Merge from codesite
diff --git a/Makefile b/Makefile
index f1bf782..86c0b4e 100644
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,6 @@
 	python expand-symlinks.py --source=samples/appengine_with_decorator2 --dest=snapshot/samples/appengine_with_decorator2
 	python expand-symlinks.py --source=samples/appengine --dest=snapshot/samples/appengine
 	cp setup_oauth2client.py snapshot/setup.py
-	cp setup_utils.py snapshot/setup_utils.py
 	cp MANIFEST_oauth2client.in snapshot/MANIFEST.in
 	cp README_oauth2client snapshot/README
 	cd snapshot; python setup.py clean
diff --git a/README b/README
index 35ba3da..bc3fd7c 100644
--- a/README
+++ b/README
@@ -1,5 +1,4 @@
-This is a prototype implementation of a client
-for discovery based APIs.
+This is python client library for Google's discovery based APIs.
 
 
 Installation
@@ -9,24 +8,17 @@
 
    $ python setup.py install
 
-If you want to do a "mock install" and simply extend your PYTHONPATH
-for the current shell to include this folder and the packages in it, do
-
-   $ source setpath.sh
-
-from the root of the project directory.
-
 
 Running
 =======
 
 After following the install directions (using setup.py or setpath.sh) you
-should be able to cd to samples/buzz and run buzz.py from there, which will use
-the apiclient library to retrieve the title of the most recent entry in Buzz
-and post a test message.  The first time you run it you will be prompted to
-authorize the application to access your Buzz information.
+should be able to cd to samples/plus and run plus.py from there, which will use
+the apiclient library to retrieve a snippet of text from each entry in Google
+Plus. The first time you run it you will be prompted to authorize the
+application to access your plus information.
 
-   $ python samples/buzz/buzz.py
+   $ python samples/plus/plus.py
 
 
 Third Party Libraries
diff --git a/apiclient/contrib/buzz/__init__.py b/apiclient/contrib/buzz/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/apiclient/contrib/buzz/__init__.py
+++ /dev/null
diff --git a/apiclient/contrib/buzz/future.json b/apiclient/contrib/buzz/future.json
deleted file mode 100644
index 05018e8..0000000
--- a/apiclient/contrib/buzz/future.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
-        "baseUrl": "https://www.googleapis.com/", 
-        "auth": {
-          "request": {
-            "url": "https://www.google.com/accounts/OAuthGetRequestToken",
-            "parameters": {
-              "xoauth_displayname": {
-                "parameterType": "query",
-                "required": false
-              },
-              "domain": {
-                "parameterType": "query",
-                "required": true
-              },
-              "scope": {
-                "parameterType": "query",
-                "required": true
-              }
-            }
-          },
-          "authorize": {
-            "url": "https://www.google.com/buzz/api/auth/OAuthAuthorizeToken",
-            "parameters": {
-              "oauth_token": {
-                "parameterType": "query",
-                "required": true
-              },
-              "iconUrl": {
-                "parameterType": "query",
-                "required": false
-              },
-              "domain": {
-                "parameterType": "query",
-                "required": true
-              },
-              "scope": {
-                "parameterType": "query",
-                "required": true
-              }
-            }
-          },
-          "access": {
-            "url": "https://www.google.com/accounts/OAuthGetAccessToken",
-            "parameters": {
-              "domain": {
-                "parameterType": "query",
-                "required": true
-              },
-              "scope": {
-                "parameterType": "query",
-                "required": true
-              }
-            }
-          }
-        },
-        "resources": {
-          "activities": {
-            "methods": {
-              "delete": {}, 
-              "extractPeopleFromSearch": {}, 
-              "get": {}, 
-              "insert": {}, 
-              "list": {
-                "next": {
-                  "type": "uri",
-                  "location": ["links", "next", 0, "href"]
-                }
-              }, 
-              "search": {
-                "next": {
-                  "type": "uri",
-                  "location": ["links", "next", 0, "href"]
-                }
-              }, 
-              "update": {}
-            }
-          }, 
-          "comments": {
-            "methods": {
-              "delete": {}, 
-              "get": {}, 
-              "insert": {}, 
-              "list": {}, 
-              "update": {}
-            }
-          }, 
-          "feeds": {
-            "methods": {
-              "delete": {}, 
-              "insert": {}, 
-              "list": {}, 
-              "update": {}
-            }
-          }, 
-          "groups": {
-            "methods": {
-              "delete": {}, 
-              "get": {}, 
-              "insert": {}, 
-              "list": {
-                "next": {
-                  "type": "uri",
-                  "location": ["links", "next", 0, "href"]
-                }
-              }, 
-              "update": {}
-            }
-          }, 
-          "people": {
-            "methods": {
-              "delete": {}, 
-              "get": {}, 
-              "liked": {
-                "next": {
-                  "type": "uri",
-                  "location": ["links", "next", 0, "href"]
-                }
-              },
-              "list": {}, 
-              "relatedToUri": {}, 
-              "reshared": {}, 
-              "search": {}, 
-              "update": {}
-            }
-          }, 
-          "photos": {
-            "methods": {
-              "insert": {}
-            }
-          }, 
-          "related": {
-            "methods": {
-              "list": {}
-            }
-          }, 
-          "search": {
-            "methods": {
-              "extractPeople": {}
-            }
-          }
-        }
-}
diff --git a/apiclient/http.py b/apiclient/http.py
index 081a4ed..d2a3a2f 100644
--- a/apiclient/http.py
+++ b/apiclient/http.py
@@ -136,10 +136,10 @@
       response = '{"data": {"id": "tag:google.c...'
       requestBuilder = RequestMockBuilder(
         {
-          'chili.activities.get': (None, response),
+          'plus.activities.get': (None, response),
         }
       )
-      apiclient.discovery.build("buzz", "v1", requestBuilder=requestBuilder)
+      apiclient.discovery.build("plus", "v1", requestBuilder=requestBuilder)
 
     Methods that you do not supply a response for will return a
     200 OK with an empty string as the response content or raise an excpetion if
diff --git a/contrib/__init__.py b/contrib/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/contrib/__init__.py
+++ /dev/null
diff --git a/contrib/buzz/__init__.py b/contrib/buzz/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/contrib/buzz/__init__.py
+++ /dev/null
diff --git a/contrib_tests/__init__.py b/contrib_tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/contrib_tests/__init__.py
+++ /dev/null
diff --git a/contrib_tests/buzz/__init__.py b/contrib_tests/buzz/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/contrib_tests/buzz/__init__.py
+++ /dev/null
diff --git a/discovery_extras.py b/discovery_extras.py
deleted file mode 100644
index 3e5a553..0000000
--- a/discovery_extras.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright (C) 2010 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Generate a skeleton discovery extras document.
-
-For the given API, retrieve the discovery document,
-strip out the guts of each method description
-and put :
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-import os
-import os.path
-import sys
-
-from anyjson import simplejson
-
-
-def main():
-  for filename in sys.argv[1:]:
-    f = file(filename, "r")
-    dis = simplejson.load(f)
-    f.close()
-
-    api = dis['name']
-    version = dis['version']
-    resources = dis['resources']
-    for res_name, res_desc in resources.iteritems():
-      methods = res_desc['methods']
-      for method_name, method_desc in methods.iteritems():
-        methods[method_name] = {}
-    path, basename = os.path.split(filename)
-    newfilename = os.path.join(path, "skel-" + basename)
-    f = file(newfilename, "w")
-    simplejson.dump(dis, f, sort_keys=True, indent=2 * ' ')
-    f.close()
-
-
-if __name__ == '__main__':
-  main()
diff --git a/docs/apiclient.anyjson.html b/docs/apiclient.anyjson.html
index a2995a0..77e5b88 100644
--- a/docs/apiclient.anyjson.html
+++ b/docs/apiclient.anyjson.html
@@ -20,7 +20,7 @@
 <font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
     
 <tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 </td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
 <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
 <tr bgcolor="#55aa55">
diff --git a/docs/apiclient.contrib.buzz.html b/docs/apiclient.contrib.buzz.html
deleted file mode 100644
index f8addd0..0000000
--- a/docs/apiclient.contrib.buzz.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: package apiclient.contrib.buzz</title>
-</head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
-<tr bgcolor="#7799ee">
-<td valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.<a href="apiclient.contrib.html"><font color="#ffffff">contrib</font></a>.buzz</strong></big></big></font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/contrib/buzz/__init__.py">/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/contrib/buzz/__init__.py</a></font></td></tr></table>
-    <p></p>
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#aa55cc">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
-    
-<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.contrib.html b/docs/apiclient.contrib.html
deleted file mode 100644
index c0e6977..0000000
--- a/docs/apiclient.contrib.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: package apiclient.contrib</title>
-</head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
-<tr bgcolor="#7799ee">
-<td valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.contrib</strong></big></big></font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/contrib/__init__.py">/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/contrib/__init__.py</a></font></td></tr></table>
-    <p></p>
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#aa55cc">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
-    
-<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="apiclient.contrib.buzz.html"><strong>buzz</strong>&nbsp;(package)</a><br>
-</td><td width="25%" valign=top><a href="apiclient.contrib.latitude.html"><strong>latitude</strong>&nbsp;(package)</a><br>
-</td><td width="25%" valign=top><a href="apiclient.contrib.moderator.html"><strong>moderator</strong>&nbsp;(package)</a><br>
-</td><td width="25%" valign=top></td></tr></table></td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.contrib.latitude.html b/docs/apiclient.contrib.latitude.html
deleted file mode 100644
index 99bd5f3..0000000
--- a/docs/apiclient.contrib.latitude.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: package apiclient.contrib.latitude</title>
-</head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
-<tr bgcolor="#7799ee">
-<td valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.<a href="apiclient.contrib.html"><font color="#ffffff">contrib</font></a>.latitude</strong></big></big></font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/contrib/latitude/__init__.py">/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/contrib/latitude/__init__.py</a></font></td></tr></table>
-    <p></p>
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#aa55cc">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
-    
-<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.contrib.moderator.html b/docs/apiclient.contrib.moderator.html
deleted file mode 100644
index b3f5e80..0000000
--- a/docs/apiclient.contrib.moderator.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: package apiclient.contrib.moderator</title>
-</head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
-<tr bgcolor="#7799ee">
-<td valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.<a href="apiclient.contrib.html"><font color="#ffffff">contrib</font></a>.moderator</strong></big></big></font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/contrib/moderator/__init__.py">/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/contrib/moderator/__init__.py</a></font></td></tr></table>
-    <p></p>
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#aa55cc">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
-    
-<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.discovery.html b/docs/apiclient.discovery.html
index e2a00bc..2cec87e 100644
--- a/docs/apiclient.discovery.html
+++ b/docs/apiclient.discovery.html
@@ -26,7 +26,7 @@
 <a href="mimetypes.html">mimetypes</a><br>
 <a href="os.html">os</a><br>
 </td><td width="25%" valign=top><a href="re.html">re</a><br>
-<a href="simplejson.html">simplejson</a><br>
+<a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 <a href="uritemplate.html">uritemplate</a><br>
 </td><td width="25%" valign=top><a href="urllib.html">urllib</a><br>
 <a href="urlparse.html">urlparse</a><br>
diff --git a/docs/apiclient.errors.html b/docs/apiclient.errors.html
index 93ebd42..80b320f 100644
--- a/docs/apiclient.errors.html
+++ b/docs/apiclient.errors.html
@@ -20,7 +20,7 @@
 <font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
     
 <tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 </td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
 <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
 <tr bgcolor="#ee77aa">
diff --git a/docs/apiclient.ext.django_orm.html b/docs/apiclient.ext.django_orm.html
index 91b9e70..e242bd7 100644
--- a/docs/apiclient.ext.django_orm.html
+++ b/docs/apiclient.ext.django_orm.html
@@ -8,7 +8,7 @@
 <td valign=bottom>&nbsp;<br>
 <font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.<a href="apiclient.ext.html"><font color="#ffffff">ext</font></a>.django_orm</strong></big></big></font></td
 ><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiclient/apiclient/ext/django_orm.py">/usr/local/google/home/jcgregorio/projects/apiclient/apiclient/ext/django_orm.py</a></font></td></tr></table>
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/ext/django_orm.py">/usr/local/google/home/jcgregorio/projects/apiclient-release/apiclient/ext/django_orm.py</a></font></td></tr></table>
     <p><tt>#&nbsp;Copyright&nbsp;(C)&nbsp;2010&nbsp;Google&nbsp;Inc.<br>
 #<br>
 #&nbsp;Licensed&nbsp;under&nbsp;the&nbsp;Apache&nbsp;License,&nbsp;Version&nbsp;2.0&nbsp;(the&nbsp;"License");<br>
@@ -65,9 +65,13 @@
 Methods defined here:<br>
 <dl><dt><a name="FlowThreeLeggedField-contribute_to_class"><strong>contribute_to_class</strong></a>(self, cls, name)</dt></dl>
 
-<dl><dt><a name="FlowThreeLeggedField-db_type"><strong>db_type</strong></a>(self)</dt></dl>
+<dl><dt><a name="FlowThreeLeggedField-db_type"><strong>db_type</strong></a> = inner(*args, **kwargs)</dt></dl>
 
-<dl><dt><a name="FlowThreeLeggedField-get_db_prep_value"><strong>get_db_prep_value</strong></a>(self, value)</dt></dl>
+<dl><dt><a name="FlowThreeLeggedField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_db_prep_save"><strong>get_db_prep_save</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_db_prep_value"><strong>get_db_prep_value</strong></a> = inner(*args, **kwargs)</dt></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-to_python"><strong>to_python</strong></a>(self, value)</dt></dl>
 
@@ -82,10 +86,14 @@
 
 <dl><dt><a name="FlowThreeLeggedField-__deepcopy__"><strong>__deepcopy__</strong></a>(self, memodict)</dt></dl>
 
-<dl><dt><a name="FlowThreeLeggedField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=&lt;class django.db.models.fields.NOT_PROVIDED&gt;</font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>)</dt></dl>
+<dl><dt><a name="FlowThreeLeggedField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=&lt;class django.db.models.fields.NOT_PROVIDED&gt;</font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>, validators<font color="#909090">=[]</font>, error_messages<font color="#909090">=None</font>)</dt></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-bind"><strong>bind</strong></a>(self, fieldmapping, original, bound_field_class)</dt></dl>
 
+<dl><dt><a name="FlowThreeLeggedField-clean"><strong>clean</strong></a>(self, value, model_instance)</dt><dd><tt>Convert&nbsp;the&nbsp;value's&nbsp;type&nbsp;and&nbsp;run&nbsp;validation.&nbsp;Validation&nbsp;errors&nbsp;from&nbsp;to_python<br>
+and&nbsp;validate&nbsp;are&nbsp;propagated.&nbsp;The&nbsp;correct&nbsp;value&nbsp;is&nbsp;returned&nbsp;if&nbsp;no&nbsp;error&nbsp;is<br>
+raised.</tt></dd></dl>
+
 <dl><dt><a name="FlowThreeLeggedField-formfield"><strong>formfield</strong></a>(self, form_class<font color="#909090">=&lt;class 'django.forms.fields.CharField'&gt;</font>, **kwargs)</dt><dd><tt>Returns&nbsp;a&nbsp;django.forms.<a href="django.db.models.fields.html#Field">Field</a>&nbsp;instance&nbsp;for&nbsp;this&nbsp;database&nbsp;<a href="django.db.models.fields.html#Field">Field</a>.</tt></dd></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-get_attname"><strong>get_attname</strong></a>(self)</dt></dl>
@@ -99,26 +107,31 @@
 
 <dl><dt><a name="FlowThreeLeggedField-get_choices_default"><strong>get_choices_default</strong></a>(self)</dt></dl>
 
-<dl><dt><a name="FlowThreeLeggedField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;prepared&nbsp;for&nbsp;database&nbsp;lookup.</tt></dd></dl>
-
-<dl><dt><a name="FlowThreeLeggedField-get_db_prep_save"><strong>get_db_prep_save</strong></a>(self, value)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;prepared&nbsp;for&nbsp;saving&nbsp;into&nbsp;a&nbsp;database.</tt></dd></dl>
-
 <dl><dt><a name="FlowThreeLeggedField-get_default"><strong>get_default</strong></a>(self)</dt><dd><tt>Returns&nbsp;the&nbsp;default&nbsp;value&nbsp;for&nbsp;this&nbsp;field.</tt></dd></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-get_flatchoices"><strong>get_flatchoices</strong></a>(self, include_blank<font color="#909090">=True</font>, blank_choice<font color="#909090">=[('', '---------')]</font>)</dt><dd><tt>Returns&nbsp;flattened&nbsp;choices&nbsp;with&nbsp;a&nbsp;default&nbsp;blank&nbsp;choice&nbsp;included.</tt></dd></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-get_internal_type"><strong>get_internal_type</strong></a>(self)</dt></dl>
 
+<dl><dt><a name="FlowThreeLeggedField-get_prep_lookup"><strong>get_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Perform&nbsp;preliminary&nbsp;non-db&nbsp;specific&nbsp;lookup&nbsp;checks&nbsp;and&nbsp;conversions</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_prep_value"><strong>get_prep_value</strong></a>(self, value)</dt><dd><tt>Perform&nbsp;preliminary&nbsp;non-db&nbsp;specific&nbsp;value&nbsp;checks&nbsp;and&nbsp;conversions.</tt></dd></dl>
+
 <dl><dt><a name="FlowThreeLeggedField-get_validator_unique_lookup_type"><strong>get_validator_unique_lookup_type</strong></a>(self)</dt></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-has_default"><strong>has_default</strong></a>(self)</dt><dd><tt>Returns&nbsp;a&nbsp;boolean&nbsp;of&nbsp;whether&nbsp;this&nbsp;field&nbsp;has&nbsp;a&nbsp;default&nbsp;value.</tt></dd></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-pre_save"><strong>pre_save</strong></a>(self, model_instance, add)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;just&nbsp;before&nbsp;saving.</tt></dd></dl>
 
+<dl><dt><a name="FlowThreeLeggedField-run_validators"><strong>run_validators</strong></a>(self, value)</dt></dl>
+
 <dl><dt><a name="FlowThreeLeggedField-save_form_data"><strong>save_form_data</strong></a>(self, instance, data)</dt></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-set_attributes_from_name"><strong>set_attributes_from_name</strong></a>(self, name)</dt></dl>
 
+<dl><dt><a name="FlowThreeLeggedField-validate"><strong>validate</strong></a>(self, value, model_instance)</dt><dd><tt>Validates&nbsp;value&nbsp;and&nbsp;throws&nbsp;ValidationError.&nbsp;Subclasses&nbsp;should&nbsp;override<br>
+this&nbsp;to&nbsp;provide&nbsp;validation&nbsp;logic.</tt></dd></dl>
+
 <dl><dt><a name="FlowThreeLeggedField-value_from_object"><strong>value_from_object</strong></a>(self, obj)</dt><dd><tt>Returns&nbsp;the&nbsp;value&nbsp;of&nbsp;this&nbsp;field&nbsp;in&nbsp;the&nbsp;given&nbsp;model&nbsp;instance.</tt></dd></dl>
 
 <dl><dt><a name="FlowThreeLeggedField-value_to_string"><strong>value_to_string</strong></a>(self, obj)</dt><dd><tt>Returns&nbsp;a&nbsp;string&nbsp;value&nbsp;of&nbsp;this&nbsp;field&nbsp;from&nbsp;the&nbsp;passed&nbsp;obj.<br>
@@ -134,6 +147,8 @@
 </dl>
 <dl><dt><strong>choices</strong></dt>
 </dl>
+<dl><dt><strong>description</strong></dt>
+</dl>
 <dl><dt><strong>flatchoices</strong></dt>
 <dd><tt>Flattened&nbsp;version&nbsp;of&nbsp;choices&nbsp;tuple.</tt></dd>
 </dl>
@@ -145,6 +160,10 @@
 
 <dl><dt><strong>creation_counter</strong> = 0</dl>
 
+<dl><dt><strong>default_error_messages</strong> = {'blank': &lt;django.utils.functional.__proxy__ object&gt;, 'invalid_choice': &lt;django.utils.functional.__proxy__ object&gt;, 'null': &lt;django.utils.functional.__proxy__ object&gt;}</dl>
+
+<dl><dt><strong>default_validators</strong> = []</dl>
+
 <dl><dt><strong>empty_strings_allowed</strong> = True</dl>
 
 </td></tr></table> <p>
@@ -163,9 +182,13 @@
 Methods defined here:<br>
 <dl><dt><a name="OAuthCredentialsField-contribute_to_class"><strong>contribute_to_class</strong></a>(self, cls, name)</dt></dl>
 
-<dl><dt><a name="OAuthCredentialsField-db_type"><strong>db_type</strong></a>(self)</dt></dl>
+<dl><dt><a name="OAuthCredentialsField-db_type"><strong>db_type</strong></a> = inner(*args, **kwargs)</dt></dl>
 
-<dl><dt><a name="OAuthCredentialsField-get_db_prep_value"><strong>get_db_prep_value</strong></a>(self, value)</dt></dl>
+<dl><dt><a name="OAuthCredentialsField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_db_prep_save"><strong>get_db_prep_save</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_db_prep_value"><strong>get_db_prep_value</strong></a> = inner(*args, **kwargs)</dt></dl>
 
 <dl><dt><a name="OAuthCredentialsField-to_python"><strong>to_python</strong></a>(self, value)</dt></dl>
 
@@ -180,10 +203,14 @@
 
 <dl><dt><a name="OAuthCredentialsField-__deepcopy__"><strong>__deepcopy__</strong></a>(self, memodict)</dt></dl>
 
-<dl><dt><a name="OAuthCredentialsField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=&lt;class django.db.models.fields.NOT_PROVIDED&gt;</font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>)</dt></dl>
+<dl><dt><a name="OAuthCredentialsField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=&lt;class django.db.models.fields.NOT_PROVIDED&gt;</font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>, validators<font color="#909090">=[]</font>, error_messages<font color="#909090">=None</font>)</dt></dl>
 
 <dl><dt><a name="OAuthCredentialsField-bind"><strong>bind</strong></a>(self, fieldmapping, original, bound_field_class)</dt></dl>
 
+<dl><dt><a name="OAuthCredentialsField-clean"><strong>clean</strong></a>(self, value, model_instance)</dt><dd><tt>Convert&nbsp;the&nbsp;value's&nbsp;type&nbsp;and&nbsp;run&nbsp;validation.&nbsp;Validation&nbsp;errors&nbsp;from&nbsp;to_python<br>
+and&nbsp;validate&nbsp;are&nbsp;propagated.&nbsp;The&nbsp;correct&nbsp;value&nbsp;is&nbsp;returned&nbsp;if&nbsp;no&nbsp;error&nbsp;is<br>
+raised.</tt></dd></dl>
+
 <dl><dt><a name="OAuthCredentialsField-formfield"><strong>formfield</strong></a>(self, form_class<font color="#909090">=&lt;class 'django.forms.fields.CharField'&gt;</font>, **kwargs)</dt><dd><tt>Returns&nbsp;a&nbsp;django.forms.<a href="django.db.models.fields.html#Field">Field</a>&nbsp;instance&nbsp;for&nbsp;this&nbsp;database&nbsp;<a href="django.db.models.fields.html#Field">Field</a>.</tt></dd></dl>
 
 <dl><dt><a name="OAuthCredentialsField-get_attname"><strong>get_attname</strong></a>(self)</dt></dl>
@@ -197,26 +224,31 @@
 
 <dl><dt><a name="OAuthCredentialsField-get_choices_default"><strong>get_choices_default</strong></a>(self)</dt></dl>
 
-<dl><dt><a name="OAuthCredentialsField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;prepared&nbsp;for&nbsp;database&nbsp;lookup.</tt></dd></dl>
-
-<dl><dt><a name="OAuthCredentialsField-get_db_prep_save"><strong>get_db_prep_save</strong></a>(self, value)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;prepared&nbsp;for&nbsp;saving&nbsp;into&nbsp;a&nbsp;database.</tt></dd></dl>
-
 <dl><dt><a name="OAuthCredentialsField-get_default"><strong>get_default</strong></a>(self)</dt><dd><tt>Returns&nbsp;the&nbsp;default&nbsp;value&nbsp;for&nbsp;this&nbsp;field.</tt></dd></dl>
 
 <dl><dt><a name="OAuthCredentialsField-get_flatchoices"><strong>get_flatchoices</strong></a>(self, include_blank<font color="#909090">=True</font>, blank_choice<font color="#909090">=[('', '---------')]</font>)</dt><dd><tt>Returns&nbsp;flattened&nbsp;choices&nbsp;with&nbsp;a&nbsp;default&nbsp;blank&nbsp;choice&nbsp;included.</tt></dd></dl>
 
 <dl><dt><a name="OAuthCredentialsField-get_internal_type"><strong>get_internal_type</strong></a>(self)</dt></dl>
 
+<dl><dt><a name="OAuthCredentialsField-get_prep_lookup"><strong>get_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Perform&nbsp;preliminary&nbsp;non-db&nbsp;specific&nbsp;lookup&nbsp;checks&nbsp;and&nbsp;conversions</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_prep_value"><strong>get_prep_value</strong></a>(self, value)</dt><dd><tt>Perform&nbsp;preliminary&nbsp;non-db&nbsp;specific&nbsp;value&nbsp;checks&nbsp;and&nbsp;conversions.</tt></dd></dl>
+
 <dl><dt><a name="OAuthCredentialsField-get_validator_unique_lookup_type"><strong>get_validator_unique_lookup_type</strong></a>(self)</dt></dl>
 
 <dl><dt><a name="OAuthCredentialsField-has_default"><strong>has_default</strong></a>(self)</dt><dd><tt>Returns&nbsp;a&nbsp;boolean&nbsp;of&nbsp;whether&nbsp;this&nbsp;field&nbsp;has&nbsp;a&nbsp;default&nbsp;value.</tt></dd></dl>
 
 <dl><dt><a name="OAuthCredentialsField-pre_save"><strong>pre_save</strong></a>(self, model_instance, add)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;just&nbsp;before&nbsp;saving.</tt></dd></dl>
 
+<dl><dt><a name="OAuthCredentialsField-run_validators"><strong>run_validators</strong></a>(self, value)</dt></dl>
+
 <dl><dt><a name="OAuthCredentialsField-save_form_data"><strong>save_form_data</strong></a>(self, instance, data)</dt></dl>
 
 <dl><dt><a name="OAuthCredentialsField-set_attributes_from_name"><strong>set_attributes_from_name</strong></a>(self, name)</dt></dl>
 
+<dl><dt><a name="OAuthCredentialsField-validate"><strong>validate</strong></a>(self, value, model_instance)</dt><dd><tt>Validates&nbsp;value&nbsp;and&nbsp;throws&nbsp;ValidationError.&nbsp;Subclasses&nbsp;should&nbsp;override<br>
+this&nbsp;to&nbsp;provide&nbsp;validation&nbsp;logic.</tt></dd></dl>
+
 <dl><dt><a name="OAuthCredentialsField-value_from_object"><strong>value_from_object</strong></a>(self, obj)</dt><dd><tt>Returns&nbsp;the&nbsp;value&nbsp;of&nbsp;this&nbsp;field&nbsp;in&nbsp;the&nbsp;given&nbsp;model&nbsp;instance.</tt></dd></dl>
 
 <dl><dt><a name="OAuthCredentialsField-value_to_string"><strong>value_to_string</strong></a>(self, obj)</dt><dd><tt>Returns&nbsp;a&nbsp;string&nbsp;value&nbsp;of&nbsp;this&nbsp;field&nbsp;from&nbsp;the&nbsp;passed&nbsp;obj.<br>
@@ -232,6 +264,8 @@
 </dl>
 <dl><dt><strong>choices</strong></dt>
 </dl>
+<dl><dt><strong>description</strong></dt>
+</dl>
 <dl><dt><strong>flatchoices</strong></dt>
 <dd><tt>Flattened&nbsp;version&nbsp;of&nbsp;choices&nbsp;tuple.</tt></dd>
 </dl>
@@ -243,6 +277,10 @@
 
 <dl><dt><strong>creation_counter</strong> = 0</dl>
 
+<dl><dt><strong>default_error_messages</strong> = {'blank': &lt;django.utils.functional.__proxy__ object&gt;, 'invalid_choice': &lt;django.utils.functional.__proxy__ object&gt;, 'null': &lt;django.utils.functional.__proxy__ object&gt;}</dl>
+
+<dl><dt><strong>default_validators</strong> = []</dl>
+
 <dl><dt><strong>empty_strings_allowed</strong> = True</dl>
 
 </td></tr></table></td></tr></table>
diff --git a/docs/apiclient.http.html b/docs/apiclient.http.html
index 8dec4c6..d35f7fa 100644
--- a/docs/apiclient.http.html
+++ b/docs/apiclient.http.html
@@ -23,7 +23,7 @@
 <tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
 <td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="httplib2.html">httplib2</a><br>
 </td><td width="25%" valign=top><a href="os.html">os</a><br>
-</td><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+</td><td width="25%" valign=top><a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 </td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
 <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
 <tr bgcolor="#ee77aa">
@@ -105,10 +105,10 @@
 &nbsp;&nbsp;response&nbsp;=&nbsp;'{"data":&nbsp;{"id":&nbsp;"tag:google.c...'<br>
 &nbsp;&nbsp;requestBuilder&nbsp;=&nbsp;<a href="#RequestMockBuilder">RequestMockBuilder</a>(<br>
 &nbsp;&nbsp;&nbsp;&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'chili.activities.get':&nbsp;(None,&nbsp;response),<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'plus.activities.get':&nbsp;(None,&nbsp;response),<br>
 &nbsp;&nbsp;&nbsp;&nbsp;}<br>
 &nbsp;&nbsp;)<br>
-&nbsp;&nbsp;apiclient.discovery.build("buzz",&nbsp;"v1",&nbsp;requestBuilder=requestBuilder)<br>
+&nbsp;&nbsp;apiclient.discovery.build("plus",&nbsp;"v1",&nbsp;requestBuilder=requestBuilder)<br>
 &nbsp;<br>
 Methods&nbsp;that&nbsp;you&nbsp;do&nbsp;not&nbsp;supply&nbsp;a&nbsp;response&nbsp;for&nbsp;will&nbsp;return&nbsp;a<br>
 200&nbsp;OK&nbsp;with&nbsp;an&nbsp;empty&nbsp;string&nbsp;as&nbsp;the&nbsp;response&nbsp;content&nbsp;or&nbsp;raise&nbsp;an&nbsp;excpetion&nbsp;if<br>
diff --git a/docs/apiclient.model.html b/docs/apiclient.model.html
index 6010090..b15b85d 100644
--- a/docs/apiclient.model.html
+++ b/docs/apiclient.model.html
@@ -24,7 +24,7 @@
 <tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
 <td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="gflags.html">gflags</a><br>
 </td><td width="25%" valign=top><a href="logging.html">logging</a><br>
-</td><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+</td><td width="25%" valign=top><a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 </td><td width="25%" valign=top><a href="urllib.html">urllib</a><br>
 </td></tr></table></td></tr></table><p>
 <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
diff --git a/docs/apiclient.oauth.html b/docs/apiclient.oauth.html
index 5d76736..de6234c 100644
--- a/docs/apiclient.oauth.html
+++ b/docs/apiclient.oauth.html
@@ -23,7 +23,7 @@
 <a href="httplib2.html">httplib2</a><br>
 </td><td width="25%" valign=top><a href="logging.html">logging</a><br>
 <a href="oauth2.html">oauth2</a><br>
-</td><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+</td><td width="25%" valign=top><a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 <a href="urllib.html">urllib</a><br>
 </td><td width="25%" valign=top><a href="urlparse.html">urlparse</a><br>
 </td></tr></table></td></tr></table><p>
diff --git a/docs/build.sh b/docs/build.sh
index 47367b1..1f922e7 100755
--- a/docs/build.sh
+++ b/docs/build.sh
@@ -22,11 +22,10 @@
 # Notes: You may have to update the location of the
 #        App Engine library for your local system.
 
-export GOOGLE_APPENGINE=$HOME/projects/google_appengine
+export GOOGLE_APPENGINE=$HOME/projects/google_appengine/
 export DJANGO_SETTINGS_MODULE=fakesettings
 export PYTHONPATH=`pwd`/..:$GOOGLE_APPENGINE
 find ../apiclient/ -name "*.py" | sed "s/\/__init__.py//" | sed "s/\.py//" | sed "s/^\.\.\///" | sed "s#/#.#g" | xargs python `which pydoc` -w
 find ../oauth2client/ -name "*.py" | sed "s/\/__init__.py//" | sed "s/\.py//" | sed "s/^\.\.\///" | sed "s#/#.#g" | xargs python `which pydoc` -w
-find ../httplib2/ -name "*.py" | sed "s/\/__init__.py//" | sed "s/\.py//" | sed "s/^\.\.\///" | sed "s#/#.#g" | xargs python `which pydoc` -w
 find ../uritemplate/ -name "*.py" | sed "s/\/__init__.py//" | sed "s/\.py//" | sed "s/^\.\.\///" | sed "s#/#.#g" | xargs python `which pydoc` -w
 
diff --git a/docs/dyn/adexchangebuyer.v1.accounts.html b/docs/dyn/adexchangebuyer.v1.accounts.html
deleted file mode 100644
index 2467730..0000000
--- a/docs/dyn/adexchangebuyer.v1.accounts.html
+++ /dev/null
@@ -1,47 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-get"><strong>get</strong></a> = method(self, **kwargs)</dt><dd><tt>Gets&nbsp;one&nbsp;account&nbsp;by&nbsp;ID.<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;id:&nbsp;string,&nbsp;The&nbsp;account&nbsp;id&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-list"><strong>list</strong></a> = method(self, **kwargs)</dt><dd><tt>Retrieves&nbsp;the&nbsp;authenticated&nbsp;user's&nbsp;list&nbsp;of&nbsp;accounts.<br>
-&nbsp;<br>
-Args:</tt></dd></dl>
-
-<dl><dt><a name="Resource-patch"><strong>patch</strong></a> = method(self, **kwargs)</dt><dd><tt>Updates&nbsp;an&nbsp;existing&nbsp;account.&nbsp;This&nbsp;method&nbsp;supports&nbsp;patch&nbsp;semantics.<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;id:&nbsp;string,&nbsp;The&nbsp;account&nbsp;id&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-update"><strong>update</strong></a> = method(self, **kwargs)</dt><dd><tt>Updates&nbsp;an&nbsp;existing&nbsp;account.<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;id:&nbsp;string,&nbsp;The&nbsp;account&nbsp;id&nbsp;(required)</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/analytics.v3.html b/docs/dyn/analytics.v3.html
index 0520383..6949bf9 100644
--- a/docs/dyn/analytics.v3.html
+++ b/docs/dyn/analytics.v3.html
@@ -16,6 +16,8 @@
 
 <dl><dt><a name="Resource-management"><strong><a href="analytics.v3.management.html">management</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
 
+<dl><dt><a name="Resource-report"><strong><a href="analytics.v3.report.html">report</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
+
 <hr>
 Data descriptors defined here:<br>
 <dl><dt><strong>__dict__</strong></dt>
diff --git a/docs/dyn/analytics.v3.report.html b/docs/dyn/analytics.v3.report.html
new file mode 100644
index 0000000..fb4d8cf
--- /dev/null
+++ b/docs/dyn/analytics.v3.report.html
@@ -0,0 +1,40 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: class Resource</title>
+</head><body bgcolor="#f0f0f8">
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
+    
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="Resource-get"><strong>get</strong></a> = method(self, **kwargs)</dt><dd><tt>Returns&nbsp;Analytics&nbsp;report&nbsp;data&nbsp;for&nbsp;a&nbsp;profile.<br>
+&nbsp;<br>
+Args:<br>
+&nbsp;&nbsp;sort:&nbsp;string,&nbsp;A&nbsp;comma-separated&nbsp;list&nbsp;of&nbsp;dimensions&nbsp;or&nbsp;metrics&nbsp;that&nbsp;determine&nbsp;the&nbsp;sort&nbsp;order&nbsp;for&nbsp;the&nbsp;report&nbsp;data.<br>
+&nbsp;&nbsp;end_date:&nbsp;string,&nbsp;End&nbsp;date&nbsp;for&nbsp;fetching&nbsp;report&nbsp;data.&nbsp;All&nbsp;requests&nbsp;should&nbsp;specify&nbsp;an&nbsp;end&nbsp;date&nbsp;formatted&nbsp;as&nbsp;YYYY-MM-DD.&nbsp;(required)<br>
+&nbsp;&nbsp;dimensions:&nbsp;string,&nbsp;A&nbsp;comma-separated&nbsp;list&nbsp;of&nbsp;Analytics&nbsp;dimensions.&nbsp;E.g.,&nbsp;'ga:browser,ga:city'.<br>
+&nbsp;&nbsp;ids:&nbsp;string,&nbsp;Unique&nbsp;table&nbsp;ID&nbsp;for&nbsp;retrieving&nbsp;report&nbsp;data.&nbsp;Table&nbsp;ID&nbsp;is&nbsp;of&nbsp;the&nbsp;form&nbsp;ga:XXXX,&nbsp;where&nbsp;XXXX&nbsp;is&nbsp;the&nbsp;Analytics&nbsp;profile&nbsp;ID.&nbsp;(required)<br>
+&nbsp;&nbsp;metrics:&nbsp;string,&nbsp;A&nbsp;comma-separated&nbsp;list&nbsp;of&nbsp;Analytics&nbsp;metrics.&nbsp;E.g.,&nbsp;'ga:visits,ga:pageviews'.&nbsp;At&nbsp;least&nbsp;one&nbsp;metric&nbsp;must&nbsp;be&nbsp;specified&nbsp;to&nbsp;retrieve&nbsp;a&nbsp;valid&nbsp;Analytics&nbsp;report.&nbsp;(required)<br>
+&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;The&nbsp;maximum&nbsp;number&nbsp;of&nbsp;entries&nbsp;to&nbsp;include&nbsp;in&nbsp;this&nbsp;feed.<br>
+&nbsp;&nbsp;filters:&nbsp;string,&nbsp;A&nbsp;comma-separated&nbsp;list&nbsp;of&nbsp;dimension&nbsp;or&nbsp;metric&nbsp;filters&nbsp;to&nbsp;be&nbsp;applied&nbsp;to&nbsp;the&nbsp;report&nbsp;data.<br>
+&nbsp;&nbsp;segment:&nbsp;string,&nbsp;An&nbsp;Analytics&nbsp;advanced&nbsp;segment&nbsp;to&nbsp;be&nbsp;applied&nbsp;to&nbsp;the&nbsp;report&nbsp;data.<br>
+&nbsp;&nbsp;start_date:&nbsp;string,&nbsp;Start&nbsp;date&nbsp;for&nbsp;fetching&nbsp;report&nbsp;data.&nbsp;All&nbsp;requests&nbsp;should&nbsp;specify&nbsp;a&nbsp;start&nbsp;date&nbsp;formatted&nbsp;as&nbsp;YYYY-MM-DD.&nbsp;(required)<br>
+&nbsp;&nbsp;start_index:&nbsp;integer,&nbsp;An&nbsp;index&nbsp;of&nbsp;the&nbsp;first&nbsp;entity&nbsp;to&nbsp;retrieve.&nbsp;Use&nbsp;this&nbsp;parameter&nbsp;as&nbsp;a&nbsp;pagination&nbsp;mechanism&nbsp;along&nbsp;with&nbsp;the&nbsp;max-results&nbsp;parameter.</tt></dd></dl>
+
+<hr>
+Data descriptors defined here:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
+</dl>
+</td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/buzz.v1.activities.html b/docs/dyn/buzz.v1.activities.html
deleted file mode 100644
index 60b5753..0000000
--- a/docs/dyn/buzz.v1.activities.html
+++ /dev/null
@@ -1,205 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-count"><strong>count</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;a&nbsp;count&nbsp;of&nbsp;link&nbsp;shares<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;url:&nbsp;string,&nbsp;URLs&nbsp;for&nbsp;which&nbsp;to&nbsp;get&nbsp;share&nbsp;counts.&nbsp;(repeated)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.</tt></dd></dl>
-
-<dl><dt><a name="Resource-delete"><strong>delete</strong></a> = method(self, **kwargs)</dt><dd><tt>Delete&nbsp;an&nbsp;activity<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;whose&nbsp;post&nbsp;to&nbsp;delete.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;to&nbsp;which&nbsp;the&nbsp;activity&nbsp;belongs.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@liked&nbsp;-&nbsp;Activities&nbsp;liked&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@muted&nbsp;-&nbsp;Activities&nbsp;muted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Activities&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;to&nbsp;delete.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-extractPeopleFromSearch"><strong>extractPeopleFromSearch</strong></a> = method(self, **kwargs)</dt><dd><tt>Search&nbsp;for&nbsp;people&nbsp;by&nbsp;topic<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;lat:&nbsp;string,&nbsp;Latitude&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;lon:&nbsp;string,&nbsp;Longitude&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;pid:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;a&nbsp;place&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;q:&nbsp;string,&nbsp;Full-text&nbsp;search&nbsp;query&nbsp;string.<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;radius:&nbsp;string,&nbsp;Radius&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;bbox:&nbsp;string,&nbsp;Bounding&nbsp;box&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-get"><strong>get</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;an&nbsp;activity<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;post&nbsp;to&nbsp;get.&nbsp;(required)<br>
-&nbsp;&nbsp;truncateAtom:&nbsp;boolean,&nbsp;Truncate&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;atom:content&nbsp;element.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;whose&nbsp;post&nbsp;to&nbsp;get.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;max_comments:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;comments&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;max_liked:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;likes&nbsp;to&nbsp;include.</tt></dd></dl>
-
-<dl><dt><a name="Resource-insert"><strong>insert</strong></a> = method(self, **kwargs)</dt><dd><tt>Create&nbsp;a&nbsp;new&nbsp;activity<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.<br>
-&nbsp;&nbsp;media_body:&nbsp;string,&nbsp;The&nbsp;filename&nbsp;of&nbsp;the&nbsp;media&nbsp;request&nbsp;body.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;preview:&nbsp;boolean,&nbsp;If&nbsp;true,&nbsp;only&nbsp;preview&nbsp;the&nbsp;action.</tt></dd></dl>
-
-<dl><dt><a name="Resource-list"><strong>list</strong></a> = method(self, **kwargs)</dt><dd><tt>List&nbsp;activities<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;truncateAtom:&nbsp;boolean,&nbsp;Truncate&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;atom:content&nbsp;element.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;of&nbsp;activities&nbsp;to&nbsp;list.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@comments&nbsp;-&nbsp;Limit&nbsp;to&nbsp;activities&nbsp;commented&nbsp;on&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@consumption&nbsp;-&nbsp;Limit&nbsp;to&nbsp;activities&nbsp;to&nbsp;be&nbsp;consumed&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@liked&nbsp;-&nbsp;Limit&nbsp;to&nbsp;activities&nbsp;liked&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@public&nbsp;-&nbsp;Limit&nbsp;to&nbsp;public&nbsp;activities&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Limit&nbsp;to&nbsp;activities&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;max_comments:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;comments&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;max_liked:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;likes&nbsp;to&nbsp;include.</tt></dd></dl>
-
-<dl><dt><a name="Resource-list_next"><strong>list_next</strong></a> = methodNext(self, previous)</dt><dd><tt>Retrieve&nbsp;the&nbsp;next&nbsp;page&nbsp;of&nbsp;results.<br>
-&nbsp;<br>
-Takes&nbsp;a&nbsp;single&nbsp;argument,&nbsp;'body',&nbsp;which&nbsp;is&nbsp;the&nbsp;results<br>
-from&nbsp;the&nbsp;last&nbsp;call,&nbsp;and&nbsp;returns&nbsp;the&nbsp;next&nbsp;set&nbsp;of&nbsp;items<br>
-in&nbsp;the&nbsp;collection.<br>
-&nbsp;<br>
-Returns:<br>
-&nbsp;&nbsp;None&nbsp;if&nbsp;there&nbsp;are&nbsp;no&nbsp;more&nbsp;items&nbsp;in&nbsp;the&nbsp;collection.</tt></dd></dl>
-
-<dl><dt><a name="Resource-patch"><strong>patch</strong></a> = method(self, **kwargs)</dt><dd><tt>Update&nbsp;an&nbsp;activity.&nbsp;This&nbsp;method&nbsp;supports&nbsp;patch&nbsp;semantics.<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;whose&nbsp;post&nbsp;to&nbsp;update.&nbsp;(required)<br>
-&nbsp;&nbsp;abuseType:&nbsp;string,&nbsp;A&nbsp;parameter<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;to&nbsp;which&nbsp;the&nbsp;activity&nbsp;belongs.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@abuse&nbsp;-&nbsp;Activities&nbsp;reported&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@liked&nbsp;-&nbsp;Activities&nbsp;liked&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@muted&nbsp;-&nbsp;Activities&nbsp;muted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Activities&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;to&nbsp;update.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-search"><strong>search</strong></a> = method(self, **kwargs)</dt><dd><tt>Search&nbsp;for&nbsp;activities<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;lat:&nbsp;string,&nbsp;Latitude&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;lon:&nbsp;string,&nbsp;Longitude&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;pid:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;a&nbsp;place&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;q:&nbsp;string,&nbsp;Full-text&nbsp;search&nbsp;query&nbsp;string.<br>
-&nbsp;&nbsp;truncateAtom:&nbsp;boolean,&nbsp;Truncate&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;atom:content&nbsp;element.<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;radius:&nbsp;string,&nbsp;Radius&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;bbox:&nbsp;string,&nbsp;Bounding&nbsp;box&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-search_next"><strong>search_next</strong></a> = methodNext(self, previous)</dt><dd><tt>Retrieve&nbsp;the&nbsp;next&nbsp;page&nbsp;of&nbsp;results.<br>
-&nbsp;<br>
-Takes&nbsp;a&nbsp;single&nbsp;argument,&nbsp;'body',&nbsp;which&nbsp;is&nbsp;the&nbsp;results<br>
-from&nbsp;the&nbsp;last&nbsp;call,&nbsp;and&nbsp;returns&nbsp;the&nbsp;next&nbsp;set&nbsp;of&nbsp;items<br>
-in&nbsp;the&nbsp;collection.<br>
-&nbsp;<br>
-Returns:<br>
-&nbsp;&nbsp;None&nbsp;if&nbsp;there&nbsp;are&nbsp;no&nbsp;more&nbsp;items&nbsp;in&nbsp;the&nbsp;collection.</tt></dd></dl>
-
-<dl><dt><a name="Resource-track"><strong>track</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;real-time&nbsp;activity&nbsp;tracking&nbsp;information<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;lat:&nbsp;string,&nbsp;Latitude&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;lon:&nbsp;string,&nbsp;Longitude&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;pid:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;a&nbsp;place&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;q:&nbsp;string,&nbsp;Full-text&nbsp;search&nbsp;query&nbsp;string.<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;radius:&nbsp;string,&nbsp;Radius&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;bbox:&nbsp;string,&nbsp;Bounding&nbsp;box&nbsp;to&nbsp;use&nbsp;in&nbsp;a&nbsp;geographic&nbsp;location&nbsp;query.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-update"><strong>update</strong></a> = method(self, **kwargs)</dt><dd><tt>Update&nbsp;an&nbsp;activity<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;whose&nbsp;post&nbsp;to&nbsp;update.&nbsp;(required)<br>
-&nbsp;&nbsp;abuseType:&nbsp;string,&nbsp;A&nbsp;parameter<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;to&nbsp;which&nbsp;the&nbsp;activity&nbsp;belongs.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@abuse&nbsp;-&nbsp;Activities&nbsp;reported&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@liked&nbsp;-&nbsp;Activities&nbsp;liked&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@muted&nbsp;-&nbsp;Activities&nbsp;muted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Activities&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;to&nbsp;update.&nbsp;(required)</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/buzz.v1.comments.html b/docs/dyn/buzz.v1.comments.html
deleted file mode 100644
index 12aa3a4..0000000
--- a/docs/dyn/buzz.v1.comments.html
+++ /dev/null
@@ -1,114 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-delete"><strong>delete</strong></a> = method(self, **kwargs)</dt><dd><tt>Delete&nbsp;a&nbsp;comment<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;commentId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;comment&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;for&nbsp;which&nbsp;to&nbsp;delete&nbsp;the&nbsp;comment.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-get"><strong>get</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;a&nbsp;comment<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;commentId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;comment&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;for&nbsp;which&nbsp;to&nbsp;get&nbsp;comments.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-insert"><strong>insert</strong></a> = method(self, **kwargs)</dt><dd><tt>Create&nbsp;a&nbsp;comment<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;on&nbsp;whose&nbsp;behalf&nbsp;to&nbsp;comment.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;on&nbsp;which&nbsp;to&nbsp;comment.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-list"><strong>list</strong></a> = method(self, **kwargs)</dt><dd><tt>List&nbsp;comments<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;for&nbsp;whose&nbsp;post&nbsp;to&nbsp;get&nbsp;comments.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;to&nbsp;which&nbsp;the&nbsp;activity&nbsp;belongs.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Activities&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;for&nbsp;which&nbsp;to&nbsp;get&nbsp;comments.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-patch"><strong>patch</strong></a> = method(self, **kwargs)</dt><dd><tt>Update&nbsp;a&nbsp;comment.&nbsp;This&nbsp;method&nbsp;supports&nbsp;patch&nbsp;semantics.<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;abuseType:&nbsp;string,&nbsp;A&nbsp;parameter<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;commentId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;comment&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;to&nbsp;which&nbsp;the&nbsp;activity&nbsp;belongs.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@abuse&nbsp;-&nbsp;Comments&nbsp;reported&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Comments&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;for&nbsp;which&nbsp;to&nbsp;update&nbsp;the&nbsp;comment.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-update"><strong>update</strong></a> = method(self, **kwargs)</dt><dd><tt>Update&nbsp;a&nbsp;comment<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;abuseType:&nbsp;string,&nbsp;A&nbsp;parameter<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;commentId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;comment&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;to&nbsp;which&nbsp;the&nbsp;activity&nbsp;belongs.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@abuse&nbsp;-&nbsp;Comments&nbsp;reported&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Comments&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;for&nbsp;which&nbsp;to&nbsp;update&nbsp;the&nbsp;comment.&nbsp;(required)</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/buzz.v1.groups.html b/docs/dyn/buzz.v1.groups.html
deleted file mode 100644
index 0676e33..0000000
--- a/docs/dyn/buzz.v1.groups.html
+++ /dev/null
@@ -1,104 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-delete"><strong>delete</strong></a> = method(self, **kwargs)</dt><dd><tt>Delete&nbsp;a&nbsp;group<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;group&nbsp;to&nbsp;delete.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-get"><strong>get</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;a&nbsp;group<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;group&nbsp;to&nbsp;get.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-insert"><strong>insert</strong></a> = method(self, **kwargs)</dt><dd><tt>Create&nbsp;a&nbsp;group<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-list"><strong>list</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;a&nbsp;user's&nbsp;groups<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-list_next"><strong>list_next</strong></a> = methodNext(self, previous)</dt><dd><tt>Retrieve&nbsp;the&nbsp;next&nbsp;page&nbsp;of&nbsp;results.<br>
-&nbsp;<br>
-Takes&nbsp;a&nbsp;single&nbsp;argument,&nbsp;'body',&nbsp;which&nbsp;is&nbsp;the&nbsp;results<br>
-from&nbsp;the&nbsp;last&nbsp;call,&nbsp;and&nbsp;returns&nbsp;the&nbsp;next&nbsp;set&nbsp;of&nbsp;items<br>
-in&nbsp;the&nbsp;collection.<br>
-&nbsp;<br>
-Returns:<br>
-&nbsp;&nbsp;None&nbsp;if&nbsp;there&nbsp;are&nbsp;no&nbsp;more&nbsp;items&nbsp;in&nbsp;the&nbsp;collection.</tt></dd></dl>
-
-<dl><dt><a name="Resource-patch"><strong>patch</strong></a> = method(self, **kwargs)</dt><dd><tt>Update&nbsp;a&nbsp;group.&nbsp;This&nbsp;method&nbsp;supports&nbsp;patch&nbsp;semantics.<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;group&nbsp;to&nbsp;update.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-update"><strong>update</strong></a> = method(self, **kwargs)</dt><dd><tt>Update&nbsp;a&nbsp;group<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;group&nbsp;to&nbsp;update.&nbsp;(required)</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/buzz.v1.html b/docs/dyn/buzz.v1.html
deleted file mode 100644
index 334b0e2..0000000
--- a/docs/dyn/buzz.v1.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-activities"><strong><a href="buzz.v1.activities.html">activities</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
-
-<dl><dt><a name="Resource-comments"><strong><a href="buzz.v1.comments.html">comments</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
-
-<dl><dt><a name="Resource-groups"><strong><a href="buzz.v1.groups.html">groups</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
-
-<dl><dt><a name="Resource-people"><strong><a href="buzz.v1.people.html">people</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
-
-<dl><dt><a name="Resource-photoAlbums"><strong><a href="buzz.v1.photoAlbums.html">photoAlbums</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
-
-<dl><dt><a name="Resource-photos"><strong><a href="buzz.v1.photos.html">photos</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
-
-<dl><dt><a name="Resource-related"><strong><a href="buzz.v1.related.html">related</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/buzz.v1.people.html b/docs/dyn/buzz.v1.people.html
deleted file mode 100644
index 2aa47da..0000000
--- a/docs/dyn/buzz.v1.people.html
+++ /dev/null
@@ -1,142 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-delete"><strong>delete</strong></a> = method(self, **kwargs)</dt><dd><tt>Remove&nbsp;a&nbsp;person&nbsp;from&nbsp;a&nbsp;group<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;personId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;person&nbsp;to&nbsp;remove&nbsp;from&nbsp;the&nbsp;group.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;owner&nbsp;of&nbsp;the&nbsp;group.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;group&nbsp;from&nbsp;which&nbsp;to&nbsp;remove&nbsp;the&nbsp;person.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-get"><strong>get</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;a&nbsp;user&nbsp;profile<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-liked"><strong>liked</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;people&nbsp;who&nbsp;liked&nbsp;an&nbsp;activity<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;A&nbsp;parameter&nbsp;(required)<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;that&nbsp;was&nbsp;liked.&nbsp;(required)<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;A&nbsp;parameter&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@liked&nbsp;-&nbsp;People&nbsp;who&nbsp;liked&nbsp;this&nbsp;activity.</tt></dd></dl>
-
-<dl><dt><a name="Resource-liked_next"><strong>liked_next</strong></a> = methodNext(self, previous)</dt><dd><tt>Retrieve&nbsp;the&nbsp;next&nbsp;page&nbsp;of&nbsp;results.<br>
-&nbsp;<br>
-Takes&nbsp;a&nbsp;single&nbsp;argument,&nbsp;'body',&nbsp;which&nbsp;is&nbsp;the&nbsp;results<br>
-from&nbsp;the&nbsp;last&nbsp;call,&nbsp;and&nbsp;returns&nbsp;the&nbsp;next&nbsp;set&nbsp;of&nbsp;items<br>
-in&nbsp;the&nbsp;collection.<br>
-&nbsp;<br>
-Returns:<br>
-&nbsp;&nbsp;None&nbsp;if&nbsp;there&nbsp;are&nbsp;no&nbsp;more&nbsp;items&nbsp;in&nbsp;the&nbsp;collection.</tt></dd></dl>
-
-<dl><dt><a name="Resource-list"><strong>list</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;people&nbsp;in&nbsp;a&nbsp;group<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;group&nbsp;for&nbsp;which&nbsp;to&nbsp;list&nbsp;users.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-patch"><strong>patch</strong></a> = method(self, **kwargs)</dt><dd><tt>Add&nbsp;a&nbsp;person&nbsp;to&nbsp;a&nbsp;group.&nbsp;This&nbsp;method&nbsp;supports&nbsp;patch&nbsp;semantics.<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;personId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;person&nbsp;to&nbsp;add&nbsp;to&nbsp;the&nbsp;group.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;owner&nbsp;of&nbsp;the&nbsp;group.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;group&nbsp;to&nbsp;which&nbsp;to&nbsp;add&nbsp;the&nbsp;person.&nbsp;(required)</tt></dd></dl>
-
-<dl><dt><a name="Resource-reshared"><strong>reshared</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;people&nbsp;who&nbsp;reshared&nbsp;an&nbsp;activity<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;A&nbsp;parameter&nbsp;(required)<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;that&nbsp;was&nbsp;reshared.&nbsp;(required)<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;A&nbsp;parameter&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@reshared&nbsp;-&nbsp;People&nbsp;who&nbsp;reshared&nbsp;this&nbsp;activity.</tt></dd></dl>
-
-<dl><dt><a name="Resource-search"><strong>search</strong></a> = method(self, **kwargs)</dt><dd><tt>Search&nbsp;for&nbsp;people<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;q:&nbsp;string,&nbsp;Full-text&nbsp;search&nbsp;query&nbsp;string.<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-update"><strong>update</strong></a> = method(self, **kwargs)</dt><dd><tt>Add&nbsp;a&nbsp;person&nbsp;to&nbsp;a&nbsp;group<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;personId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;person&nbsp;to&nbsp;add&nbsp;to&nbsp;the&nbsp;group.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;owner&nbsp;of&nbsp;the&nbsp;group.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;groupId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;group&nbsp;to&nbsp;which&nbsp;to&nbsp;add&nbsp;the&nbsp;person.&nbsp;(required)</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/buzz.v1.photoAlbums.html b/docs/dyn/buzz.v1.photoAlbums.html
deleted file mode 100644
index 4ca4ec5..0000000
--- a/docs/dyn/buzz.v1.photoAlbums.html
+++ /dev/null
@@ -1,74 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-delete"><strong>delete</strong></a> = method(self, **kwargs)</dt><dd><tt>Delete&nbsp;a&nbsp;photo&nbsp;album<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;albumId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;album&nbsp;to&nbsp;delete.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-get"><strong>get</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;a&nbsp;photo&nbsp;album<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;albumId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;album&nbsp;to&nbsp;get.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-insert"><strong>insert</strong></a> = method(self, **kwargs)</dt><dd><tt>Create&nbsp;a&nbsp;photo&nbsp;album<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-list"><strong>list</strong></a> = method(self, **kwargs)</dt><dd><tt>List&nbsp;a&nbsp;user's&nbsp;photo&nbsp;albums<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;of&nbsp;albums&nbsp;to&nbsp;list.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Albums&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/buzz.v1.photos.html b/docs/dyn/buzz.v1.photos.html
deleted file mode 100644
index 847cc6e..0000000
--- a/docs/dyn/buzz.v1.photos.html
+++ /dev/null
@@ -1,104 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-delete"><strong>delete</strong></a> = method(self, **kwargs)</dt><dd><tt>Delete&nbsp;a&nbsp;photo<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;photoId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;photo&nbsp;to&nbsp;delete.&nbsp;(required)<br>
-&nbsp;&nbsp;albumId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;album&nbsp;to&nbsp;which&nbsp;to&nbsp;photo&nbsp;belongs.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-get"><strong>get</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;photo&nbsp;metadata<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;photoId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;photo&nbsp;for&nbsp;which&nbsp;to&nbsp;get&nbsp;metadata.&nbsp;(required)<br>
-&nbsp;&nbsp;albumId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;album&nbsp;containing&nbsp;the&nbsp;photo.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-insert"><strong>insert</strong></a> = method(self, **kwargs)</dt><dd><tt>Upload&nbsp;a&nbsp;photo&nbsp;to&nbsp;an&nbsp;album<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.<br>
-&nbsp;&nbsp;media_body:&nbsp;string,&nbsp;The&nbsp;filename&nbsp;of&nbsp;the&nbsp;media&nbsp;request&nbsp;body.<br>
-&nbsp;&nbsp;albumId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;album&nbsp;to&nbsp;which&nbsp;to&nbsp;upload.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-insert2"><strong>insert2</strong></a> = method(self, **kwargs)</dt><dd><tt>Upload&nbsp;a&nbsp;photo&nbsp;to&nbsp;an&nbsp;album<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.<br>
-&nbsp;&nbsp;media_body:&nbsp;string,&nbsp;The&nbsp;filename&nbsp;of&nbsp;the&nbsp;media&nbsp;request&nbsp;body.<br>
-&nbsp;&nbsp;albumId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;album&nbsp;to&nbsp;which&nbsp;to&nbsp;upload.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-listByAlbum"><strong>listByAlbum</strong></a> = method(self, **kwargs)</dt><dd><tt>List&nbsp;photos&nbsp;in&nbsp;an&nbsp;album<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;albumId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;album&nbsp;for&nbsp;which&nbsp;to&nbsp;list&nbsp;photos.&nbsp;(required)<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<dl><dt><a name="Resource-listByScope"><strong>listByScope</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;a&nbsp;user's&nbsp;photos<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;c:&nbsp;string,&nbsp;A&nbsp;continuation&nbsp;token&nbsp;that&nbsp;allows&nbsp;pagination.<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;max_results:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;include.<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;of&nbsp;photos&nbsp;to&nbsp;list.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@recent&nbsp;-&nbsp;Recent&nbsp;photos&nbsp;uploaded&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/buzz.v1.related.html b/docs/dyn/buzz.v1.related.html
deleted file mode 100644
index 258682a..0000000
--- a/docs/dyn/buzz.v1.related.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: class Resource</title>
-</head><body bgcolor="#f0f0f8">
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="Resource">class <strong>Resource</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
-    
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;for&nbsp;interacting&nbsp;with&nbsp;a&nbsp;resource.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="Resource-list"><strong>list</strong></a> = method(self, **kwargs)</dt><dd><tt>Get&nbsp;related&nbsp;links&nbsp;for&nbsp;an&nbsp;activity<br>
-&nbsp;<br>
-Args:<br>
-&nbsp;&nbsp;userId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;user&nbsp;being&nbsp;referenced.&nbsp;(required)<br>
-&nbsp;&nbsp;hl:&nbsp;string,&nbsp;Language&nbsp;code&nbsp;to&nbsp;limit&nbsp;language&nbsp;results.<br>
-&nbsp;&nbsp;scope:&nbsp;string,&nbsp;The&nbsp;collection&nbsp;to&nbsp;which&nbsp;the&nbsp;activity&nbsp;belongs.&nbsp;(required)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@self&nbsp;-&nbsp;Activities&nbsp;posted&nbsp;by&nbsp;the&nbsp;user.<br>
-&nbsp;&nbsp;alt:&nbsp;string,&nbsp;Specifies&nbsp;an&nbsp;alternative&nbsp;representation&nbsp;type.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atom&nbsp;-&nbsp;Use&nbsp;Atom&nbsp;XML&nbsp;format<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;-&nbsp;Use&nbsp;JSON&nbsp;format<br>
-&nbsp;&nbsp;postId:&nbsp;string,&nbsp;ID&nbsp;of&nbsp;the&nbsp;activity&nbsp;to&nbsp;which&nbsp;to&nbsp;get&nbsp;related&nbsp;links.&nbsp;(required)</tt></dd></dl>
-
-<hr>
-Data descriptors defined here:<br>
-<dl><dt><strong>__dict__</strong></dt>
-<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-<dl><dt><strong>__weakref__</strong></dt>
-<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
-</dl>
-</td></tr></table>
-</body></html>
\ No newline at end of file
diff --git a/docs/dyn/orkut.v2.html b/docs/dyn/orkut.v2.html
index a3a1738..28ef8bc 100644
--- a/docs/dyn/orkut.v2.html
+++ b/docs/dyn/orkut.v2.html
@@ -26,6 +26,8 @@
 
 <dl><dt><a name="Resource-counters"><strong><a href="orkut.v2.counters.html">counters</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
 
+<dl><dt><a name="Resource-scraps"><strong><a href="orkut.v2.scraps.html">scraps</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
+
 <hr>
 Data descriptors defined here:<br>
 <dl><dt><strong>__dict__</strong></dt>
diff --git a/docs/dyn/adexchangebuyer.v1.html b/docs/dyn/orkut.v2.scraps.html
similarity index 81%
rename from docs/dyn/adexchangebuyer.v1.html
rename to docs/dyn/orkut.v2.scraps.html
index 1aec0ec..15a00e7 100644
--- a/docs/dyn/adexchangebuyer.v1.html
+++ b/docs/dyn/orkut.v2.scraps.html
@@ -14,7 +14,10 @@
 <td width="100%">Methods defined here:<br>
 <dl><dt><a name="Resource-__init__"><strong>__init__</strong></a>(self)</dt></dl>
 
-<dl><dt><a name="Resource-accounts"><strong><a href="adexchangebuyer.v1.accounts.html">accounts</a></strong></a> = methodResource(self)</dt><dd><tt>A&nbsp;collection&nbsp;resource.</tt></dd></dl>
+<dl><dt><a name="Resource-insert"><strong>insert</strong></a> = method(self, **kwargs)</dt><dd><tt>Creates&nbsp;a&nbsp;new&nbsp;scrap.<br>
+&nbsp;<br>
+Args:<br>
+&nbsp;&nbsp;body:&nbsp;object,&nbsp;The&nbsp;request&nbsp;body.&nbsp;(required)</tt></dd></dl>
 
 <hr>
 Data descriptors defined here:<br>
diff --git a/docs/dyn/plus.v1.activities.html b/docs/dyn/plus.v1.activities.html
index 8efeda3..8aa998e 100644
--- a/docs/dyn/plus.v1.activities.html
+++ b/docs/dyn/plus.v1.activities.html
@@ -52,9 +52,10 @@
 &nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best&nbsp;-&nbsp;Sort&nbsp;activities&nbsp;by&nbsp;relevance&nbsp;to&nbsp;the&nbsp;user,&nbsp;most&nbsp;relevant&nbsp;first.<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recent&nbsp;-&nbsp;Sort&nbsp;activities&nbsp;by&nbsp;published&nbsp;date,&nbsp;most&nbsp;recent&nbsp;first.<br>
+&nbsp;&nbsp;language:&nbsp;string,&nbsp;Specify&nbsp;the&nbsp;preferred&nbsp;language&nbsp;to&nbsp;search&nbsp;with.&nbsp;See&nbsp;Language&nbsp;Codes&nbsp;for&nbsp;available&nbsp;values.<br>
 &nbsp;&nbsp;pageToken:&nbsp;string,&nbsp;The&nbsp;continuation&nbsp;token,&nbsp;used&nbsp;to&nbsp;page&nbsp;through&nbsp;large&nbsp;result&nbsp;sets.&nbsp;To&nbsp;get&nbsp;the&nbsp;next&nbsp;page&nbsp;of&nbsp;results,&nbsp;set&nbsp;this&nbsp;parameter&nbsp;to&nbsp;the&nbsp;value&nbsp;of&nbsp;"nextPageToken"&nbsp;from&nbsp;the&nbsp;previous&nbsp;response.&nbsp;This&nbsp;token&nbsp;may&nbsp;be&nbsp;of&nbsp;any&nbsp;length.<br>
 &nbsp;&nbsp;maxResults:&nbsp;integer,&nbsp;The&nbsp;maximum&nbsp;number&nbsp;of&nbsp;activities&nbsp;to&nbsp;include&nbsp;in&nbsp;the&nbsp;response,&nbsp;used&nbsp;for&nbsp;paging.&nbsp;For&nbsp;any&nbsp;response,&nbsp;the&nbsp;actual&nbsp;number&nbsp;returned&nbsp;may&nbsp;be&nbsp;less&nbsp;than&nbsp;the&nbsp;specified&nbsp;maxResults.<br>
-&nbsp;&nbsp;query:&nbsp;string,&nbsp;Full-text&nbsp;search&nbsp;query&nbsp;string.</tt></dd></dl>
+&nbsp;&nbsp;query:&nbsp;string,&nbsp;Full-text&nbsp;search&nbsp;query&nbsp;string.&nbsp;(required)</tt></dd></dl>
 
 <dl><dt><a name="Resource-search_next"><strong>search_next</strong></a> = methodNext(self, previous_request, previous_response)</dt><dd><tt>Retrieves&nbsp;the&nbsp;next&nbsp;page&nbsp;of&nbsp;results.<br>
 &nbsp;<br>
diff --git a/docs/dyn/plus.v1.people.html b/docs/dyn/plus.v1.people.html
index 9627350..1c0d759 100644
--- a/docs/dyn/plus.v1.people.html
+++ b/docs/dyn/plus.v1.people.html
@@ -43,9 +43,10 @@
 <dl><dt><a name="Resource-search"><strong>search</strong></a> = method(self, **kwargs)</dt><dd><tt>Search&nbsp;all&nbsp;public&nbsp;profiles.<br>
 &nbsp;<br>
 Args:<br>
+&nbsp;&nbsp;language:&nbsp;string,&nbsp;Specify&nbsp;the&nbsp;preferred&nbsp;language&nbsp;to&nbsp;search&nbsp;with.&nbsp;See&nbsp;Language&nbsp;Codes&nbsp;for&nbsp;available&nbsp;values.<br>
 &nbsp;&nbsp;pageToken:&nbsp;string,&nbsp;The&nbsp;continuation&nbsp;token,&nbsp;used&nbsp;to&nbsp;page&nbsp;through&nbsp;large&nbsp;result&nbsp;sets.&nbsp;To&nbsp;get&nbsp;the&nbsp;next&nbsp;page&nbsp;of&nbsp;results,&nbsp;set&nbsp;this&nbsp;parameter&nbsp;to&nbsp;the&nbsp;value&nbsp;of&nbsp;"nextPageToken"&nbsp;from&nbsp;the&nbsp;previous&nbsp;response.&nbsp;This&nbsp;token&nbsp;may&nbsp;be&nbsp;of&nbsp;any&nbsp;length.<br>
 &nbsp;&nbsp;maxResults:&nbsp;integer,&nbsp;The&nbsp;maximum&nbsp;number&nbsp;of&nbsp;people&nbsp;to&nbsp;include&nbsp;in&nbsp;the&nbsp;response,&nbsp;used&nbsp;for&nbsp;paging.&nbsp;For&nbsp;any&nbsp;response,&nbsp;the&nbsp;actual&nbsp;number&nbsp;returned&nbsp;may&nbsp;be&nbsp;less&nbsp;than&nbsp;the&nbsp;specified&nbsp;maxResults.<br>
-&nbsp;&nbsp;query:&nbsp;string,&nbsp;Full-text&nbsp;search&nbsp;query&nbsp;string.</tt></dd></dl>
+&nbsp;&nbsp;query:&nbsp;string,&nbsp;Full-text&nbsp;search&nbsp;query&nbsp;string.&nbsp;(required)</tt></dd></dl>
 
 <dl><dt><a name="Resource-search_next"><strong>search_next</strong></a> = methodNext(self, previous_request, previous_response)</dt><dd><tt>Retrieves&nbsp;the&nbsp;next&nbsp;page&nbsp;of&nbsp;results.<br>
 &nbsp;<br>
diff --git a/docs/dyn/shopping.v1.products.html b/docs/dyn/shopping.v1.products.html
index 55d04f7..fd874fb 100644
--- a/docs/dyn/shopping.v1.products.html
+++ b/docs/dyn/shopping.v1.products.html
@@ -47,13 +47,11 @@
 &nbsp;&nbsp;debug_rdcRequest:&nbsp;boolean,&nbsp;Google&nbsp;Internal<br>
 &nbsp;&nbsp;taxonomy:&nbsp;string,&nbsp;Taxonomy&nbsp;name<br>
 &nbsp;&nbsp;promotions_enabled:&nbsp;boolean,&nbsp;Whether&nbsp;to&nbsp;return&nbsp;promotion&nbsp;information<br>
-&nbsp;&nbsp;shelfSpaceAds_enabled:&nbsp;boolean,&nbsp;Whether&nbsp;to&nbsp;return&nbsp;shelf&nbsp;space&nbsp;ads<br>
 &nbsp;&nbsp;debug_rdcResponse:&nbsp;boolean,&nbsp;Google&nbsp;Internal<br>
 &nbsp;&nbsp;productFields:&nbsp;string,&nbsp;Google&nbsp;Internal<br>
 &nbsp;&nbsp;channels:&nbsp;string,&nbsp;Channels&nbsp;specification<br>
 &nbsp;&nbsp;facets_discover:&nbsp;string,&nbsp;Facets&nbsp;to&nbsp;discover<br>
 &nbsp;&nbsp;startIndex:&nbsp;integer,&nbsp;Index&nbsp;(1-based)&nbsp;of&nbsp;first&nbsp;product&nbsp;to&nbsp;return<br>
-&nbsp;&nbsp;attributeFilter:&nbsp;string,&nbsp;Comma&nbsp;separated&nbsp;list&nbsp;of&nbsp;attributes&nbsp;to&nbsp;return<br>
 &nbsp;&nbsp;crowdBy:&nbsp;string,&nbsp;Crowding&nbsp;specification<br>
 &nbsp;&nbsp;spelling_enabled:&nbsp;boolean,&nbsp;Whether&nbsp;to&nbsp;return&nbsp;spelling&nbsp;suggestions<br>
 &nbsp;&nbsp;debug_enabled:&nbsp;boolean,&nbsp;Google&nbsp;Internal<br>
@@ -62,7 +60,7 @@
 &nbsp;&nbsp;useCase:&nbsp;string,&nbsp;One&nbsp;of&nbsp;CommerceSearchUseCase,&nbsp;ShoppingApiUseCase<br>
 &nbsp;&nbsp;debug_geocodeResponse:&nbsp;boolean,&nbsp;Google&nbsp;Internal<br>
 &nbsp;&nbsp;location:&nbsp;string,&nbsp;Location&nbsp;used&nbsp;to&nbsp;determine&nbsp;tax&nbsp;and&nbsp;shipping<br>
-&nbsp;&nbsp;categories_include:&nbsp;string,&nbsp;Category&nbsp;specification<br>
+&nbsp;&nbsp;maxVariants:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;variant&nbsp;results&nbsp;to&nbsp;return&nbsp;per&nbsp;result<br>
 &nbsp;&nbsp;debug_searchRequest:&nbsp;boolean,&nbsp;Google&nbsp;Internal<br>
 &nbsp;&nbsp;relatedQueries_enabled:&nbsp;boolean,&nbsp;Whether&nbsp;to&nbsp;return&nbsp;related&nbsp;queries<br>
 &nbsp;&nbsp;facets_useGcsConfig:&nbsp;boolean,&nbsp;Whether&nbsp;to&nbsp;return&nbsp;facet&nbsp;information&nbsp;as&nbsp;configured&nbsp;in&nbsp;the&nbsp;GCS&nbsp;account<br>
@@ -71,8 +69,7 @@
 &nbsp;&nbsp;debug_enableLogging:&nbsp;boolean,&nbsp;Google&nbsp;Internal<br>
 &nbsp;&nbsp;maxResults:&nbsp;integer,&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;results&nbsp;to&nbsp;return<br>
 &nbsp;&nbsp;categories_enabled:&nbsp;boolean,&nbsp;Whether&nbsp;to&nbsp;return&nbsp;category&nbsp;information<br>
-&nbsp;&nbsp;shelfSpaceAds_useGcsConfig:&nbsp;boolean,&nbsp;This&nbsp;parameter&nbsp;is&nbsp;currently&nbsp;ignored<br>
-&nbsp;&nbsp;shelfSpaceAds_maxResults:&nbsp;integer,&nbsp;The&nbsp;maximum&nbsp;number&nbsp;of&nbsp;shelf&nbsp;space&nbsp;ads&nbsp;to&nbsp;return<br>
+&nbsp;&nbsp;attributeFilter:&nbsp;string,&nbsp;Comma&nbsp;separated&nbsp;list&nbsp;of&nbsp;attributes&nbsp;to&nbsp;return<br>
 &nbsp;&nbsp;categories_useGcsConfig:&nbsp;boolean,&nbsp;This&nbsp;parameter&nbsp;is&nbsp;currently&nbsp;ignored<br>
 &nbsp;&nbsp;minAvailability:&nbsp;string,&nbsp;A&nbsp;parameter<br>
 &nbsp;&nbsp;&nbsp;&nbsp;Allowed&nbsp;values<br>
@@ -81,7 +78,7 @@
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outOfStock&nbsp;-&nbsp;Out&nbsp;of&nbsp;stock,&nbsp;limited&nbsp;availability&nbsp;and&nbsp;in&nbsp;stock&nbsp;products&nbsp;will&nbsp;be&nbsp;returned<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unknown&nbsp;-&nbsp;All&nbsp;products&nbsp;will&nbsp;be&nbsp;returned<br>
 &nbsp;&nbsp;facets_include:&nbsp;string,&nbsp;Facets&nbsp;to&nbsp;include&nbsp;(applies&nbsp;when&nbsp;useGcsConfig&nbsp;==&nbsp;false)<br>
-&nbsp;&nbsp;thumbnails:&nbsp;string,&nbsp;Image&nbsp;thumbnails&nbsp;specification<br>
+&nbsp;&nbsp;categories_include:&nbsp;string,&nbsp;Category&nbsp;specification<br>
 &nbsp;&nbsp;language:&nbsp;string,&nbsp;Language&nbsp;restriction&nbsp;(BCP&nbsp;47)<br>
 &nbsp;&nbsp;currency:&nbsp;string,&nbsp;Currency&nbsp;restriction&nbsp;(ISO&nbsp;4217)<br>
 &nbsp;&nbsp;sayt_enabled:&nbsp;boolean,&nbsp;Google&nbsp;Internal<br>
@@ -94,7 +91,8 @@
 &nbsp;&nbsp;country:&nbsp;string,&nbsp;Country&nbsp;restriction&nbsp;(ISO&nbsp;3166)<br>
 &nbsp;&nbsp;relatedQueries_useGcsConfig:&nbsp;boolean,&nbsp;This&nbsp;parameter&nbsp;is&nbsp;currently&nbsp;ignored<br>
 &nbsp;&nbsp;promotions_useGcsConfig:&nbsp;boolean,&nbsp;Whether&nbsp;to&nbsp;return&nbsp;promotion&nbsp;information&nbsp;as&nbsp;configured&nbsp;in&nbsp;the&nbsp;GCS&nbsp;account<br>
-&nbsp;&nbsp;plusOne:&nbsp;string,&nbsp;+1&nbsp;rendering&nbsp;specification.</tt></dd></dl>
+&nbsp;&nbsp;plusOne:&nbsp;string,&nbsp;+1&nbsp;rendering&nbsp;specification.<br>
+&nbsp;&nbsp;thumbnails:&nbsp;string,&nbsp;Image&nbsp;thumbnails&nbsp;specification</tt></dd></dl>
 
 <hr>
 Data descriptors defined here:<br>
diff --git a/docs/fakesettings.py b/docs/fakesettings.py
deleted file mode 100644
index 565d2e5..0000000
--- a/docs/fakesettings.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# Django settings for django_sample project.
-import os
-
-DEBUG = True
-TEMPLATE_DEBUG = DEBUG
-
-ADMINS = (
-    # ('Your Name', 'your_email@domain.com'),
-)
-
-MANAGERS = ADMINS
-
-DATABASE_ENGINE = 'sqlite3'
-DATABASE_NAME = 'database.sqlite3'
-DATABASE_USER = ''
-DATABASE_PASSWORD = ''
-DATABASE_HOST = ''
-DATABASE_PORT = ''
-
-# Local time zone for this installation. Choices can be found here:
-# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
-# although not all choices may be available on all operating systems.
-# If running in a Windows environment this must be set to the same as your
-# system time zone.
-TIME_ZONE = 'America/New_York'
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'en-us'
-
-SITE_ID = 1
-
-# If you set this to False, Django will make some optimizations so as not
-# to load the internationalization machinery.
-USE_I18N = True
-
-# Absolute path to the directory that holds media.
-# Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = ''
-
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash if there is a path component (optional in other cases).
-# Examples: "http://media.lawrence.com", "http://example.com/media/"
-MEDIA_URL = ''
-
-# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
-# trailing slash.
-# Examples: "http://foo.com/media/", "/media/".
-ADMIN_MEDIA_PREFIX = '/media/'
-
-# Make this unique, and don't share it with anybody.
-SECRET_KEY = '_=9hq-$t_uv1ckf&s!y2$9g$1dm*6p1cl%*!^mg=7gr)!zj32d'
-
-# List of callables that know how to import templates from various sources.
-TEMPLATE_LOADERS = (
-    'django.template.loaders.filesystem.load_template_source',
-    'django.template.loaders.app_directories.load_template_source',
-#     'django.template.loaders.eggs.load_template_source',
-)
-
-MIDDLEWARE_CLASSES = (
-    'django.middleware.common.CommonMiddleware',
-    'django.contrib.sessions.middleware.SessionMiddleware',
-    'django.contrib.auth.middleware.AuthenticationMiddleware',
-)
-
-ROOT_URLCONF = 'django_sample.urls'
-
-TEMPLATE_DIRS = (
-    # Put strings here, like "/home/html/django_templates"
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-    os.path.join(os.path.dirname(__file__), 'templates')
-)
-
-INSTALLED_APPS = (
-    'django.contrib.admin',
-    'django.contrib.auth',
-    'django.contrib.contenttypes',
-    'django.contrib.sessions',
-    'django.contrib.sites',
-    'django_sample.buzz'
-)
diff --git a/docs/oauth2client.client.html b/docs/oauth2client.client.html
index e8a5152..5a0f5d6 100644
--- a/docs/oauth2client.client.html
+++ b/docs/oauth2client.client.html
@@ -24,7 +24,7 @@
 <a href="datetime.html">datetime</a><br>
 </td><td width="25%" valign=top><a href="httplib2.html">httplib2</a><br>
 <a href="logging.html">logging</a><br>
-<a href="simplejson.html">simplejson</a><br>
+<a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 </td><td width="25%" valign=top><a href="sys.html">sys</a><br>
 <a href="urllib.html">urllib</a><br>
 <a href="urlparse.html">urlparse</a><br>
diff --git a/docs/oauth2client.clientsecrets.html b/docs/oauth2client.clientsecrets.html
index cc438e5..c4100ce 100644
--- a/docs/oauth2client.clientsecrets.html
+++ b/docs/oauth2client.clientsecrets.html
@@ -20,7 +20,7 @@
 <font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
     
 <tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 </td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
 <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
 <tr bgcolor="#ee77aa">
diff --git a/docs/oauth2client.django_orm.html b/docs/oauth2client.django_orm.html
index 19fb474..ba85510 100644
--- a/docs/oauth2client.django_orm.html
+++ b/docs/oauth2client.django_orm.html
@@ -8,7 +8,7 @@
 <td valign=bottom>&nbsp;<br>
 <font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="oauth2client.html"><font color="#ffffff">oauth2client</font></a>.django_orm</strong></big></big></font></td
 ><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiclient/oauth2client/django_orm.py">/usr/local/google/home/jcgregorio/projects/apiclient/oauth2client/django_orm.py</a></font></td></tr></table>
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiclient-release/oauth2client/django_orm.py">/usr/local/google/home/jcgregorio/projects/apiclient-release/oauth2client/django_orm.py</a></font></td></tr></table>
     <p><tt>OAuth&nbsp;2.0&nbsp;utilities&nbsp;for&nbsp;Django.<br>
 &nbsp;<br>
 Utilities&nbsp;for&nbsp;using&nbsp;OAuth&nbsp;2.0&nbsp;in&nbsp;conjunction&nbsp;with<br>
@@ -62,9 +62,15 @@
 Methods defined here:<br>
 <dl><dt><a name="CredentialsField-contribute_to_class"><strong>contribute_to_class</strong></a>(self, cls, name)</dt></dl>
 
-<dl><dt><a name="CredentialsField-db_type"><strong>db_type</strong></a>(self, connection<font color="#909090">=None</font>)</dt></dl>
+<dl><dt><a name="CredentialsField-db_type"><strong>db_type</strong></a> = inner(*args, **kwargs)</dt></dl>
 
-<dl><dt><a name="CredentialsField-get_db_prep_value"><strong>get_db_prep_value</strong></a>(self, value)</dt></dl>
+<dl><dt><a name="CredentialsField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="CredentialsField-get_db_prep_save"><strong>get_db_prep_save</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="CredentialsField-get_db_prep_value"><strong>get_db_prep_value</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="CredentialsField-get_internal_type"><strong>get_internal_type</strong></a>(self)</dt></dl>
 
 <dl><dt><a name="CredentialsField-to_python"><strong>to_python</strong></a>(self, value)</dt></dl>
 
@@ -79,10 +85,14 @@
 
 <dl><dt><a name="CredentialsField-__deepcopy__"><strong>__deepcopy__</strong></a>(self, memodict)</dt></dl>
 
-<dl><dt><a name="CredentialsField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=&lt;class django.db.models.fields.NOT_PROVIDED&gt;</font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>)</dt></dl>
+<dl><dt><a name="CredentialsField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=&lt;class django.db.models.fields.NOT_PROVIDED&gt;</font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>, validators<font color="#909090">=[]</font>, error_messages<font color="#909090">=None</font>)</dt></dl>
 
 <dl><dt><a name="CredentialsField-bind"><strong>bind</strong></a>(self, fieldmapping, original, bound_field_class)</dt></dl>
 
+<dl><dt><a name="CredentialsField-clean"><strong>clean</strong></a>(self, value, model_instance)</dt><dd><tt>Convert&nbsp;the&nbsp;value's&nbsp;type&nbsp;and&nbsp;run&nbsp;validation.&nbsp;Validation&nbsp;errors&nbsp;from&nbsp;to_python<br>
+and&nbsp;validate&nbsp;are&nbsp;propagated.&nbsp;The&nbsp;correct&nbsp;value&nbsp;is&nbsp;returned&nbsp;if&nbsp;no&nbsp;error&nbsp;is<br>
+raised.</tt></dd></dl>
+
 <dl><dt><a name="CredentialsField-formfield"><strong>formfield</strong></a>(self, form_class<font color="#909090">=&lt;class 'django.forms.fields.CharField'&gt;</font>, **kwargs)</dt><dd><tt>Returns&nbsp;a&nbsp;django.forms.<a href="django.db.models.fields.html#Field">Field</a>&nbsp;instance&nbsp;for&nbsp;this&nbsp;database&nbsp;<a href="django.db.models.fields.html#Field">Field</a>.</tt></dd></dl>
 
 <dl><dt><a name="CredentialsField-get_attname"><strong>get_attname</strong></a>(self)</dt></dl>
@@ -96,15 +106,13 @@
 
 <dl><dt><a name="CredentialsField-get_choices_default"><strong>get_choices_default</strong></a>(self)</dt></dl>
 
-<dl><dt><a name="CredentialsField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;prepared&nbsp;for&nbsp;database&nbsp;lookup.</tt></dd></dl>
-
-<dl><dt><a name="CredentialsField-get_db_prep_save"><strong>get_db_prep_save</strong></a>(self, value)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;prepared&nbsp;for&nbsp;saving&nbsp;into&nbsp;a&nbsp;database.</tt></dd></dl>
-
 <dl><dt><a name="CredentialsField-get_default"><strong>get_default</strong></a>(self)</dt><dd><tt>Returns&nbsp;the&nbsp;default&nbsp;value&nbsp;for&nbsp;this&nbsp;field.</tt></dd></dl>
 
 <dl><dt><a name="CredentialsField-get_flatchoices"><strong>get_flatchoices</strong></a>(self, include_blank<font color="#909090">=True</font>, blank_choice<font color="#909090">=[('', '---------')]</font>)</dt><dd><tt>Returns&nbsp;flattened&nbsp;choices&nbsp;with&nbsp;a&nbsp;default&nbsp;blank&nbsp;choice&nbsp;included.</tt></dd></dl>
 
-<dl><dt><a name="CredentialsField-get_internal_type"><strong>get_internal_type</strong></a>(self)</dt></dl>
+<dl><dt><a name="CredentialsField-get_prep_lookup"><strong>get_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Perform&nbsp;preliminary&nbsp;non-db&nbsp;specific&nbsp;lookup&nbsp;checks&nbsp;and&nbsp;conversions</tt></dd></dl>
+
+<dl><dt><a name="CredentialsField-get_prep_value"><strong>get_prep_value</strong></a>(self, value)</dt><dd><tt>Perform&nbsp;preliminary&nbsp;non-db&nbsp;specific&nbsp;value&nbsp;checks&nbsp;and&nbsp;conversions.</tt></dd></dl>
 
 <dl><dt><a name="CredentialsField-get_validator_unique_lookup_type"><strong>get_validator_unique_lookup_type</strong></a>(self)</dt></dl>
 
@@ -112,10 +120,15 @@
 
 <dl><dt><a name="CredentialsField-pre_save"><strong>pre_save</strong></a>(self, model_instance, add)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;just&nbsp;before&nbsp;saving.</tt></dd></dl>
 
+<dl><dt><a name="CredentialsField-run_validators"><strong>run_validators</strong></a>(self, value)</dt></dl>
+
 <dl><dt><a name="CredentialsField-save_form_data"><strong>save_form_data</strong></a>(self, instance, data)</dt></dl>
 
 <dl><dt><a name="CredentialsField-set_attributes_from_name"><strong>set_attributes_from_name</strong></a>(self, name)</dt></dl>
 
+<dl><dt><a name="CredentialsField-validate"><strong>validate</strong></a>(self, value, model_instance)</dt><dd><tt>Validates&nbsp;value&nbsp;and&nbsp;throws&nbsp;ValidationError.&nbsp;Subclasses&nbsp;should&nbsp;override<br>
+this&nbsp;to&nbsp;provide&nbsp;validation&nbsp;logic.</tt></dd></dl>
+
 <dl><dt><a name="CredentialsField-value_from_object"><strong>value_from_object</strong></a>(self, obj)</dt><dd><tt>Returns&nbsp;the&nbsp;value&nbsp;of&nbsp;this&nbsp;field&nbsp;in&nbsp;the&nbsp;given&nbsp;model&nbsp;instance.</tt></dd></dl>
 
 <dl><dt><a name="CredentialsField-value_to_string"><strong>value_to_string</strong></a>(self, obj)</dt><dd><tt>Returns&nbsp;a&nbsp;string&nbsp;value&nbsp;of&nbsp;this&nbsp;field&nbsp;from&nbsp;the&nbsp;passed&nbsp;obj.<br>
@@ -131,6 +144,8 @@
 </dl>
 <dl><dt><strong>choices</strong></dt>
 </dl>
+<dl><dt><strong>description</strong></dt>
+</dl>
 <dl><dt><strong>flatchoices</strong></dt>
 <dd><tt>Flattened&nbsp;version&nbsp;of&nbsp;choices&nbsp;tuple.</tt></dd>
 </dl>
@@ -142,6 +157,10 @@
 
 <dl><dt><strong>creation_counter</strong> = 0</dl>
 
+<dl><dt><strong>default_error_messages</strong> = {'blank': &lt;django.utils.functional.__proxy__ object&gt;, 'invalid_choice': &lt;django.utils.functional.__proxy__ object&gt;, 'null': &lt;django.utils.functional.__proxy__ object&gt;}</dl>
+
+<dl><dt><strong>default_validators</strong> = []</dl>
+
 <dl><dt><strong>empty_strings_allowed</strong> = True</dl>
 
 </td></tr></table> <p>
@@ -160,9 +179,15 @@
 Methods defined here:<br>
 <dl><dt><a name="FlowField-contribute_to_class"><strong>contribute_to_class</strong></a>(self, cls, name)</dt></dl>
 
-<dl><dt><a name="FlowField-db_type"><strong>db_type</strong></a>(self, connection<font color="#909090">=None</font>)</dt></dl>
+<dl><dt><a name="FlowField-db_type"><strong>db_type</strong></a> = inner(*args, **kwargs)</dt></dl>
 
-<dl><dt><a name="FlowField-get_db_prep_value"><strong>get_db_prep_value</strong></a>(self, value)</dt></dl>
+<dl><dt><a name="FlowField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="FlowField-get_db_prep_save"><strong>get_db_prep_save</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="FlowField-get_db_prep_value"><strong>get_db_prep_value</strong></a> = inner(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="FlowField-get_internal_type"><strong>get_internal_type</strong></a>(self)</dt></dl>
 
 <dl><dt><a name="FlowField-to_python"><strong>to_python</strong></a>(self, value)</dt></dl>
 
@@ -177,10 +202,14 @@
 
 <dl><dt><a name="FlowField-__deepcopy__"><strong>__deepcopy__</strong></a>(self, memodict)</dt></dl>
 
-<dl><dt><a name="FlowField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=&lt;class django.db.models.fields.NOT_PROVIDED&gt;</font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>)</dt></dl>
+<dl><dt><a name="FlowField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=&lt;class django.db.models.fields.NOT_PROVIDED&gt;</font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>, validators<font color="#909090">=[]</font>, error_messages<font color="#909090">=None</font>)</dt></dl>
 
 <dl><dt><a name="FlowField-bind"><strong>bind</strong></a>(self, fieldmapping, original, bound_field_class)</dt></dl>
 
+<dl><dt><a name="FlowField-clean"><strong>clean</strong></a>(self, value, model_instance)</dt><dd><tt>Convert&nbsp;the&nbsp;value's&nbsp;type&nbsp;and&nbsp;run&nbsp;validation.&nbsp;Validation&nbsp;errors&nbsp;from&nbsp;to_python<br>
+and&nbsp;validate&nbsp;are&nbsp;propagated.&nbsp;The&nbsp;correct&nbsp;value&nbsp;is&nbsp;returned&nbsp;if&nbsp;no&nbsp;error&nbsp;is<br>
+raised.</tt></dd></dl>
+
 <dl><dt><a name="FlowField-formfield"><strong>formfield</strong></a>(self, form_class<font color="#909090">=&lt;class 'django.forms.fields.CharField'&gt;</font>, **kwargs)</dt><dd><tt>Returns&nbsp;a&nbsp;django.forms.<a href="django.db.models.fields.html#Field">Field</a>&nbsp;instance&nbsp;for&nbsp;this&nbsp;database&nbsp;<a href="django.db.models.fields.html#Field">Field</a>.</tt></dd></dl>
 
 <dl><dt><a name="FlowField-get_attname"><strong>get_attname</strong></a>(self)</dt></dl>
@@ -194,15 +223,13 @@
 
 <dl><dt><a name="FlowField-get_choices_default"><strong>get_choices_default</strong></a>(self)</dt></dl>
 
-<dl><dt><a name="FlowField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;prepared&nbsp;for&nbsp;database&nbsp;lookup.</tt></dd></dl>
-
-<dl><dt><a name="FlowField-get_db_prep_save"><strong>get_db_prep_save</strong></a>(self, value)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;prepared&nbsp;for&nbsp;saving&nbsp;into&nbsp;a&nbsp;database.</tt></dd></dl>
-
 <dl><dt><a name="FlowField-get_default"><strong>get_default</strong></a>(self)</dt><dd><tt>Returns&nbsp;the&nbsp;default&nbsp;value&nbsp;for&nbsp;this&nbsp;field.</tt></dd></dl>
 
 <dl><dt><a name="FlowField-get_flatchoices"><strong>get_flatchoices</strong></a>(self, include_blank<font color="#909090">=True</font>, blank_choice<font color="#909090">=[('', '---------')]</font>)</dt><dd><tt>Returns&nbsp;flattened&nbsp;choices&nbsp;with&nbsp;a&nbsp;default&nbsp;blank&nbsp;choice&nbsp;included.</tt></dd></dl>
 
-<dl><dt><a name="FlowField-get_internal_type"><strong>get_internal_type</strong></a>(self)</dt></dl>
+<dl><dt><a name="FlowField-get_prep_lookup"><strong>get_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Perform&nbsp;preliminary&nbsp;non-db&nbsp;specific&nbsp;lookup&nbsp;checks&nbsp;and&nbsp;conversions</tt></dd></dl>
+
+<dl><dt><a name="FlowField-get_prep_value"><strong>get_prep_value</strong></a>(self, value)</dt><dd><tt>Perform&nbsp;preliminary&nbsp;non-db&nbsp;specific&nbsp;value&nbsp;checks&nbsp;and&nbsp;conversions.</tt></dd></dl>
 
 <dl><dt><a name="FlowField-get_validator_unique_lookup_type"><strong>get_validator_unique_lookup_type</strong></a>(self)</dt></dl>
 
@@ -210,10 +237,15 @@
 
 <dl><dt><a name="FlowField-pre_save"><strong>pre_save</strong></a>(self, model_instance, add)</dt><dd><tt>Returns&nbsp;field's&nbsp;value&nbsp;just&nbsp;before&nbsp;saving.</tt></dd></dl>
 
+<dl><dt><a name="FlowField-run_validators"><strong>run_validators</strong></a>(self, value)</dt></dl>
+
 <dl><dt><a name="FlowField-save_form_data"><strong>save_form_data</strong></a>(self, instance, data)</dt></dl>
 
 <dl><dt><a name="FlowField-set_attributes_from_name"><strong>set_attributes_from_name</strong></a>(self, name)</dt></dl>
 
+<dl><dt><a name="FlowField-validate"><strong>validate</strong></a>(self, value, model_instance)</dt><dd><tt>Validates&nbsp;value&nbsp;and&nbsp;throws&nbsp;ValidationError.&nbsp;Subclasses&nbsp;should&nbsp;override<br>
+this&nbsp;to&nbsp;provide&nbsp;validation&nbsp;logic.</tt></dd></dl>
+
 <dl><dt><a name="FlowField-value_from_object"><strong>value_from_object</strong></a>(self, obj)</dt><dd><tt>Returns&nbsp;the&nbsp;value&nbsp;of&nbsp;this&nbsp;field&nbsp;in&nbsp;the&nbsp;given&nbsp;model&nbsp;instance.</tt></dd></dl>
 
 <dl><dt><a name="FlowField-value_to_string"><strong>value_to_string</strong></a>(self, obj)</dt><dd><tt>Returns&nbsp;a&nbsp;string&nbsp;value&nbsp;of&nbsp;this&nbsp;field&nbsp;from&nbsp;the&nbsp;passed&nbsp;obj.<br>
@@ -229,6 +261,8 @@
 </dl>
 <dl><dt><strong>choices</strong></dt>
 </dl>
+<dl><dt><strong>description</strong></dt>
+</dl>
 <dl><dt><strong>flatchoices</strong></dt>
 <dd><tt>Flattened&nbsp;version&nbsp;of&nbsp;choices&nbsp;tuple.</tt></dd>
 </dl>
@@ -240,6 +274,10 @@
 
 <dl><dt><strong>creation_counter</strong> = 0</dl>
 
+<dl><dt><strong>default_error_messages</strong> = {'blank': &lt;django.utils.functional.__proxy__ object&gt;, 'invalid_choice': &lt;django.utils.functional.__proxy__ object&gt;, 'null': &lt;django.utils.functional.__proxy__ object&gt;}</dl>
+
+<dl><dt><strong>default_validators</strong> = []</dl>
+
 <dl><dt><strong>empty_strings_allowed</strong> = True</dl>
 
 </td></tr></table> <p>
@@ -271,12 +309,12 @@
 &nbsp;&nbsp;key_value:&nbsp;string,&nbsp;key&nbsp;value&nbsp;for&nbsp;the&nbsp;entity&nbsp;that&nbsp;has&nbsp;the&nbsp;credentials<br>
 &nbsp;&nbsp;property_name:&nbsp;string,&nbsp;name&nbsp;of&nbsp;the&nbsp;property&nbsp;that&nbsp;is&nbsp;an&nbsp;CredentialsProperty</tt></dd></dl>
 
-<dl><dt><a name="Storage-get"><strong>get</strong></a>(self)</dt><dd><tt>Retrieve&nbsp;Credential&nbsp;from&nbsp;datastore.<br>
+<dl><dt><a name="Storage-locked_get"><strong>locked_get</strong></a>(self)</dt><dd><tt>Retrieve&nbsp;Credential&nbsp;from&nbsp;datastore.<br>
 &nbsp;<br>
 Returns:<br>
 &nbsp;&nbsp;oauth2client.Credentials</tt></dd></dl>
 
-<dl><dt><a name="Storage-put"><strong>put</strong></a>(self, credentials)</dt><dd><tt>Write&nbsp;a&nbsp;Credentials&nbsp;to&nbsp;the&nbsp;datastore.<br>
+<dl><dt><a name="Storage-locked_put"><strong>locked_put</strong></a>(self, credentials)</dt><dd><tt>Write&nbsp;a&nbsp;Credentials&nbsp;to&nbsp;the&nbsp;datastore.<br>
 &nbsp;<br>
 Args:<br>
 &nbsp;&nbsp;credentials:&nbsp;Credentials,&nbsp;the&nbsp;credentials&nbsp;to&nbsp;store.</tt></dd></dl>
@@ -287,14 +325,14 @@
 &nbsp;<br>
 This&nbsp;lock&nbsp;is&nbsp;not&nbsp;reentrant.</tt></dd></dl>
 
-<dl><dt><a name="Storage-locked_get"><strong>locked_get</strong></a>(self)</dt><dd><tt>Retrieve&nbsp;credential.<br>
+<dl><dt><a name="Storage-get"><strong>get</strong></a>(self)</dt><dd><tt>Retrieve&nbsp;credential.<br>
 &nbsp;<br>
-The&nbsp;<a href="#Storage">Storage</a>&nbsp;lock&nbsp;must&nbsp;be&nbsp;held&nbsp;when&nbsp;this&nbsp;is&nbsp;called.<br>
+The&nbsp;<a href="#Storage">Storage</a>&nbsp;lock&nbsp;must&nbsp;*not*&nbsp;be&nbsp;held&nbsp;when&nbsp;this&nbsp;is&nbsp;called.<br>
 &nbsp;<br>
 Returns:<br>
 &nbsp;&nbsp;oauth2client.client.Credentials</tt></dd></dl>
 
-<dl><dt><a name="Storage-locked_put"><strong>locked_put</strong></a>(self, credentials)</dt><dd><tt>Write&nbsp;a&nbsp;credential.<br>
+<dl><dt><a name="Storage-put"><strong>put</strong></a>(self, credentials)</dt><dd><tt>Write&nbsp;a&nbsp;credential.<br>
 &nbsp;<br>
 The&nbsp;<a href="#Storage">Storage</a>&nbsp;lock&nbsp;must&nbsp;be&nbsp;held&nbsp;when&nbsp;this&nbsp;is&nbsp;called.<br>
 &nbsp;<br>
diff --git a/docs/oauth2client.file.html b/docs/oauth2client.file.html
index 4a5bd55..6ca5460 100644
--- a/docs/oauth2client.file.html
+++ b/docs/oauth2client.file.html
@@ -20,7 +20,7 @@
 <font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
     
 <tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 </td><td width="25%" valign=top><a href="threading.html">threading</a><br>
 </td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
 <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
diff --git a/docs/oauth2client.multistore_file.html b/docs/oauth2client.multistore_file.html
index 4cfcf47..468d904 100644
--- a/docs/oauth2client.multistore_file.html
+++ b/docs/oauth2client.multistore_file.html
@@ -47,7 +47,7 @@
 <a href="fcntl.html">fcntl</a><br>
 </td><td width="25%" valign=top><a href="logging.html">logging</a><br>
 <a href="os.html">os</a><br>
-</td><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+</td><td width="25%" valign=top><a href="django.utils.simplejson.html">django.utils.simplejson</a><br>
 <a href="threading.html">threading</a><br>
 </td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
 <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
diff --git a/functional_tests/__init__.py b/functional_tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/functional_tests/__init__.py
+++ /dev/null
diff --git a/functional_tests/data/buzz_credentials.dat b/functional_tests/data/buzz_credentials.dat
deleted file mode 100644
index 91613e4..0000000
--- a/functional_tests/data/buzz_credentials.dat
+++ /dev/null
@@ -1,50 +0,0 @@
-ccopy_reg
-_reconstructor
-p0
-(capiclient.oauth
-OAuthCredentials
-p1
-c__builtin__
-object
-p2
-Ntp3
-Rp4
-(dp5
-S'token'
-p6
-g0
-(coauth2
-Token
-p7
-g2
-Ntp8
-Rp9
-(dp10
-S'secret'
-p11
-S'tsAddOKXxs7dypwkRTCSAvPV'
-p12
-sS'key'
-p13
-S'1/Krdi6C3n47g2ny13MdnZbj7AS77JdgaMVg2fDY7ZmwI'
-p14
-sbsS'consumer'
-p15
-g0
-(coauth2
-Consumer
-p16
-g2
-Ntp17
-Rp18
-(dp19
-g11
-S'anonymous'
-p20
-sg13
-g20
-sbsS'user_agent'
-p21
-S'google-api-client-python-buzz-cmdline/1.0'
-p22
-sb.
\ No newline at end of file
diff --git a/functional_tests/test_services.py b/functional_tests/test_services.py
deleted file mode 100644
index f9263a3..0000000
--- a/functional_tests/test_services.py
+++ /dev/null
@@ -1,288 +0,0 @@
-#!/usr/bin/python2.4
-#
-# Copyright 2010 Google Inc. All Rights Reserved.
-
-"""Discovery document tests
-
-Functional tests that verify we can retrieve data from existing services.
-"""
-
-__author__ = 'ade@google.com (Ade Oshineye)'
-
-import httplib2
-import pprint
-
-from apiclient.discovery import build
-import httplib2
-import logging
-import pickle
-import os
-import time
-import unittest
-
-class BuzzFunctionalTest(unittest.TestCase):
-  def setUp(self):
-    self.buzz = build('buzz', 'v1', developerKey='AIzaSyD7aEm5tyC9BAdoC-MfL0ol7VV1P4zQgig')
-
-  def test_can_get_specific_activity(self):
-    activity = self.buzz.activities().get(userId='105037104815911535953',
-                                     postId='B:z12sspviqyakfvye123wehng0muwz5jzq04').execute()
-
-    self.assertTrue(activity is not None)
-
-  def test_can_get_specific_activity_with_tag_id(self):
-    activity = self.buzz.activities().get(userId='105037104815911535953',
-                                     postId='tag:google.com,2010:buzz:z13ptnw5usmnv15ey22fzlswnuqoebasu').execute()
-
-    self.assertTrue(activity is not None)
-
-  def test_can_get_buzz_activities_with_many_params(self):
-    max_results = 2
-    activities_command = self.buzz.activities()
-    activities = activities_command.list(userId='googlebuzz', scope='@self',
-                             max_comments=max_results*2 ,max_liked=max_results*3,
-                             max_results=max_results).execute()
-    activity_count = len(activities['items'])
-    self.assertEquals(max_results, activity_count)
-
-    activities = activities_command.list_next(activities).execute()
-    activity_count = len(activities['items'])
-    self.assertEquals(max_results, activity_count)
-
-  def test_can_get_multiple_pages_of_buzz_activities(self):
-    max_results = 2
-    activities_command = self.buzz.activities()
-
-    activities = activities_command.list(userId='adewale', scope='@self',
-                             max_results=max_results).execute()
-    for count in range(10):
-      activities = activities_command.list_next(activities).execute()
-      activity_count = len(activities['items'])
-      self.assertEquals(max_results, activity_count, 'Failed after %s pages' % str(count))
-
-  def IGNORE_test_can_get_multiple_pages_of_buzz_likers(self):
-    # Ignore this test until the Buzz API fixes the bug with next links
-    # http://code.google.com/p/google-buzz-api/issues/detail?id=114
-    max_results = 1
-    people_cmd = self.buzz.people()
-    # The post https://www.googleapis.com/buzz/v1/activities/111062888259659218284/@self/B:z13nh535yk2syfob004cdjyb3mjeulcwv3c?alt=json#
-    #Perform this call https://www.googleapis.com/buzz/v1/activities/111062888259659218284/@self/B:z13nh535yk2syfob004cdjyb3mjeulcwv3c/@liked?alt=json&max-results=1
-    people = people_cmd.liked(groupId='@liked', userId='googlebuzz', scope='@self',
-                              postId='B:z13nh535yk2syfob004cdjyb3mjeulcwv3c', max_results=max_results).execute()
-
-    for count in range(10):
-      print count
-      people = people_cmd.liked_next(people).execute()
-      people_count = len(people['items'])
-      self.assertEquals(max_results, people_count, 'Failed after %s pages' % str(count))
-
-  def test_can_get_user_profile(self):
-    person = self.buzz.people().get(userId='googlebuzz').execute()
-
-    self.assertTrue(person is not None)
-    self.assertEquals('buzz#person', person['kind'])
-    self.assertEquals('Google Buzz Team', person['displayName'])
-    self.assertEquals('111062888259659218284', person['id'])
-    self.assertEquals('https://profiles.google.com/googlebuzz', person['profileUrl'])
-
-  def test_can_get_user_profile_using_numeric_identifier(self):
-    person = self.buzz.people().get(userId='108242092577082601423').execute()
-
-    self.assertTrue(person is not None)
-    self.assertEquals('buzz#person', person['kind'])
-    self.assertEquals('Test Account', person['displayName'])
-    self.assertEquals('108242092577082601423', person['id'])
-    self.assertEquals('https://profiles.google.com/108242092577082601423', person['profileUrl'])
-
-  def test_can_get_followees_of_user(self):
-    expected_followees = 30
-    following = self.buzz.people().list(userId='googlebuzz', groupId='@following', max_results=expected_followees).execute()
-
-    self.assertEquals(expected_followees, following['totalResults'])
-    self.assertEquals(expected_followees, len(following['entry']))
-
-  def test_can_efficiently_get_follower_count_of_user(self):
-
-    # Restricting max_results to 1 means only a tiny amount of data comes back but the totalResults still has the total.
-    followers = self.buzz.people().list(userId='googlebuzz', groupId='@followers',
-                                   max_results='1').execute()
-
-    # @googlebuzz has a large but fluctuating number of followers
-    # It is sufficient if the result is bigger than 10, 000
-    follower_count = followers['totalResults']
-    self.assertTrue(follower_count > 10000, follower_count)
-
-  def test_follower_count_is_missing_for_user_with_hidden_follower_count(self):
-    followers = self.buzz.people().list(userId='adewale', groupId='@followers').execute()
-
-    self.assertFalse('totalResults' in followers)
-
-
-class BuzzAuthenticatedFunctionalTest(unittest.TestCase):
-  def __init__(self, method_name):
-    unittest.TestCase.__init__(self, method_name)
-    credentials_dir = os.path.join(logging.os.path.dirname(__file__), './data')
-    f = file(os.path.join(credentials_dir, 'buzz_credentials.dat'), 'r')
-    credentials = pickle.loads(f.read())
-    f.close()
-
-    self.http = credentials.authorize(httplib2.Http())
-    self.buzz = build('buzz', 'v1', http=self.http, developerKey='AIzaSyD7aEm5tyC9BAdoC-MfL0ol7VV1P4zQgig')
-
-  def test_can_create_activity(self):
-
-    activity = self.buzz.activities().insert(userId='@me', body={
-        'data': {
-            'title': 'Testing insert',
-            'object': {
-                'content': u'Just a short note to show that insert is working. ?',
-                'type': 'note'}
-            }
-        }
-    ).execute()
-    self.assertTrue(activity is not None)
-
-  def test_fields_parameter_restricts_response_fields(self):
-    activity = self.buzz.activities().insert(userId='@me', body={
-        'data': {
-            'title': 'Testing patch',
-            'object': {
-                'content': u'Just a short note to show that insert is working. ?',
-                'type': 'note'}
-            }
-        }
-    ).execute()
-    self.assertTrue('kind' in activity)
-
-    # test fields to restrict what is returned
-    activity = self.buzz.activities().get(userId='@me', postId=activity['id'],
-                                        fields='object,id').execute()
-    self.assertTrue('kind' not in activity)
-    self.assertTrue('object' in activity)
-    self.assertTrue('id' in activity)
-
-  def test_patch(self):
-    activity = self.buzz.activities().insert(userId='@me', body={
-        'data': {
-            'title': 'Testing patch',
-            'object': {
-                'content': u'Just a short note to show that insert is working. ?',
-                'type': 'note'}
-            }
-        }).execute()
-    # Construct a raw patch to send, also restrict the response with fields
-    activity = self.buzz.activities().patch(userId='@me',
-                                            scope='@self',
-                                            postId=activity['id'],
-                                            body={
-        'object': {
-            'content': 'Updated content only!'}},
-        fields='object').execute()
-    self.assertEquals(activity['object']['content'], 'Updated content only!')
-    self.assertTrue('id' not in activity)
-
-  def test_can_create_private_activity(self):
-    activity = self.buzz.activities().insert(userId='@me', body={
-        'data': {
-            'title': 'Testing insert',
-            'object': {
-                'content': 'This is a private post.'
-                },
-            'visibility': {
-                'entries': [
-                    { 'id': 'tag:google.com,2010:buzz-group:108242092577082601423:13' }
-                    ]
-                }
-            }
-        }
-    ).execute()
-    self.assertTrue(activity is not None)
-
-  def test_can_create_and_delete_new_group(self):
-    group_name = 'New Group Created At' + str(time.time())
-    group = self.buzz.groups().insert(userId='@me', body = {
-      'data': {
-        'title': group_name
-      }
-    }).execute()
-    self.assertTrue(group is not None)
-
-    result = self.buzz.groups().delete(userId='@me', groupId=group['id']).execute()
-    self.assertEquals({}, result)
-
-  def test_can_identify_number_of_groups_belonging_to_user(self):
-    groups = self.buzz.groups().list(userId='108242092577082601423').execute()
-
-    # This should work as long as no-one deletes the 4 default groups for this test account
-    expected_default_number_of_groups = 4
-    self.assertTrue(len(groups['items']) > expected_default_number_of_groups)
-
-  def IGNORE__test_can_like_activity(self):
-    activity = self.buzz.activities().insert(userId='@me', body={
-        'data': {
-            'title': 'Testing insert',
-            'object': {
-                'content': u'Just a short note to show that insert is working. ?',
-                'type': 'note'}
-            }
-        }
-    ).execute()
-    pprint.pprint(activity)
-    id = activity['id']
-    likers = self.buzz.people().liked(userId='105037104815911535953', postId=id, groupId='@liked', scope='@self').execute()
-    # Todo(ade) Insert the new liker once the Buzz back-end bug is fixed
-
-  def test_can_comment_on_activity(self):
-    activity = self.buzz.activities().insert(userId='@me', body={
-        'data': {
-            'title': 'A new activity',
-            'object': {
-                'content': u'The body of the new activity',
-                'type': 'note'}
-            }
-        }
-    ).execute()
-
-    id = activity['id']
-    comment = self.buzz.comments().insert(userId='@me', postId=id, body={
-        'data': {
-            'content': 'A comment on the new activity'
-            }
-    }).execute()
-
-  def test_can_list_groups_belonging_to_user(self):
-    groups = self.buzz.groups().list(userId='108242092577082601423').execute()
-
-    group = self.buzz.groups().get(userId='108242092577082601423', groupId='G:108242092577082601423:15').execute()
-    self.assertEquals('G:108242092577082601423:15', group['id'], group)
-
-    group = self.buzz.groups().get(userId='108242092577082601423', groupId='G:108242092577082601423:14').execute()
-    self.assertEquals('G:108242092577082601423:14', group['id'], group)
-
-    group = self.buzz.groups().get(userId='108242092577082601423', groupId='G:108242092577082601423:13').execute()
-    self.assertEquals('G:108242092577082601423:13', group['id'], group)
-
-    group = self.buzz.groups().get(userId='108242092577082601423', groupId='G:108242092577082601423:6').execute()
-    self.assertEquals('G:108242092577082601423:6', group['id'], group)
-
-  def test_can_delete_activity(self):
-    activity = self.buzz.activities().insert(userId='@me', body={
-        'data': {
-            'title': 'Activity to be deleted',
-            'object': {
-                'content': u'Created this activity so that it can be deleted.',
-                'type': 'note'}
-            }
-        }
-    ).execute()
-    id = activity['id']
-
-    self.buzz.activities().delete(scope='@self', userId='@me', postId=id).execute()
-    time.sleep(2)
-
-    activity_url = activity['links']['self'][0]['href']
-    resp, content = self.http.request(activity_url, 'GET')
-    self.assertEquals(404, resp.status)
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/gflags.py b/gflags.py
deleted file mode 100644
index 8bf2edf..0000000
--- a/gflags.py
+++ /dev/null
@@ -1,2712 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2007, Google Inc.
-# 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.
-#
-# ---
-# Author: Chad Lester
-# Design and style contributions by:
-#   Amit Patel, Bogdan Cocosel, Daniel Dulitz, Eric Tiedemann,
-#   Eric Veach, Laurence Gonsalves, Matthew Springer
-# Code reorganized a bit by Craig Silverstein
-
-"""This module is used to define and parse command line flags.
-
-This module defines a *distributed* flag-definition policy: rather than
-an application having to define all flags in or near main(), each python
-module defines flags that are useful to it.  When one python module
-imports another, it gains access to the other's flags.  (This is
-implemented by having all modules share a common, global registry object
-containing all the flag information.)
-
-Flags are defined through the use of one of the DEFINE_xxx functions.
-The specific function used determines how the flag is parsed, checked,
-and optionally type-converted, when it's seen on the command line.
-
-
-IMPLEMENTATION: DEFINE_* creates a 'Flag' object and registers it with a
-'FlagValues' object (typically the global FlagValues FLAGS, defined
-here).  The 'FlagValues' object can scan the command line arguments and
-pass flag arguments to the corresponding 'Flag' objects for
-value-checking and type conversion.  The converted flag values are
-available as attributes of the 'FlagValues' object.
-
-Code can access the flag through a FlagValues object, for instance
-gflags.FLAGS.myflag.  Typically, the __main__ module passes the
-command line arguments to gflags.FLAGS for parsing.
-
-At bottom, this module calls getopt(), so getopt functionality is
-supported, including short- and long-style flags, and the use of -- to
-terminate flags.
-
-Methods defined by the flag module will throw 'FlagsError' exceptions.
-The exception argument will be a human-readable string.
-
-
-FLAG TYPES: This is a list of the DEFINE_*'s that you can do.  All flags
-take a name, default value, help-string, and optional 'short' name
-(one-letter name).  Some flags have other arguments, which are described
-with the flag.
-
-DEFINE_string: takes any input, and interprets it as a string.
-
-DEFINE_bool or
-DEFINE_boolean: typically does not take an argument: say --myflag to
-                set FLAGS.myflag to true, or --nomyflag to set
-                FLAGS.myflag to false.  Alternately, you can say
-                   --myflag=true  or --myflag=t or --myflag=1  or
-                   --myflag=false or --myflag=f or --myflag=0
-
-DEFINE_float: takes an input and interprets it as a floating point
-              number.  Takes optional args lower_bound and upper_bound;
-              if the number specified on the command line is out of
-              range, it will raise a FlagError.
-
-DEFINE_integer: takes an input and interprets it as an integer.  Takes
-                optional args lower_bound and upper_bound as for floats.
-
-DEFINE_enum: takes a list of strings which represents legal values.  If
-             the command-line value is not in this list, raise a flag
-             error.  Otherwise, assign to FLAGS.flag as a string.
-
-DEFINE_list: Takes a comma-separated list of strings on the commandline.
-             Stores them in a python list object.
-
-DEFINE_spaceseplist: Takes a space-separated list of strings on the
-                     commandline.  Stores them in a python list object.
-                     Example: --myspacesepflag "foo bar baz"
-
-DEFINE_multistring: The same as DEFINE_string, except the flag can be
-                    specified more than once on the commandline.  The
-                    result is a python list object (list of strings),
-                    even if the flag is only on the command line once.
-
-DEFINE_multi_int: The same as DEFINE_integer, except the flag can be
-                  specified more than once on the commandline.  The
-                  result is a python list object (list of ints), even if
-                  the flag is only on the command line once.
-
-
-SPECIAL FLAGS: There are a few flags that have special meaning:
-   --help          prints a list of all the flags in a human-readable fashion
-   --helpshort     prints a list of all key flags (see below).
-   --helpxml       prints a list of all flags, in XML format.  DO NOT parse
-                   the output of --help and --helpshort.  Instead, parse
-                   the output of --helpxml.  For more info, see
-                   "OUTPUT FOR --helpxml" below.
-   --flagfile=foo  read flags from file foo.
-   --undefok=f1,f2 ignore unrecognized option errors for f1,f2.
-                   For boolean flags, you should use --undefok=boolflag, and
-                   --boolflag and --noboolflag will be accepted.  Do not use
-                   --undefok=noboolflag.
-   --              as in getopt(), terminates flag-processing
-
-
-FLAGS VALIDATORS: If your program:
-  - requires flag X to be specified
-  - needs flag Y to match a regular expression
-  - or requires any more general constraint to be satisfied
-then validators are for you!
-
-Each validator represents a constraint over one flag, which is enforced
-starting from the initial parsing of the flags and until the program
-terminates.
-
-Also, lower_bound and upper_bound for numerical flags are enforced using flag
-validators.
-
-Howto:
-If you want to enforce a constraint over one flag, use
-
-flags.RegisterValidator(flag_name,
-                        checker,
-                        message='Flag validation failed',
-                        flag_values=FLAGS)
-
-After flag values are initially parsed, and after any change to the specified
-flag, method checker(flag_value) will be executed. If constraint is not
-satisfied, an IllegalFlagValue exception will be raised. See
-RegisterValidator's docstring for a detailed explanation on how to construct
-your own checker.
-
-
-EXAMPLE USAGE:
-
-FLAGS = flags.FLAGS
-
-flags.DEFINE_integer('my_version', 0, 'Version number.')
-flags.DEFINE_string('filename', None, 'Input file name', short_name='f')
-
-flags.RegisterValidator('my_version',
-                        lambda value: value % 2 == 0,
-                        message='--my_version must be divisible by 2')
-flags.MarkFlagAsRequired('filename')
-
-
-NOTE ON --flagfile:
-
-Flags may be loaded from text files in addition to being specified on
-the commandline.
-
-Any flags you don't feel like typing, throw them in a file, one flag per
-line, for instance:
-   --myflag=myvalue
-   --nomyboolean_flag
-You then specify your file with the special flag '--flagfile=somefile'.
-You CAN recursively nest flagfile= tokens OR use multiple files on the
-command line.  Lines beginning with a single hash '#' or a double slash
-'//' are comments in your flagfile.
-
-Any flagfile=<file> will be interpreted as having a relative path from
-the current working directory rather than from the place the file was
-included from:
-   myPythonScript.py --flagfile=config/somefile.cfg
-
-If somefile.cfg includes further --flagfile= directives, these will be
-referenced relative to the original CWD, not from the directory the
-including flagfile was found in!
-
-The caveat applies to people who are including a series of nested files
-in a different dir than they are executing out of.  Relative path names
-are always from CWD, not from the directory of the parent include
-flagfile. We do now support '~' expanded directory names.
-
-Absolute path names ALWAYS work!
-
-
-EXAMPLE USAGE:
-
-  import gflags
-  FLAGS = gflags.FLAGS
-
-  # Flag names are globally defined!  So in general, we need to be
-  # careful to pick names that are unlikely to be used by other libraries.
-  # If there is a conflict, we'll get an error at import time.
-  gflags.DEFINE_string('name', 'Mr. President', 'your name')
-  gflags.DEFINE_integer('age', None, 'your age in years', lower_bound=0)
-  gflags.DEFINE_boolean('debug', False, 'produces debugging output')
-  gflags.DEFINE_enum('gender', 'male', ['male', 'female'], 'your gender')
-
-  def main(argv):
-    try:
-      argv = FLAGS(argv)  # parse flags
-    except gflags.FlagsError, e:
-      print '%s\\nUsage: %s ARGS\\n%s' % (e, sys.argv[0], FLAGS)
-      sys.exit(1)
-    if FLAGS.debug: print 'non-flag arguments:', argv
-    print 'Happy Birthday', FLAGS.name
-    if FLAGS.age is not None:
-      print 'You are a %s, who is %d years old' % (FLAGS.gender, FLAGS.age)
-
-  if __name__ == '__main__':
-    main(sys.argv)
-
-
-KEY FLAGS:
-
-As we already explained, each module gains access to all flags defined
-by all the other modules it transitively imports.  In the case of
-non-trivial scripts, this means a lot of flags ...  For documentation
-purposes, it is good to identify the flags that are key (i.e., really
-important) to a module.  Clearly, the concept of "key flag" is a
-subjective one.  When trying to determine whether a flag is key to a
-module or not, assume that you are trying to explain your module to a
-potential user: which flags would you really like to mention first?
-
-We'll describe shortly how to declare which flags are key to a module.
-For the moment, assume we know the set of key flags for each module.
-Then, if you use the app.py module, you can use the --helpshort flag to
-print only the help for the flags that are key to the main module, in a
-human-readable format.
-
-NOTE: If you need to parse the flag help, do NOT use the output of
---help / --helpshort.  That output is meant for human consumption, and
-may be changed in the future.  Instead, use --helpxml; flags that are
-key for the main module are marked there with a <key>yes</key> element.
-
-The set of key flags for a module M is composed of:
-
-1. Flags defined by module M by calling a DEFINE_* function.
-
-2. Flags that module M explictly declares as key by using the function
-
-     DECLARE_key_flag(<flag_name>)
-
-3. Key flags of other modules that M specifies by using the function
-
-     ADOPT_module_key_flags(<other_module>)
-
-   This is a "bulk" declaration of key flags: each flag that is key for
-   <other_module> becomes key for the current module too.
-
-Notice that if you do not use the functions described at points 2 and 3
-above, then --helpshort prints information only about the flags defined
-by the main module of our script.  In many cases, this behavior is good
-enough.  But if you move part of the main module code (together with the
-related flags) into a different module, then it is nice to use
-DECLARE_key_flag / ADOPT_module_key_flags and make sure --helpshort
-lists all relevant flags (otherwise, your code refactoring may confuse
-your users).
-
-Note: each of DECLARE_key_flag / ADOPT_module_key_flags has its own
-pluses and minuses: DECLARE_key_flag is more targeted and may lead a
-more focused --helpshort documentation.  ADOPT_module_key_flags is good
-for cases when an entire module is considered key to the current script.
-Also, it does not require updates to client scripts when a new flag is
-added to the module.
-
-
-EXAMPLE USAGE 2 (WITH KEY FLAGS):
-
-Consider an application that contains the following three files (two
-auxiliary modules and a main module):
-
-File libfoo.py:
-
-  import gflags
-
-  gflags.DEFINE_integer('num_replicas', 3, 'Number of replicas to start')
-  gflags.DEFINE_boolean('rpc2', True, 'Turn on the usage of RPC2.')
-
-  ... some code ...
-
-File libbar.py:
-
-  import gflags
-
-  gflags.DEFINE_string('bar_gfs_path', '/gfs/path',
-                       'Path to the GFS files for libbar.')
-  gflags.DEFINE_string('email_for_bar_errors', 'bar-team@google.com',
-                       'Email address for bug reports about module libbar.')
-  gflags.DEFINE_boolean('bar_risky_hack', False,
-                        'Turn on an experimental and buggy optimization.')
-
-  ... some code ...
-
-File myscript.py:
-
-  import gflags
-  import libfoo
-  import libbar
-
-  gflags.DEFINE_integer('num_iterations', 0, 'Number of iterations.')
-
-  # Declare that all flags that are key for libfoo are
-  # key for this module too.
-  gflags.ADOPT_module_key_flags(libfoo)
-
-  # Declare that the flag --bar_gfs_path (defined in libbar) is key
-  # for this module.
-  gflags.DECLARE_key_flag('bar_gfs_path')
-
-  ... some code ...
-
-When myscript is invoked with the flag --helpshort, the resulted help
-message lists information about all the key flags for myscript:
---num_iterations, --num_replicas, --rpc2, and --bar_gfs_path (in
-addition to the special flags --help and --helpshort).
-
-Of course, myscript uses all the flags declared by it (in this case,
-just --num_replicas) or by any of the modules it transitively imports
-(e.g., the modules libfoo, libbar).  E.g., it can access the value of
-FLAGS.bar_risky_hack, even if --bar_risky_hack is not declared as a key
-flag for myscript.
-
-
-OUTPUT FOR --helpxml:
-
-The --helpxml flag generates output with the following structure:
-
-<?xml version="1.0"?>
-<AllFlags>
-  <program>PROGRAM_BASENAME</program>
-  <usage>MAIN_MODULE_DOCSTRING</usage>
-  (<flag>
-    [<key>yes</key>]
-    <file>DECLARING_MODULE</file>
-    <name>FLAG_NAME</name>
-    <meaning>FLAG_HELP_MESSAGE</meaning>
-    <default>DEFAULT_FLAG_VALUE</default>
-    <current>CURRENT_FLAG_VALUE</current>
-    <type>FLAG_TYPE</type>
-    [OPTIONAL_ELEMENTS]
-  </flag>)*
-</AllFlags>
-
-Notes:
-
-1. The output is intentionally similar to the output generated by the
-C++ command-line flag library.  The few differences are due to the
-Python flags that do not have a C++ equivalent (at least not yet),
-e.g., DEFINE_list.
-
-2. New XML elements may be added in the future.
-
-3. DEFAULT_FLAG_VALUE is in serialized form, i.e., the string you can
-pass for this flag on the command-line.  E.g., for a flag defined
-using DEFINE_list, this field may be foo,bar, not ['foo', 'bar'].
-
-4. CURRENT_FLAG_VALUE is produced using str().  This means that the
-string 'false' will be represented in the same way as the boolean
-False.  Using repr() would have removed this ambiguity and simplified
-parsing, but would have broken the compatibility with the C++
-command-line flags.
-
-5. OPTIONAL_ELEMENTS describe elements relevant for certain kinds of
-flags: lower_bound, upper_bound (for flags that specify bounds),
-enum_value (for enum flags), list_separator (for flags that consist of
-a list of values, separated by a special token).
-
-6. We do not provide any example here: please use --helpxml instead.
-"""
-
-import cgi
-import getopt
-import os
-import re
-import string
-import sys
-
-import gflags_validators
-
-# Are we running at least python 2.2?
-try:
-  if tuple(sys.version_info[:3]) < (2,2,0):
-    raise NotImplementedError("requires python 2.2.0 or later")
-except AttributeError:   # a very old python, that lacks sys.version_info
-  raise NotImplementedError("requires python 2.2.0 or later")
-
-# If we're not running at least python 2.2.1, define True, False, and bool.
-# Thanks, Guido, for the code.
-try:
-  True, False, bool
-except NameError:
-  False = 0
-  True = 1
-  def bool(x):
-    if x:
-      return True
-    else:
-      return False
-
-# Are we running under pychecker?
-_RUNNING_PYCHECKER = 'pychecker.python' in sys.modules
-
-
-def _GetCallingModule():
-  """Returns the name of the module that's calling into this module.
-
-  We generally use this function to get the name of the module calling a
-  DEFINE_foo... function.
-  """
-  # Walk down the stack to find the first globals dict that's not ours.
-  for depth in range(1, sys.getrecursionlimit()):
-    if not sys._getframe(depth).f_globals is globals():
-      globals_for_frame = sys._getframe(depth).f_globals
-      module_name = _GetModuleObjectAndName(globals_for_frame)[1]
-      if module_name is not None:
-        return module_name
-  raise AssertionError("No module was found")
-
-
-def _GetThisModuleObjectAndName():
-  """Returns: (module object, module name) for this module."""
-  return _GetModuleObjectAndName(globals())
-
-
-# module exceptions:
-class FlagsError(Exception):
-  """The base class for all flags errors."""
-  pass
-
-
-class DuplicateFlag(FlagsError):
-  """Raised if there is a flag naming conflict."""
-  pass
-
-
-class DuplicateFlagCannotPropagateNoneToSwig(DuplicateFlag):
-  """Special case of DuplicateFlag -- SWIG flag value can't be set to None.
-
-  This can be raised when a duplicate flag is created. Even if allow_override is
-  True, we still abort if the new value is None, because it's currently
-  impossible to pass None default value back to SWIG. See FlagValues.SetDefault
-  for details.
-  """
-  pass
-
-
-# A DuplicateFlagError conveys more information than a
-# DuplicateFlag. Since there are external modules that create
-# DuplicateFlags, the interface to DuplicateFlag shouldn't change.
-class DuplicateFlagError(DuplicateFlag):
-
-  def __init__(self, flagname, flag_values):
-    self.flagname = flagname
-    message = "The flag '%s' is defined twice." % self.flagname
-    flags_by_module = flag_values.FlagsByModuleDict()
-    for module in flags_by_module:
-      for flag in flags_by_module[module]:
-        if flag.name == flagname or flag.short_name == flagname:
-          message = message + " First from " + module + ","
-          break
-    message = message + " Second from " + _GetCallingModule()
-    DuplicateFlag.__init__(self, message)
-
-
-class IllegalFlagValue(FlagsError):
-  """The flag command line argument is illegal."""
-  pass
-
-
-class UnrecognizedFlag(FlagsError):
-  """Raised if a flag is unrecognized."""
-  pass
-
-
-# An UnrecognizedFlagError conveys more information than an UnrecognizedFlag.
-# Since there are external modules that create DuplicateFlags, the interface to
-# DuplicateFlag shouldn't change.  The flagvalue will be assigned the full value
-# of the flag and its argument, if any, allowing handling of unrecognzed flags
-# in an exception handler.
-# If flagvalue is the empty string, then this exception is an due to a
-# reference to a flag that was not already defined.
-class UnrecognizedFlagError(UnrecognizedFlag):
-  def __init__(self, flagname, flagvalue=''):
-    self.flagname = flagname
-    self.flagvalue = flagvalue
-    UnrecognizedFlag.__init__(
-        self, "Unknown command line flag '%s'" % flagname)
-
-# Global variable used by expvar
-_exported_flags = {}
-_help_width = 80  # width of help output
-
-
-def GetHelpWidth():
-  """Returns: an integer, the width of help lines that is used in TextWrap."""
-  return _help_width
-
-
-def CutCommonSpacePrefix(text):
-  """Removes a common space prefix from the lines of a multiline text.
-
-  If the first line does not start with a space, it is left as it is and
-  only in the remaining lines a common space prefix is being searched
-  for. That means the first line will stay untouched. This is especially
-  useful to turn doc strings into help texts. This is because some
-  people prefer to have the doc comment start already after the
-  apostrophy and then align the following lines while others have the
-  apostrophies on a seperately line.
-
-  The function also drops trailing empty lines and ignores empty lines
-  following the initial content line while calculating the initial
-  common whitespace.
-
-  Args:
-    text: text to work on
-
-  Returns:
-    the resulting text
-  """
-  text_lines = text.splitlines()
-  # Drop trailing empty lines
-  while text_lines and not text_lines[-1]:
-    text_lines = text_lines[:-1]
-  if text_lines:
-    # We got some content, is the first line starting with a space?
-    if text_lines[0] and text_lines[0][0].isspace():
-      text_first_line = []
-    else:
-      text_first_line = [text_lines.pop(0)]
-    # Calculate length of common leading whitesppace (only over content lines)
-    common_prefix = os.path.commonprefix([line for line in text_lines if line])
-    space_prefix_len = len(common_prefix) - len(common_prefix.lstrip())
-    # If we have a common space prefix, drop it from all lines
-    if space_prefix_len:
-      for index in xrange(len(text_lines)):
-        if text_lines[index]:
-          text_lines[index] = text_lines[index][space_prefix_len:]
-    return '\n'.join(text_first_line + text_lines)
-  return ''
-
-
-def TextWrap(text, length=None, indent='', firstline_indent=None, tabs='    '):
-  """Wraps a given text to a maximum line length and returns it.
-
-  We turn lines that only contain whitespaces into empty lines.  We keep
-  new lines and tabs (e.g., we do not treat tabs as spaces).
-
-  Args:
-    text:             text to wrap
-    length:           maximum length of a line, includes indentation
-                      if this is None then use GetHelpWidth()
-    indent:           indent for all but first line
-    firstline_indent: indent for first line; if None, fall back to indent
-    tabs:             replacement for tabs
-
-  Returns:
-    wrapped text
-
-  Raises:
-    FlagsError: if indent not shorter than length
-    FlagsError: if firstline_indent not shorter than length
-  """
-  # Get defaults where callee used None
-  if length is None:
-    length = GetHelpWidth()
-  if indent is None:
-    indent = ''
-  if len(indent) >= length:
-    raise FlagsError('Indent must be shorter than length')
-  # In line we will be holding the current line which is to be started
-  # with indent (or firstline_indent if available) and then appended
-  # with words.
-  if firstline_indent is None:
-    firstline_indent = ''
-    line = indent
-  else:
-    line = firstline_indent
-    if len(firstline_indent) >= length:
-      raise FlagsError('First iline indent must be shorter than length')
-
-  # If the callee does not care about tabs we simply convert them to
-  # spaces If callee wanted tabs to be single space then we do that
-  # already here.
-  if not tabs or tabs == ' ':
-    text = text.replace('\t', ' ')
-  else:
-    tabs_are_whitespace = not tabs.strip()
-
-  line_regex = re.compile('([ ]*)(\t*)([^ \t]+)', re.MULTILINE)
-
-  # Split the text into lines and the lines with the regex above. The
-  # resulting lines are collected in result[]. For each split we get the
-  # spaces, the tabs and the next non white space (e.g. next word).
-  result = []
-  for text_line in text.splitlines():
-    # Store result length so we can find out whether processing the next
-    # line gave any new content
-    old_result_len = len(result)
-    # Process next line with line_regex. For optimization we do an rstrip().
-    # - process tabs (changes either line or word, see below)
-    # - process word (first try to squeeze on line, then wrap or force wrap)
-    # Spaces found on the line are ignored, they get added while wrapping as
-    # needed.
-    for spaces, current_tabs, word in line_regex.findall(text_line.rstrip()):
-      # If tabs weren't converted to spaces, handle them now
-      if current_tabs:
-        # If the last thing we added was a space anyway then drop
-        # it. But let's not get rid of the indentation.
-        if (((result and line != indent) or
-             (not result and line != firstline_indent)) and line[-1] == ' '):
-          line = line[:-1]
-        # Add the tabs, if that means adding whitespace, just add it at
-        # the line, the rstrip() code while shorten the line down if
-        # necessary
-        if tabs_are_whitespace:
-          line += tabs * len(current_tabs)
-        else:
-          # if not all tab replacement is whitespace we prepend it to the word
-          word = tabs * len(current_tabs) + word
-      # Handle the case where word cannot be squeezed onto current last line
-      if len(line) + len(word) > length and len(indent) + len(word) <= length:
-        result.append(line.rstrip())
-        line = indent + word
-        word = ''
-        # No space left on line or can we append a space?
-        if len(line) + 1 >= length:
-          result.append(line.rstrip())
-          line = indent
-        else:
-          line += ' '
-      # Add word and shorten it up to allowed line length. Restart next
-      # line with indent and repeat, or add a space if we're done (word
-      # finished) This deals with words that caanot fit on one line
-      # (e.g. indent + word longer than allowed line length).
-      while len(line) + len(word) >= length:
-        line += word
-        result.append(line[:length])
-        word = line[length:]
-        line = indent
-      # Default case, simply append the word and a space
-      if word:
-        line += word + ' '
-    # End of input line. If we have content we finish the line. If the
-    # current line is just the indent but we had content in during this
-    # original line then we need to add an emoty line.
-    if (result and line != indent) or (not result and line != firstline_indent):
-      result.append(line.rstrip())
-    elif len(result) == old_result_len:
-      result.append('')
-    line = indent
-
-  return '\n'.join(result)
-
-
-def DocToHelp(doc):
-  """Takes a __doc__ string and reformats it as help."""
-
-  # Get rid of starting and ending white space. Using lstrip() or even
-  # strip() could drop more than maximum of first line and right space
-  # of last line.
-  doc = doc.strip()
-
-  # Get rid of all empty lines
-  whitespace_only_line = re.compile('^[ \t]+$', re.M)
-  doc = whitespace_only_line.sub('', doc)
-
-  # Cut out common space at line beginnings
-  doc = CutCommonSpacePrefix(doc)
-
-  # Just like this module's comment, comments tend to be aligned somehow.
-  # In other words they all start with the same amount of white space
-  # 1) keep double new lines
-  # 2) keep ws after new lines if not empty line
-  # 3) all other new lines shall be changed to a space
-  # Solution: Match new lines between non white space and replace with space.
-  doc = re.sub('(?<=\S)\n(?=\S)', ' ', doc, re.M)
-
-  return doc
-
-
-def _GetModuleObjectAndName(globals_dict):
-  """Returns the module that defines a global environment, and its name.
-
-  Args:
-    globals_dict: A dictionary that should correspond to an environment
-      providing the values of the globals.
-
-  Returns:
-    A pair consisting of (1) module object and (2) module name (a
-    string).  Returns (None, None) if the module could not be
-    identified.
-  """
-  # The use of .items() (instead of .iteritems()) is NOT a mistake: if
-  # a parallel thread imports a module while we iterate over
-  # .iteritems() (not nice, but possible), we get a RuntimeError ...
-  # Hence, we use the slightly slower but safer .items().
-  for name, module in sys.modules.items():
-    if getattr(module, '__dict__', None) is globals_dict:
-      if name == '__main__':
-        # Pick a more informative name for the main module.
-        name = sys.argv[0]
-      return (module, name)
-  return (None, None)
-
-
-def _GetMainModule():
-  """Returns the name of the module from which execution started."""
-  for depth in range(1, sys.getrecursionlimit()):
-    try:
-      globals_of_main = sys._getframe(depth).f_globals
-    except ValueError:
-      return _GetModuleObjectAndName(globals_of_main)[1]
-  raise AssertionError("No module was found")
-
-
-class FlagValues:
-  """Registry of 'Flag' objects.
-
-  A 'FlagValues' can then scan command line arguments, passing flag
-  arguments through to the 'Flag' objects that it owns.  It also
-  provides easy access to the flag values.  Typically only one
-  'FlagValues' object is needed by an application: gflags.FLAGS
-
-  This class is heavily overloaded:
-
-  'Flag' objects are registered via __setitem__:
-       FLAGS['longname'] = x   # register a new flag
-
-  The .value attribute of the registered 'Flag' objects can be accessed
-  as attributes of this 'FlagValues' object, through __getattr__.  Both
-  the long and short name of the original 'Flag' objects can be used to
-  access its value:
-       FLAGS.longname          # parsed flag value
-       FLAGS.x                 # parsed flag value (short name)
-
-  Command line arguments are scanned and passed to the registered 'Flag'
-  objects through the __call__ method.  Unparsed arguments, including
-  argv[0] (e.g. the program name) are returned.
-       argv = FLAGS(sys.argv)  # scan command line arguments
-
-  The original registered Flag objects can be retrieved through the use
-  of the dictionary-like operator, __getitem__:
-       x = FLAGS['longname']   # access the registered Flag object
-
-  The str() operator of a 'FlagValues' object provides help for all of
-  the registered 'Flag' objects.
-  """
-
-  def __init__(self):
-    # Since everything in this class is so heavily overloaded, the only
-    # way of defining and using fields is to access __dict__ directly.
-
-    # Dictionary: flag name (string) -> Flag object.
-    self.__dict__['__flags'] = {}
-    # Dictionary: module name (string) -> list of Flag objects that are defined
-    # by that module.
-    self.__dict__['__flags_by_module'] = {}
-    # Dictionary: module name (string) -> list of Flag objects that are
-    # key for that module.
-    self.__dict__['__key_flags_by_module'] = {}
-
-    # Set if we should use new style gnu_getopt rather than getopt when parsing
-    # the args.  Only possible with Python 2.3+
-    self.UseGnuGetOpt(False)
-
-  def UseGnuGetOpt(self, use_gnu_getopt=True):
-    self.__dict__['__use_gnu_getopt'] = use_gnu_getopt
-
-  def IsGnuGetOpt(self):
-    return self.__dict__['__use_gnu_getopt']
-
-  def FlagDict(self):
-    return self.__dict__['__flags']
-
-  def FlagsByModuleDict(self):
-    """Returns the dictionary of module_name -> list of defined flags.
-
-    Returns:
-      A dictionary.  Its keys are module names (strings).  Its values
-      are lists of Flag objects.
-    """
-    return self.__dict__['__flags_by_module']
-
-  def KeyFlagsByModuleDict(self):
-    """Returns the dictionary of module_name -> list of key flags.
-
-    Returns:
-      A dictionary.  Its keys are module names (strings).  Its values
-      are lists of Flag objects.
-    """
-    return self.__dict__['__key_flags_by_module']
-
-  def _RegisterFlagByModule(self, module_name, flag):
-    """Records the module that defines a specific flag.
-
-    We keep track of which flag is defined by which module so that we
-    can later sort the flags by module.
-
-    Args:
-      module_name: A string, the name of a Python module.
-      flag: A Flag object, a flag that is key to the module.
-    """
-    flags_by_module = self.FlagsByModuleDict()
-    flags_by_module.setdefault(module_name, []).append(flag)
-
-  def _RegisterKeyFlagForModule(self, module_name, flag):
-    """Specifies that a flag is a key flag for a module.
-
-    Args:
-      module_name: A string, the name of a Python module.
-      flag: A Flag object, a flag that is key to the module.
-    """
-    key_flags_by_module = self.KeyFlagsByModuleDict()
-    # The list of key flags for the module named module_name.
-    key_flags = key_flags_by_module.setdefault(module_name, [])
-    # Add flag, but avoid duplicates.
-    if flag not in key_flags:
-      key_flags.append(flag)
-
-  def _GetFlagsDefinedByModule(self, module):
-    """Returns the list of flags defined by a module.
-
-    Args:
-      module: A module object or a module name (a string).
-
-    Returns:
-      A new list of Flag objects.  Caller may update this list as he
-      wishes: none of those changes will affect the internals of this
-      FlagValue object.
-    """
-    if not isinstance(module, str):
-      module = module.__name__
-
-    return list(self.FlagsByModuleDict().get(module, []))
-
-  def _GetKeyFlagsForModule(self, module):
-    """Returns the list of key flags for a module.
-
-    Args:
-      module: A module object or a module name (a string)
-
-    Returns:
-      A new list of Flag objects.  Caller may update this list as he
-      wishes: none of those changes will affect the internals of this
-      FlagValue object.
-    """
-    if not isinstance(module, str):
-      module = module.__name__
-
-    # Any flag is a key flag for the module that defined it.  NOTE:
-    # key_flags is a fresh list: we can update it without affecting the
-    # internals of this FlagValues object.
-    key_flags = self._GetFlagsDefinedByModule(module)
-
-    # Take into account flags explicitly declared as key for a module.
-    for flag in self.KeyFlagsByModuleDict().get(module, []):
-      if flag not in key_flags:
-        key_flags.append(flag)
-    return key_flags
-
-  def AppendFlagValues(self, flag_values):
-    """Appends flags registered in another FlagValues instance.
-
-    Args:
-      flag_values: registry to copy from
-    """
-    for flag_name, flag in flag_values.FlagDict().iteritems():
-      # Each flags with shortname appears here twice (once under its
-      # normal name, and again with its short name).  To prevent
-      # problems (DuplicateFlagError) with double flag registration, we
-      # perform a check to make sure that the entry we're looking at is
-      # for its normal name.
-      if flag_name == flag.name:
-        self[flag_name] = flag
-
-  def RemoveFlagValues(self, flag_values):
-    """Remove flags that were previously appended from another FlagValues.
-
-    Args:
-      flag_values: registry containing flags to remove.
-    """
-    for flag_name in flag_values.FlagDict():
-      self.__delattr__(flag_name)
-
-  def __setitem__(self, name, flag):
-    """Registers a new flag variable."""
-    fl = self.FlagDict()
-    if not isinstance(flag, Flag):
-      raise IllegalFlagValue(flag)
-    if not isinstance(name, type("")):
-      raise FlagsError("Flag name must be a string")
-    if len(name) == 0:
-      raise FlagsError("Flag name cannot be empty")
-    # If running under pychecker, duplicate keys are likely to be
-    # defined.  Disable check for duplicate keys when pycheck'ing.
-    if (fl.has_key(name) and not flag.allow_override and
-        not fl[name].allow_override and not _RUNNING_PYCHECKER):
-      raise DuplicateFlagError(name, self)
-    short_name = flag.short_name
-    if short_name is not None:
-      if (fl.has_key(short_name) and not flag.allow_override and
-          not fl[short_name].allow_override and not _RUNNING_PYCHECKER):
-        raise DuplicateFlagError(short_name, self)
-      fl[short_name] = flag
-    fl[name] = flag
-    global _exported_flags
-    _exported_flags[name] = flag
-
-  def __getitem__(self, name):
-    """Retrieves the Flag object for the flag --name."""
-    return self.FlagDict()[name]
-
-  def __getattr__(self, name):
-    """Retrieves the 'value' attribute of the flag --name."""
-    fl = self.FlagDict()
-    if not fl.has_key(name):
-      raise AttributeError(name)
-    return fl[name].value
-
-  def __setattr__(self, name, value):
-    """Sets the 'value' attribute of the flag --name."""
-    fl = self.FlagDict()
-    fl[name].value = value
-    self._AssertValidators(fl[name].validators)
-    return value
-
-  def _AssertAllValidators(self):
-    all_validators = set()
-    for flag in self.FlagDict().itervalues():
-      for validator in flag.validators:
-        all_validators.add(validator)
-    self._AssertValidators(all_validators)
-
-  def _AssertValidators(self, validators):
-    """Assert if all validators in the list are satisfied.
-
-    Asserts validators in the order they were created.
-    Args:
-      validators: Iterable(gflags_validators.Validator), validators to be
-        verified
-    Raises:
-      AttributeError: if validators work with a non-existing flag.
-      IllegalFlagValue: if validation fails for at least one validator
-    """
-    for validator in sorted(
-        validators, key=lambda validator: validator.insertion_index):
-      try:
-        validator.Verify(self)
-      except gflags_validators.Error, e:
-        message = validator.PrintFlagsWithValues(self)
-        raise IllegalFlagValue('%s: %s' % (message, str(e)))
-
-  def _FlagIsRegistered(self, flag_obj):
-    """Checks whether a Flag object is registered under some name.
-
-    Note: this is non trivial: in addition to its normal name, a flag
-    may have a short name too.  In self.FlagDict(), both the normal and
-    the short name are mapped to the same flag object.  E.g., calling
-    only "del FLAGS.short_name" is not unregistering the corresponding
-    Flag object (it is still registered under the longer name).
-
-    Args:
-      flag_obj: A Flag object.
-
-    Returns:
-      A boolean: True iff flag_obj is registered under some name.
-    """
-    flag_dict = self.FlagDict()
-    # Check whether flag_obj is registered under its long name.
-    name = flag_obj.name
-    if flag_dict.get(name, None) == flag_obj:
-      return True
-    # Check whether flag_obj is registered under its short name.
-    short_name = flag_obj.short_name
-    if (short_name is not None and
-        flag_dict.get(short_name, None) == flag_obj):
-      return True
-    # The flag cannot be registered under any other name, so we do not
-    # need to do a full search through the values of self.FlagDict().
-    return False
-
-  def __delattr__(self, flag_name):
-    """Deletes a previously-defined flag from a flag object.
-
-    This method makes sure we can delete a flag by using
-
-      del flag_values_object.<flag_name>
-
-    E.g.,
-
-      flags.DEFINE_integer('foo', 1, 'Integer flag.')
-      del flags.FLAGS.foo
-
-    Args:
-      flag_name: A string, the name of the flag to be deleted.
-
-    Raises:
-      AttributeError: When there is no registered flag named flag_name.
-    """
-    fl = self.FlagDict()
-    if flag_name not in fl:
-      raise AttributeError(flag_name)
-
-    flag_obj = fl[flag_name]
-    del fl[flag_name]
-
-    if not self._FlagIsRegistered(flag_obj):
-      # If the Flag object indicated by flag_name is no longer
-      # registered (please see the docstring of _FlagIsRegistered), then
-      # we delete the occurences of the flag object in all our internal
-      # dictionaries.
-      self.__RemoveFlagFromDictByModule(self.FlagsByModuleDict(), flag_obj)
-      self.__RemoveFlagFromDictByModule(self.KeyFlagsByModuleDict(), flag_obj)
-
-  def __RemoveFlagFromDictByModule(self, flags_by_module_dict, flag_obj):
-    """Removes a flag object from a module -> list of flags dictionary.
-
-    Args:
-      flags_by_module_dict: A dictionary that maps module names to lists of
-        flags.
-      flag_obj: A flag object.
-    """
-    for unused_module, flags_in_module in flags_by_module_dict.iteritems():
-      # while (as opposed to if) takes care of multiple occurences of a
-      # flag in the list for the same module.
-      while flag_obj in flags_in_module:
-        flags_in_module.remove(flag_obj)
-
-  def SetDefault(self, name, value):
-    """Changes the default value of the named flag object."""
-    fl = self.FlagDict()
-    if not fl.has_key(name):
-      raise AttributeError(name)
-    fl[name].SetDefault(value)
-    self._AssertValidators(fl[name].validators)
-
-  def __contains__(self, name):
-    """Returns True if name is a value (flag) in the dict."""
-    return name in self.FlagDict()
-
-  has_key = __contains__  # a synonym for __contains__()
-
-  def __iter__(self):
-    return self.FlagDict().iterkeys()
-
-  def __call__(self, argv):
-    """Parses flags from argv; stores parsed flags into this FlagValues object.
-
-    All unparsed arguments are returned.  Flags are parsed using the GNU
-    Program Argument Syntax Conventions, using getopt:
-
-    http://www.gnu.org/software/libc/manual/html_mono/libc.html#Getopt
-
-    Args:
-       argv: argument list. Can be of any type that may be converted to a list.
-
-    Returns:
-       The list of arguments not parsed as options, including argv[0]
-
-    Raises:
-       FlagsError: on any parsing error
-    """
-    # Support any sequence type that can be converted to a list
-    argv = list(argv)
-
-    shortopts = ""
-    longopts = []
-
-    fl = self.FlagDict()
-
-    # This pre parses the argv list for --flagfile=<> options.
-    argv = argv[:1] + self.ReadFlagsFromFiles(argv[1:], force_gnu=False)
-
-    # Correct the argv to support the google style of passing boolean
-    # parameters.  Boolean parameters may be passed by using --mybool,
-    # --nomybool, --mybool=(true|false|1|0).  getopt does not support
-    # having options that may or may not have a parameter.  We replace
-    # instances of the short form --mybool and --nomybool with their
-    # full forms: --mybool=(true|false).
-    original_argv = list(argv)  # list() makes a copy
-    shortest_matches = None
-    for name, flag in fl.items():
-      if not flag.boolean:
-        continue
-      if shortest_matches is None:
-        # Determine the smallest allowable prefix for all flag names
-        shortest_matches = self.ShortestUniquePrefixes(fl)
-      no_name = 'no' + name
-      prefix = shortest_matches[name]
-      no_prefix = shortest_matches[no_name]
-
-      # Replace all occurences of this boolean with extended forms
-      for arg_idx in range(1, len(argv)):
-        arg = argv[arg_idx]
-        if arg.find('=') >= 0: continue
-        if arg.startswith('--'+prefix) and ('--'+name).startswith(arg):
-          argv[arg_idx] = ('--%s=true' % name)
-        elif arg.startswith('--'+no_prefix) and ('--'+no_name).startswith(arg):
-          argv[arg_idx] = ('--%s=false' % name)
-
-    # Loop over all of the flags, building up the lists of short options
-    # and long options that will be passed to getopt.  Short options are
-    # specified as a string of letters, each letter followed by a colon
-    # if it takes an argument.  Long options are stored in an array of
-    # strings.  Each string ends with an '=' if it takes an argument.
-    for name, flag in fl.items():
-      longopts.append(name + "=")
-      if len(name) == 1:  # one-letter option: allow short flag type also
-        shortopts += name
-        if not flag.boolean:
-          shortopts += ":"
-
-    longopts.append('undefok=')
-    undefok_flags = []
-
-    # In case --undefok is specified, loop to pick up unrecognized
-    # options one by one.
-    unrecognized_opts = []
-    args = argv[1:]
-    while True:
-      try:
-        if self.__dict__['__use_gnu_getopt']:
-          optlist, unparsed_args = getopt.gnu_getopt(args, shortopts, longopts)
-        else:
-          optlist, unparsed_args = getopt.getopt(args, shortopts, longopts)
-        break
-      except getopt.GetoptError, e:
-        if not e.opt or e.opt in fl:
-          # Not an unrecognized option, reraise the exception as a FlagsError
-          raise FlagsError(e)
-        # Remove offender from args and try again
-        for arg_index in range(len(args)):
-          if ((args[arg_index] == '--' + e.opt) or
-              (args[arg_index] == '-' + e.opt) or
-              (args[arg_index].startswith('--' + e.opt + '='))):
-            unrecognized_opts.append((e.opt, args[arg_index]))
-            args = args[0:arg_index] + args[arg_index+1:]
-            break
-        else:
-          # We should have found the option, so we don't expect to get
-          # here.  We could assert, but raising the original exception
-          # might work better.
-          raise FlagsError(e)
-
-    for name, arg in optlist:
-      if name == '--undefok':
-        flag_names = arg.split(',')
-        undefok_flags.extend(flag_names)
-        # For boolean flags, if --undefok=boolflag is specified, then we should
-        # also accept --noboolflag, in addition to --boolflag.
-        # Since we don't know the type of the undefok'd flag, this will affect
-        # non-boolean flags as well.
-        # NOTE: You shouldn't use --undefok=noboolflag, because then we will
-        # accept --nonoboolflag here.  We are choosing not to do the conversion
-        # from noboolflag -> boolflag because of the ambiguity that flag names
-        # can start with 'no'.
-        undefok_flags.extend('no' + name for name in flag_names)
-        continue
-      if name.startswith('--'):
-        # long option
-        name = name[2:]
-        short_option = 0
-      else:
-        # short option
-        name = name[1:]
-        short_option = 1
-      if fl.has_key(name):
-        flag = fl[name]
-        if flag.boolean and short_option: arg = 1
-        flag.Parse(arg)
-
-    # If there were unrecognized options, raise an exception unless
-    # the options were named via --undefok.
-    for opt, value in unrecognized_opts:
-      if opt not in undefok_flags:
-        raise UnrecognizedFlagError(opt, value)
-
-    if unparsed_args:
-      if self.__dict__['__use_gnu_getopt']:
-        # if using gnu_getopt just return the program name + remainder of argv.
-        ret_val = argv[:1] + unparsed_args
-      else:
-        # unparsed_args becomes the first non-flag detected by getopt to
-        # the end of argv.  Because argv may have been modified above,
-        # return original_argv for this region.
-        ret_val = argv[:1] + original_argv[-len(unparsed_args):]
-    else:
-      ret_val = argv[:1]
-
-    self._AssertAllValidators()
-    return ret_val
-
-  def Reset(self):
-    """Resets the values to the point before FLAGS(argv) was called."""
-    for f in self.FlagDict().values():
-      f.Unparse()
-
-  def RegisteredFlags(self):
-    """Returns: a list of the names and short names of all registered flags."""
-    return self.FlagDict().keys()
-
-  def FlagValuesDict(self):
-    """Returns: a dictionary that maps flag names to flag values."""
-    flag_values = {}
-
-    for flag_name in self.RegisteredFlags():
-      flag = self.FlagDict()[flag_name]
-      flag_values[flag_name] = flag.value
-
-    return flag_values
-
-  def __str__(self):
-    """Generates a help string for all known flags."""
-    return self.GetHelp()
-
-  def GetHelp(self, prefix=''):
-    """Generates a help string for all known flags."""
-    helplist = []
-
-    flags_by_module = self.FlagsByModuleDict()
-    if flags_by_module:
-
-      modules = flags_by_module.keys()
-      modules.sort()
-
-      # Print the help for the main module first, if possible.
-      main_module = _GetMainModule()
-      if main_module in modules:
-        modules.remove(main_module)
-        modules = [main_module] + modules
-
-      for module in modules:
-        self.__RenderOurModuleFlags(module, helplist)
-
-      self.__RenderModuleFlags('gflags',
-                               _SPECIAL_FLAGS.FlagDict().values(),
-                               helplist)
-
-    else:
-      # Just print one long list of flags.
-      self.__RenderFlagList(
-          self.FlagDict().values() + _SPECIAL_FLAGS.FlagDict().values(),
-          helplist, prefix)
-
-    return '\n'.join(helplist)
-
-  def __RenderModuleFlags(self, module, flags, output_lines, prefix=""):
-    """Generates a help string for a given module."""
-    if not isinstance(module, str):
-      module = module.__name__
-    output_lines.append('\n%s%s:' % (prefix, module))
-    self.__RenderFlagList(flags, output_lines, prefix + "  ")
-
-  def __RenderOurModuleFlags(self, module, output_lines, prefix=""):
-    """Generates a help string for a given module."""
-    flags = self._GetFlagsDefinedByModule(module)
-    if flags:
-      self.__RenderModuleFlags(module, flags, output_lines, prefix)
-
-  def __RenderOurModuleKeyFlags(self, module, output_lines, prefix=""):
-    """Generates a help string for the key flags of a given module.
-
-    Args:
-      module: A module object or a module name (a string).
-      output_lines: A list of strings.  The generated help message
-        lines will be appended to this list.
-      prefix: A string that is prepended to each generated help line.
-    """
-    key_flags = self._GetKeyFlagsForModule(module)
-    if key_flags:
-      self.__RenderModuleFlags(module, key_flags, output_lines, prefix)
-
-  def ModuleHelp(self, module):
-    """Describe the key flags of a module.
-
-    Args:
-      module: A module object or a module name (a string).
-
-    Returns:
-      string describing the key flags of a module.
-    """
-    helplist = []
-    self.__RenderOurModuleKeyFlags(module, helplist)
-    return '\n'.join(helplist)
-
-  def MainModuleHelp(self):
-    """Describe the key flags of the main module.
-
-    Returns:
-      string describing the key flags of a module.
-    """
-    return self.ModuleHelp(_GetMainModule())
-
-  def __RenderFlagList(self, flaglist, output_lines, prefix="  "):
-    fl = self.FlagDict()
-    special_fl = _SPECIAL_FLAGS.FlagDict()
-    flaglist = [(flag.name, flag) for flag in flaglist]
-    flaglist.sort()
-    flagset = {}
-    for (name, flag) in flaglist:
-      # It's possible this flag got deleted or overridden since being
-      # registered in the per-module flaglist.  Check now against the
-      # canonical source of current flag information, the FlagDict.
-      if fl.get(name, None) != flag and special_fl.get(name, None) != flag:
-        # a different flag is using this name now
-        continue
-      # only print help once
-      if flagset.has_key(flag): continue
-      flagset[flag] = 1
-      flaghelp = ""
-      if flag.short_name: flaghelp += "-%s," % flag.short_name
-      if flag.boolean:
-        flaghelp += "--[no]%s" % flag.name + ":"
-      else:
-        flaghelp += "--%s" % flag.name + ":"
-      flaghelp += "  "
-      if flag.help:
-        flaghelp += flag.help
-      flaghelp = TextWrap(flaghelp, indent=prefix+"  ",
-                          firstline_indent=prefix)
-      if flag.default_as_str:
-        flaghelp += "\n"
-        flaghelp += TextWrap("(default: %s)" % flag.default_as_str,
-                             indent=prefix+"  ")
-      if flag.parser.syntactic_help:
-        flaghelp += "\n"
-        flaghelp += TextWrap("(%s)" % flag.parser.syntactic_help,
-                             indent=prefix+"  ")
-      output_lines.append(flaghelp)
-
-  def get(self, name, default):
-    """Returns the value of a flag (if not None) or a default value.
-
-    Args:
-      name: A string, the name of a flag.
-      default: Default value to use if the flag value is None.
-    """
-
-    value = self.__getattr__(name)
-    if value is not None:  # Can't do if not value, b/c value might be '0' or ""
-      return value
-    else:
-      return default
-
-  def ShortestUniquePrefixes(self, fl):
-    """Returns: dictionary; maps flag names to their shortest unique prefix."""
-    # Sort the list of flag names
-    sorted_flags = []
-    for name, flag in fl.items():
-      sorted_flags.append(name)
-      if flag.boolean:
-        sorted_flags.append('no%s' % name)
-    sorted_flags.sort()
-
-    # For each name in the sorted list, determine the shortest unique
-    # prefix by comparing itself to the next name and to the previous
-    # name (the latter check uses cached info from the previous loop).
-    shortest_matches = {}
-    prev_idx = 0
-    for flag_idx in range(len(sorted_flags)):
-      curr = sorted_flags[flag_idx]
-      if flag_idx == (len(sorted_flags) - 1):
-        next = None
-      else:
-        next = sorted_flags[flag_idx+1]
-        next_len = len(next)
-      for curr_idx in range(len(curr)):
-        if (next is None
-            or curr_idx >= next_len
-            or curr[curr_idx] != next[curr_idx]):
-          # curr longer than next or no more chars in common
-          shortest_matches[curr] = curr[:max(prev_idx, curr_idx) + 1]
-          prev_idx = curr_idx
-          break
-      else:
-        # curr shorter than (or equal to) next
-        shortest_matches[curr] = curr
-        prev_idx = curr_idx + 1  # next will need at least one more char
-    return shortest_matches
-
-  def __IsFlagFileDirective(self, flag_string):
-    """Checks whether flag_string contain a --flagfile=<foo> directive."""
-    if isinstance(flag_string, type("")):
-      if flag_string.startswith('--flagfile='):
-        return 1
-      elif flag_string == '--flagfile':
-        return 1
-      elif flag_string.startswith('-flagfile='):
-        return 1
-      elif flag_string == '-flagfile':
-        return 1
-      else:
-        return 0
-    return 0
-
-  def ExtractFilename(self, flagfile_str):
-    """Returns filename from a flagfile_str of form -[-]flagfile=filename.
-
-    The cases of --flagfile foo and -flagfile foo shouldn't be hitting
-    this function, as they are dealt with in the level above this
-    function.
-    """
-    if flagfile_str.startswith('--flagfile='):
-      return os.path.expanduser((flagfile_str[(len('--flagfile=')):]).strip())
-    elif flagfile_str.startswith('-flagfile='):
-      return os.path.expanduser((flagfile_str[(len('-flagfile=')):]).strip())
-    else:
-      raise FlagsError('Hit illegal --flagfile type: %s' % flagfile_str)
-
-  def __GetFlagFileLines(self, filename, parsed_file_list):
-    """Returns the useful (!=comments, etc) lines from a file with flags.
-
-    Args:
-      filename: A string, the name of the flag file.
-      parsed_file_list: A list of the names of the files we have
-        already read.  MUTATED BY THIS FUNCTION.
-
-    Returns:
-      List of strings. See the note below.
-
-    NOTE(springer): This function checks for a nested --flagfile=<foo>
-    tag and handles the lower file recursively. It returns a list of
-    all the lines that _could_ contain command flags. This is
-    EVERYTHING except whitespace lines and comments (lines starting
-    with '#' or '//').
-    """
-    line_list = []  # All line from flagfile.
-    flag_line_list = []  # Subset of lines w/o comments, blanks, flagfile= tags.
-    try:
-      file_obj = open(filename, 'r')
-    except IOError, e_msg:
-      print e_msg
-      print 'ERROR:: Unable to open flagfile: %s' % (filename)
-      return flag_line_list
-
-    line_list = file_obj.readlines()
-    file_obj.close()
-    parsed_file_list.append(filename)
-
-    # This is where we check each line in the file we just read.
-    for line in line_list:
-      if line.isspace():
-        pass
-      # Checks for comment (a line that starts with '#').
-      elif line.startswith('#') or line.startswith('//'):
-        pass
-      # Checks for a nested "--flagfile=<bar>" flag in the current file.
-      # If we find one, recursively parse down into that file.
-      elif self.__IsFlagFileDirective(line):
-        sub_filename = self.ExtractFilename(line)
-        # We do a little safety check for reparsing a file we've already done.
-        if not sub_filename in parsed_file_list:
-          included_flags = self.__GetFlagFileLines(sub_filename,
-                                                   parsed_file_list)
-          flag_line_list.extend(included_flags)
-        else:  # Case of hitting a circularly included file.
-          print >>sys.stderr, ('Warning: Hit circular flagfile dependency: %s'
-                               % sub_filename)
-      else:
-        # Any line that's not a comment or a nested flagfile should get
-        # copied into 2nd position.  This leaves earlier arguements
-        # further back in the list, thus giving them higher priority.
-        flag_line_list.append(line.strip())
-    return flag_line_list
-
-  def ReadFlagsFromFiles(self, argv, force_gnu=True):
-    """Processes command line args, but also allow args to be read from file.
-    Args:
-      argv: A list of strings, usually sys.argv[1:], which may contain one or
-        more flagfile directives of the form --flagfile="./filename".
-        Note that the name of the program (sys.argv[0]) should be omitted.
-      force_gnu: If False, --flagfile parsing obeys normal flag semantics.
-        If True, --flagfile parsing instead follows gnu_getopt semantics.
-        *** WARNING *** force_gnu=False may become the future default!
-
-    Returns:
-
-      A new list which has the original list combined with what we read
-      from any flagfile(s).
-
-    References: Global gflags.FLAG class instance.
-
-    This function should be called before the normal FLAGS(argv) call.
-    This function scans the input list for a flag that looks like:
-    --flagfile=<somefile>. Then it opens <somefile>, reads all valid key
-    and value pairs and inserts them into the input list between the
-    first item of the list and any subsequent items in the list.
-
-    Note that your application's flags are still defined the usual way
-    using gflags DEFINE_flag() type functions.
-
-    Notes (assuming we're getting a commandline of some sort as our input):
-    --> Flags from the command line argv _should_ always take precedence!
-    --> A further "--flagfile=<otherfile.cfg>" CAN be nested in a flagfile.
-        It will be processed after the parent flag file is done.
-    --> For duplicate flags, first one we hit should "win".
-    --> In a flagfile, a line beginning with # or // is a comment.
-    --> Entirely blank lines _should_ be ignored.
-    """
-    parsed_file_list = []
-    rest_of_args = argv
-    new_argv = []
-    while rest_of_args:
-      current_arg = rest_of_args[0]
-      rest_of_args = rest_of_args[1:]
-      if self.__IsFlagFileDirective(current_arg):
-        # This handles the case of -(-)flagfile foo.  In this case the
-        # next arg really is part of this one.
-        if current_arg == '--flagfile' or current_arg == '-flagfile':
-          if not rest_of_args:
-            raise IllegalFlagValue('--flagfile with no argument')
-          flag_filename = os.path.expanduser(rest_of_args[0])
-          rest_of_args = rest_of_args[1:]
-        else:
-          # This handles the case of (-)-flagfile=foo.
-          flag_filename = self.ExtractFilename(current_arg)
-        new_argv[0:0] = self.__GetFlagFileLines(flag_filename, parsed_file_list)
-      else:
-        new_argv.append(current_arg)
-        # Stop parsing after '--', like getopt and gnu_getopt.
-        if current_arg == '--':
-          break
-        # Stop parsing after a non-flag, like getopt.
-        if not current_arg.startswith('-'):
-          if not force_gnu and not self.__dict__['__use_gnu_getopt']:
-            break
-
-    if rest_of_args:
-      new_argv.extend(rest_of_args)
-
-    return new_argv
-
-  def FlagsIntoString(self):
-    """Returns a string with the flags assignments from this FlagValues object.
-
-    This function ignores flags whose value is None.  Each flag
-    assignment is separated by a newline.
-
-    NOTE: MUST mirror the behavior of the C++ function
-    CommandlineFlagsIntoString from google3/base/commandlineflags.cc.
-    """
-    s = ''
-    for flag in self.FlagDict().values():
-      if flag.value is not None:
-        s += flag.Serialize() + '\n'
-    return s
-
-  def AppendFlagsIntoFile(self, filename):
-    """Appends all flags assignments from this FlagInfo object to a file.
-
-    Output will be in the format of a flagfile.
-
-    NOTE: MUST mirror the behavior of the C++ version of
-    AppendFlagsIntoFile from google3/base/commandlineflags.cc.
-    """
-    out_file = open(filename, 'a')
-    out_file.write(self.FlagsIntoString())
-    out_file.close()
-
-  def WriteHelpInXMLFormat(self, outfile=None):
-    """Outputs flag documentation in XML format.
-
-    NOTE: We use element names that are consistent with those used by
-    the C++ command-line flag library, from
-    google3/base/commandlineflags_reporting.cc.  We also use a few new
-    elements (e.g., <key>), but we do not interfere / overlap with
-    existing XML elements used by the C++ library.  Please maintain this
-    consistency.
-
-    Args:
-      outfile: File object we write to.  Default None means sys.stdout.
-    """
-    outfile = outfile or sys.stdout
-
-    outfile.write('<?xml version=\"1.0\"?>\n')
-    outfile.write('<AllFlags>\n')
-    indent = '  '
-    _WriteSimpleXMLElement(outfile, 'program', os.path.basename(sys.argv[0]),
-                           indent)
-
-    usage_doc = sys.modules['__main__'].__doc__
-    if not usage_doc:
-      usage_doc = '\nUSAGE: %s [flags]\n' % sys.argv[0]
-    else:
-      usage_doc = usage_doc.replace('%s', sys.argv[0])
-    _WriteSimpleXMLElement(outfile, 'usage', usage_doc, indent)
-
-    # Get list of key flags for the main module.
-    key_flags = self._GetKeyFlagsForModule(_GetMainModule())
-
-    # Sort flags by declaring module name and next by flag name.
-    flags_by_module = self.FlagsByModuleDict()
-    all_module_names = list(flags_by_module.keys())
-    all_module_names.sort()
-    for module_name in all_module_names:
-      flag_list = [(f.name, f) for f in flags_by_module[module_name]]
-      flag_list.sort()
-      for unused_flag_name, flag in flag_list:
-        is_key = flag in key_flags
-        flag.WriteInfoInXMLFormat(outfile, module_name,
-                                  is_key=is_key, indent=indent)
-
-    outfile.write('</AllFlags>\n')
-    outfile.flush()
-
-  def AddValidator(self, validator):
-    """Register new flags validator to be checked.
-
-    Args:
-      validator: gflags_validators.Validator
-    Raises:
-      AttributeError: if validators work with a non-existing flag.
-    """
-    for flag_name in validator.GetFlagsNames():
-      flag = self.FlagDict()[flag_name]
-      flag.validators.append(validator)
-
-# end of FlagValues definition
-
-
-# The global FlagValues instance
-FLAGS = FlagValues()
-
-
-def _MakeXMLSafe(s):
-  """Escapes <, >, and & from s, and removes XML 1.0-illegal chars."""
-  s = cgi.escape(s)  # Escape <, >, and &
-  # Remove characters that cannot appear in an XML 1.0 document
-  # (http://www.w3.org/TR/REC-xml/#charsets).
-  #
-  # NOTE: if there are problems with current solution, one may move to
-  # XML 1.1, which allows such chars, if they're entity-escaped (&#xHH;).
-  s = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f]', '', s)
-  return s
-
-
-def _WriteSimpleXMLElement(outfile, name, value, indent):
-  """Writes a simple XML element.
-
-  Args:
-    outfile: File object we write the XML element to.
-    name: A string, the name of XML element.
-    value: A Python object, whose string representation will be used
-      as the value of the XML element.
-    indent: A string, prepended to each line of generated output.
-  """
-  value_str = str(value)
-  if isinstance(value, bool):
-    # Display boolean values as the C++ flag library does: no caps.
-    value_str = value_str.lower()
-  outfile.write('%s<%s>%s</%s>\n' %
-                (indent, name, _MakeXMLSafe(value_str), name))
-
-
-class Flag:
-  """Information about a command-line flag.
-
-  'Flag' objects define the following fields:
-    .name  - the name for this flag
-    .default - the default value for this flag
-    .default_as_str - default value as repr'd string, e.g., "'true'" (or None)
-    .value  - the most recent parsed value of this flag; set by Parse()
-    .help  - a help string or None if no help is available
-    .short_name  - the single letter alias for this flag (or None)
-    .boolean  - if 'true', this flag does not accept arguments
-    .present  - true if this flag was parsed from command line flags.
-    .parser  - an ArgumentParser object
-    .serializer - an ArgumentSerializer object
-    .allow_override - the flag may be redefined without raising an error
-
-  The only public method of a 'Flag' object is Parse(), but it is
-  typically only called by a 'FlagValues' object.  The Parse() method is
-  a thin wrapper around the 'ArgumentParser' Parse() method.  The parsed
-  value is saved in .value, and the .present attribute is updated.  If
-  this flag was already present, a FlagsError is raised.
-
-  Parse() is also called during __init__ to parse the default value and
-  initialize the .value attribute.  This enables other python modules to
-  safely use flags even if the __main__ module neglects to parse the
-  command line arguments.  The .present attribute is cleared after
-  __init__ parsing.  If the default value is set to None, then the
-  __init__ parsing step is skipped and the .value attribute is
-  initialized to None.
-
-  Note: The default value is also presented to the user in the help
-  string, so it is important that it be a legal value for this flag.
-  """
-
-  def __init__(self, parser, serializer, name, default, help_string,
-               short_name=None, boolean=0, allow_override=0):
-    self.name = name
-
-    if not help_string:
-      help_string = '(no help available)'
-
-    self.help = help_string
-    self.short_name = short_name
-    self.boolean = boolean
-    self.present = 0
-    self.parser = parser
-    self.serializer = serializer
-    self.allow_override = allow_override
-    self.value = None
-    self.validators = []
-
-    self.SetDefault(default)
-
-  def __GetParsedValueAsString(self, value):
-    if value is None:
-      return None
-    if self.serializer:
-      return repr(self.serializer.Serialize(value))
-    if self.boolean:
-      if value:
-        return repr('true')
-      else:
-        return repr('false')
-    return repr(str(value))
-
-  def Parse(self, argument):
-    try:
-      self.value = self.parser.Parse(argument)
-    except ValueError, e:  # recast ValueError as IllegalFlagValue
-      raise IllegalFlagValue("flag --%s=%s: %s" % (self.name, argument, e))
-    self.present += 1
-
-  def Unparse(self):
-    if self.default is None:
-      self.value = None
-    else:
-      self.Parse(self.default)
-    self.present = 0
-
-  def Serialize(self):
-    if self.value is None:
-      return ''
-    if self.boolean:
-      if self.value:
-        return "--%s" % self.name
-      else:
-        return "--no%s" % self.name
-    else:
-      if not self.serializer:
-        raise FlagsError("Serializer not present for flag %s" % self.name)
-      return "--%s=%s" % (self.name, self.serializer.Serialize(self.value))
-
-  def SetDefault(self, value):
-    """Changes the default value (and current value too) for this Flag."""
-    # We can't allow a None override because it may end up not being
-    # passed to C++ code when we're overriding C++ flags.  So we
-    # cowardly bail out until someone fixes the semantics of trying to
-    # pass None to a C++ flag.  See swig_flags.Init() for details on
-    # this behavior.
-    # TODO(olexiy): Users can directly call this method, bypassing all flags
-    # validators (we don't have FlagValues here, so we can not check
-    # validators).
-    # The simplest solution I see is to make this method private.
-    # Another approach would be to store reference to the corresponding
-    # FlagValues with each flag, but this seems to be an overkill.
-    if value is None and self.allow_override:
-      raise DuplicateFlagCannotPropagateNoneToSwig(self.name)
-
-    self.default = value
-    self.Unparse()
-    self.default_as_str = self.__GetParsedValueAsString(self.value)
-
-  def Type(self):
-    """Returns: a string that describes the type of this Flag."""
-    # NOTE: we use strings, and not the types.*Type constants because
-    # our flags can have more exotic types, e.g., 'comma separated list
-    # of strings', 'whitespace separated list of strings', etc.
-    return self.parser.Type()
-
-  def WriteInfoInXMLFormat(self, outfile, module_name, is_key=False, indent=''):
-    """Writes common info about this flag, in XML format.
-
-    This is information that is relevant to all flags (e.g., name,
-    meaning, etc.).  If you defined a flag that has some other pieces of
-    info, then please override _WriteCustomInfoInXMLFormat.
-
-    Please do NOT override this method.
-
-    Args:
-      outfile: File object we write to.
-      module_name: A string, the name of the module that defines this flag.
-      is_key: A boolean, True iff this flag is key for main module.
-      indent: A string that is prepended to each generated line.
-    """
-    outfile.write(indent + '<flag>\n')
-    inner_indent = indent + '  '
-    if is_key:
-      _WriteSimpleXMLElement(outfile, 'key', 'yes', inner_indent)
-    _WriteSimpleXMLElement(outfile, 'file', module_name, inner_indent)
-    # Print flag features that are relevant for all flags.
-    _WriteSimpleXMLElement(outfile, 'name', self.name, inner_indent)
-    if self.short_name:
-      _WriteSimpleXMLElement(outfile, 'short_name', self.short_name,
-                             inner_indent)
-    if self.help:
-      _WriteSimpleXMLElement(outfile, 'meaning', self.help, inner_indent)
-    # The default flag value can either be represented as a string like on the
-    # command line, or as a Python object.  We serialize this value in the
-    # latter case in order to remain consistent.
-    if self.serializer and not isinstance(self.default, str):
-      default_serialized = self.serializer.Serialize(self.default)
-    else:
-      default_serialized = self.default
-    _WriteSimpleXMLElement(outfile, 'default', default_serialized, inner_indent)
-    _WriteSimpleXMLElement(outfile, 'current', self.value, inner_indent)
-    _WriteSimpleXMLElement(outfile, 'type', self.Type(), inner_indent)
-    # Print extra flag features this flag may have.
-    self._WriteCustomInfoInXMLFormat(outfile, inner_indent)
-    outfile.write(indent + '</flag>\n')
-
-  def _WriteCustomInfoInXMLFormat(self, outfile, indent):
-    """Writes extra info about this flag, in XML format.
-
-    "Extra" means "not already printed by WriteInfoInXMLFormat above."
-
-    Args:
-      outfile: File object we write to.
-      indent: A string that is prepended to each generated line.
-    """
-    # Usually, the parser knows the extra details about the flag, so
-    # we just forward the call to it.
-    self.parser.WriteCustomInfoInXMLFormat(outfile, indent)
-# End of Flag definition
-
-
-class _ArgumentParserCache(type):
-  """Metaclass used to cache and share argument parsers among flags."""
-
-  _instances = {}
-
-  def __call__(mcs, *args, **kwargs):
-    """Returns an instance of the argument parser cls.
-
-    This method overrides behavior of the __new__ methods in
-    all subclasses of ArgumentParser (inclusive). If an instance
-    for mcs with the same set of arguments exists, this instance is
-    returned, otherwise a new instance is created.
-
-    If any keyword arguments are defined, or the values in args
-    are not hashable, this method always returns a new instance of
-    cls.
-
-    Args:
-      args: Positional initializer arguments.
-      kwargs: Initializer keyword arguments.
-
-    Returns:
-      An instance of cls, shared or new.
-    """
-    if kwargs:
-      return type.__call__(mcs, *args, **kwargs)
-    else:
-      instances = mcs._instances
-      key = (mcs,) + tuple(args)
-      try:
-        return instances[key]
-      except KeyError:
-        # No cache entry for key exists, create a new one.
-        return instances.setdefault(key, type.__call__(mcs, *args))
-      except TypeError:
-        # An object in args cannot be hashed, always return
-        # a new instance.
-        return type.__call__(mcs, *args)
-
-
-class ArgumentParser(object):
-  """Base class used to parse and convert arguments.
-
-  The Parse() method checks to make sure that the string argument is a
-  legal value and convert it to a native type.  If the value cannot be
-  converted, it should throw a 'ValueError' exception with a human
-  readable explanation of why the value is illegal.
-
-  Subclasses should also define a syntactic_help string which may be
-  presented to the user to describe the form of the legal values.
-
-  Argument parser classes must be stateless, since instances are cached
-  and shared between flags. Initializer arguments are allowed, but all
-  member variables must be derived from initializer arguments only.
-  """
-  __metaclass__ = _ArgumentParserCache
-
-  syntactic_help = ""
-
-  def Parse(self, argument):
-    """Default implementation: always returns its argument unmodified."""
-    return argument
-
-  def Type(self):
-    return 'string'
-
-  def WriteCustomInfoInXMLFormat(self, outfile, indent):
-    pass
-
-
-class ArgumentSerializer:
-  """Base class for generating string representations of a flag value."""
-
-  def Serialize(self, value):
-    return str(value)
-
-
-class ListSerializer(ArgumentSerializer):
-
-  def __init__(self, list_sep):
-    self.list_sep = list_sep
-
-  def Serialize(self, value):
-    return self.list_sep.join([str(x) for x in value])
-
-
-# Flags validators
-
-
-def RegisterValidator(flag_name,
-                      checker,
-                      message='Flag validation failed',
-                      flag_values=FLAGS):
-  """Adds a constraint, which will be enforced during program execution.
-
-  The constraint is validated when flags are initially parsed, and after each
-  change of the corresponding flag's value.
-  Args:
-    flag_name: string, name of the flag to be checked.
-    checker: method to validate the flag.
-      input  - value of the corresponding flag (string, boolean, etc.
-        This value will be passed to checker by the library). See file's
-        docstring for examples.
-      output - Boolean.
-        Must return True if validator constraint is satisfied.
-        If constraint is not satisfied, it should either return False or
-          raise gflags_validators.Error(desired_error_message).
-    message: error text to be shown to the user if checker returns False.
-      If checker raises gflags_validators.Error, message from the raised
-        Error will be shown.
-    flag_values: FlagValues
-  Raises:
-    AttributeError: if flag_name is not registered as a valid flag name.
-  """
-  flag_values.AddValidator(gflags_validators.SimpleValidator(flag_name,
-                                                             checker,
-                                                             message))
-
-
-def MarkFlagAsRequired(flag_name, flag_values=FLAGS):
-  """Ensure that flag is not None during program execution.
-
-  Registers a flag validator, which will follow usual validator
-  rules.
-  Args:
-    flag_name: string, name of the flag
-    flag_values: FlagValues
-  Raises:
-    AttributeError: if flag_name is not registered as a valid flag name.
-  """
-  RegisterValidator(flag_name,
-                    lambda value: value is not None,
-                    message='Flag --%s must be specified.' % flag_name,
-                    flag_values=flag_values)
-
-
-def _RegisterBoundsValidatorIfNeeded(parser, name, flag_values):
-  """Enforce lower and upper bounds for numeric flags.
-
-  Args:
-    parser: NumericParser (either FloatParser or IntegerParser). Provides lower
-      and upper bounds, and help text to display.
-    name: string, name of the flag
-    flag_values: FlagValues
-  """
-  if parser.lower_bound is not None or parser.upper_bound is not None:
-
-    def Checker(value):
-      if value is not None and parser.IsOutsideBounds(value):
-        message = '%s is not %s' % (value, parser.syntactic_help)
-        raise gflags_validators.Error(message)
-      return True
-
-    RegisterValidator(name,
-                      Checker,
-                      flag_values=flag_values)
-
-
-# The DEFINE functions are explained in mode details in the module doc string.
-
-
-def DEFINE(parser, name, default, help, flag_values=FLAGS, serializer=None,
-           **args):
-  """Registers a generic Flag object.
-
-  NOTE: in the docstrings of all DEFINE* functions, "registers" is short
-  for "creates a new flag and registers it".
-
-  Auxiliary function: clients should use the specialized DEFINE_<type>
-  function instead.
-
-  Args:
-    parser: ArgumentParser that is used to parse the flag arguments.
-    name: A string, the flag name.
-    default: The default value of the flag.
-    help: A help string.
-    flag_values: FlagValues object the flag will be registered with.
-    serializer: ArgumentSerializer that serializes the flag value.
-    args: Dictionary with extra keyword args that are passes to the
-      Flag __init__.
-  """
-  DEFINE_flag(Flag(parser, serializer, name, default, help, **args),
-              flag_values)
-
-
-def DEFINE_flag(flag, flag_values=FLAGS):
-  """Registers a 'Flag' object with a 'FlagValues' object.
-
-  By default, the global FLAGS 'FlagValue' object is used.
-
-  Typical users will use one of the more specialized DEFINE_xxx
-  functions, such as DEFINE_string or DEFINE_integer.  But developers
-  who need to create Flag objects themselves should use this function
-  to register their flags.
-  """
-  # copying the reference to flag_values prevents pychecker warnings
-  fv = flag_values
-  fv[flag.name] = flag
-  # Tell flag_values who's defining the flag.
-  if isinstance(flag_values, FlagValues):
-    # Regarding the above isinstance test: some users pass funny
-    # values of flag_values (e.g., {}) in order to avoid the flag
-    # registration (in the past, there used to be a flag_values ==
-    # FLAGS test here) and redefine flags with the same name (e.g.,
-    # debug).  To avoid breaking their code, we perform the
-    # registration only if flag_values is a real FlagValues object.
-    flag_values._RegisterFlagByModule(_GetCallingModule(), flag)
-
-
-def _InternalDeclareKeyFlags(flag_names,
-                             flag_values=FLAGS, key_flag_values=None):
-  """Declares a flag as key for the calling module.
-
-  Internal function.  User code should call DECLARE_key_flag or
-  ADOPT_module_key_flags instead.
-
-  Args:
-    flag_names: A list of strings that are names of already-registered
-      Flag objects.
-    flag_values: A FlagValues object that the flags listed in
-      flag_names have registered with (the value of the flag_values
-      argument from the DEFINE_* calls that defined those flags).
-      This should almost never need to be overridden.
-    key_flag_values: A FlagValues object that (among possibly many
-      other things) keeps track of the key flags for each module.
-      Default None means "same as flag_values".  This should almost
-      never need to be overridden.
-
-  Raises:
-    UnrecognizedFlagError: when we refer to a flag that was not
-      defined yet.
-  """
-  key_flag_values = key_flag_values or flag_values
-
-  module = _GetCallingModule()
-
-  for flag_name in flag_names:
-    if flag_name not in flag_values:
-      raise UnrecognizedFlagError(flag_name)
-    flag = flag_values.FlagDict()[flag_name]
-    key_flag_values._RegisterKeyFlagForModule(module, flag)
-
-
-def DECLARE_key_flag(flag_name, flag_values=FLAGS):
-  """Declares one flag as key to the current module.
-
-  Key flags are flags that are deemed really important for a module.
-  They are important when listing help messages; e.g., if the
-  --helpshort command-line flag is used, then only the key flags of the
-  main module are listed (instead of all flags, as in the case of
-  --help).
-
-  Sample usage:
-
-    flags.DECLARED_key_flag('flag_1')
-
-  Args:
-    flag_name: A string, the name of an already declared flag.
-      (Redeclaring flags as key, including flags implicitly key
-      because they were declared in this module, is a no-op.)
-    flag_values: A FlagValues object.  This should almost never
-      need to be overridden.
-  """
-  if flag_name in _SPECIAL_FLAGS:
-    # Take care of the special flags, e.g., --flagfile, --undefok.
-    # These flags are defined in _SPECIAL_FLAGS, and are treated
-    # specially during flag parsing, taking precedence over the
-    # user-defined flags.
-    _InternalDeclareKeyFlags([flag_name],
-                             flag_values=_SPECIAL_FLAGS,
-                             key_flag_values=flag_values)
-    return
-  _InternalDeclareKeyFlags([flag_name], flag_values=flag_values)
-
-
-def ADOPT_module_key_flags(module, flag_values=FLAGS):
-  """Declares that all flags key to a module are key to the current module.
-
-  Args:
-    module: A module object.
-    flag_values: A FlagValues object.  This should almost never need
-      to be overridden.
-
-  Raises:
-    FlagsError: When given an argument that is a module name (a
-    string), instead of a module object.
-  """
-  # NOTE(salcianu): an even better test would be if not
-  # isinstance(module, types.ModuleType) but I didn't want to import
-  # types for such a tiny use.
-  if isinstance(module, str):
-    raise FlagsError('Received module name %s; expected a module object.'
-                     % module)
-  _InternalDeclareKeyFlags(
-      [f.name for f in flag_values._GetKeyFlagsForModule(module.__name__)],
-      flag_values=flag_values)
-  # If module is this flag module, take _SPECIAL_FLAGS into account.
-  if module == _GetThisModuleObjectAndName()[0]:
-    _InternalDeclareKeyFlags(
-        # As we associate flags with _GetCallingModule(), the special
-        # flags defined in this module are incorrectly registered with
-        # a different module.  So, we can't use _GetKeyFlagsForModule.
-        # Instead, we take all flags from _SPECIAL_FLAGS (a private
-        # FlagValues, where no other module should register flags).
-        [f.name for f in _SPECIAL_FLAGS.FlagDict().values()],
-        flag_values=_SPECIAL_FLAGS,
-        key_flag_values=flag_values)
-
-
-#
-# STRING FLAGS
-#
-
-
-def DEFINE_string(name, default, help, flag_values=FLAGS, **args):
-  """Registers a flag whose value can be any string."""
-  parser = ArgumentParser()
-  serializer = ArgumentSerializer()
-  DEFINE(parser, name, default, help, flag_values, serializer, **args)
-
-
-#
-# BOOLEAN FLAGS
-#
-# and the special HELP flags.
-
-class BooleanParser(ArgumentParser):
-  """Parser of boolean values."""
-
-  def Convert(self, argument):
-    """Converts the argument to a boolean; raise ValueError on errors."""
-    if type(argument) == str:
-      if argument.lower() in ['true', 't', '1']:
-        return True
-      elif argument.lower() in ['false', 'f', '0']:
-        return False
-
-    bool_argument = bool(argument)
-    if argument == bool_argument:
-      # The argument is a valid boolean (True, False, 0, or 1), and not just
-      # something that always converts to bool (list, string, int, etc.).
-      return bool_argument
-
-    raise ValueError('Non-boolean argument to boolean flag', argument)
-
-  def Parse(self, argument):
-    val = self.Convert(argument)
-    return val
-
-  def Type(self):
-    return 'bool'
-
-
-class BooleanFlag(Flag):
-  """Basic boolean flag.
-
-  Boolean flags do not take any arguments, and their value is either
-  True (1) or False (0).  The false value is specified on the command
-  line by prepending the word 'no' to either the long or the short flag
-  name.
-
-  For example, if a Boolean flag was created whose long name was
-  'update' and whose short name was 'x', then this flag could be
-  explicitly unset through either --noupdate or --nox.
-  """
-
-  def __init__(self, name, default, help, short_name=None, **args):
-    p = BooleanParser()
-    Flag.__init__(self, p, None, name, default, help, short_name, 1, **args)
-    if not self.help: self.help = "a boolean value"
-
-
-def DEFINE_boolean(name, default, help, flag_values=FLAGS, **args):
-  """Registers a boolean flag.
-
-  Such a boolean flag does not take an argument.  If a user wants to
-  specify a false value explicitly, the long option beginning with 'no'
-  must be used: i.e. --noflag
-
-  This flag will have a value of None, True or False.  None is possible
-  if default=None and the user does not specify the flag on the command
-  line.
-  """
-  DEFINE_flag(BooleanFlag(name, default, help, **args), flag_values)
-
-# Match C++ API to unconfuse C++ people.
-DEFINE_bool = DEFINE_boolean
-
-class HelpFlag(BooleanFlag):
-  """
-  HelpFlag is a special boolean flag that prints usage information and
-  raises a SystemExit exception if it is ever found in the command
-  line arguments.  Note this is called with allow_override=1, so other
-  apps can define their own --help flag, replacing this one, if they want.
-  """
-  def __init__(self):
-    BooleanFlag.__init__(self, "help", 0, "show this help",
-                         short_name="?", allow_override=1)
-  def Parse(self, arg):
-    if arg:
-      doc = sys.modules["__main__"].__doc__
-      flags = str(FLAGS)
-      print doc or ("\nUSAGE: %s [flags]\n" % sys.argv[0])
-      if flags:
-        print "flags:"
-        print flags
-      sys.exit(1)
-
-
-class HelpXMLFlag(BooleanFlag):
-  """Similar to HelpFlag, but generates output in XML format."""
-
-  def __init__(self):
-    BooleanFlag.__init__(self, 'helpxml', False,
-                         'like --help, but generates XML output',
-                         allow_override=1)
-
-  def Parse(self, arg):
-    if arg:
-      FLAGS.WriteHelpInXMLFormat(sys.stdout)
-      sys.exit(1)
-
-
-class HelpshortFlag(BooleanFlag):
-  """
-  HelpshortFlag is a special boolean flag that prints usage
-  information for the "main" module, and rasies a SystemExit exception
-  if it is ever found in the command line arguments.  Note this is
-  called with allow_override=1, so other apps can define their own
-  --helpshort flag, replacing this one, if they want.
-  """
-  def __init__(self):
-    BooleanFlag.__init__(self, "helpshort", 0,
-                         "show usage only for this module", allow_override=1)
-  def Parse(self, arg):
-    if arg:
-      doc = sys.modules["__main__"].__doc__
-      flags = FLAGS.MainModuleHelp()
-      print doc or ("\nUSAGE: %s [flags]\n" % sys.argv[0])
-      if flags:
-        print "flags:"
-        print flags
-      sys.exit(1)
-
-#
-# Numeric parser - base class for Integer and Float parsers
-#
-
-
-class NumericParser(ArgumentParser):
-  """Parser of numeric values.
-
-  Parsed value may be bounded to a given upper and lower bound.
-  """
-
-  def IsOutsideBounds(self, val):
-    return ((self.lower_bound is not None and val < self.lower_bound) or
-            (self.upper_bound is not None and val > self.upper_bound))
-
-  def Parse(self, argument):
-    val = self.Convert(argument)
-    if self.IsOutsideBounds(val):
-      raise ValueError("%s is not %s" % (val, self.syntactic_help))
-    return val
-
-  def WriteCustomInfoInXMLFormat(self, outfile, indent):
-    if self.lower_bound is not None:
-      _WriteSimpleXMLElement(outfile, 'lower_bound', self.lower_bound, indent)
-    if self.upper_bound is not None:
-      _WriteSimpleXMLElement(outfile, 'upper_bound', self.upper_bound, indent)
-
-  def Convert(self, argument):
-    """Default implementation: always returns its argument unmodified."""
-    return argument
-
-# End of Numeric Parser
-
-#
-# FLOAT FLAGS
-#
-
-class FloatParser(NumericParser):
-  """Parser of floating point values.
-
-  Parsed value may be bounded to a given upper and lower bound.
-  """
-  number_article = "a"
-  number_name = "number"
-  syntactic_help = " ".join((number_article, number_name))
-
-  def __init__(self, lower_bound=None, upper_bound=None):
-    super(FloatParser, self).__init__()
-    self.lower_bound = lower_bound
-    self.upper_bound = upper_bound
-    sh = self.syntactic_help
-    if lower_bound is not None and upper_bound is not None:
-      sh = ("%s in the range [%s, %s]" % (sh, lower_bound, upper_bound))
-    elif lower_bound == 0:
-      sh = "a non-negative %s" % self.number_name
-    elif upper_bound == 0:
-      sh = "a non-positive %s" % self.number_name
-    elif upper_bound is not None:
-      sh = "%s <= %s" % (self.number_name, upper_bound)
-    elif lower_bound is not None:
-      sh = "%s >= %s" % (self.number_name, lower_bound)
-    self.syntactic_help = sh
-
-  def Convert(self, argument):
-    """Converts argument to a float; raises ValueError on errors."""
-    return float(argument)
-
-  def Type(self):
-    return 'float'
-# End of FloatParser
-
-
-def DEFINE_float(name, default, help, lower_bound=None, upper_bound=None,
-                 flag_values=FLAGS, **args):
-  """Registers a flag whose value must be a float.
-
-  If lower_bound or upper_bound are set, then this flag must be
-  within the given range.
-  """
-  parser = FloatParser(lower_bound, upper_bound)
-  serializer = ArgumentSerializer()
-  DEFINE(parser, name, default, help, flag_values, serializer, **args)
-  _RegisterBoundsValidatorIfNeeded(parser, name, flag_values=flag_values)
-
-#
-# INTEGER FLAGS
-#
-
-
-class IntegerParser(NumericParser):
-  """Parser of an integer value.
-
-  Parsed value may be bounded to a given upper and lower bound.
-  """
-  number_article = "an"
-  number_name = "integer"
-  syntactic_help = " ".join((number_article, number_name))
-
-  def __init__(self, lower_bound=None, upper_bound=None):
-    super(IntegerParser, self).__init__()
-    self.lower_bound = lower_bound
-    self.upper_bound = upper_bound
-    sh = self.syntactic_help
-    if lower_bound is not None and upper_bound is not None:
-      sh = ("%s in the range [%s, %s]" % (sh, lower_bound, upper_bound))
-    elif lower_bound == 1:
-      sh = "a positive %s" % self.number_name
-    elif upper_bound == -1:
-      sh = "a negative %s" % self.number_name
-    elif lower_bound == 0:
-      sh = "a non-negative %s" % self.number_name
-    elif upper_bound == 0:
-      sh = "a non-positive %s" % self.number_name
-    elif upper_bound is not None:
-      sh = "%s <= %s" % (self.number_name, upper_bound)
-    elif lower_bound is not None:
-      sh = "%s >= %s" % (self.number_name, lower_bound)
-    self.syntactic_help = sh
-
-  def Convert(self, argument):
-    __pychecker__ = 'no-returnvalues'
-    if type(argument) == str:
-      base = 10
-      if len(argument) > 2 and argument[0] == "0" and argument[1] == "x":
-        base = 16
-      try:
-        return int(argument, base)
-      # ValueError is thrown when argument is a string, and overflows an int.
-      except ValueError:
-        return long(argument, base)
-    else:
-      try:
-        return int(argument)
-      # OverflowError is thrown when argument is numeric, and overflows an int.
-      except OverflowError:
-        return long(argument)
-
-  def Type(self):
-    return 'int'
-
-
-def DEFINE_integer(name, default, help, lower_bound=None, upper_bound=None,
-                   flag_values=FLAGS, **args):
-  """Registers a flag whose value must be an integer.
-
-  If lower_bound, or upper_bound are set, then this flag must be
-  within the given range.
-  """
-  parser = IntegerParser(lower_bound, upper_bound)
-  serializer = ArgumentSerializer()
-  DEFINE(parser, name, default, help, flag_values, serializer, **args)
-  _RegisterBoundsValidatorIfNeeded(parser, name, flag_values=flag_values)
-
-
-#
-# ENUM FLAGS
-#
-
-
-class EnumParser(ArgumentParser):
-  """Parser of a string enum value (a string value from a given set).
-
-  If enum_values (see below) is not specified, any string is allowed.
-  """
-
-  def __init__(self, enum_values=None):
-    super(EnumParser, self).__init__()
-    self.enum_values = enum_values
-
-  def Parse(self, argument):
-    if self.enum_values and argument not in self.enum_values:
-      raise ValueError("value should be one of <%s>" %
-                       "|".join(self.enum_values))
-    return argument
-
-  def Type(self):
-    return 'string enum'
-
-
-class EnumFlag(Flag):
-  """Basic enum flag; its value can be any string from list of enum_values."""
-
-  def __init__(self, name, default, help, enum_values=None,
-               short_name=None, **args):
-    enum_values = enum_values or []
-    p = EnumParser(enum_values)
-    g = ArgumentSerializer()
-    Flag.__init__(self, p, g, name, default, help, short_name, **args)
-    if not self.help: self.help = "an enum string"
-    self.help = "<%s>: %s" % ("|".join(enum_values), self.help)
-
-  def _WriteCustomInfoInXMLFormat(self, outfile, indent):
-    for enum_value in self.parser.enum_values:
-      _WriteSimpleXMLElement(outfile, 'enum_value', enum_value, indent)
-
-
-def DEFINE_enum(name, default, enum_values, help, flag_values=FLAGS,
-                **args):
-  """Registers a flag whose value can be any string from enum_values."""
-  DEFINE_flag(EnumFlag(name, default, help, enum_values, ** args),
-              flag_values)
-
-
-#
-# LIST FLAGS
-#
-
-
-class BaseListParser(ArgumentParser):
-  """Base class for a parser of lists of strings.
-
-  To extend, inherit from this class; from the subclass __init__, call
-
-    BaseListParser.__init__(self, token, name)
-
-  where token is a character used to tokenize, and name is a description
-  of the separator.
-  """
-
-  def __init__(self, token=None, name=None):
-    assert name
-    super(BaseListParser, self).__init__()
-    self._token = token
-    self._name = name
-    self.syntactic_help = "a %s separated list" % self._name
-
-  def Parse(self, argument):
-    if isinstance(argument, list):
-      return argument
-    elif argument == '':
-      return []
-    else:
-      return [s.strip() for s in argument.split(self._token)]
-
-  def Type(self):
-    return '%s separated list of strings' % self._name
-
-
-class ListParser(BaseListParser):
-  """Parser for a comma-separated list of strings."""
-
-  def __init__(self):
-    BaseListParser.__init__(self, ',', 'comma')
-
-  def WriteCustomInfoInXMLFormat(self, outfile, indent):
-    BaseListParser.WriteCustomInfoInXMLFormat(self, outfile, indent)
-    _WriteSimpleXMLElement(outfile, 'list_separator', repr(','), indent)
-
-
-class WhitespaceSeparatedListParser(BaseListParser):
-  """Parser for a whitespace-separated list of strings."""
-
-  def __init__(self):
-    BaseListParser.__init__(self, None, 'whitespace')
-
-  def WriteCustomInfoInXMLFormat(self, outfile, indent):
-    BaseListParser.WriteCustomInfoInXMLFormat(self, outfile, indent)
-    separators = list(string.whitespace)
-    separators.sort()
-    for ws_char in string.whitespace:
-      _WriteSimpleXMLElement(outfile, 'list_separator', repr(ws_char), indent)
-
-
-def DEFINE_list(name, default, help, flag_values=FLAGS, **args):
-  """Registers a flag whose value is a comma-separated list of strings."""
-  parser = ListParser()
-  serializer = ListSerializer(',')
-  DEFINE(parser, name, default, help, flag_values, serializer, **args)
-
-
-def DEFINE_spaceseplist(name, default, help, flag_values=FLAGS, **args):
-  """Registers a flag whose value is a whitespace-separated list of strings.
-
-  Any whitespace can be used as a separator.
-  """
-  parser = WhitespaceSeparatedListParser()
-  serializer = ListSerializer(' ')
-  DEFINE(parser, name, default, help, flag_values, serializer, **args)
-
-
-#
-# MULTI FLAGS
-#
-
-
-class MultiFlag(Flag):
-  """A flag that can appear multiple time on the command-line.
-
-  The value of such a flag is a list that contains the individual values
-  from all the appearances of that flag on the command-line.
-
-  See the __doc__ for Flag for most behavior of this class.  Only
-  differences in behavior are described here:
-
-    * The default value may be either a single value or a list of values.
-      A single value is interpreted as the [value] singleton list.
-
-    * The value of the flag is always a list, even if the option was
-      only supplied once, and even if the default value is a single
-      value
-  """
-
-  def __init__(self, *args, **kwargs):
-    Flag.__init__(self, *args, **kwargs)
-    self.help += ';\n    repeat this option to specify a list of values'
-
-  def Parse(self, arguments):
-    """Parses one or more arguments with the installed parser.
-
-    Args:
-      arguments: a single argument or a list of arguments (typically a
-        list of default values); a single argument is converted
-        internally into a list containing one item.
-    """
-    if not isinstance(arguments, list):
-      # Default value may be a list of values.  Most other arguments
-      # will not be, so convert them into a single-item list to make
-      # processing simpler below.
-      arguments = [arguments]
-
-    if self.present:
-      # keep a backup reference to list of previously supplied option values
-      values = self.value
-    else:
-      # "erase" the defaults with an empty list
-      values = []
-
-    for item in arguments:
-      # have Flag superclass parse argument, overwriting self.value reference
-      Flag.Parse(self, item)  # also increments self.present
-      values.append(self.value)
-
-    # put list of option values back in the 'value' attribute
-    self.value = values
-
-  def Serialize(self):
-    if not self.serializer:
-      raise FlagsError("Serializer not present for flag %s" % self.name)
-    if self.value is None:
-      return ''
-
-    s = ''
-
-    multi_value = self.value
-
-    for self.value in multi_value:
-      if s: s += ' '
-      s += Flag.Serialize(self)
-
-    self.value = multi_value
-
-    return s
-
-  def Type(self):
-    return 'multi ' + self.parser.Type()
-
-
-def DEFINE_multi(parser, serializer, name, default, help, flag_values=FLAGS,
-                 **args):
-  """Registers a generic MultiFlag that parses its args with a given parser.
-
-  Auxiliary function.  Normal users should NOT use it directly.
-
-  Developers who need to create their own 'Parser' classes for options
-  which can appear multiple times can call this module function to
-  register their flags.
-  """
-  DEFINE_flag(MultiFlag(parser, serializer, name, default, help, **args),
-              flag_values)
-
-
-def DEFINE_multistring(name, default, help, flag_values=FLAGS, **args):
-  """Registers a flag whose value can be a list of any strings.
-
-  Use the flag on the command line multiple times to place multiple
-  string values into the list.  The 'default' may be a single string
-  (which will be converted into a single-element list) or a list of
-  strings.
-  """
-  parser = ArgumentParser()
-  serializer = ArgumentSerializer()
-  DEFINE_multi(parser, serializer, name, default, help, flag_values, **args)
-
-
-def DEFINE_multi_int(name, default, help, lower_bound=None, upper_bound=None,
-                     flag_values=FLAGS, **args):
-  """Registers a flag whose value can be a list of arbitrary integers.
-
-  Use the flag on the command line multiple times to place multiple
-  integer values into the list.  The 'default' may be a single integer
-  (which will be converted into a single-element list) or a list of
-  integers.
-  """
-  parser = IntegerParser(lower_bound, upper_bound)
-  serializer = ArgumentSerializer()
-  DEFINE_multi(parser, serializer, name, default, help, flag_values, **args)
-
-
-# Now register the flags that we want to exist in all applications.
-# These are all defined with allow_override=1, so user-apps can use
-# these flagnames for their own purposes, if they want.
-DEFINE_flag(HelpFlag())
-DEFINE_flag(HelpshortFlag())
-DEFINE_flag(HelpXMLFlag())
-
-# Define special flags here so that help may be generated for them.
-# NOTE: Please do NOT use _SPECIAL_FLAGS from outside this module.
-_SPECIAL_FLAGS = FlagValues()
-
-
-DEFINE_string(
-    'flagfile', "",
-    "Insert flag definitions from the given file into the command line.",
-    _SPECIAL_FLAGS)
-
-DEFINE_string(
-    'undefok', "",
-    "comma-separated list of flag names that it is okay to specify "
-    "on the command line even if the program does not define a flag "
-    "with that name.  IMPORTANT: flags in this list that have "
-    "arguments MUST use the --flag=value format.", _SPECIAL_FLAGS)
diff --git a/gflags_validators.py b/gflags_validators.py
deleted file mode 100755
index 92d0e23..0000000
--- a/gflags_validators.py
+++ /dev/null
@@ -1,187 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2010, Google Inc.
-# 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.
-
-"""Module to enforce different constraints on flags.
-
-A validator represents an invariant, enforced over a one or more flags.
-See 'FLAGS VALIDATORS' in flags.py's docstring for a usage manual.
-"""
-
-__author__ = 'olexiy@google.com (Olexiy Oryeshko)'
-
-
-class Error(Exception):
-  """Thrown If validator constraint is not satisfied."""
-
-
-class Validator(object):
-  """Base class for flags validators.
-
-  Users should NOT overload these classes, and use flags.Register...
-  methods instead.
-  """
-
-  # Used to assign each validator an unique insertion_index
-  validators_count = 0
-
-  def __init__(self, checker, message):
-    """Constructor to create all validators.
-
-    Args:
-      checker: function to verify the constraint.
-        Input of this method varies, see SimpleValidator and
-          DictionaryValidator for a detailed description.
-      message: string, error message to be shown to the user
-    """
-    self.checker = checker
-    self.message = message
-    Validator.validators_count += 1
-    # Used to assert validators in the order they were registered (CL/18694236)
-    self.insertion_index = Validator.validators_count
-
-  def Verify(self, flag_values):
-    """Verify that constraint is satisfied.
-
-    flags library calls this method to verify Validator's constraint.
-    Args:
-      flag_values: flags.FlagValues, containing all flags
-    Raises:
-      Error: if constraint is not satisfied.
-    """
-    param = self._GetInputToCheckerFunction(flag_values)
-    if not self.checker(param):
-      raise Error(self.message)
-
-  def GetFlagsNames(self):
-    """Return the names of the flags checked by this validator.
-
-    Returns:
-      [string], names of the flags
-    """
-    raise NotImplementedError('This method should be overloaded')
-
-  def PrintFlagsWithValues(self, flag_values):
-    raise NotImplementedError('This method should be overloaded')
-
-  def _GetInputToCheckerFunction(self, flag_values):
-    """Given flag values, construct the input to be given to checker.
-
-    Args:
-      flag_values: flags.FlagValues, containing all flags.
-    Returns:
-      Return type depends on the specific validator.
-    """
-    raise NotImplementedError('This method should be overloaded')
-
-
-class SimpleValidator(Validator):
-  """Validator behind RegisterValidator() method.
-
-  Validates that a single flag passes its checker function. The checker function
-  takes the flag value and returns True (if value looks fine) or, if flag value
-  is not valid, either returns False or raises an Exception."""
-  def __init__(self, flag_name, checker, message):
-    """Constructor.
-
-    Args:
-      flag_name: string, name of the flag.
-      checker: function to verify the validator.
-        input  - value of the corresponding flag (string, boolean, etc).
-        output - Boolean. Must return True if validator constraint is satisfied.
-          If constraint is not satisfied, it should either return False or
-          raise Error.
-      message: string, error message to be shown to the user if validator's
-        condition is not satisfied
-    """
-    super(SimpleValidator, self).__init__(checker, message)
-    self.flag_name = flag_name
-
-  def GetFlagsNames(self):
-    return [self.flag_name]
-
-  def PrintFlagsWithValues(self, flag_values):
-    return 'flag --%s=%s' % (self.flag_name, flag_values[self.flag_name].value)
-
-  def _GetInputToCheckerFunction(self, flag_values):
-    """Given flag values, construct the input to be given to checker.
-
-    Args:
-      flag_values: flags.FlagValues
-    Returns:
-      value of the corresponding flag.
-    """
-    return flag_values[self.flag_name].value
-
-
-class DictionaryValidator(Validator):
-  """Validator behind RegisterDictionaryValidator method.
-
-  Validates that flag values pass their common checker function. The checker
-  function takes flag values and returns True (if values look fine) or,
-  if values are not valid, either returns False or raises an Exception.
-  """
-  def __init__(self, flag_names, checker, message):
-    """Constructor.
-
-    Args:
-      flag_names: [string], containing names of the flags used by checker.
-      checker: function to verify the validator.
-        input  - dictionary, with keys() being flag_names, and value for each
-          key being the value of the corresponding flag (string, boolean, etc).
-        output - Boolean. Must return True if validator constraint is satisfied.
-          If constraint is not satisfied, it should either return False or
-          raise Error.
-      message: string, error message to be shown to the user if validator's
-        condition is not satisfied
-    """
-    super(DictionaryValidator, self).__init__(checker, message)
-    self.flag_names = flag_names
-
-  def _GetInputToCheckerFunction(self, flag_values):
-    """Given flag values, construct the input to be given to checker.
-
-    Args:
-      flag_values: flags.FlagValues
-    Returns:
-      dictionary, with keys() being self.lag_names, and value for each key
-        being the value of the corresponding flag (string, boolean, etc).
-    """
-    return dict([key, flag_values[key].value] for key in self.flag_names)
-
-  def PrintFlagsWithValues(self, flag_values):
-    prefix = 'flags '
-    flags_with_values = []
-    for key in self.flag_names:
-      flags_with_values.append('%s=%s' % (key, flag_values[key].value))
-    return prefix + ', '.join(flags_with_values)
-
-  def GetFlagsNames(self):
-    return self.flag_names
diff --git a/httplib2/__init__.py b/httplib2/__init__.py
deleted file mode 100644
index bbf6f79..0000000
--- a/httplib2/__init__.py
+++ /dev/null
@@ -1,1513 +0,0 @@
-from __future__ import generators
-"""
-httplib2
-
-A caching http interface that supports ETags and gzip
-to conserve bandwidth.
-
-Requires Python 2.3 or later
-
-Changelog:
-2007-08-18, Rick: Modified so it's able to use a socks proxy if needed.
-
-"""
-
-__author__ = "Joe Gregorio (joe@bitworking.org)"
-__copyright__ = "Copyright 2006, Joe Gregorio"
-__contributors__ = ["Thomas Broyer (t.broyer@ltgt.net)",
-    "James Antill",
-    "Xavier Verges Farrero",
-    "Jonathan Feinberg",
-    "Blair Zajac",
-    "Sam Ruby",
-    "Louis Nyffenegger"]
-__license__ = "MIT"
-__version__ = "0.7.0"
-
-import re
-import sys
-import email
-import email.Utils
-import email.Message
-import email.FeedParser
-import StringIO
-import gzip
-import zlib
-import httplib
-import urlparse
-import base64
-import os
-import copy
-import calendar
-import time
-import random
-import errno
-# remove depracated warning in python2.6
-try:
-    from hashlib import sha1 as _sha, md5 as _md5
-except ImportError:
-    import sha
-    import md5
-    _sha = sha.new
-    _md5 = md5.new
-import hmac
-from gettext import gettext as _
-import socket
-
-try:
-    from httplib2 import socks
-except ImportError:
-    socks = None
-
-# Build the appropriate socket wrapper for ssl
-try:
-    import ssl # python 2.6
-    ssl_SSLError = ssl.SSLError
-    def _ssl_wrap_socket(sock, key_file, cert_file,
-                         disable_validation, ca_certs):
-        if disable_validation:
-            cert_reqs = ssl.CERT_NONE
-        else:
-            cert_reqs = ssl.CERT_REQUIRED
-        # We should be specifying SSL version 3 or TLS v1, but the ssl module
-        # doesn't expose the necessary knobs. So we need to go with the default
-        # of SSLv23.
-        return ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file,
-                               cert_reqs=cert_reqs, ca_certs=ca_certs)
-except (AttributeError, ImportError):
-    ssl_SSLError = None
-    def _ssl_wrap_socket(sock, key_file, cert_file,
-                         disable_validation, ca_certs):
-        if not disable_validation:
-            raise CertificateValidationUnsupported(
-                    "SSL certificate validation is not supported without "
-                    "the ssl module installed. To avoid this error, install "
-                    "the ssl module, or explicity disable validation.")
-        ssl_sock = socket.ssl(sock, key_file, cert_file)
-        return httplib.FakeSocket(sock, ssl_sock)
-
-
-if sys.version_info >= (2,3):
-    from iri2uri import iri2uri
-else:
-    def iri2uri(uri):
-        return uri
-
-def has_timeout(timeout): # python 2.6
-    if hasattr(socket, '_GLOBAL_DEFAULT_TIMEOUT'):
-        return (timeout is not None and timeout is not socket._GLOBAL_DEFAULT_TIMEOUT)
-    return (timeout is not None)
-
-__all__ = ['Http', 'Response', 'ProxyInfo', 'HttpLib2Error',
-  'RedirectMissingLocation', 'RedirectLimit', 'FailedToDecompressContent',
-  'UnimplementedDigestAuthOptionError', 'UnimplementedHmacDigestAuthOptionError',
-  'debuglevel', 'ProxiesUnavailableError']
-
-
-# The httplib debug level, set to a non-zero value to get debug output
-debuglevel = 0
-
-
-# Python 2.3 support
-if sys.version_info < (2,4):
-    def sorted(seq):
-        seq.sort()
-        return seq
-
-# Python 2.3 support
-def HTTPResponse__getheaders(self):
-    """Return list of (header, value) tuples."""
-    if self.msg is None:
-        raise httplib.ResponseNotReady()
-    return self.msg.items()
-
-if not hasattr(httplib.HTTPResponse, 'getheaders'):
-    httplib.HTTPResponse.getheaders = HTTPResponse__getheaders
-
-# All exceptions raised here derive from HttpLib2Error
-class HttpLib2Error(Exception): pass
-
-# Some exceptions can be caught and optionally
-# be turned back into responses.
-class HttpLib2ErrorWithResponse(HttpLib2Error):
-    def __init__(self, desc, response, content):
-        self.response = response
-        self.content = content
-        HttpLib2Error.__init__(self, desc)
-
-class RedirectMissingLocation(HttpLib2ErrorWithResponse): pass
-class RedirectLimit(HttpLib2ErrorWithResponse): pass
-class FailedToDecompressContent(HttpLib2ErrorWithResponse): pass
-class UnimplementedDigestAuthOptionError(HttpLib2ErrorWithResponse): pass
-class UnimplementedHmacDigestAuthOptionError(HttpLib2ErrorWithResponse): pass
-
-class MalformedHeader(HttpLib2Error): pass
-class RelativeURIError(HttpLib2Error): pass
-class ServerNotFoundError(HttpLib2Error): pass
-class ProxiesUnavailableError(HttpLib2Error): pass
-class CertificateValidationUnsupported(HttpLib2Error): pass
-class SSLHandshakeError(HttpLib2Error): pass
-class NotSupportedOnThisPlatform(HttpLib2Error): pass
-class CertificateHostnameMismatch(SSLHandshakeError):
-  def __init__(self, desc, host, cert):
-    HttpLib2Error.__init__(self, desc)
-    self.host = host
-    self.cert = cert
-
-# Open Items:
-# -----------
-# Proxy support
-
-# Are we removing the cached content too soon on PUT (only delete on 200 Maybe?)
-
-# Pluggable cache storage (supports storing the cache in
-#   flat files by default. We need a plug-in architecture
-#   that can support Berkeley DB and Squid)
-
-# == Known Issues ==
-# Does not handle a resource that uses conneg and Last-Modified but no ETag as a cache validator.
-# Does not handle Cache-Control: max-stale
-# Does not use Age: headers when calculating cache freshness.
-
-
-# The number of redirections to follow before giving up.
-# Note that only GET redirects are automatically followed.
-# Will also honor 301 requests by saving that info and never
-# requesting that URI again.
-DEFAULT_MAX_REDIRECTS = 5
-
-# Default CA certificates file bundled with httplib2.
-CA_CERTS = os.path.join(
-        os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt")
-
-# Which headers are hop-by-hop headers by default
-HOP_BY_HOP = ['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade']
-
-def _get_end2end_headers(response):
-    hopbyhop = list(HOP_BY_HOP)
-    hopbyhop.extend([x.strip() for x in response.get('connection', '').split(',')])
-    return [header for header in response.keys() if header not in hopbyhop]
-
-URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
-
-def parse_uri(uri):
-    """Parses a URI using the regex given in Appendix B of RFC 3986.
-
-        (scheme, authority, path, query, fragment) = parse_uri(uri)
-    """
-    groups = URI.match(uri).groups()
-    return (groups[1], groups[3], groups[4], groups[6], groups[8])
-
-def urlnorm(uri):
-    (scheme, authority, path, query, fragment) = parse_uri(uri)
-    if not scheme or not authority:
-        raise RelativeURIError("Only absolute URIs are allowed. uri = %s" % uri)
-    authority = authority.lower()
-    scheme = scheme.lower()
-    if not path:
-        path = "/"
-    # Could do syntax based normalization of the URI before
-    # computing the digest. See Section 6.2.2 of Std 66.
-    request_uri = query and "?".join([path, query]) or path
-    scheme = scheme.lower()
-    defrag_uri = scheme + "://" + authority + request_uri
-    return scheme, authority, request_uri, defrag_uri
-
-
-# Cache filename construction (original borrowed from Venus http://intertwingly.net/code/venus/)
-re_url_scheme    = re.compile(r'^\w+://')
-re_slash         = re.compile(r'[?/:|]+')
-
-def safename(filename):
-    """Return a filename suitable for the cache.
-
-    Strips dangerous and common characters to create a filename we
-    can use to store the cache in.
-    """
-
-    try:
-        if re_url_scheme.match(filename):
-            if isinstance(filename,str):
-                filename = filename.decode('utf-8')
-                filename = filename.encode('idna')
-            else:
-                filename = filename.encode('idna')
-    except UnicodeError:
-        pass
-    if isinstance(filename,unicode):
-        filename=filename.encode('utf-8')
-    filemd5 = _md5(filename).hexdigest()
-    filename = re_url_scheme.sub("", filename)
-    filename = re_slash.sub(",", filename)
-
-    # limit length of filename
-    if len(filename)>200:
-        filename=filename[:200]
-    return ",".join((filename, filemd5))
-
-NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
-def _normalize_headers(headers):
-    return dict([ (key.lower(), NORMALIZE_SPACE.sub(value, ' ').strip())  for (key, value) in headers.iteritems()])
-
-def _parse_cache_control(headers):
-    retval = {}
-    if headers.has_key('cache-control'):
-        parts =  headers['cache-control'].split(',')
-        parts_with_args = [tuple([x.strip().lower() for x in part.split("=", 1)]) for part in parts if -1 != part.find("=")]
-        parts_wo_args = [(name.strip().lower(), 1) for name in parts if -1 == name.find("=")]
-        retval = dict(parts_with_args + parts_wo_args)
-    return retval
-
-# Whether to use a strict mode to parse WWW-Authenticate headers
-# Might lead to bad results in case of ill-formed header value,
-# so disabled by default, falling back to relaxed parsing.
-# Set to true to turn on, usefull for testing servers.
-USE_WWW_AUTH_STRICT_PARSING = 0
-
-# In regex below:
-#    [^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+             matches a "token" as defined by HTTP
-#    "(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?"    matches a "quoted-string" as defined by HTTP, when LWS have already been replaced by a single space
-# Actually, as an auth-param value can be either a token or a quoted-string, they are combined in a single pattern which matches both:
-#    \"?((?<=\")(?:[^\0-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?<!\")[^\0-\x08\x0A-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+(?!\"))\"?
-WWW_AUTH_STRICT = re.compile(r"^(?:\s*(?:,\s*)?([^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?<!\")[^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$")
-WWW_AUTH_RELAXED = re.compile(r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(?<!\")[^ \t\r\n,]+(?!\"))\"?)(.*)$")
-UNQUOTE_PAIRS = re.compile(r'\\(.)')
-def _parse_www_authenticate(headers, headername='www-authenticate'):
-    """Returns a dictionary of dictionaries, one dict
-    per auth_scheme."""
-    retval = {}
-    if headers.has_key(headername):
-        try:
-          authenticate = headers[headername].strip()
-          www_auth = USE_WWW_AUTH_STRICT_PARSING and WWW_AUTH_STRICT or WWW_AUTH_RELAXED
-          while authenticate:
-              # Break off the scheme at the beginning of the line
-              if headername == 'authentication-info':
-                  (auth_scheme, the_rest) = ('digest', authenticate)
-              else:
-                  (auth_scheme, the_rest) = authenticate.split(" ", 1)
-              # Now loop over all the key value pairs that come after the scheme,
-              # being careful not to roll into the next scheme
-              match = www_auth.search(the_rest)
-              auth_params = {}
-              while match:
-                  if match and len(match.groups()) == 3:
-                      (key, value, the_rest) = match.groups()
-                      auth_params[key.lower()] = UNQUOTE_PAIRS.sub(r'\1', value) # '\\'.join([x.replace('\\', '') for x in value.split('\\\\')])
-                  match = www_auth.search(the_rest)
-              retval[auth_scheme.lower()] = auth_params
-              authenticate = the_rest.strip()
-        except ValueError:
-          raise MalformedHeader("WWW-Authenticate")
-    return retval
-
-
-def _entry_disposition(response_headers, request_headers):
-    """Determine freshness from the Date, Expires and Cache-Control headers.
-
-    We don't handle the following:
-
-    1. Cache-Control: max-stale
-    2. Age: headers are not used in the calculations.
-
-    Not that this algorithm is simpler than you might think
-    because we are operating as a private (non-shared) cache.
-    This lets us ignore 's-maxage'. We can also ignore
-    'proxy-invalidate' since we aren't a proxy.
-    We will never return a stale document as
-    fresh as a design decision, and thus the non-implementation
-    of 'max-stale'. This also lets us safely ignore 'must-revalidate'
-    since we operate as if every server has sent 'must-revalidate'.
-    Since we are private we get to ignore both 'public' and
-    'private' parameters. We also ignore 'no-transform' since
-    we don't do any transformations.
-    The 'no-store' parameter is handled at a higher level.
-    So the only Cache-Control parameters we look at are:
-
-    no-cache
-    only-if-cached
-    max-age
-    min-fresh
-    """
-
-    retval = "STALE"
-    cc = _parse_cache_control(request_headers)
-    cc_response = _parse_cache_control(response_headers)
-
-    if request_headers.has_key('pragma') and request_headers['pragma'].lower().find('no-cache') != -1:
-        retval = "TRANSPARENT"
-        if 'cache-control' not in request_headers:
-            request_headers['cache-control'] = 'no-cache'
-    elif cc.has_key('no-cache'):
-        retval = "TRANSPARENT"
-    elif cc_response.has_key('no-cache'):
-        retval = "STALE"
-    elif cc.has_key('only-if-cached'):
-        retval = "FRESH"
-    elif response_headers.has_key('date'):
-        date = calendar.timegm(email.Utils.parsedate_tz(response_headers['date']))
-        now = time.time()
-        current_age = max(0, now - date)
-        if cc_response.has_key('max-age'):
-            try:
-                freshness_lifetime = int(cc_response['max-age'])
-            except ValueError:
-                freshness_lifetime = 0
-        elif response_headers.has_key('expires'):
-            expires = email.Utils.parsedate_tz(response_headers['expires'])
-            if None == expires:
-                freshness_lifetime = 0
-            else:
-                freshness_lifetime = max(0, calendar.timegm(expires) - date)
-        else:
-            freshness_lifetime = 0
-        if cc.has_key('max-age'):
-            try:
-                freshness_lifetime = int(cc['max-age'])
-            except ValueError:
-                freshness_lifetime = 0
-        if cc.has_key('min-fresh'):
-            try:
-                min_fresh = int(cc['min-fresh'])
-            except ValueError:
-                min_fresh = 0
-            current_age += min_fresh
-        if freshness_lifetime > current_age:
-            retval = "FRESH"
-    return retval
-
-def _decompressContent(response, new_content):
-    content = new_content
-    try:
-        encoding = response.get('content-encoding', None)
-        if encoding in ['gzip', 'deflate']:
-            if encoding == 'gzip':
-                content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read()
-            if encoding == 'deflate':
-                content = zlib.decompress(content)
-            response['content-length'] = str(len(content))
-            # Record the historical presence of the encoding in a way the won't interfere.
-            response['-content-encoding'] = response['content-encoding']
-            del response['content-encoding']
-    except IOError:
-        content = ""
-        raise FailedToDecompressContent(_("Content purported to be compressed with %s but failed to decompress.") % response.get('content-encoding'), response, content)
-    return content
-
-def _updateCache(request_headers, response_headers, content, cache, cachekey):
-    if cachekey:
-        cc = _parse_cache_control(request_headers)
-        cc_response = _parse_cache_control(response_headers)
-        if cc.has_key('no-store') or cc_response.has_key('no-store'):
-            cache.delete(cachekey)
-        else:
-            info = email.Message.Message()
-            for key, value in response_headers.iteritems():
-                if key not in ['status','content-encoding','transfer-encoding']:
-                    info[key] = value
-
-            # Add annotations to the cache to indicate what headers
-            # are variant for this request.
-            vary = response_headers.get('vary', None)
-            if vary:
-                vary_headers = vary.lower().replace(' ', '').split(',')
-                for header in vary_headers:
-                    key = '-varied-%s' % header
-                    try:
-                        info[key] = request_headers[header]
-                    except KeyError:
-                        pass
-
-            status = response_headers.status
-            if status == 304:
-                status = 200
-
-            status_header = 'status: %d\r\n' % status
-
-            header_str = info.as_string()
-
-            header_str = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", header_str)
-            text = "".join([status_header, header_str, content])
-
-            cache.set(cachekey, text)
-
-def _cnonce():
-    dig = _md5("%s:%s" % (time.ctime(), ["0123456789"[random.randrange(0, 9)] for i in range(20)])).hexdigest()
-    return dig[:16]
-
-def _wsse_username_token(cnonce, iso_now, password):
-    return base64.b64encode(_sha("%s%s%s" % (cnonce, iso_now, password)).digest()).strip()
-
-
-# For credentials we need two things, first
-# a pool of credential to try (not necesarily tied to BAsic, Digest, etc.)
-# Then we also need a list of URIs that have already demanded authentication
-# That list is tricky since sub-URIs can take the same auth, or the
-# auth scheme may change as you descend the tree.
-# So we also need each Auth instance to be able to tell us
-# how close to the 'top' it is.
-
-class Authentication(object):
-    def __init__(self, credentials, host, request_uri, headers, response, content, http):
-        (scheme, authority, path, query, fragment) = parse_uri(request_uri)
-        self.path = path
-        self.host = host
-        self.credentials = credentials
-        self.http = http
-
-    def depth(self, request_uri):
-        (scheme, authority, path, query, fragment) = parse_uri(request_uri)
-        return request_uri[len(self.path):].count("/")
-
-    def inscope(self, host, request_uri):
-        # XXX Should we normalize the request_uri?
-        (scheme, authority, path, query, fragment) = parse_uri(request_uri)
-        return (host == self.host) and path.startswith(self.path)
-
-    def request(self, method, request_uri, headers, content):
-        """Modify the request headers to add the appropriate
-        Authorization header. Over-rise this in sub-classes."""
-        pass
-
-    def response(self, response, content):
-        """Gives us a chance to update with new nonces
-        or such returned from the last authorized response.
-        Over-rise this in sub-classes if necessary.
-
-        Return TRUE is the request is to be retried, for
-        example Digest may return stale=true.
-        """
-        return False
-
-
-
-class BasicAuthentication(Authentication):
-    def __init__(self, credentials, host, request_uri, headers, response, content, http):
-        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
-
-    def request(self, method, request_uri, headers, content):
-        """Modify the request headers to add the appropriate
-        Authorization header."""
-        headers['authorization'] = 'Basic ' + base64.b64encode("%s:%s" % self.credentials).strip()
-
-
-class DigestAuthentication(Authentication):
-    """Only do qop='auth' and MD5, since that
-    is all Apache currently implements"""
-    def __init__(self, credentials, host, request_uri, headers, response, content, http):
-        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
-        challenge = _parse_www_authenticate(response, 'www-authenticate')
-        self.challenge = challenge['digest']
-        qop = self.challenge.get('qop', 'auth')
-        self.challenge['qop'] = ('auth' in [x.strip() for x in qop.split()]) and 'auth' or None
-        if self.challenge['qop'] is None:
-            raise UnimplementedDigestAuthOptionError( _("Unsupported value for qop: %s." % qop))
-        self.challenge['algorithm'] = self.challenge.get('algorithm', 'MD5').upper()
-        if self.challenge['algorithm'] != 'MD5':
-            raise UnimplementedDigestAuthOptionError( _("Unsupported value for algorithm: %s." % self.challenge['algorithm']))
-        self.A1 = "".join([self.credentials[0], ":", self.challenge['realm'], ":", self.credentials[1]])
-        self.challenge['nc'] = 1
-
-    def request(self, method, request_uri, headers, content, cnonce = None):
-        """Modify the request headers"""
-        H = lambda x: _md5(x).hexdigest()
-        KD = lambda s, d: H("%s:%s" % (s, d))
-        A2 = "".join([method, ":", request_uri])
-        self.challenge['cnonce'] = cnonce or _cnonce()
-        request_digest  = '"%s"' % KD(H(self.A1), "%s:%s:%s:%s:%s" % (self.challenge['nonce'],
-                    '%08x' % self.challenge['nc'],
-                    self.challenge['cnonce'],
-                    self.challenge['qop'], H(A2)
-                    ))
-        headers['authorization'] = 'Digest username="%s", realm="%s", nonce="%s", uri="%s", algorithm=%s, response=%s, qop=%s, nc=%08x, cnonce="%s"' % (
-                self.credentials[0],
-                self.challenge['realm'],
-                self.challenge['nonce'],
-                request_uri,
-                self.challenge['algorithm'],
-                request_digest,
-                self.challenge['qop'],
-                self.challenge['nc'],
-                self.challenge['cnonce'],
-                )
-        if self.challenge.get('opaque'):
-            headers['authorization'] += ', opaque="%s"' % self.challenge['opaque']
-        self.challenge['nc'] += 1
-
-    def response(self, response, content):
-        if not response.has_key('authentication-info'):
-            challenge = _parse_www_authenticate(response, 'www-authenticate').get('digest', {})
-            if 'true' == challenge.get('stale'):
-                self.challenge['nonce'] = challenge['nonce']
-                self.challenge['nc'] = 1
-                return True
-        else:
-            updated_challenge = _parse_www_authenticate(response, 'authentication-info').get('digest', {})
-
-            if updated_challenge.has_key('nextnonce'):
-                self.challenge['nonce'] = updated_challenge['nextnonce']
-                self.challenge['nc'] = 1
-        return False
-
-
-class HmacDigestAuthentication(Authentication):
-    """Adapted from Robert Sayre's code and DigestAuthentication above."""
-    __author__ = "Thomas Broyer (t.broyer@ltgt.net)"
-
-    def __init__(self, credentials, host, request_uri, headers, response, content, http):
-        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
-        challenge = _parse_www_authenticate(response, 'www-authenticate')
-        self.challenge = challenge['hmacdigest']
-        # TODO: self.challenge['domain']
-        self.challenge['reason'] = self.challenge.get('reason', 'unauthorized')
-        if self.challenge['reason'] not in ['unauthorized', 'integrity']:
-            self.challenge['reason'] = 'unauthorized'
-        self.challenge['salt'] = self.challenge.get('salt', '')
-        if not self.challenge.get('snonce'):
-            raise UnimplementedHmacDigestAuthOptionError( _("The challenge doesn't contain a server nonce, or this one is empty."))
-        self.challenge['algorithm'] = self.challenge.get('algorithm', 'HMAC-SHA-1')
-        if self.challenge['algorithm'] not in ['HMAC-SHA-1', 'HMAC-MD5']:
-            raise UnimplementedHmacDigestAuthOptionError( _("Unsupported value for algorithm: %s." % self.challenge['algorithm']))
-        self.challenge['pw-algorithm'] = self.challenge.get('pw-algorithm', 'SHA-1')
-        if self.challenge['pw-algorithm'] not in ['SHA-1', 'MD5']:
-            raise UnimplementedHmacDigestAuthOptionError( _("Unsupported value for pw-algorithm: %s." % self.challenge['pw-algorithm']))
-        if self.challenge['algorithm'] == 'HMAC-MD5':
-            self.hashmod = _md5
-        else:
-            self.hashmod = _sha
-        if self.challenge['pw-algorithm'] == 'MD5':
-            self.pwhashmod = _md5
-        else:
-            self.pwhashmod = _sha
-        self.key = "".join([self.credentials[0], ":",
-                    self.pwhashmod.new("".join([self.credentials[1], self.challenge['salt']])).hexdigest().lower(),
-                    ":", self.challenge['realm']
-                    ])
-        self.key = self.pwhashmod.new(self.key).hexdigest().lower()
-
-    def request(self, method, request_uri, headers, content):
-        """Modify the request headers"""
-        keys = _get_end2end_headers(headers)
-        keylist = "".join(["%s " % k for k in keys])
-        headers_val = "".join([headers[k] for k in keys])
-        created = time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime())
-        cnonce = _cnonce()
-        request_digest = "%s:%s:%s:%s:%s" % (method, request_uri, cnonce, self.challenge['snonce'], headers_val)
-        request_digest  = hmac.new(self.key, request_digest, self.hashmod).hexdigest().lower()
-        headers['authorization'] = 'HMACDigest username="%s", realm="%s", snonce="%s", cnonce="%s", uri="%s", created="%s", response="%s", headers="%s"' % (
-                self.credentials[0],
-                self.challenge['realm'],
-                self.challenge['snonce'],
-                cnonce,
-                request_uri,
-                created,
-                request_digest,
-                keylist,
-                )
-
-    def response(self, response, content):
-        challenge = _parse_www_authenticate(response, 'www-authenticate').get('hmacdigest', {})
-        if challenge.get('reason') in ['integrity', 'stale']:
-            return True
-        return False
-
-
-class WsseAuthentication(Authentication):
-    """This is thinly tested and should not be relied upon.
-    At this time there isn't any third party server to test against.
-    Blogger and TypePad implemented this algorithm at one point
-    but Blogger has since switched to Basic over HTTPS and
-    TypePad has implemented it wrong, by never issuing a 401
-    challenge but instead requiring your client to telepathically know that
-    their endpoint is expecting WSSE profile="UsernameToken"."""
-    def __init__(self, credentials, host, request_uri, headers, response, content, http):
-        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
-
-    def request(self, method, request_uri, headers, content):
-        """Modify the request headers to add the appropriate
-        Authorization header."""
-        headers['authorization'] = 'WSSE profile="UsernameToken"'
-        iso_now = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
-        cnonce = _cnonce()
-        password_digest = _wsse_username_token(cnonce, iso_now, self.credentials[1])
-        headers['X-WSSE'] = 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"' % (
-                self.credentials[0],
-                password_digest,
-                cnonce,
-                iso_now)
-
-class GoogleLoginAuthentication(Authentication):
-    def __init__(self, credentials, host, request_uri, headers, response, content, http):
-        from urllib import urlencode
-        Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
-        challenge = _parse_www_authenticate(response, 'www-authenticate')
-        service = challenge['googlelogin'].get('service', 'xapi')
-        # Bloggger actually returns the service in the challenge
-        # For the rest we guess based on the URI
-        if service == 'xapi' and  request_uri.find("calendar") > 0:
-            service = "cl"
-        # No point in guessing Base or Spreadsheet
-        #elif request_uri.find("spreadsheets") > 0:
-        #    service = "wise"
-
-        auth = dict(Email=credentials[0], Passwd=credentials[1], service=service, source=headers['user-agent'])
-        resp, content = self.http.request("https://www.google.com/accounts/ClientLogin", method="POST", body=urlencode(auth), headers={'Content-Type': 'application/x-www-form-urlencoded'})
-        lines = content.split('\n')
-        d = dict([tuple(line.split("=", 1)) for line in lines if line])
-        if resp.status == 403:
-            self.Auth = ""
-        else:
-            self.Auth = d['Auth']
-
-    def request(self, method, request_uri, headers, content):
-        """Modify the request headers to add the appropriate
-        Authorization header."""
-        headers['authorization'] = 'GoogleLogin Auth=' + self.Auth
-
-
-AUTH_SCHEME_CLASSES = {
-    "basic": BasicAuthentication,
-    "wsse": WsseAuthentication,
-    "digest": DigestAuthentication,
-    "hmacdigest": HmacDigestAuthentication,
-    "googlelogin": GoogleLoginAuthentication
-}
-
-AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"]
-
-class FileCache(object):
-    """Uses a local directory as a store for cached files.
-    Not really safe to use if multiple threads or processes are going to
-    be running on the same cache.
-    """
-    def __init__(self, cache, safe=safename): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior
-        self.cache = cache
-        self.safe = safe
-        if not os.path.exists(cache):
-            os.makedirs(self.cache)
-
-    def get(self, key):
-        retval = None
-        cacheFullPath = os.path.join(self.cache, self.safe(key))
-        try:
-            f = file(cacheFullPath, "rb")
-            retval = f.read()
-            f.close()
-        except IOError:
-            pass
-        return retval
-
-    def set(self, key, value):
-        cacheFullPath = os.path.join(self.cache, self.safe(key))
-        f = file(cacheFullPath, "wb")
-        f.write(value)
-        f.close()
-
-    def delete(self, key):
-        cacheFullPath = os.path.join(self.cache, self.safe(key))
-        if os.path.exists(cacheFullPath):
-            os.remove(cacheFullPath)
-
-class Credentials(object):
-    def __init__(self):
-        self.credentials = []
-
-    def add(self, name, password, domain=""):
-        self.credentials.append((domain.lower(), name, password))
-
-    def clear(self):
-        self.credentials = []
-
-    def iter(self, domain):
-        for (cdomain, name, password) in self.credentials:
-            if cdomain == "" or domain == cdomain:
-                yield (name, password)
-
-class KeyCerts(Credentials):
-    """Identical to Credentials except that
-    name/password are mapped to key/cert."""
-    pass
-
-
-class ProxyInfo(object):
-  """Collect information required to use a proxy."""
-  def __init__(self, proxy_type, proxy_host, proxy_port, proxy_rdns=None, proxy_user=None, proxy_pass=None):
-      """The parameter proxy_type must be set to one of socks.PROXY_TYPE_XXX
-      constants. For example:
-
-p = ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, proxy_host='localhost', proxy_port=8000)
-      """
-      self.proxy_type, self.proxy_host, self.proxy_port, self.proxy_rdns, self.proxy_user, self.proxy_pass = proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass
-
-  def astuple(self):
-    return (self.proxy_type, self.proxy_host, self.proxy_port, self.proxy_rdns,
-        self.proxy_user, self.proxy_pass)
-
-  def isgood(self):
-    return (self.proxy_host != None) and (self.proxy_port != None)
-
-
-class HTTPConnectionWithTimeout(httplib.HTTPConnection):
-    """
-    HTTPConnection subclass that supports timeouts
-
-    All timeouts are in seconds. If None is passed for timeout then
-    Python's default timeout for sockets will be used. See for example
-    the docs of socket.setdefaulttimeout():
-    http://docs.python.org/library/socket.html#socket.setdefaulttimeout
-    """
-
-    def __init__(self, host, port=None, strict=None, timeout=None, proxy_info=None):
-        httplib.HTTPConnection.__init__(self, host, port, strict)
-        self.timeout = timeout
-        self.proxy_info = proxy_info
-
-    def connect(self):
-        """Connect to the host and port specified in __init__."""
-        # Mostly verbatim from httplib.py.
-        if self.proxy_info and socks is None:
-            raise ProxiesUnavailableError(
-                'Proxy support missing but proxy use was requested!')
-        msg = "getaddrinfo returns an empty list"
-        for res in socket.getaddrinfo(self.host, self.port, 0,
-                socket.SOCK_STREAM):
-            af, socktype, proto, canonname, sa = res
-            try:
-                if self.proxy_info and self.proxy_info.isgood():
-                    self.sock = socks.socksocket(af, socktype, proto)
-                    self.sock.setproxy(*self.proxy_info.astuple())
-                else:
-                    self.sock = socket.socket(af, socktype, proto)
-                    self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
-                # Different from httplib: support timeouts.
-                if has_timeout(self.timeout):
-                    self.sock.settimeout(self.timeout)
-                    # End of difference from httplib.
-                if self.debuglevel > 0:
-                    print "connect: (%s, %s)" % (self.host, self.port)
-
-                self.sock.connect(sa)
-            except socket.error, msg:
-                if self.debuglevel > 0:
-                    print 'connect fail:', (self.host, self.port)
-                if self.sock:
-                    self.sock.close()
-                self.sock = None
-                continue
-            break
-        if not self.sock:
-            raise socket.error, msg
-
-class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
-    """
-    This class allows communication via SSL.
-
-    All timeouts are in seconds. If None is passed for timeout then
-    Python's default timeout for sockets will be used. See for example
-    the docs of socket.setdefaulttimeout():
-    http://docs.python.org/library/socket.html#socket.setdefaulttimeout
-    """
-    def __init__(self, host, port=None, key_file=None, cert_file=None,
-                 strict=None, timeout=None, proxy_info=None,
-                 ca_certs=None, disable_ssl_certificate_validation=False):
-        httplib.HTTPSConnection.__init__(self, host, port=port, key_file=key_file,
-                cert_file=cert_file, strict=strict)
-        self.timeout = timeout
-        self.proxy_info = proxy_info
-        if ca_certs is None:
-          ca_certs = CA_CERTS
-        self.ca_certs = ca_certs
-        self.disable_ssl_certificate_validation = \
-                disable_ssl_certificate_validation
-
-    # The following two methods were adapted from https_wrapper.py, released
-    # with the Google Appengine SDK at
-    # http://googleappengine.googlecode.com/svn-history/r136/trunk/python/google/appengine/tools/https_wrapper.py
-    # under the following license:
-    #
-    # Copyright 2007 Google Inc.
-    #
-    # Licensed under the Apache License, Version 2.0 (the "License");
-    # you may not use this file except in compliance with the License.
-    # You may obtain a copy of the License at
-    #
-    #     http://www.apache.org/licenses/LICENSE-2.0
-    #
-    # Unless required by applicable law or agreed to in writing, software
-    # distributed under the License is distributed on an "AS IS" BASIS,
-    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    # See the License for the specific language governing permissions and
-    # limitations under the License.
-    #
-
-    def _GetValidHostsForCert(self, cert):
-        """Returns a list of valid host globs for an SSL certificate.
-
-        Args:
-          cert: A dictionary representing an SSL certificate.
-        Returns:
-          list: A list of valid host globs.
-        """
-        if 'subjectAltName' in cert:
-            return [x[1] for x in cert['subjectAltName']
-                    if x[0].lower() == 'dns']
-        else:
-            return [x[0][1] for x in cert['subject']
-                    if x[0][0].lower() == 'commonname']
-
-    def _ValidateCertificateHostname(self, cert, hostname):
-        """Validates that a given hostname is valid for an SSL certificate.
-
-        Args:
-          cert: A dictionary representing an SSL certificate.
-          hostname: The hostname to test.
-        Returns:
-          bool: Whether or not the hostname is valid for this certificate.
-        """
-        hosts = self._GetValidHostsForCert(cert)
-        for host in hosts:
-            host_re = host.replace('.', '\.').replace('*', '[^.]*')
-            if re.search('^%s$' % (host_re,), hostname, re.I):
-                return True
-        return False
-
-    def connect(self):
-        "Connect to a host on a given (SSL) port."
-
-        msg = "getaddrinfo returns an empty list"
-        for family, socktype, proto, canonname, sockaddr in socket.getaddrinfo(
-            self.host, self.port, 0, socket.SOCK_STREAM):
-            try:
-                if self.proxy_info and self.proxy_info.isgood():
-                    sock = socks.socksocket(family, socktype, proto)
-                    sock.setproxy(*self.proxy_info.astuple())
-                else:
-                    sock = socket.socket(family, socktype, proto)
-                    sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
-
-                if has_timeout(self.timeout):
-                    sock.settimeout(self.timeout)
-                sock.connect((self.host, self.port))
-                self.sock =_ssl_wrap_socket(
-                    sock, self.key_file, self.cert_file,
-                    self.disable_ssl_certificate_validation, self.ca_certs)
-                if self.debuglevel > 0:
-                    print "connect: (%s, %s)" % (self.host, self.port)
-                if not self.disable_ssl_certificate_validation:
-                    cert = self.sock.getpeercert()
-                    hostname = self.host.split(':', 0)[0]
-                    if not self._ValidateCertificateHostname(cert, hostname):
-                        raise CertificateHostnameMismatch(
-                            'Server presented certificate that does not match '
-                            'host %s: %s' % (hostname, cert), hostname, cert)
-            except ssl_SSLError, e:
-                if sock:
-                    sock.close()
-                if self.sock:
-                    self.sock.close()
-                self.sock = None
-                # Unfortunately the ssl module doesn't seem to provide any way
-                # to get at more detailed error information, in particular
-                # whether the error is due to certificate validation or
-                # something else (such as SSL protocol mismatch).
-                if e.errno == ssl.SSL_ERROR_SSL:
-                    raise SSLHandshakeError(e)
-                else:
-                    raise
-            except (socket.timeout, socket.gaierror):
-              raise
-            except socket.error, msg:
-              if self.debuglevel > 0:
-                  print 'connect fail:', (self.host, self.port)
-              if self.sock:
-                  self.sock.close()
-              self.sock = None
-              continue
-            break
-        if not self.sock:
-          raise socket.error, msg
-
-SCHEME_TO_CONNECTION = {
-    'http': HTTPConnectionWithTimeout,
-    'https': HTTPSConnectionWithTimeout
-    }
-
-# Use a different connection object for Google App Engine
-try:
-  from google.appengine.api.urlfetch import fetch
-  from google.appengine.api.urlfetch import InvalidURLError
-  from google.appengine.api.urlfetch import DownloadError
-  from google.appengine.api.urlfetch import ResponseTooLargeError
-  from google.appengine.api.urlfetch import SSLCertificateError
-
-
-  class ResponseDict(dict):
-    """Is a dictionary that also has a read() method, so
-    that it can pass itself off as an httlib.HTTPResponse()."""
-    def read(self):
-      pass
-
-
-  class AppEngineHttpConnection(object):
-    """Emulates an httplib.HTTPConnection object, but actually uses the Google
-    App Engine urlfetch library. This allows the timeout to be properly used on
-    Google App Engine, and avoids using httplib, which on Google App Engine is
-    just another wrapper around urlfetch.
-    """
-    def __init__(self, host, port=None, key_file=None, cert_file=None,
-                 strict=None, timeout=None, proxy_info=None, ca_certs=None,
-                 disable_certificate_validation=False):
-      self.host = host
-      self.port = port
-      self.timeout = timeout
-      if key_file or cert_file or proxy_info or ca_certs:
-        raise NotSupportedOnThisPlatform()
-      self.response = None
-      self.scheme = 'http'
-      self.validate_certificate = not disable_certificate_validation
-      self.sock = True
-
-    def request(self, method, url, body, headers):
-      # Calculate the absolute URI, which fetch requires
-      netloc = self.host
-      if self.port:
-        netloc = '%s:%s' % (self.host, self.port)
-      absolute_uri = '%s://%s%s' % (self.scheme, netloc, url)
-      try:
-        response = fetch(absolute_uri, payload=body, method=method,
-            headers=headers, allow_truncated=False, follow_redirects=False,
-            deadline=self.timeout,
-            validate_certificate=self.validate_certificate)
-        self.response = ResponseDict(response.headers)
-        self.response['status'] = str(response.status_code)
-        self.response.status = response.status_code
-        setattr(self.response, 'read', lambda : response.content)
-
-      # Make sure the exceptions raised match the exceptions expected.
-      except InvalidURLError:
-        raise socket.gaierror('')
-      except (DownloadError, ResponseTooLargeError, SSLCertificateError):
-        raise httplib.HTTPException()
-
-    def getresponse(self):
-      return self.response
-
-    def set_debuglevel(self, level):
-      pass
-
-    def connect(self):
-      pass
-
-    def close(self):
-      pass
-
-
-  class AppEngineHttpsConnection(AppEngineHttpConnection):
-    """Same as AppEngineHttpConnection, but for HTTPS URIs."""
-    def __init__(self, host, port=None, key_file=None, cert_file=None,
-                 strict=None, timeout=None, proxy_info=None):
-      AppEngineHttpConnection.__init__(self, host, port, key_file, cert_file,
-          strict, timeout, proxy_info)
-      self.scheme = 'https'
-
-  # Update the connection classes to use the Googel App Engine specific ones.
-  SCHEME_TO_CONNECTION = {
-      'http': AppEngineHttpConnection,
-      'https': AppEngineHttpsConnection
-      }
-
-except ImportError:
-  pass
-
-
-class Http(object):
-    """An HTTP client that handles:
-- all methods
-- caching
-- ETags
-- compression,
-- HTTPS
-- Basic
-- Digest
-- WSSE
-
-and more.
-    """
-    def __init__(self, cache=None, timeout=None, proxy_info=None,
-                 ca_certs=None, disable_ssl_certificate_validation=False):
-        """
-        The value of proxy_info is a ProxyInfo instance.
-
-        If 'cache' is a string then it is used as a directory name for
-        a disk cache. Otherwise it must be an object that supports the
-        same interface as FileCache.
-
-        All timeouts are in seconds. If None is passed for timeout
-        then Python's default timeout for sockets will be used. See
-        for example the docs of socket.setdefaulttimeout():
-        http://docs.python.org/library/socket.html#socket.setdefaulttimeout
-
-        ca_certs is the path of a file containing root CA certificates for SSL
-        server certificate validation.  By default, a CA cert file bundled with
-        httplib2 is used.
-
-        If disable_ssl_certificate_validation is true, SSL cert validation will
-        not be performed.
-        """
-        self.proxy_info = proxy_info
-        self.ca_certs = ca_certs
-        self.disable_ssl_certificate_validation = \
-                disable_ssl_certificate_validation
-
-        # Map domain name to an httplib connection
-        self.connections = {}
-        # The location of the cache, for now a directory
-        # where cached responses are held.
-        if cache and isinstance(cache, basestring):
-            self.cache = FileCache(cache)
-        else:
-            self.cache = cache
-
-        # Name/password
-        self.credentials = Credentials()
-
-        # Key/cert
-        self.certificates = KeyCerts()
-
-        # authorization objects
-        self.authorizations = []
-
-        # If set to False then no redirects are followed, even safe ones.
-        self.follow_redirects = True
-
-        # Which HTTP methods do we apply optimistic concurrency to, i.e.
-        # which methods get an "if-match:" etag header added to them.
-        self.optimistic_concurrency_methods = ["PUT", "PATCH"]
-
-        # If 'follow_redirects' is True, and this is set to True then
-        # all redirecs are followed, including unsafe ones.
-        self.follow_all_redirects = False
-
-        self.ignore_etag = False
-
-        self.force_exception_to_status_code = False
-
-        self.timeout = timeout
-
-    def _auth_from_challenge(self, host, request_uri, headers, response, content):
-        """A generator that creates Authorization objects
-           that can be applied to requests.
-        """
-        challenges = _parse_www_authenticate(response, 'www-authenticate')
-        for cred in self.credentials.iter(host):
-            for scheme in AUTH_SCHEME_ORDER:
-                if challenges.has_key(scheme):
-                    yield AUTH_SCHEME_CLASSES[scheme](cred, host, request_uri, headers, response, content, self)
-
-    def add_credentials(self, name, password, domain=""):
-        """Add a name and password that will be used
-        any time a request requires authentication."""
-        self.credentials.add(name, password, domain)
-
-    def add_certificate(self, key, cert, domain):
-        """Add a key and cert that will be used
-        any time a request requires authentication."""
-        self.certificates.add(key, cert, domain)
-
-    def clear_credentials(self):
-        """Remove all the names and passwords
-        that are used for authentication"""
-        self.credentials.clear()
-        self.authorizations = []
-
-    def _conn_request(self, conn, request_uri, method, body, headers):
-        for i in range(2):
-            try:
-                if conn.sock is None:
-                  conn.connect()
-                conn.request(method, request_uri, body, headers)
-            except socket.timeout:
-                raise
-            except socket.gaierror:
-                conn.close()
-                raise ServerNotFoundError("Unable to find the server at %s" % conn.host)
-            except ssl_SSLError:
-                conn.close()
-                raise
-            except socket.error, e:
-                err = 0
-                if hasattr(e, 'args'):
-                    err = getattr(e, 'args')[0]
-                else:
-                    err = e.errno
-                if err == errno.ECONNREFUSED: # Connection refused
-                    raise
-            except httplib.HTTPException:
-                # Just because the server closed the connection doesn't apparently mean
-                # that the server didn't send a response.
-                if conn.sock is None:
-                    if i == 0:
-                        conn.close()
-                        conn.connect()
-                        continue
-                    else:
-                        conn.close()
-                        raise
-                if i == 0:
-                    conn.close()
-                    conn.connect()
-                    continue
-                pass
-            try:
-                response = conn.getresponse()
-            except (socket.error, httplib.HTTPException):
-                if i == 0:
-                    conn.close()
-                    conn.connect()
-                    continue
-                else:
-                    raise
-            else:
-                content = ""
-                if method == "HEAD":
-                    response.close()
-                else:
-                    content = response.read()
-                response = Response(response)
-                if method != "HEAD":
-                    content = _decompressContent(response, content)
-            break
-        return (response, content)
-
-
-    def _request(self, conn, host, absolute_uri, request_uri, method, body, headers, redirections, cachekey):
-        """Do the actual request using the connection object
-        and also follow one level of redirects if necessary"""
-
-        auths = [(auth.depth(request_uri), auth) for auth in self.authorizations if auth.inscope(host, request_uri)]
-        auth = auths and sorted(auths)[0][1] or None
-        if auth:
-            auth.request(method, request_uri, headers, body)
-
-        (response, content) = self._conn_request(conn, request_uri, method, body, headers)
-
-        if auth:
-            if auth.response(response, body):
-                auth.request(method, request_uri, headers, body)
-                (response, content) = self._conn_request(conn, request_uri, method, body, headers )
-                response._stale_digest = 1
-
-        if response.status == 401:
-            for authorization in self._auth_from_challenge(host, request_uri, headers, response, content):
-                authorization.request(method, request_uri, headers, body)
-                (response, content) = self._conn_request(conn, request_uri, method, body, headers, )
-                if response.status != 401:
-                    self.authorizations.append(authorization)
-                    authorization.response(response, body)
-                    break
-
-        if (self.follow_all_redirects or (method in ["GET", "HEAD"]) or response.status == 303):
-            if self.follow_redirects and response.status in [300, 301, 302, 303, 307]:
-                # Pick out the location header and basically start from the beginning
-                # remembering first to strip the ETag header and decrement our 'depth'
-                if redirections:
-                    if not response.has_key('location') and response.status != 300:
-                        raise RedirectMissingLocation( _("Redirected but the response is missing a Location: header."), response, content)
-                    # Fix-up relative redirects (which violate an RFC 2616 MUST)
-                    if response.has_key('location'):
-                        location = response['location']
-                        (scheme, authority, path, query, fragment) = parse_uri(location)
-                        if authority == None:
-                            response['location'] = urlparse.urljoin(absolute_uri, location)
-                    if response.status == 301 and method in ["GET", "HEAD"]:
-                        response['-x-permanent-redirect-url'] = response['location']
-                        if not response.has_key('content-location'):
-                            response['content-location'] = absolute_uri
-                        _updateCache(headers, response, content, self.cache, cachekey)
-                    if headers.has_key('if-none-match'):
-                        del headers['if-none-match']
-                    if headers.has_key('if-modified-since'):
-                        del headers['if-modified-since']
-                    if response.has_key('location'):
-                        location = response['location']
-                        old_response = copy.deepcopy(response)
-                        if not old_response.has_key('content-location'):
-                            old_response['content-location'] = absolute_uri
-                        redirect_method = method
-                        if response.status in [302, 303]:
-                            redirect_method = "GET"
-                            body = None
-                        (response, content) = self.request(location, redirect_method, body=body, headers = headers, redirections = redirections - 1)
-                        response.previous = old_response
-                else:
-                    raise RedirectLimit("Redirected more times than rediection_limit allows.", response, content)
-            elif response.status in [200, 203] and method in ["GET", "HEAD"]:
-                # Don't cache 206's since we aren't going to handle byte range requests
-                if not response.has_key('content-location'):
-                    response['content-location'] = absolute_uri
-                _updateCache(headers, response, content, self.cache, cachekey)
-
-        return (response, content)
-
-    def _normalize_headers(self, headers):
-        return _normalize_headers(headers)
-
-# Need to catch and rebrand some exceptions
-# Then need to optionally turn all exceptions into status codes
-# including all socket.* and httplib.* exceptions.
-
-
-    def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAULT_MAX_REDIRECTS, connection_type=None):
-        """ Performs a single HTTP request.
-The 'uri' is the URI of the HTTP resource and can begin
-with either 'http' or 'https'. The value of 'uri' must be an absolute URI.
-
-The 'method' is the HTTP method to perform, such as GET, POST, DELETE, etc.
-There is no restriction on the methods allowed.
-
-The 'body' is the entity body to be sent with the request. It is a string
-object.
-
-Any extra headers that are to be sent with the request should be provided in the
-'headers' dictionary.
-
-The maximum number of redirect to follow before raising an
-exception is 'redirections. The default is 5.
-
-The return value is a tuple of (response, content), the first
-being and instance of the 'Response' class, the second being
-a string that contains the response entity body.
-        """
-        try:
-            if headers is None:
-                headers = {}
-            else:
-                headers = self._normalize_headers(headers)
-
-            if not headers.has_key('user-agent'):
-                headers['user-agent'] = "Python-httplib2/%s (gzip)" % __version__
-
-            uri = iri2uri(uri)
-
-            (scheme, authority, request_uri, defrag_uri) = urlnorm(uri)
-            domain_port = authority.split(":")[0:2]
-            if len(domain_port) == 2 and domain_port[1] == '443' and scheme == 'http':
-                scheme = 'https'
-                authority = domain_port[0]
-
-            conn_key = scheme+":"+authority
-            if conn_key in self.connections:
-                conn = self.connections[conn_key]
-            else:
-                if not connection_type:
-                  connection_type = SCHEME_TO_CONNECTION[scheme]
-                certs = list(self.certificates.iter(authority))
-                if issubclass(connection_type, HTTPSConnectionWithTimeout):
-                    if certs:
-                        conn = self.connections[conn_key] = connection_type(
-                                authority, key_file=certs[0][0],
-                                cert_file=certs[0][1], timeout=self.timeout,
-                                proxy_info=self.proxy_info,
-                                ca_certs=self.ca_certs,
-                                disable_ssl_certificate_validation=
-                                        self.disable_ssl_certificate_validation)
-                    else:
-                        conn = self.connections[conn_key] = connection_type(
-                                authority, timeout=self.timeout,
-                                proxy_info=self.proxy_info,
-                                ca_certs=self.ca_certs,
-                                disable_ssl_certificate_validation=
-                                        self.disable_ssl_certificate_validation)
-                else:
-                    conn = self.connections[conn_key] = connection_type(
-                            authority, timeout=self.timeout,
-                            proxy_info=self.proxy_info)
-                conn.set_debuglevel(debuglevel)
-
-            if 'range' not in headers and 'accept-encoding' not in headers:
-                headers['accept-encoding'] = 'gzip, deflate'
-
-            info = email.Message.Message()
-            cached_value = None
-            if self.cache:
-                cachekey = defrag_uri
-                cached_value = self.cache.get(cachekey)
-                if cached_value:
-                    # info = email.message_from_string(cached_value)
-                    #
-                    # Need to replace the line above with the kludge below
-                    # to fix the non-existent bug not fixed in this
-                    # bug report: http://mail.python.org/pipermail/python-bugs-list/2005-September/030289.html
-                    try:
-                        info, content = cached_value.split('\r\n\r\n', 1)
-                        feedparser = email.FeedParser.FeedParser()
-                        feedparser.feed(info)
-                        info = feedparser.close()
-                        feedparser._parse = None
-                    except IndexError:
-                        self.cache.delete(cachekey)
-                        cachekey = None
-                        cached_value = None
-            else:
-                cachekey = None
-
-            if method in self.optimistic_concurrency_methods and self.cache and info.has_key('etag') and not self.ignore_etag and 'if-match' not in headers:
-                # http://www.w3.org/1999/04/Editing/
-                headers['if-match'] = info['etag']
-
-            if method not in ["GET", "HEAD"] and self.cache and cachekey:
-                # RFC 2616 Section 13.10
-                self.cache.delete(cachekey)
-
-            # Check the vary header in the cache to see if this request
-            # matches what varies in the cache.
-            if method in ['GET', 'HEAD'] and 'vary' in info:
-                vary = info['vary']
-                vary_headers = vary.lower().replace(' ', '').split(',')
-                for header in vary_headers:
-                    key = '-varied-%s' % header
-                    value = info[key]
-                    if headers.get(header, None) != value:
-                            cached_value = None
-                            break
-
-            if cached_value and method in ["GET", "HEAD"] and self.cache and 'range' not in headers:
-                if info.has_key('-x-permanent-redirect-url'):
-                    # Should cached permanent redirects be counted in our redirection count? For now, yes.
-                    if redirections <= 0:
-                      raise RedirectLimit("Redirected more times than rediection_limit allows.", {}, "")
-                    (response, new_content) = self.request(info['-x-permanent-redirect-url'], "GET", headers = headers, redirections = redirections - 1)
-                    response.previous = Response(info)
-                    response.previous.fromcache = True
-                else:
-                    # Determine our course of action:
-                    #   Is the cached entry fresh or stale?
-                    #   Has the client requested a non-cached response?
-                    #
-                    # There seems to be three possible answers:
-                    # 1. [FRESH] Return the cache entry w/o doing a GET
-                    # 2. [STALE] Do the GET (but add in cache validators if available)
-                    # 3. [TRANSPARENT] Do a GET w/o any cache validators (Cache-Control: no-cache) on the request
-                    entry_disposition = _entry_disposition(info, headers)
-
-                    if entry_disposition == "FRESH":
-                        if not cached_value:
-                            info['status'] = '504'
-                            content = ""
-                        response = Response(info)
-                        if cached_value:
-                            response.fromcache = True
-                        return (response, content)
-
-                    if entry_disposition == "STALE":
-                        if info.has_key('etag') and not self.ignore_etag and not 'if-none-match' in headers:
-                            headers['if-none-match'] = info['etag']
-                        if info.has_key('last-modified') and not 'last-modified' in headers:
-                            headers['if-modified-since'] = info['last-modified']
-                    elif entry_disposition == "TRANSPARENT":
-                        pass
-
-                    (response, new_content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
-
-                if response.status == 304 and method == "GET":
-                    # Rewrite the cache entry with the new end-to-end headers
-                    # Take all headers that are in response
-                    # and overwrite their values in info.
-                    # unless they are hop-by-hop, or are listed in the connection header.
-
-                    for key in _get_end2end_headers(response):
-                        info[key] = response[key]
-                    merged_response = Response(info)
-                    if hasattr(response, "_stale_digest"):
-                        merged_response._stale_digest = response._stale_digest
-                    _updateCache(headers, merged_response, content, self.cache, cachekey)
-                    response = merged_response
-                    response.status = 200
-                    response.fromcache = True
-
-                elif response.status == 200:
-                    content = new_content
-                else:
-                    self.cache.delete(cachekey)
-                    content = new_content
-            else:
-                cc = _parse_cache_control(headers)
-                if cc.has_key('only-if-cached'):
-                    info['status'] = '504'
-                    response = Response(info)
-                    content = ""
-                else:
-                    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
-        except Exception, e:
-            if self.force_exception_to_status_code:
-                if isinstance(e, HttpLib2ErrorWithResponse):
-                    response = e.response
-                    content = e.content
-                    response.status = 500
-                    response.reason = str(e)
-                elif isinstance(e, socket.timeout):
-                    content = "Request Timeout"
-                    response = Response( {
-                            "content-type": "text/plain",
-                            "status": "408",
-                            "content-length": len(content)
-                            })
-                    response.reason = "Request Timeout"
-                else:
-                    content = str(e)
-                    response = Response( {
-                            "content-type": "text/plain",
-                            "status": "400",
-                            "content-length": len(content)
-                            })
-                    response.reason = "Bad Request"
-            else:
-                raise
-
-
-        return (response, content)
-
-
-
-class Response(dict):
-    """An object more like email.Message than httplib.HTTPResponse."""
-
-    """Is this response from our local cache"""
-    fromcache = False
-
-    """HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1. """
-    version = 11
-
-    "Status code returned by server. "
-    status = 200
-
-    """Reason phrase returned by server."""
-    reason = "Ok"
-
-    previous = None
-
-    def __init__(self, info):
-        # info is either an email.Message or
-        # an httplib.HTTPResponse object.
-        if isinstance(info, httplib.HTTPResponse):
-            for key, value in info.getheaders():
-                self[key.lower()] = value
-            self.status = info.status
-            self['status'] = str(self.status)
-            self.reason = info.reason
-            self.version = info.version
-        elif isinstance(info, email.Message.Message):
-            for key, value in info.items():
-                self[key] = value
-            self.status = int(self['status'])
-        else:
-            for key, value in info.iteritems():
-                self[key] = value
-            self.status = int(self.get('status', self.status))
-
-
-    def __getattr__(self, name):
-        if name == 'dict':
-            return self
-        else:
-            raise AttributeError, name
diff --git a/httplib2/cacerts.txt b/httplib2/cacerts.txt
deleted file mode 100644
index da36ed1..0000000
--- a/httplib2/cacerts.txt
+++ /dev/null
@@ -1,714 +0,0 @@
-# Certifcate Authority certificates for validating SSL connections.
-#
-# This file contains PEM format certificates generated from
-# http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt
-#
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Netscape security libraries.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1994-2000
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-Verisign/RSA Secure Server CA
-=============================
-
------BEGIN CERTIFICATE-----
-MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
-VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
-MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
-BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
-dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
-ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
-0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
-uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
-hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
-YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
-1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
------END CERTIFICATE-----
-
-Thawte Personal Basic CA
-========================
-
------BEGIN CERTIFICATE-----
-MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
-VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
-ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
-IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
-DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
-EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
-ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
-dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
-QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
-BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
-dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
-wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
-G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
-AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
-c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
-9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
------END CERTIFICATE-----
-
-Thawte Personal Premium CA
-==========================
-
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
-VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
-ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
-dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
-bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
-QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
-BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
-IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
-bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
-Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
-Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
-Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
-ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
-SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
-b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
-KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
------END CERTIFICATE-----
-
-Thawte Personal Freemail CA
-===========================
-
------BEGIN CERTIFICATE-----
-MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
-VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
-ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
-YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
-Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
-AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
-MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
-b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
-cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
-d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
-DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
-rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
-uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
-BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
-MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
-/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
-gQ==
------END CERTIFICATE-----
-
-Thawte Server CA
-================
-
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
-VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
-MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
-MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
-dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
-cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
-DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
-gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
-yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
-L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
-EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
-7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
-QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
-qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
-
-Thawte Premium Server CA
-========================
-
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
-VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
-dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
-MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
-MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
-A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
-b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
-cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
-bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
-VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
-ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
-uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
-9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
-hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
-pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
------END CERTIFICATE-----
-
-Equifax Secure CA
-=================
-
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
-UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
-dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
-MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
-dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
-BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
-cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
-AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
-MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
-aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
-ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
-IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
-MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
-A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
-7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
-1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority
-=======================================================
-
------BEGIN CERTIFICATE-----
-MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
-c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
-NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
-VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
-bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
-H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
-4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
-BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
-EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
-FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
-lA==
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority
-=======================================================
-
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
-MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
-BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
-ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
-YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
-FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
-CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
-J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
-r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
-
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
-MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
-BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
-ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
-BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
-I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
-CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
-lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
-AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority - G2
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
-c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
-MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
-emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
-DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
-FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
-UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
-YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
-MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
-VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
-Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
-AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
-h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
-uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
-DzFc6PLZ
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority - G2
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
-YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
-MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
-aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
-Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
-IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
-KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
-eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
-HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
-DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
-AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
-nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
-rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
-jBJ7xUS0rg==
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G2
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
-c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
-MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
-emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
-DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
-FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
-UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
-YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
-MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
-pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
-13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
-AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
-U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
-F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
-oJ2daZH9
------END CERTIFICATE-----
-
-Verisign Class 4 Public Primary Certification Authority - G2
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
-c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
-MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
-emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
-DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
-FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
-UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
-YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
-MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
-HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
-qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
-AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
-cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
-cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
-T8qAkbYp
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority - G3
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
-nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
-8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
-ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
-PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
-6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
-n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
-qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
-wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
-ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
-pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
-E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority - G3
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
-aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
-IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
-Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
-BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
-Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
-Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
-IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
-J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
-JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
-wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
-koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
-qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
-Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
-xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
-7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
-sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
-sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
-cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G3
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
-N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
-KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
-kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
-CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
-Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
-imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
-2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
-DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
-F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
-TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
-
-Verisign Class 4 Public Primary Certification Authority - G3
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
-GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
-+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
-U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
-NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
-ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
-ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
-CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
-g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
-fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
-2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
-bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
-
-Equifax Secure Global eBusiness CA
-==================================
-
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
-ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
-MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
-dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
-c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
-UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
-58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
-o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
-aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
-A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
-Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
-8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 1
-=============================
-
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
-ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
-MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
-LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
-KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
-RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
-WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
-Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
-AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
-eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
-zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
-WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
-/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 2
-=============================
-
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
-dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
-NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
-VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
-vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
-BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
-AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
-MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
-IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
-NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
-y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
-MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
-A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
-0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
-E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
------END CERTIFICATE-----
-
-Thawte Time Stamping CA
-=======================
-
------BEGIN CERTIFICATE-----
-MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
-BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
-BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
-MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
-Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
-A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
-c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
-6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
-Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
-8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
-Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
-9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
-pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
-CayJSdM=
------END CERTIFICATE-----
-
-thawte Primary Root CA
-======================
-
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
-qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
-MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
-BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
-NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
-LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
-A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
-W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
-3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
-6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
-Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
-NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
-r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
-DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
-YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
-/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
-LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
-jVaMaA==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G5
-============================================================
-
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
-ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
-nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
-t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
-SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
-BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
-rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
-NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
-BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
-BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
-MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
-p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
-5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
-WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
-4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
-hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
-
-Entrust.net Secure Server Certification Authority
-=================================================
-
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
-ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
-ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
-MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
-b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
-U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
-I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
-wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
-AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
-oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
-BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
-dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
-MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
-b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
-MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
-E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
-MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
-hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
-95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
-2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
-
-Go Daddy Certification Authority Root Certificate Bundle
-========================================================
-
------BEGIN CERTIFICATE-----
-MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
-ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
-RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
-MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
-QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
-b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
-b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
-KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
-VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
-SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
-cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
-6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
-MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
-kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
-BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
-BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
-c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
-AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
-BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
-OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
-A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
-0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
-RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
-qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
-U+4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
-bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
-BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
-DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
-YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
-ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
-2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
-N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
-r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
-f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
-U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
-TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
-VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
-SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
-biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
-MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
-AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
-ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
-Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
-IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
-bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
-QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
-WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
-SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
-NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
-dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
-WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
-v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
-UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
-IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
-W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
------END CERTIFICATE-----
-
diff --git a/httplib2/iri2uri.py b/httplib2/iri2uri.py
deleted file mode 100644
index 70667ed..0000000
--- a/httplib2/iri2uri.py
+++ /dev/null
@@ -1,110 +0,0 @@
-"""
-iri2uri
-
-Converts an IRI to a URI.
-
-"""
-__author__ = "Joe Gregorio (joe@bitworking.org)"
-__copyright__ = "Copyright 2006, Joe Gregorio"
-__contributors__ = []
-__version__ = "1.0.0"
-__license__ = "MIT"
-__history__ = """
-"""
-
-import urlparse
-
-
-# Convert an IRI to a URI following the rules in RFC 3987
-# 
-# The characters we need to enocde and escape are defined in the spec:
-#
-# iprivate =  %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD
-# ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
-#         / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
-#         / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
-#         / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
-#         / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
-#         / %xD0000-DFFFD / %xE1000-EFFFD
-
-escape_range = [
-   (0xA0, 0xD7FF ),
-   (0xE000, 0xF8FF ),
-   (0xF900, 0xFDCF ),
-   (0xFDF0, 0xFFEF),
-   (0x10000, 0x1FFFD ),
-   (0x20000, 0x2FFFD ),
-   (0x30000, 0x3FFFD),
-   (0x40000, 0x4FFFD ),
-   (0x50000, 0x5FFFD ),
-   (0x60000, 0x6FFFD),
-   (0x70000, 0x7FFFD ),
-   (0x80000, 0x8FFFD ),
-   (0x90000, 0x9FFFD),
-   (0xA0000, 0xAFFFD ),
-   (0xB0000, 0xBFFFD ),
-   (0xC0000, 0xCFFFD),
-   (0xD0000, 0xDFFFD ),
-   (0xE1000, 0xEFFFD),
-   (0xF0000, 0xFFFFD ),
-   (0x100000, 0x10FFFD)
-]
- 
-def encode(c):
-    retval = c
-    i = ord(c)
-    for low, high in escape_range:
-        if i < low:
-            break
-        if i >= low and i <= high:
-            retval = "".join(["%%%2X" % ord(o) for o in c.encode('utf-8')])
-            break
-    return retval
-
-
-def iri2uri(uri):
-    """Convert an IRI to a URI. Note that IRIs must be 
-    passed in a unicode strings. That is, do not utf-8 encode
-    the IRI before passing it into the function.""" 
-    if isinstance(uri ,unicode):
-        (scheme, authority, path, query, fragment) = urlparse.urlsplit(uri)
-        authority = authority.encode('idna')
-        # For each character in 'ucschar' or 'iprivate'
-        #  1. encode as utf-8
-        #  2. then %-encode each octet of that utf-8 
-        uri = urlparse.urlunsplit((scheme, authority, path, query, fragment))
-        uri = "".join([encode(c) for c in uri])
-    return uri
-        
-if __name__ == "__main__":
-    import unittest
-
-    class Test(unittest.TestCase):
-
-        def test_uris(self):
-            """Test that URIs are invariant under the transformation."""
-            invariant = [ 
-                u"ftp://ftp.is.co.za/rfc/rfc1808.txt",
-                u"http://www.ietf.org/rfc/rfc2396.txt",
-                u"ldap://[2001:db8::7]/c=GB?objectClass?one",
-                u"mailto:John.Doe@example.com",
-                u"news:comp.infosystems.www.servers.unix",
-                u"tel:+1-816-555-1212",
-                u"telnet://192.0.2.16:80/",
-                u"urn:oasis:names:specification:docbook:dtd:xml:4.1.2" ]
-            for uri in invariant:
-                self.assertEqual(uri, iri2uri(uri))
-            
-        def test_iri(self):
-            """ Test that the right type of escaping is done for each part of the URI."""
-            self.assertEqual("http://xn--o3h.com/%E2%98%84", iri2uri(u"http://\N{COMET}.com/\N{COMET}"))
-            self.assertEqual("http://bitworking.org/?fred=%E2%98%84", iri2uri(u"http://bitworking.org/?fred=\N{COMET}"))
-            self.assertEqual("http://bitworking.org/#%E2%98%84", iri2uri(u"http://bitworking.org/#\N{COMET}"))
-            self.assertEqual("#%E2%98%84", iri2uri(u"#\N{COMET}"))
-            self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}"))
-            self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}")))
-            self.assertNotEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}".encode('utf-8')))
-
-    unittest.main()
-
-    
diff --git a/httplib2/socks.py b/httplib2/socks.py
deleted file mode 100644
index 84cb93b..0000000
--- a/httplib2/socks.py
+++ /dev/null
@@ -1,438 +0,0 @@
-"""SocksiPy - Python SOCKS module.
-Version 1.00
-
-Copyright 2006 Dan-Haim. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-2. 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.
-3. Neither the name of Dan Haim nor the names of his contributors may be used
-   to endorse or promote products derived from this software without specific
-   prior written permission.
-   
-THIS SOFTWARE IS PROVIDED BY DAN HAIM "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 DAN HAIM OR HIS 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, 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 DAMANGE.
-
-
-This module provides a standard socket-like interface for Python
-for tunneling connections through SOCKS proxies.
-
-"""
-
-"""
-
-Minor modifications made by Christopher Gilbert (http://motomastyle.com/)
-for use in PyLoris (http://pyloris.sourceforge.net/)
-
-Minor modifications made by Mario Vilas (http://breakingcode.wordpress.com/)
-mainly to merge bug fixes found in Sourceforge
-
-"""
-
-import base64
-import socket
-import struct
-import sys
-
-if getattr(socket, 'socket', None) is None:
-    raise ImportError('socket.socket missing, proxy support unusable')
-
-PROXY_TYPE_SOCKS4 = 1
-PROXY_TYPE_SOCKS5 = 2
-PROXY_TYPE_HTTP = 3
-PROXY_TYPE_HTTP_NO_TUNNEL = 4
-
-_defaultproxy = None
-_orgsocket = socket.socket
-
-class ProxyError(Exception): pass
-class GeneralProxyError(ProxyError): pass
-class Socks5AuthError(ProxyError): pass
-class Socks5Error(ProxyError): pass
-class Socks4Error(ProxyError): pass
-class HTTPError(ProxyError): pass
-
-_generalerrors = ("success",
-    "invalid data",
-    "not connected",
-    "not available",
-    "bad proxy type",
-    "bad input")
-
-_socks5errors = ("succeeded",
-    "general SOCKS server failure",
-    "connection not allowed by ruleset",
-    "Network unreachable",
-    "Host unreachable",
-    "Connection refused",
-    "TTL expired",
-    "Command not supported",
-    "Address type not supported",
-    "Unknown error")
-
-_socks5autherrors = ("succeeded",
-    "authentication is required",
-    "all offered authentication methods were rejected",
-    "unknown username or invalid password",
-    "unknown error")
-
-_socks4errors = ("request granted",
-    "request rejected or failed",
-    "request rejected because SOCKS server cannot connect to identd on the client",
-    "request rejected because the client program and identd report different user-ids",
-    "unknown error")
-
-def setdefaultproxy(proxytype=None, addr=None, port=None, rdns=True, username=None, password=None):
-    """setdefaultproxy(proxytype, addr[, port[, rdns[, username[, password]]]])
-    Sets a default proxy which all further socksocket objects will use,
-    unless explicitly changed.
-    """
-    global _defaultproxy
-    _defaultproxy = (proxytype, addr, port, rdns, username, password)
-
-def wrapmodule(module):
-    """wrapmodule(module)
-    Attempts to replace a module's socket library with a SOCKS socket. Must set
-    a default proxy using setdefaultproxy(...) first.
-    This will only work on modules that import socket directly into the namespace;
-    most of the Python Standard Library falls into this category.
-    """
-    if _defaultproxy != None:
-        module.socket.socket = socksocket
-    else:
-        raise GeneralProxyError((4, "no proxy specified"))
-
-class socksocket(socket.socket):
-    """socksocket([family[, type[, proto]]]) -> socket object
-    Open a SOCKS enabled socket. The parameters are the same as
-    those of the standard socket init. In order for SOCKS to work,
-    you must specify family=AF_INET, type=SOCK_STREAM and proto=0.
-    """
-
-    def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _sock=None):
-        _orgsocket.__init__(self, family, type, proto, _sock)
-        if _defaultproxy != None:
-            self.__proxy = _defaultproxy
-        else:
-            self.__proxy = (None, None, None, None, None, None)
-        self.__proxysockname = None
-        self.__proxypeername = None
-        self.__httptunnel = True
-
-    def __recvall(self, count):
-        """__recvall(count) -> data
-        Receive EXACTLY the number of bytes requested from the socket.
-        Blocks until the required number of bytes have been received.
-        """
-        data = self.recv(count)
-        while len(data) < count:
-            d = self.recv(count-len(data))
-            if not d: raise GeneralProxyError((0, "connection closed unexpectedly"))
-            data = data + d
-        return data
-
-    def sendall(self, content, *args):
-        """ override socket.socket.sendall method to rewrite the header 
-        for non-tunneling proxies if needed 
-        """
-        if not self.__httptunnel:
-            content = self.__rewriteproxy(content)
-        return super(socksocket, self).sendall(content, *args)
-
-    def __rewriteproxy(self, header):
-        """ rewrite HTTP request headers to support non-tunneling proxies 
-        (i.e. those which do not support the CONNECT method).
-        This only works for HTTP (not HTTPS) since HTTPS requires tunneling.
-        """
-        host, endpt = None, None
-        hdrs = header.split("\r\n")
-        for hdr in hdrs:
-            if hdr.lower().startswith("host:"):
-                host = hdr
-            elif hdr.lower().startswith("get") or hdr.lower().startswith("post"):
-                endpt = hdr
-        if host and endpt: 
-            hdrs.remove(host)
-            hdrs.remove(endpt)
-            host = host.split(" ")[1]
-            endpt = endpt.split(" ")
-            if (self.__proxy[4] != None and self.__proxy[5] != None):
-                hdrs.insert(0, self.__getauthheader())
-            hdrs.insert(0, "Host: %s" % host)
-            hdrs.insert(0, "%s http://%s%s %s" % (endpt[0], host, endpt[1], endpt[2]))
-        return "\r\n".join(hdrs)
-
-    def __getauthheader(self):
-        auth = self.__proxy[4] + ":" + self.__proxy[5]
-        return "Proxy-Authorization: Basic " + base64.b64encode(auth)
-
-    def setproxy(self, proxytype=None, addr=None, port=None, rdns=True, username=None, password=None):
-        """setproxy(proxytype, addr[, port[, rdns[, username[, password]]]])
-        Sets the proxy to be used.
-        proxytype -    The type of the proxy to be used. Three types
-                are supported: PROXY_TYPE_SOCKS4 (including socks4a),
-                PROXY_TYPE_SOCKS5 and PROXY_TYPE_HTTP
-        addr -        The address of the server (IP or DNS).
-        port -        The port of the server. Defaults to 1080 for SOCKS
-                servers and 8080 for HTTP proxy servers.
-        rdns -        Should DNS queries be preformed on the remote side
-                (rather than the local side). The default is True.
-                Note: This has no effect with SOCKS4 servers.
-        username -    Username to authenticate with to the server.
-                The default is no authentication.
-        password -    Password to authenticate with to the server.
-                Only relevant when username is also provided.
-        """
-        self.__proxy = (proxytype, addr, port, rdns, username, password)
-
-    def __negotiatesocks5(self, destaddr, destport):
-        """__negotiatesocks5(self,destaddr,destport)
-        Negotiates a connection through a SOCKS5 server.
-        """
-        # First we'll send the authentication packages we support.
-        if (self.__proxy[4]!=None) and (self.__proxy[5]!=None):
-            # The username/password details were supplied to the
-            # setproxy method so we support the USERNAME/PASSWORD
-            # authentication (in addition to the standard none).
-            self.sendall(struct.pack('BBBB', 0x05, 0x02, 0x00, 0x02))
-        else:
-            # No username/password were entered, therefore we
-            # only support connections with no authentication.
-            self.sendall(struct.pack('BBB', 0x05, 0x01, 0x00))
-        # We'll receive the server's response to determine which
-        # method was selected
-        chosenauth = self.__recvall(2)
-        if chosenauth[0:1] != chr(0x05).encode():
-            self.close()
-            raise GeneralProxyError((1, _generalerrors[1]))
-        # Check the chosen authentication method
-        if chosenauth[1:2] == chr(0x00).encode():
-            # No authentication is required
-            pass
-        elif chosenauth[1:2] == chr(0x02).encode():
-            # Okay, we need to perform a basic username/password
-            # authentication.
-            self.sendall(chr(0x01).encode() + chr(len(self.__proxy[4])) + self.__proxy[4] + chr(len(self.__proxy[5])) + self.__proxy[5])
-            authstat = self.__recvall(2)
-            if authstat[0:1] != chr(0x01).encode():
-                # Bad response
-                self.close()
-                raise GeneralProxyError((1, _generalerrors[1]))
-            if authstat[1:2] != chr(0x00).encode():
-                # Authentication failed
-                self.close()
-                raise Socks5AuthError((3, _socks5autherrors[3]))
-            # Authentication succeeded
-        else:
-            # Reaching here is always bad
-            self.close()
-            if chosenauth[1] == chr(0xFF).encode():
-                raise Socks5AuthError((2, _socks5autherrors[2]))
-            else:
-                raise GeneralProxyError((1, _generalerrors[1]))
-        # Now we can request the actual connection
-        req = struct.pack('BBB', 0x05, 0x01, 0x00)
-        # If the given destination address is an IP address, we'll
-        # use the IPv4 address request even if remote resolving was specified.
-        try:
-            ipaddr = socket.inet_aton(destaddr)
-            req = req + chr(0x01).encode() + ipaddr
-        except socket.error:
-            # Well it's not an IP number,  so it's probably a DNS name.
-            if self.__proxy[3]:
-                # Resolve remotely
-                ipaddr = None
-                req = req + chr(0x03).encode() + chr(len(destaddr)).encode() + destaddr
-            else:
-                # Resolve locally
-                ipaddr = socket.inet_aton(socket.gethostbyname(destaddr))
-                req = req + chr(0x01).encode() + ipaddr
-        req = req + struct.pack(">H", destport)
-        self.sendall(req)
-        # Get the response
-        resp = self.__recvall(4)
-        if resp[0:1] != chr(0x05).encode():
-            self.close()
-            raise GeneralProxyError((1, _generalerrors[1]))
-        elif resp[1:2] != chr(0x00).encode():
-            # Connection failed
-            self.close()
-            if ord(resp[1:2])<=8:
-                raise Socks5Error((ord(resp[1:2]), _socks5errors[ord(resp[1:2])]))
-            else:
-                raise Socks5Error((9, _socks5errors[9]))
-        # Get the bound address/port
-        elif resp[3:4] == chr(0x01).encode():
-            boundaddr = self.__recvall(4)
-        elif resp[3:4] == chr(0x03).encode():
-            resp = resp + self.recv(1)
-            boundaddr = self.__recvall(ord(resp[4:5]))
-        else:
-            self.close()
-            raise GeneralProxyError((1,_generalerrors[1]))
-        boundport = struct.unpack(">H", self.__recvall(2))[0]
-        self.__proxysockname = (boundaddr, boundport)
-        if ipaddr != None:
-            self.__proxypeername = (socket.inet_ntoa(ipaddr), destport)
-        else:
-            self.__proxypeername = (destaddr, destport)
-
-    def getproxysockname(self):
-        """getsockname() -> address info
-        Returns the bound IP address and port number at the proxy.
-        """
-        return self.__proxysockname
-
-    def getproxypeername(self):
-        """getproxypeername() -> address info
-        Returns the IP and port number of the proxy.
-        """
-        return _orgsocket.getpeername(self)
-
-    def getpeername(self):
-        """getpeername() -> address info
-        Returns the IP address and port number of the destination
-        machine (note: getproxypeername returns the proxy)
-        """
-        return self.__proxypeername
-
-    def __negotiatesocks4(self,destaddr,destport):
-        """__negotiatesocks4(self,destaddr,destport)
-        Negotiates a connection through a SOCKS4 server.
-        """
-        # Check if the destination address provided is an IP address
-        rmtrslv = False
-        try:
-            ipaddr = socket.inet_aton(destaddr)
-        except socket.error:
-            # It's a DNS name. Check where it should be resolved.
-            if self.__proxy[3]:
-                ipaddr = struct.pack("BBBB", 0x00, 0x00, 0x00, 0x01)
-                rmtrslv = True
-            else:
-                ipaddr = socket.inet_aton(socket.gethostbyname(destaddr))
-        # Construct the request packet
-        req = struct.pack(">BBH", 0x04, 0x01, destport) + ipaddr
-        # The username parameter is considered userid for SOCKS4
-        if self.__proxy[4] != None:
-            req = req + self.__proxy[4]
-        req = req + chr(0x00).encode()
-        # DNS name if remote resolving is required
-        # NOTE: This is actually an extension to the SOCKS4 protocol
-        # called SOCKS4A and may not be supported in all cases.
-        if rmtrslv:
-            req = req + destaddr + chr(0x00).encode()
-        self.sendall(req)
-        # Get the response from the server
-        resp = self.__recvall(8)
-        if resp[0:1] != chr(0x00).encode():
-            # Bad data
-            self.close()
-            raise GeneralProxyError((1,_generalerrors[1]))
-        if resp[1:2] != chr(0x5A).encode():
-            # Server returned an error
-            self.close()
-            if ord(resp[1:2]) in (91, 92, 93):
-                self.close()
-                raise Socks4Error((ord(resp[1:2]), _socks4errors[ord(resp[1:2]) - 90]))
-            else:
-                raise Socks4Error((94, _socks4errors[4]))
-        # Get the bound address/port
-        self.__proxysockname = (socket.inet_ntoa(resp[4:]), struct.unpack(">H", resp[2:4])[0])
-        if rmtrslv != None:
-            self.__proxypeername = (socket.inet_ntoa(ipaddr), destport)
-        else:
-            self.__proxypeername = (destaddr, destport)
-
-    def __negotiatehttp(self, destaddr, destport):
-        """__negotiatehttp(self,destaddr,destport)
-        Negotiates a connection through an HTTP server.
-        """
-        # If we need to resolve locally, we do this now
-        if not self.__proxy[3]:
-            addr = socket.gethostbyname(destaddr)
-        else:
-            addr = destaddr
-        headers =  ["CONNECT ", addr, ":", str(destport), " HTTP/1.1\r\n"]
-        headers += ["Host: ", destaddr, "\r\n"]
-        if (self.__proxy[4] != None and self.__proxy[5] != None):
-                headers += [self.__getauthheader(), "\r\n"]
-        headers.append("\r\n")
-        self.sendall("".join(headers).encode())
-        # We read the response until we get the string "\r\n\r\n"
-        resp = self.recv(1)
-        while resp.find("\r\n\r\n".encode()) == -1:
-            resp = resp + self.recv(1)
-        # We just need the first line to check if the connection
-        # was successful
-        statusline = resp.splitlines()[0].split(" ".encode(), 2)
-        if statusline[0] not in ("HTTP/1.0".encode(), "HTTP/1.1".encode()):
-            self.close()
-            raise GeneralProxyError((1, _generalerrors[1]))
-        try:
-            statuscode = int(statusline[1])
-        except ValueError:
-            self.close()
-            raise GeneralProxyError((1, _generalerrors[1]))
-        if statuscode != 200:
-            self.close()
-            raise HTTPError((statuscode, statusline[2]))
-        self.__proxysockname = ("0.0.0.0", 0)
-        self.__proxypeername = (addr, destport)
-
-    def connect(self, destpair):
-        """connect(self, despair)
-        Connects to the specified destination through a proxy.
-        destpar - A tuple of the IP/DNS address and the port number.
-        (identical to socket's connect).
-        To select the proxy server use setproxy().
-        """
-        # Do a minimal input check first
-        if (not type(destpair) in (list,tuple)) or (len(destpair) < 2) or (type(destpair[0]) != type('')) or (type(destpair[1]) != int):
-            raise GeneralProxyError((5, _generalerrors[5]))
-        if self.__proxy[0] == PROXY_TYPE_SOCKS5:
-            if self.__proxy[2] != None:
-                portnum = self.__proxy[2]
-            else:
-                portnum = 1080
-            _orgsocket.connect(self, (self.__proxy[1], portnum))
-            self.__negotiatesocks5(destpair[0], destpair[1])
-        elif self.__proxy[0] == PROXY_TYPE_SOCKS4:
-            if self.__proxy[2] != None:
-                portnum = self.__proxy[2]
-            else:
-                portnum = 1080
-            _orgsocket.connect(self,(self.__proxy[1], portnum))
-            self.__negotiatesocks4(destpair[0], destpair[1])
-        elif self.__proxy[0] == PROXY_TYPE_HTTP:
-            if self.__proxy[2] != None:
-                portnum = self.__proxy[2]
-            else:
-                portnum = 8080
-            _orgsocket.connect(self,(self.__proxy[1], portnum))
-            self.__negotiatehttp(destpair[0], destpair[1])
-        elif self.__proxy[0] == PROXY_TYPE_HTTP_NO_TUNNEL:
-            if self.__proxy[2] != None:
-                portnum = self.__proxy[2]
-            else:
-                portnum = 8080
-            _orgsocket.connect(self,(self.__proxy[1],portnum))
-            if destpair[1] == 443:
-                self.__negotiatehttp(destpair[0],destpair[1])
-            else:
-                self.__httptunnel = False
-        elif self.__proxy[0] == None:
-            _orgsocket.connect(self, (destpair[0], destpair[1]))
-        else:
-            raise GeneralProxyError((4, _generalerrors[4]))
diff --git a/oacurl.py b/oacurl.py
deleted file mode 100644
index 740baf2..0000000
--- a/oacurl.py
+++ /dev/null
@@ -1,160 +0,0 @@
-# Copyright (C) 2010 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-from apiclient.discovery import build
-from apiclient.oauth import FlowThreeLegged
-
-import datetime
-import httplib2
-import logging
-import oauth_wrap
-import optparse
-import os
-import sys
-
-
-def load_properties_file(path):
-  properties = {}
-  for line in open(path):
-    line = line.strip()
-    if line.startswith('#'):
-      continue
-      
-    key,value = line.split('=')
-    properties[key.strip()] = value.strip()
-  return properties
-
-
-def save_properties(consumer_key, consumer_secret, token_key, token_secret, path):
-  file = open(path, 'w')
-  
-  # File format and order is based on oacurl.java's defaults
-  now = datetime.datetime.today()
-  now_string = now.strftime('%a %b %d %H:%m:%S %Z %Y')
-  file.write('#%s\n' % now_string)
-  file.write('consumerSecret=%s\n' % consumer_secret)
-  file.write('accessToken=%s\n' % token_key)
-  file.write('consumerKey=%s\n' % consumer_key)
-  file.write('accessTokenSecret=%s\n' % token_secret)
-  file.close()
-
-
-def fetch(url):
-  logging.debug('Now fetching: %s' % url)
-  
-  path = os.path.expanduser('~/.oacurl.properties')
-  if not os.path.exists(path):
-    logging.debug('User is not logged in.')
-    
-    print 'You are not logged in'
-    sys.exit(1)
-
-  properties = load_properties_file(path)
-  oauth_parameters = {
-    'consumer_key': properties['consumerKey'], 
-    'consumer_secret' : properties['consumerSecret'],
-    'oauth_token' : properties['accessToken'],
-    'oauth_token_secret':properties['accessTokenSecret']}
-  
-  http = oauth_wrap.get_authorised_http(oauth_parameters)
-  response, content = http.request(url)
-  logging.debug(response)
-  logging.debug(content)
-  
-  return response,content
-
-
-def buzz_login():
-  buzz_discovery = build("buzz", "v1").auth_discovery()
-
-  flow = FlowThreeLegged(buzz_discovery,
-                         consumer_key='anonymous',
-                         consumer_secret='anonymous',
-                         user_agent='google-api-client-python-buzz-cmdline/1.0',
-                         domain='anonymous',
-                         scope='https://www.googleapis.com/auth/buzz',
-                         xoauth_displayname='oacurl.py')
-
-  authorize_url = flow.step1_get_authorize_url()
-
-  print 'Go to the following link in your browser:'
-  print authorize_url
-  print
-
-  accepted = 'n'
-  while accepted.lower() == 'n':
-      accepted = raw_input('Have you authorized me? (y/n) ')
-  verification = raw_input('What is the verification code? ').strip()
-
-  credentials = flow.step2_exchange(verification)
-  path = os.path.expanduser('~/.oacurl.properties')
-  save_properties('anonymous', 'anonymous', credentials.token.key, credentials.token.secret,path)
-  
-  
-def generic_login():
-  #TODO(ade) Implement support for other services
-  print 'Support for services other than Buzz is not implemented yet. Sorry.'
-
-
-def login(options):
-  if options.buzz:
-    buzz_login()
-  else:
-    generic_login()
-
-
-def get_command(args):
-  if args and args[0] == 'login':
-    return 'login'
-  if args and args[0] == 'fetch':
-    return 'fetch'
-  return None
-
-
-def configure_logging(options):
-  if options.verbose:
-    logging.basicConfig(level=logging.DEBUG)
-
-
-def main():
-  usage = '''Usage: python %prog [options] fetch <url>
-  Example: python %prog -v fetch "https://www.googleapis.com/buzz/v1/people/@me/@self?alt=json&pp=1"
-  '''
-  parser = optparse.OptionParser(usage=usage)
-  parser.set_defaults(verbose=False)
-  parser.add_option('-v', '--verbose', action='store_true', dest='verbose')
-  parser.add_option('-q', '--quiet', action='store_false', dest='verbose')
-  parser.add_option('--buzz', action='store_true', dest='buzz')
-  
-  (options, args) = parser.parse_args()
-
-  configure_logging(options)
-  logging.debug('Options: %s and Args: %s' % (str(options), str(args)))
-  
-  command = get_command(args)
-  
-  if not command:
-    parser.error('Invalid arguments')
-    return
-  
-  if command == 'fetch':
-    response, content = fetch(args[1])
-    print response
-    print content
-    return
-  
-  if command == 'login':
-    login(options)
-
-if __name__ == '__main__':
-  main()
\ No newline at end of file
diff --git a/oauth2/__init__.py b/oauth2/__init__.py
deleted file mode 100644
index 3adbd20..0000000
--- a/oauth2/__init__.py
+++ /dev/null
@@ -1,735 +0,0 @@
-"""
-The MIT License
-
-Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-"""
-
-import urllib
-import time
-import random
-import urlparse
-import hmac
-import binascii
-import httplib2
-
-try:
-    from urlparse import parse_qs, parse_qsl
-except ImportError:
-    from cgi import parse_qs, parse_qsl
-
-
-VERSION = '1.0'  # Hi Blaine!
-HTTP_METHOD = 'GET'
-SIGNATURE_METHOD = 'PLAINTEXT'
-
-
-class Error(RuntimeError):
-    """Generic exception class."""
-
-    def __init__(self, message='OAuth error occurred.'):
-        self._message = message
-
-    @property
-    def message(self):
-        """A hack to get around the deprecation errors in 2.6."""
-        return self._message
-
-    def __str__(self):
-        return self._message
-
-
-class MissingSignature(Error):
-    pass
-
-
-def build_authenticate_header(realm=''):
-    """Optional WWW-Authenticate header (401 error)"""
-    return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
-
-
-def build_xoauth_string(url, consumer, token=None):
-    """Build an XOAUTH string for use in SMTP/IMPA authentication."""
-    request = Request.from_consumer_and_token(consumer, token,
-        "GET", url)
-
-    signing_method = SignatureMethod_HMAC_SHA1()
-    request.sign_request(signing_method, consumer, token)
-
-    params = []
-    for k, v in sorted(request.iteritems()):
-        if v is not None:
-            params.append('%s="%s"' % (k, escape(v)))
-
-    return "%s %s %s" % ("GET", url, ','.join(params))
-
-
-def escape(s):
-    """Escape a URL including any /."""
-    return urllib.quote(s, safe='~')
-
-
-def generate_timestamp():
-    """Get seconds since epoch (UTC)."""
-    return int(time.time())
-
-
-def generate_nonce(length=8):
-    """Generate pseudorandom number."""
-    return ''.join([str(random.randint(0, 9)) for i in range(length)])
-
-
-def generate_verifier(length=8):
-    """Generate pseudorandom number."""
-    return ''.join([str(random.randint(0, 9)) for i in range(length)])
-
-
-class Consumer(object):
-    """A consumer of OAuth-protected services.
- 
-    The OAuth consumer is a "third-party" service that wants to access
-    protected resources from an OAuth service provider on behalf of an end
-    user. It's kind of the OAuth client.
- 
-    Usually a consumer must be registered with the service provider by the
-    developer of the consumer software. As part of that process, the service
-    provider gives the consumer a *key* and a *secret* with which the consumer
-    software can identify itself to the service. The consumer will include its
-    key in each request to identify itself, but will use its secret only when
-    signing requests, to prove that the request is from that particular
-    registered consumer.
- 
-    Once registered, the consumer can then use its consumer credentials to ask
-    the service provider for a request token, kicking off the OAuth
-    authorization process.
-    """
-
-    key = None
-    secret = None
-
-    def __init__(self, key, secret):
-        self.key = key
-        self.secret = secret
-
-        if self.key is None or self.secret is None:
-            raise ValueError("Key and secret must be set.")
-
-    def __str__(self):
-        data = {'oauth_consumer_key': self.key,
-            'oauth_consumer_secret': self.secret}
-
-        return urllib.urlencode(data)
-
-
-class Token(object):
-    """An OAuth credential used to request authorization or a protected
-    resource.
- 
-    Tokens in OAuth comprise a *key* and a *secret*. The key is included in
-    requests to identify the token being used, but the secret is used only in
-    the signature, to prove that the requester is who the server gave the
-    token to.
- 
-    When first negotiating the authorization, the consumer asks for a *request
-    token* that the live user authorizes with the service provider. The
-    consumer then exchanges the request token for an *access token* that can
-    be used to access protected resources.
-    """
-
-    key = None
-    secret = None
-    callback = None
-    callback_confirmed = None
-    verifier = None
-
-    def __init__(self, key, secret):
-        self.key = key
-        self.secret = secret
-
-        if self.key is None or self.secret is None:
-            raise ValueError("Key and secret must be set.")
-
-    def set_callback(self, callback):
-        self.callback = callback
-        self.callback_confirmed = 'true'
-
-    def set_verifier(self, verifier=None):
-        if verifier is not None:
-            self.verifier = verifier
-        else:
-            self.verifier = generate_verifier()
-
-    def get_callback_url(self):
-        if self.callback and self.verifier:
-            # Append the oauth_verifier.
-            parts = urlparse.urlparse(self.callback)
-            scheme, netloc, path, params, query, fragment = parts[:6]
-            if query:
-                query = '%s&oauth_verifier=%s' % (query, self.verifier)
-            else:
-                query = 'oauth_verifier=%s' % self.verifier
-            return urlparse.urlunparse((scheme, netloc, path, params,
-                query, fragment))
-        return self.callback
-
-    def to_string(self):
-        """Returns this token as a plain string, suitable for storage.
- 
-        The resulting string includes the token's secret, so you should never
-        send or store this string where a third party can read it.
-        """
-
-        data = {
-            'oauth_token': self.key,
-            'oauth_token_secret': self.secret,
-        }
-
-        if self.callback_confirmed is not None:
-            data['oauth_callback_confirmed'] = self.callback_confirmed
-        return urllib.urlencode(data)
- 
-    @staticmethod
-    def from_string(s):
-        """Deserializes a token from a string like one returned by
-        `to_string()`."""
-
-        if not len(s):
-            raise ValueError("Invalid parameter string.")
-
-        params = parse_qs(s, keep_blank_values=False)
-        if not len(params):
-            raise ValueError("Invalid parameter string.")
-
-        try:
-            key = params['oauth_token'][0]
-        except Exception:
-            raise ValueError("'oauth_token' not found in OAuth request.")
-
-        try:
-            secret = params['oauth_token_secret'][0]
-        except Exception:
-            raise ValueError("'oauth_token_secret' not found in " 
-                "OAuth request.")
-
-        token = Token(key, secret)
-        try:
-            token.callback_confirmed = params['oauth_callback_confirmed'][0]
-        except KeyError:
-            pass  # 1.0, no callback confirmed.
-        return token
-
-    def __str__(self):
-        return self.to_string()
-
-
-def setter(attr):
-    name = attr.__name__
- 
-    def getter(self):
-        try:
-            return self.__dict__[name]
-        except KeyError:
-            raise AttributeError(name)
- 
-    def deleter(self):
-        del self.__dict__[name]
- 
-    return property(getter, attr, deleter)
-
-
-class Request(dict):
- 
-    """The parameters and information for an HTTP request, suitable for
-    authorizing with OAuth credentials.
- 
-    When a consumer wants to access a service's protected resources, it does
-    so using a signed HTTP request identifying itself (the consumer) with its
-    key, and providing an access token authorized by the end user to access
-    those resources.
- 
-    """
- 
-    version = VERSION
- 
-    def __init__(self, method=HTTP_METHOD, url=None, parameters=None):
-        self.method = method
-        self.url = url
-        if parameters is not None:
-            self.update(parameters)
- 
-    @setter
-    def url(self, value):
-        self.__dict__['url'] = value
-        if value is not None:
-            scheme, netloc, path, params, query, fragment = urlparse.urlparse(value)
-
-            # Exclude default port numbers.
-            if scheme == 'http' and netloc[-3:] == ':80':
-                netloc = netloc[:-3]
-            elif scheme == 'https' and netloc[-4:] == ':443':
-                netloc = netloc[:-4]
-            if scheme not in ('http', 'https'):
-                raise ValueError("Unsupported URL %s (%s)." % (value, scheme))
-
-            # Normalized URL excludes params, query, and fragment.
-            self.normalized_url = urlparse.urlunparse((scheme, netloc, path, None, None, None))
-        else:
-            self.normalized_url = None
-            self.__dict__['url'] = None
- 
-    @setter
-    def method(self, value):
-        self.__dict__['method'] = value.upper()
- 
-    def _get_timestamp_nonce(self):
-        return self['oauth_timestamp'], self['oauth_nonce']
- 
-    def get_nonoauth_parameters(self):
-        """Get any non-OAuth parameters."""
-        return dict([(k, v) for k, v in self.iteritems() 
-                    if not k.startswith('oauth_')])
- 
-    def to_header(self, realm=''):
-        """Serialize as a header for an HTTPAuth request."""
-        oauth_params = ((k, v) for k, v in self.items() 
-                            if k.startswith('oauth_'))
-        stringy_params = ((k, escape(str(v))) for k, v in oauth_params)
-        header_params = ('%s="%s"' % (k, v) for k, v in stringy_params)
-        params_header = ', '.join(header_params)
- 
-        auth_header = 'OAuth realm="%s"' % realm
-        if params_header:
-            auth_header = "%s, %s" % (auth_header, params_header)
- 
-        return {'Authorization': auth_header}
- 
-    def to_postdata(self):
-        """Serialize as post data for a POST request."""
-        # tell urlencode to deal with sequence values and map them correctly
-        # to resulting querystring. for example self["k"] = ["v1", "v2"] will
-        # result in 'k=v1&k=v2' and not k=%5B%27v1%27%2C+%27v2%27%5D
-        return urllib.urlencode(self, True)
- 
-    def to_url(self):
-        """Serialize as a URL for a GET request."""
-        base_url = urlparse.urlparse(self.url)
-        query = parse_qs(base_url.query)
-        for k, v in self.items():
-            query.setdefault(k, []).append(v)
-        url = (base_url.scheme, base_url.netloc, base_url.path, base_url.params,
-               urllib.urlencode(query, True), base_url.fragment)
-        return urlparse.urlunparse(url)
-
-    def get_parameter(self, parameter):
-        ret = self.get(parameter)
-        if ret is None:
-            raise Error('Parameter not found: %s' % parameter)
-
-        return ret
- 
-    def get_normalized_parameters(self):
-        """Return a string that contains the parameters that must be signed."""
-        items = []
-        for key, value in self.iteritems():
-            if key == 'oauth_signature':
-                continue
-            # 1.0a/9.1.1 states that kvp must be sorted by key, then by value,
-            # so we unpack sequence values into multiple items for sorting.
-            if hasattr(value, '__iter__'):
-                items.extend((key, item) for item in value)
-            else:
-                items.append((key, value))
-
-        # Include any query string parameters from the provided URL
-        query = urlparse.urlparse(self.url)[4]
-        items.extend(self._split_url_string(query).items())
-
-        encoded_str = urllib.urlencode(sorted(items))
-        # Encode signature parameters per Oauth Core 1.0 protocol
-        # spec draft 7, section 3.6
-        # (http://tools.ietf.org/html/draft-hammer-oauth-07#section-3.6)
-        # Spaces must be encoded with "%20" instead of "+"
-        return encoded_str.replace('+', '%20')
- 
-    def sign_request(self, signature_method, consumer, token):
-        """Set the signature parameter to the result of sign."""
-
-        if 'oauth_consumer_key' not in self:
-            self['oauth_consumer_key'] = consumer.key
-
-        if token and 'oauth_token' not in self:
-            self['oauth_token'] = token.key
-
-        self['oauth_signature_method'] = signature_method.name
-        self['oauth_signature'] = signature_method.sign(self, consumer, token)
- 
-    @classmethod
-    def make_timestamp(cls):
-        """Get seconds since epoch (UTC)."""
-        return str(int(time.time()))
- 
-    @classmethod
-    def make_nonce(cls):
-        """Generate pseudorandom number."""
-        return str(random.randint(0, 100000000))
- 
-    @classmethod
-    def from_request(cls, http_method, http_url, headers=None, parameters=None,
-            query_string=None):
-        """Combines multiple parameter sources."""
-        if parameters is None:
-            parameters = {}
- 
-        # Headers
-        if headers and 'Authorization' in headers:
-            auth_header = headers['Authorization']
-            # Check that the authorization header is OAuth.
-            if auth_header[:6] == 'OAuth ':
-                auth_header = auth_header[6:]
-                try:
-                    # Get the parameters from the header.
-                    header_params = cls._split_header(auth_header)
-                    parameters.update(header_params)
-                except:
-                    raise Error('Unable to parse OAuth parameters from '
-                        'Authorization header.')
- 
-        # GET or POST query string.
-        if query_string:
-            query_params = cls._split_url_string(query_string)
-            parameters.update(query_params)
- 
-        # URL parameters.
-        param_str = urlparse.urlparse(http_url)[4] # query
-        url_params = cls._split_url_string(param_str)
-        parameters.update(url_params)
- 
-        if parameters:
-            return cls(http_method, http_url, parameters)
- 
-        return None
- 
-    @classmethod
-    def from_consumer_and_token(cls, consumer, token=None,
-            http_method=HTTP_METHOD, http_url=None, parameters=None):
-        if not parameters:
-            parameters = {}
- 
-        defaults = {
-            'oauth_consumer_key': consumer.key,
-            'oauth_timestamp': cls.make_timestamp(),
-            'oauth_nonce': cls.make_nonce(),
-            'oauth_version': cls.version,
-        }
- 
-        defaults.update(parameters)
-        parameters = defaults
- 
-        if token:
-            parameters['oauth_token'] = token.key
-            if token.verifier:
-                parameters['oauth_verifier'] = token.verifier
- 
-        return Request(http_method, http_url, parameters)
- 
-    @classmethod
-    def from_token_and_callback(cls, token, callback=None, 
-        http_method=HTTP_METHOD, http_url=None, parameters=None):
-
-        if not parameters:
-            parameters = {}
- 
-        parameters['oauth_token'] = token.key
- 
-        if callback:
-            parameters['oauth_callback'] = callback
- 
-        return cls(http_method, http_url, parameters)
- 
-    @staticmethod
-    def _split_header(header):
-        """Turn Authorization: header into parameters."""
-        params = {}
-        parts = header.split(',')
-        for param in parts:
-            # Ignore realm parameter.
-            if param.find('realm') > -1:
-                continue
-            # Remove whitespace.
-            param = param.strip()
-            # Split key-value.
-            param_parts = param.split('=', 1)
-            # Remove quotes and unescape the value.
-            params[param_parts[0]] = urllib.unquote(param_parts[1].strip('\"'))
-        return params
- 
-    @staticmethod
-    def _split_url_string(param_str):
-        """Turn URL string into parameters."""
-        parameters = parse_qs(param_str, keep_blank_values=False)
-        for k, v in parameters.iteritems():
-            parameters[k] = urllib.unquote(v[0])
-        return parameters
-
-
-class Client(httplib2.Http):
-    """OAuthClient is a worker to attempt to execute a request."""
-
-    def __init__(self, consumer, token=None, cache=None, timeout=None,
-        proxy_info=None):
-
-        if consumer is not None and not isinstance(consumer, Consumer):
-            raise ValueError("Invalid consumer.")
-
-        if token is not None and not isinstance(token, Token):
-            raise ValueError("Invalid token.")
-
-        self.consumer = consumer
-        self.token = token
-        self.method = SignatureMethod_HMAC_SHA1()
-
-        httplib2.Http.__init__(self, cache=cache, timeout=timeout, 
-            proxy_info=proxy_info)
-
-    def set_signature_method(self, method):
-        if not isinstance(method, SignatureMethod):
-            raise ValueError("Invalid signature method.")
-
-        self.method = method
-
-    def request(self, uri, method="GET", body=None, headers=None, 
-        redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None):
-        DEFAULT_CONTENT_TYPE = 'application/x-www-form-urlencoded'
-
-        if not isinstance(headers, dict):
-            headers = {}
-
-        is_multipart = method == 'POST' and headers.get('Content-Type', 
-            DEFAULT_CONTENT_TYPE) != DEFAULT_CONTENT_TYPE
-
-        if body and method == "POST" and not is_multipart:
-            parameters = dict(parse_qsl(body))
-        else:
-            parameters = None
-
-        req = Request.from_consumer_and_token(self.consumer, 
-            token=self.token, http_method=method, http_url=uri, 
-            parameters=parameters)
-
-        req.sign_request(self.method, self.consumer, self.token)
-
-        if method == "POST":
-            headers['Content-Type'] = headers.get('Content-Type', 
-                DEFAULT_CONTENT_TYPE)
-            if is_multipart:
-                headers.update(req.to_header())
-            else:
-                body = req.to_postdata()
-        elif method == "GET":
-            uri = req.to_url()
-        else:
-            headers.update(req.to_header())
-
-        return httplib2.Http.request(self, uri, method=method, body=body, 
-            headers=headers, redirections=redirections, 
-            connection_type=connection_type)
-
-
-class Server(object):
-    """A skeletal implementation of a service provider, providing protected
-    resources to requests from authorized consumers.
- 
-    This class implements the logic to check requests for authorization. You
-    can use it with your web server or web framework to protect certain
-    resources with OAuth.
-    """
-
-    timestamp_threshold = 300 # In seconds, five minutes.
-    version = VERSION
-    signature_methods = None
-
-    def __init__(self, signature_methods=None):
-        self.signature_methods = signature_methods or {}
-
-    def add_signature_method(self, signature_method):
-        self.signature_methods[signature_method.name] = signature_method
-        return self.signature_methods
-
-    def verify_request(self, request, consumer, token):
-        """Verifies an api call and checks all the parameters."""
-
-        version = self._get_version(request)
-        self._check_signature(request, consumer, token)
-        parameters = request.get_nonoauth_parameters()
-        return parameters
-
-    def build_authenticate_header(self, realm=''):
-        """Optional support for the authenticate header."""
-        return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
-
-    def _get_version(self, request):
-        """Verify the correct version request for this server."""
-        try:
-            version = request.get_parameter('oauth_version')
-        except:
-            version = VERSION
-
-        if version and version != self.version:
-            raise Error('OAuth version %s not supported.' % str(version))
-
-        return version
-
-    def _get_signature_method(self, request):
-        """Figure out the signature with some defaults."""
-        try:
-            signature_method = request.get_parameter('oauth_signature_method')
-        except:
-            signature_method = SIGNATURE_METHOD
-
-        try:
-            # Get the signature method object.
-            signature_method = self.signature_methods[signature_method]
-        except:
-            signature_method_names = ', '.join(self.signature_methods.keys())
-            raise Error('Signature method %s not supported try one of the following: %s' % (signature_method, signature_method_names))
-
-        return signature_method
-
-    def _get_verifier(self, request):
-        return request.get_parameter('oauth_verifier')
-
-    def _check_signature(self, request, consumer, token):
-        timestamp, nonce = request._get_timestamp_nonce()
-        self._check_timestamp(timestamp)
-        signature_method = self._get_signature_method(request)
-
-        try:
-            signature = request.get_parameter('oauth_signature')
-        except:
-            raise MissingSignature('Missing oauth_signature.')
-
-        # Validate the signature.
-        valid = signature_method.check(request, consumer, token, signature)
-
-        if not valid:
-            key, base = signature_method.signing_base(request, consumer, token)
-
-            raise Error('Invalid signature. Expected signature base ' 
-                'string: %s' % base)
-
-        built = signature_method.sign(request, consumer, token)
-
-    def _check_timestamp(self, timestamp):
-        """Verify that timestamp is recentish."""
-        timestamp = int(timestamp)
-        now = int(time.time())
-        lapsed = now - timestamp
-        if lapsed > self.timestamp_threshold:
-            raise Error('Expired timestamp: given %d and now %s has a '
-                'greater difference than threshold %d' % (timestamp, now, 
-                    self.timestamp_threshold))
-
-
-class SignatureMethod(object):
-    """A way of signing requests.
- 
-    The OAuth protocol lets consumers and service providers pick a way to sign
-    requests. This interface shows the methods expected by the other `oauth`
-    modules for signing requests. Subclass it and implement its methods to
-    provide a new way to sign requests.
-    """
-
-    def signing_base(self, request, consumer, token):
-        """Calculates the string that needs to be signed.
-
-        This method returns a 2-tuple containing the starting key for the
-        signing and the message to be signed. The latter may be used in error
-        messages to help clients debug their software.
-
-        """
-        raise NotImplementedError
-
-    def sign(self, request, consumer, token):
-        """Returns the signature for the given request, based on the consumer
-        and token also provided.
-
-        You should use your implementation of `signing_base()` to build the
-        message to sign. Otherwise it may be less useful for debugging.
-
-        """
-        raise NotImplementedError
-
-    def check(self, request, consumer, token, signature):
-        """Returns whether the given signature is the correct signature for
-        the given consumer and token signing the given request."""
-        built = self.sign(request, consumer, token)
-        return built == signature
-
-
-class SignatureMethod_HMAC_SHA1(SignatureMethod):
-    name = 'HMAC-SHA1'
-        
-    def signing_base(self, request, consumer, token):
-        if request.normalized_url is None:
-            raise ValueError("Base URL for request is not set.")
-
-        sig = (
-            escape(request.method),
-            escape(request.normalized_url),
-            escape(request.get_normalized_parameters()),
-        )
-
-        key = '%s&' % escape(consumer.secret)
-        if token:
-            key += escape(token.secret)
-        raw = '&'.join(sig)
-        return key, raw
-
-    def sign(self, request, consumer, token):
-        """Builds the base signature string."""
-        key, raw = self.signing_base(request, consumer, token)
-
-        # HMAC object.
-        try:
-            from hashlib import sha1 as sha
-        except ImportError:
-            import sha # Deprecated
-
-        hashed = hmac.new(key, raw, sha)
-
-        # Calculate the digest base 64.
-        return binascii.b2a_base64(hashed.digest())[:-1]
-
-
-class SignatureMethod_PLAINTEXT(SignatureMethod):
-
-    name = 'PLAINTEXT'
-
-    def signing_base(self, request, consumer, token):
-        """Concatenates the consumer key and secret with the token's
-        secret."""
-        sig = '%s&' % escape(consumer.secret)
-        if token:
-            sig = sig + escape(token.secret)
-        return sig, sig
-
-    def sign(self, request, consumer, token):
-        key, raw = self.signing_base(request, consumer, token)
-        return raw
diff --git a/oauth2/clients/__init__.py b/oauth2/clients/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/oauth2/clients/__init__.py
+++ /dev/null
diff --git a/oauth2/clients/imap.py b/oauth2/clients/imap.py
deleted file mode 100644
index 68b7cd8..0000000
--- a/oauth2/clients/imap.py
+++ /dev/null
@@ -1,40 +0,0 @@
-"""
-The MIT License
-
-Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-"""
-
-import oauth2
-import imaplib
-
-
-class IMAP4_SSL(imaplib.IMAP4_SSL):
-    """IMAP wrapper for imaplib.IMAP4_SSL that implements XOAUTH."""
-
-    def authenticate(self, url, consumer, token):
-        if consumer is not None and not isinstance(consumer, oauth2.Consumer):
-            raise ValueError("Invalid consumer.")
-
-        if token is not None and not isinstance(token, oauth2.Token):
-            raise ValueError("Invalid token.")
-
-        imaplib.IMAP4_SSL.authenticate(self, 'XOAUTH',
-            lambda x: oauth2.build_xoauth_string(url, consumer, token))
diff --git a/oauth2/clients/smtp.py b/oauth2/clients/smtp.py
deleted file mode 100644
index 3e7bf0b..0000000
--- a/oauth2/clients/smtp.py
+++ /dev/null
@@ -1,41 +0,0 @@
-"""
-The MIT License
-
-Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-"""
-
-import oauth2
-import smtplib
-import base64
-
-
-class SMTP(smtplib.SMTP):
-    """SMTP wrapper for smtplib.SMTP that implements XOAUTH."""
-
-    def authenticate(self, url, consumer, token):
-        if consumer is not None and not isinstance(consumer, oauth2.Consumer):
-            raise ValueError("Invalid consumer.")
-
-        if token is not None and not isinstance(token, oauth2.Token):
-            raise ValueError("Invalid token.")
-
-        self.docmd('AUTH', 'XOAUTH %s' % \
-            base64.b64encode(oauth2.build_xoauth_string(url, consumer, token)))
diff --git a/oauth2client/appengine.py b/oauth2client/appengine.py
index 1bc2aaa..db7817a 100644
--- a/oauth2client/appengine.py
+++ b/oauth2client/appengine.py
@@ -289,7 +289,7 @@
     decorator = OAuth2Decorator(
         client_id='837...ent.com',
         client_secret='Qh...wwI',
-        scope='https://www.googleapis.com/auth/buzz')
+        scope='https://www.googleapis.com/auth/plus')
 
 
     class MainHandler(webapp.RequestHandler):
@@ -446,7 +446,7 @@
 
     decorator = OAuth2DecoratorFromClientSecrets(
       os.path.join(os.path.dirname(__file__), 'client_secrets.json')
-      scope='https://www.googleapis.com/auth/buzz')
+      scope='https://www.googleapis.com/auth/plus')
 
 
     class MainHandler(webapp.RequestHandler):
diff --git a/oauth2client/client.py b/oauth2client/client.py
index 3d81a8c..d77e776 100644
--- a/oauth2client/client.py
+++ b/oauth2client/client.py
@@ -641,7 +641,10 @@
     self.user_agent = user_agent
     self.auth_uri = auth_uri
     self.token_uri = token_uri
-    self.params = kwargs
+    self.params = {
+        'access_type': 'offline',
+        }
+    self.params.update(kwargs)
     self.redirect_uri = None
 
   def step1_get_authorize_url(self, redirect_uri='oob'):
diff --git a/oauth_wrap.py b/oauth_wrap.py
deleted file mode 100644
index 2c0786f..0000000
--- a/oauth_wrap.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright (C) 2010 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import httplib2
-import oauth2 as oauth
-import simplejson
-
-
-def oauth_wrap(consumer, token, http):
-    """
-    Args:
-       http - An instance of httplib2.Http
-           or something that acts like it.
-
-    Returns:
-       A modified instance of http that was passed in.
-
-    Example:
-
-      h = httplib2.Http()
-      h = oauth_wrap(h)
-
-    Grumble. You can't create a new OAuth
-    subclass of httplib2.Authenication because
-    it never gets passed the absolute URI, which is
-    needed for signing. So instead we have to overload
-    'request' with a closure that adds in the
-    Authorization header and then calls the original version
-    of 'request().
-    """
-    request_orig = http.request
-    signer = oauth.SignatureMethod_HMAC_SHA1()
-
-    def new_request(uri, method='GET', body=None, headers=None,
-        redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None):
-      """Modify the request headers to add the appropriate
-      Authorization header."""
-      req = oauth.Request.from_consumer_and_token(
-          consumer, token, http_method=method, http_url=uri)
-      req.sign_request(signer, consumer, token)
-      if headers == None:
-        headers = {}
-      headers.update(req.to_header())
-      headers['user-agent'] = 'jcgregorio-test-client'
-      return request_orig(uri, method, body, headers, redirections,
-          connection_type)
-
-    http.request = new_request
-    return http
-
-def get_authorised_http(oauth_params):
-  consumer = oauth.Consumer(oauth_params['consumer_key'],
-      oauth_params['consumer_secret'])
-  token = oauth.Token(oauth_params['oauth_token'],
-      oauth_params['oauth_token_secret'])
-
-  # Create a simple monkeypatch for httplib2.Http.request
-  # just adds in the oauth authorization header and then calls
-  # the original request().
-  http = httplib2.Http()
-  return oauth_wrap(consumer, token, http)
-
-def get_wrapped_http(filename='oauth_token.dat'):
-  f = open(filename, 'r')
-  oauth_params = simplejson.loads(f.read())
-
-  return get_authorised_http(oauth_params)
diff --git a/samples/api-python-client-doc/apiclient b/samples/api-python-client-doc/apiclient
deleted file mode 120000
index 22e4c9c..0000000
--- a/samples/api-python-client-doc/apiclient
+++ /dev/null
@@ -1 +0,0 @@
-../../apiclient/
\ No newline at end of file
diff --git a/samples/api-python-client-doc/gflags.py b/samples/api-python-client-doc/gflags.py
deleted file mode 120000
index 5a2ff94..0000000
--- a/samples/api-python-client-doc/gflags.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags.py
\ No newline at end of file
diff --git a/samples/api-python-client-doc/gflags_validators.py b/samples/api-python-client-doc/gflags_validators.py
deleted file mode 120000
index 25d8ce8..0000000
--- a/samples/api-python-client-doc/gflags_validators.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags_validators.py
\ No newline at end of file
diff --git a/samples/api-python-client-doc/httplib2 b/samples/api-python-client-doc/httplib2
deleted file mode 120000
index 488ae9f..0000000
--- a/samples/api-python-client-doc/httplib2
+++ /dev/null
@@ -1 +0,0 @@
-../../httplib2/
\ No newline at end of file
diff --git a/samples/api-python-client-doc/oauth2 b/samples/api-python-client-doc/oauth2
deleted file mode 120000
index af104cc..0000000
--- a/samples/api-python-client-doc/oauth2
+++ /dev/null
@@ -1 +0,0 @@
-../../oauth2
\ No newline at end of file
diff --git a/samples/api-python-client-doc/simplejson b/samples/api-python-client-doc/simplejson
deleted file mode 120000
index 148c7cf..0000000
--- a/samples/api-python-client-doc/simplejson
+++ /dev/null
@@ -1 +0,0 @@
-../../simplejson/
\ No newline at end of file
diff --git a/samples/api-python-client-doc/uritemplate b/samples/api-python-client-doc/uritemplate
deleted file mode 120000
index ce92dcb..0000000
--- a/samples/api-python-client-doc/uritemplate
+++ /dev/null
@@ -1 +0,0 @@
-../../uritemplate/
\ No newline at end of file
diff --git a/samples/appengine/apiclient b/samples/appengine/apiclient
deleted file mode 120000
index 22e4c9c..0000000
--- a/samples/appengine/apiclient
+++ /dev/null
@@ -1 +0,0 @@
-../../apiclient/
\ No newline at end of file
diff --git a/samples/appengine/app.yaml b/samples/appengine/app.yaml
index 03bdf81..bdc4be1 100644
--- a/samples/appengine/app.yaml
+++ b/samples/appengine/app.yaml
@@ -1,15 +1,11 @@
-application: m-buzz
-version: 1
+application: jcg-testing-01
+version: 2
 runtime: python
 api_version: 1
 
 handlers:
-- url: /static
-  static_dir: static
-
-- url: /google8f1adb368b7bd14c.html
-  upload: google8f1adb368b7bd14c.html
-  static_files: static/google8f1adb368b7bd14c.html
+- url: /oauth2callback
+  script: oauth2client/appengine.py
 
 - url: .*
   script: main.py
diff --git a/samples/appengine_with_decorator2/client_secrets.json b/samples/appengine/client_secrets.json
similarity index 100%
rename from samples/appengine_with_decorator2/client_secrets.json
rename to samples/appengine/client_secrets.json
diff --git a/samples/appengine/gflags.py b/samples/appengine/gflags.py
deleted file mode 120000
index 5a2ff94..0000000
--- a/samples/appengine/gflags.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags.py
\ No newline at end of file
diff --git a/samples/appengine/gflags_validators.py b/samples/appengine/gflags_validators.py
deleted file mode 120000
index 25d8ce8..0000000
--- a/samples/appengine/gflags_validators.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags_validators.py
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/grant.html b/samples/appengine/grant.html
similarity index 83%
rename from samples/appengine_with_decorator2/grant.html
rename to samples/appengine/grant.html
index a52ea08..0087325 100644
--- a/samples/appengine_with_decorator2/grant.html
+++ b/samples/appengine/grant.html
@@ -4,7 +4,7 @@
   </head>
   <body>
     {% if has_credentials %}
-    <p>Thanks for granting us permission. Please <a href="/followers">proceed to the main
+    <p>Thanks for granting us permission. Please <a href="/about">proceed to the main
       application</a>.</p>
     {% else %}
     <p><a href="{{ url }}">Grant</a> this application permission to read your
diff --git a/samples/appengine/httplib2 b/samples/appengine/httplib2
deleted file mode 120000
index 488ae9f..0000000
--- a/samples/appengine/httplib2
+++ /dev/null
@@ -1 +0,0 @@
-../../httplib2/
\ No newline at end of file
diff --git a/samples/appengine/main.py b/samples/appengine/main.py
old mode 100755
new mode 100644
index 184f5fa..309376c
--- a/samples/appengine/main.py
+++ b/samples/appengine/main.py
@@ -14,6 +14,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
+"""Starting template for Google App Engine applications.
+
+Use this project as a starting point if you are just beginning to build a Google
+App Engine project. Remember to download the OAuth 2.0 client secrets which can
+be obtained from the Developer Console <https://code.google.com/apis/console/>
+and save them as 'client_secrets.json' in the project directory.
+"""
 
 __author__ = 'jcgregorio@google.com (Joe Gregorio)'
 
@@ -24,84 +31,79 @@
 import pickle
 
 from apiclient.discovery import build
-from oauth2client.appengine import CredentialsProperty
-from oauth2client.appengine import StorageByKeyName
-from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.appengine import oauth2decorator_from_clientsecrets
+from oauth2client.client import AccessTokenRefreshError
 from google.appengine.api import memcache
-from google.appengine.api import users
-from google.appengine.ext import db
 from google.appengine.ext import webapp
 from google.appengine.ext.webapp import template
-from google.appengine.ext.webapp import util
-from google.appengine.ext.webapp.util import login_required
+from google.appengine.ext.webapp.util import run_wsgi_app
 
 
-FLOW = OAuth2WebServerFlow(
-    # Visit https://code.google.com/apis/console to
-    # generate your client_id, client_secret and to
-    # register your redirect_uri.
-    client_id='<YOUR CLIENT ID HERE>',
-    client_secret='<YOUR CLIENT SECRET HERE>',
-    scope='https://www.googleapis.com/auth/buzz',
-    user_agent='buzz-cmdline-sample/1.0')
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret, which are found
+# on the API Access tab on the Google APIs
+# Console <http://code.google.com/apis/console>
+CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+<h1>Warning: Please configure OAuth 2.0</h1>
+<p>
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+</p>
+<p>
+<code>%s</code>.
+</p>
+<p>with information found on the <a
+href="https://code.google.com/apis/console">APIs Console</a>.
+</p>
+""" % CLIENT_SECRETS
 
 
-class Credentials(db.Model):
-  credentials = CredentialsProperty()
-
+http = httplib2.Http(memcache)
+service = build("plus", "v1", http=http)
+decorator = oauth2decorator_from_clientsecrets(
+    CLIENT_SECRETS,
+    'https://www.googleapis.com/auth/plus.me',
+    MISSING_CLIENT_SECRETS_MESSAGE)
 
 class MainHandler(webapp.RequestHandler):
 
-  @login_required
+  @decorator.oauth_aware
   def get(self):
-    user = users.get_current_user()
-    credentials = StorageByKeyName(
-        Credentials, user.user_id(), 'credentials').get()
+    path = os.path.join(os.path.dirname(__file__), 'grant.html')
+    variables = {
+        'url': decorator.authorize_url(),
+        'has_credentials': decorator.has_credentials()
+        }
+    self.response.out.write(template.render(path, variables))
 
-    if credentials is None or credentials.invalid == True:
-      callback = self.request.relative_url('/oauth2callback')
-      authorize_url = FLOW.step1_get_authorize_url(callback)
-      memcache.set(user.user_id(), pickle.dumps(FLOW))
-      self.redirect(authorize_url)
-    else:
-      http = httplib2.Http()
-      http = credentials.authorize(http)
-      service = build("buzz", "v1", http=http)
-      activities = service.activities()
-      activitylist = activities.list(scope='@consumption',
-                                     userId='@me').execute()
+
+class AboutHandler(webapp.RequestHandler):
+
+  @decorator.oauth_required
+  def get(self):
+    try:
+      http = decorator.http()
+      user = service.people().get(userId='me').execute(http)
+      text = 'Hello, %s!' % user['displayName']
+
       path = os.path.join(os.path.dirname(__file__), 'welcome.html')
-      logout = users.create_logout_url('/')
-      self.response.out.write(
-          template.render(
-              path, {'activitylist': activitylist,
-                     'logout': logout
-                     }))
-
-
-class OAuthHandler(webapp.RequestHandler):
-
-  @login_required
-  def get(self):
-    user = users.get_current_user()
-    flow = pickle.loads(memcache.get(user.user_id()))
-    if flow:
-      credentials = flow.step2_exchange(self.request.params)
-      StorageByKeyName(
-          Credentials, user.user_id(), 'credentials').put(credentials)
-      self.redirect("/")
-    else:
-      pass
+      self.response.out.write(template.render(path, {'text': text }))
+    except AccessTokenRefreshError:
+      self.redirect('/')
 
 
 def main():
   application = webapp.WSGIApplication(
       [
-      ('/', MainHandler),
-      ('/oauth2callback', OAuthHandler)
+       ('/', MainHandler),
+       ('/about', AboutHandler),
       ],
       debug=True)
-  util.run_wsgi_app(application)
+  run_wsgi_app(application)
 
 
 if __name__ == '__main__':
diff --git a/samples/appengine/oauth2 b/samples/appengine/oauth2
deleted file mode 120000
index af104cc..0000000
--- a/samples/appengine/oauth2
+++ /dev/null
@@ -1 +0,0 @@
-../../oauth2
\ No newline at end of file
diff --git a/samples/appengine/oauth2client b/samples/appengine/oauth2client
deleted file mode 120000
index 9013119..0000000
--- a/samples/appengine/oauth2client
+++ /dev/null
@@ -1 +0,0 @@
-../../oauth2client/
\ No newline at end of file
diff --git a/samples/appengine/simplejson b/samples/appengine/simplejson
deleted file mode 120000
index 148c7cf..0000000
--- a/samples/appengine/simplejson
+++ /dev/null
@@ -1 +0,0 @@
-../../simplejson/
\ No newline at end of file
diff --git a/samples/appengine/static/go.png b/samples/appengine/static/go.png
deleted file mode 100644
index e5aacda..0000000
--- a/samples/appengine/static/go.png
+++ /dev/null
Binary files differ
diff --git a/samples/appengine/uritemplate b/samples/appengine/uritemplate
deleted file mode 120000
index ce92dcb..0000000
--- a/samples/appengine/uritemplate
+++ /dev/null
@@ -1 +0,0 @@
-../../uritemplate/
\ No newline at end of file
diff --git a/samples/appengine/welcome.html b/samples/appengine/welcome.html
index da40a16..57b186e 100644
--- a/samples/appengine/welcome.html
+++ b/samples/appengine/welcome.html
@@ -1,29 +1,8 @@
 <html>
   <head>
-    <title>Buzz Stuff</title>
-    <style type=text/css>
-      td  { vertical-align: top; padding: 0.5em }
-      img { border:0 }
-    </style>
+    <title>Welcome</title>
   </head>
   <body>
-    <p><a href="{{ logout }}">Logout</a></p>
-      <table border=0>
-      {% for item in activitylist.items %}
-      <tr valign=top>
-        <td>
-          <a href="{{ item.actor.profileUrl }}"><img
-            src="{{ item.actor.thumbnailUrl }}"></a><br>
-          <a href="{{ item.actor.profileUrl }}">{{ item.actor.name }}</a></td>
-      <td>
-        {{ item.object.content }}
-        </td>
-        <td>
-          <a href="{{ item.object.links.alternate.0.href }}"><img
-            src="/static/go.png"></a>
-        </td>
-      </tr>
-      {% endfor %}
-      </table>
+    <p>{{ text }}</p>
   </body>
 </html>
diff --git a/samples/appengine_with_decorator/apiclient b/samples/appengine_with_decorator/apiclient
deleted file mode 120000
index 24fe0bc..0000000
--- a/samples/appengine_with_decorator/apiclient
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/apiclient
\ No newline at end of file
diff --git a/samples/appengine_with_decorator/app.yaml b/samples/appengine_with_decorator/app.yaml
deleted file mode 100644
index c0d43d5..0000000
--- a/samples/appengine_with_decorator/app.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-application: jcg-testing-01
-version: 1
-runtime: python
-api_version: 1
-
-handlers:
-- url: /oauth2callback
-  script: oauth2client/appengine.py
-
-- url: .*
-  script: main.py
-
diff --git a/samples/appengine_with_decorator/better.py b/samples/appengine_with_decorator/better.py
deleted file mode 100644
index 03963f4..0000000
--- a/samples/appengine_with_decorator/better.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2007 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Starting template for Google App Engine applications.
-
-Use this project as a starting point if you are just beginning to build a Google
-App Engine project. Remember to fill in the OAuth 2.0 client_id and
-client_secret which can be obtained from the Developer Console
-<https://code.google.com/apis/console/>
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-
-import httplib2
-import logging
-import os
-import pickle
-
-from apiclient.discovery import build
-from oauth2client.appengine import OAuth2Decorator
-from oauth2client.client import AccessTokenRefreshError
-from google.appengine.api import memcache
-from google.appengine.ext import webapp
-from google.appengine.ext.webapp import template
-from google.appengine.ext.webapp.util import run_wsgi_app
-
-# The client_id and client_secret are copied from the API Access tab on
-# the Google APIs Console <http://code.google.com/apis/console>
-decorator = OAuth2Decorator(
-    client_id='837647042410-75ifgipj95q4agpm0cs452mg7i2pn17c.apps.googleusercontent.com',
-    client_secret='QhxYsjM__u4vy5N0DXUFRwwI',
-    scope='https://www.googleapis.com/auth/buzz',
-    user_agent='my-sample-app/1.0')
-
-http = httplib2.Http(memcache)
-service = build("buzz", "v1", http=http)
-
-
-class MainHandler(webapp.RequestHandler):
-
-  @decorator.oauth_aware
-  def get(self):
-    path = os.path.join(os.path.dirname(__file__), 'grant.html')
-    variables = {
-        'url': decorator.authorize_url(),
-        'has_credentials': decorator.has_credentials()
-        }
-    self.response.out.write(template.render(path, variables))
-
-
-class FollowerHandler(webapp.RequestHandler):
-
-  @decorator.oauth_required
-  def get(self):
-    try:
-      http = decorator.http()
-      followers = service.people().list(
-          userId='@me', groupId='@followers').execute(http)
-      text = 'Hello, you have %s followers!' % followers['totalResults']
-
-      path = os.path.join(os.path.dirname(__file__), 'welcome.html')
-      self.response.out.write(template.render(path, {'text': text }))
-    except AccessTokenRefreshError:
-      self.redirect('/')
-
-
-def main():
-  application = webapp.WSGIApplication(
-      [
-       ('/', MainHandler),
-       ('/followers', FollowerHandler),
-      ],
-      debug=True)
-  run_wsgi_app(application)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/samples/appengine_with_decorator/gflags.py b/samples/appengine_with_decorator/gflags.py
deleted file mode 120000
index 5a2ff94..0000000
--- a/samples/appengine_with_decorator/gflags.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags.py
\ No newline at end of file
diff --git a/samples/appengine_with_decorator/gflags_validators.py b/samples/appengine_with_decorator/gflags_validators.py
deleted file mode 120000
index 25d8ce8..0000000
--- a/samples/appengine_with_decorator/gflags_validators.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags_validators.py
\ No newline at end of file
diff --git a/samples/appengine_with_decorator/httplib2 b/samples/appengine_with_decorator/httplib2
deleted file mode 120000
index 4cd2774..0000000
--- a/samples/appengine_with_decorator/httplib2
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/httplib2
\ No newline at end of file
diff --git a/samples/appengine_with_decorator/index.yaml b/samples/appengine_with_decorator/index.yaml
deleted file mode 100644
index a3b9e05..0000000
--- a/samples/appengine_with_decorator/index.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-indexes:
-
-# AUTOGENERATED
-
-# This index.yaml is automatically updated whenever the dev_appserver
-# detects that a new type of query is run.  If you want to manage the
-# index.yaml file manually, remove the above marker line (the line
-# saying "# AUTOGENERATED").  If you want to manage some indexes
-# manually, move them above the marker line.  The index.yaml file is
-# automatically uploaded to the admin console when you next deploy
-# your application using appcfg.py.
diff --git a/samples/appengine_with_decorator/main.py b/samples/appengine_with_decorator/main.py
deleted file mode 100755
index ca08d29..0000000
--- a/samples/appengine_with_decorator/main.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2007 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Starting template for Google App Engine applications.
-
-Use this project as a starting point if you are just beginning to build a Google
-App Engine project. Remember to fill in the OAuth 2.0 client_id and
-client_secret which can be obtained from the Developer Console
-<https://code.google.com/apis/console/>
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-
-import httplib2
-import logging
-import os
-import pickle
-
-from apiclient.discovery import build
-from oauth2client.appengine import OAuth2Decorator
-from google.appengine.api import memcache
-from google.appengine.ext import webapp
-from google.appengine.ext.webapp.util import run_wsgi_app
-
-# The client_id and client_secret are copied from the API Access tab on
-# the Google APIs Console <http://code.google.com/apis/console>
-decorator = OAuth2Decorator(
-    client_id='837647042410-75ifgipj95q4agpm0cs452mg7i2pn17c.apps.googleusercontent.com',
-    client_secret='QhxYsjM__u4vy5N0DXUFRwwI',
-    scope='https://www.googleapis.com/auth/buzz',
-    user_agent='my-sample-app/1.0')
-
-http = httplib2.Http(memcache)
-service = build("buzz", "v1", http=http)
-
-class MainHandler(webapp.RequestHandler):
-
-  @decorator.oauth_required
-  def get(self):
-    http = decorator.http()
-    followers = service.people().list(
-        userId='@me', groupId='@followers').execute(http)
-    self.response.out.write(
-        'Hello, you have %s followers!' % followers['totalResults'])
-
-def main():
-  application = webapp.WSGIApplication(
-      [
-       ('/', MainHandler),
-      ],
-      debug=True)
-  run_wsgi_app(application)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/samples/appengine_with_decorator/oauth2 b/samples/appengine_with_decorator/oauth2
deleted file mode 120000
index ee61c25..0000000
--- a/samples/appengine_with_decorator/oauth2
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/oauth2
\ No newline at end of file
diff --git a/samples/appengine_with_decorator/oauth2client b/samples/appengine_with_decorator/oauth2client
deleted file mode 120000
index 9013119..0000000
--- a/samples/appengine_with_decorator/oauth2client
+++ /dev/null
@@ -1 +0,0 @@
-../../oauth2client/
\ No newline at end of file
diff --git a/samples/appengine_with_decorator/uritemplate b/samples/appengine_with_decorator/uritemplate
deleted file mode 120000
index 1c98e41..0000000
--- a/samples/appengine_with_decorator/uritemplate
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/uritemplate
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/apiclient b/samples/appengine_with_decorator2/apiclient
deleted file mode 120000
index 24fe0bc..0000000
--- a/samples/appengine_with_decorator2/apiclient
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/apiclient
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/app.yaml b/samples/appengine_with_decorator2/app.yaml
deleted file mode 100644
index bdc4be1..0000000
--- a/samples/appengine_with_decorator2/app.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-application: jcg-testing-01
-version: 2
-runtime: python
-api_version: 1
-
-handlers:
-- url: /oauth2callback
-  script: oauth2client/appengine.py
-
-- url: .*
-  script: main.py
-
diff --git a/samples/appengine_with_decorator2/gflags.py b/samples/appengine_with_decorator2/gflags.py
deleted file mode 120000
index 5a2ff94..0000000
--- a/samples/appengine_with_decorator2/gflags.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags.py
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/gflags_validators.py b/samples/appengine_with_decorator2/gflags_validators.py
deleted file mode 120000
index 25d8ce8..0000000
--- a/samples/appengine_with_decorator2/gflags_validators.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags_validators.py
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/httplib2 b/samples/appengine_with_decorator2/httplib2
deleted file mode 120000
index 4cd2774..0000000
--- a/samples/appengine_with_decorator2/httplib2
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/httplib2
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/index.yaml b/samples/appengine_with_decorator2/index.yaml
deleted file mode 100644
index a3b9e05..0000000
--- a/samples/appengine_with_decorator2/index.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-indexes:
-
-# AUTOGENERATED
-
-# This index.yaml is automatically updated whenever the dev_appserver
-# detects that a new type of query is run.  If you want to manage the
-# index.yaml file manually, remove the above marker line (the line
-# saying "# AUTOGENERATED").  If you want to manage some indexes
-# manually, move them above the marker line.  The index.yaml file is
-# automatically uploaded to the admin console when you next deploy
-# your application using appcfg.py.
diff --git a/samples/appengine_with_decorator2/main.py b/samples/appengine_with_decorator2/main.py
deleted file mode 100644
index 443ff64..0000000
--- a/samples/appengine_with_decorator2/main.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2007 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Starting template for Google App Engine applications.
-
-Use this project as a starting point if you are just beginning to build a Google
-App Engine project. Remember to download the OAuth 2.0 client secrets which can
-be obtained from the Developer Console <https://code.google.com/apis/console/>
-and save them as 'client_secrets.json' in the project directory.
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-
-import httplib2
-import logging
-import os
-import pickle
-
-from apiclient.discovery import build
-from oauth2client.appengine import oauth2decorator_from_clientsecrets
-from oauth2client.client import AccessTokenRefreshError
-from google.appengine.api import memcache
-from google.appengine.ext import webapp
-from google.appengine.ext.webapp import template
-from google.appengine.ext.webapp.util import run_wsgi_app
-
-
-# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
-# application, including client_id and client_secret, which are found
-# on the API Access tab on the Google APIs
-# Console <http://code.google.com/apis/console>
-CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')
-
-# Helpful message to display in the browser if the CLIENT_SECRETS file
-# is missing.
-MISSING_CLIENT_SECRETS_MESSAGE = """
-<h1>Warning: Please configure OAuth 2.0</h1>
-<p>
-To make this sample run you will need to populate the client_secrets.json file
-found at:
-</p>
-<p>
-<code>%s</code>.
-</p>
-<p>with information found on the <a
-href="https://code.google.com/apis/console">APIs Console</a>.
-</p>
-""" % CLIENT_SECRETS
-
-
-http = httplib2.Http(memcache)
-service = build("buzz", "v1", http=http)
-decorator = oauth2decorator_from_clientsecrets(
-    CLIENT_SECRETS,
-    'https://www.googleapis.com/auth/buzz',
-    MISSING_CLIENT_SECRETS_MESSAGE)
-
-class MainHandler(webapp.RequestHandler):
-
-  @decorator.oauth_aware
-  def get(self):
-    path = os.path.join(os.path.dirname(__file__), 'grant.html')
-    variables = {
-        'url': decorator.authorize_url(),
-        'has_credentials': decorator.has_credentials()
-        }
-    self.response.out.write(template.render(path, variables))
-
-
-class FollowerHandler(webapp.RequestHandler):
-
-  @decorator.oauth_required
-  def get(self):
-    try:
-      http = decorator.http()
-      followers = service.people().list(
-          userId='@me', groupId='@followers').execute(http)
-      text = 'Hello, you have %s followers!' % followers['totalResults']
-
-      path = os.path.join(os.path.dirname(__file__), 'welcome.html')
-      self.response.out.write(template.render(path, {'text': text }))
-    except AccessTokenRefreshError:
-      self.redirect('/')
-
-
-def main():
-  application = webapp.WSGIApplication(
-      [
-       ('/', MainHandler),
-       ('/followers', FollowerHandler),
-      ],
-      debug=True)
-  run_wsgi_app(application)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/samples/appengine_with_decorator2/oauth2 b/samples/appengine_with_decorator2/oauth2
deleted file mode 120000
index ee61c25..0000000
--- a/samples/appengine_with_decorator2/oauth2
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/oauth2
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/oauth2client b/samples/appengine_with_decorator2/oauth2client
deleted file mode 120000
index 9013119..0000000
--- a/samples/appengine_with_decorator2/oauth2client
+++ /dev/null
@@ -1 +0,0 @@
-../../oauth2client/
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/uritemplate b/samples/appengine_with_decorator2/uritemplate
deleted file mode 120000
index 1c98e41..0000000
--- a/samples/appengine_with_decorator2/uritemplate
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/uritemplate
\ No newline at end of file
diff --git a/samples/appengine_with_decorator2/welcome.html b/samples/appengine_with_decorator2/welcome.html
deleted file mode 100644
index 57b186e..0000000
--- a/samples/appengine_with_decorator2/welcome.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<html>
-  <head>
-    <title>Welcome</title>
-  </head>
-  <body>
-    <p>{{ text }}</p>
-  </body>
-</html>
diff --git a/samples/appengine_with_robots/apiclient b/samples/appengine_with_robots/apiclient
deleted file mode 120000
index 24fe0bc..0000000
--- a/samples/appengine_with_robots/apiclient
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/apiclient
\ No newline at end of file
diff --git a/samples/appengine_with_robots/gflags.py b/samples/appengine_with_robots/gflags.py
deleted file mode 120000
index 5a2ff94..0000000
--- a/samples/appengine_with_robots/gflags.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags.py
\ No newline at end of file
diff --git a/samples/appengine_with_robots/gflags_validators.py b/samples/appengine_with_robots/gflags_validators.py
deleted file mode 120000
index 25d8ce8..0000000
--- a/samples/appengine_with_robots/gflags_validators.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags_validators.py
\ No newline at end of file
diff --git a/samples/appengine_with_robots/httplib2 b/samples/appengine_with_robots/httplib2
deleted file mode 120000
index 4cd2774..0000000
--- a/samples/appengine_with_robots/httplib2
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/httplib2
\ No newline at end of file
diff --git a/samples/appengine_with_robots/oauth2 b/samples/appengine_with_robots/oauth2
deleted file mode 120000
index ee61c25..0000000
--- a/samples/appengine_with_robots/oauth2
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/oauth2
\ No newline at end of file
diff --git a/samples/appengine_with_robots/oauth2client b/samples/appengine_with_robots/oauth2client
deleted file mode 120000
index 9013119..0000000
--- a/samples/appengine_with_robots/oauth2client
+++ /dev/null
@@ -1 +0,0 @@
-../../oauth2client/
\ No newline at end of file
diff --git a/samples/appengine_with_robots/uritemplate b/samples/appengine_with_robots/uritemplate
deleted file mode 120000
index 1c98e41..0000000
--- a/samples/appengine_with_robots/uritemplate
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/uritemplate
\ No newline at end of file
diff --git a/samples/oauth2/dailymotion/app.yaml b/samples/dailymotion/app.yaml
similarity index 100%
rename from samples/oauth2/dailymotion/app.yaml
rename to samples/dailymotion/app.yaml
diff --git a/samples/oauth2/dailymotion/index.yaml b/samples/dailymotion/index.yaml
similarity index 100%
rename from samples/oauth2/dailymotion/index.yaml
rename to samples/dailymotion/index.yaml
diff --git a/samples/oauth2/dailymotion/main.py b/samples/dailymotion/main.py
similarity index 100%
rename from samples/oauth2/dailymotion/main.py
rename to samples/dailymotion/main.py
diff --git a/samples/oauth2/dailymotion/welcome.html b/samples/dailymotion/welcome.html
similarity index 100%
rename from samples/oauth2/dailymotion/welcome.html
rename to samples/dailymotion/welcome.html
diff --git a/samples/debugging/main.py b/samples/debugging/main.py
deleted file mode 100644
index be82ff1..0000000
--- a/samples/debugging/main.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright 2010 Google Inc. All Rights Reserved.
-
-"""Simple command-line example for Translate.
-
-Command-line application that translates
-some text.
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-import gflags
-import logging
-import pprint
-import sys
-
-from apiclient.discovery import build
-from apiclient.model import JsonModel
-
-
-FLAGS = gflags.FLAGS
-logger = logging.getLogger()
-logger.setLevel(logging.INFO)
-
-
-def main(argv):
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
-    sys.exit(1)
-
-  service = build('translate', 'v2',
-                  developerKey='AIzaSyAQIKv_gwnob-YNrXV2stnY86GSGY81Zr0',
-                  model=JsonModel())
-  print service.translations().list(
-      source='en',
-      target='fr',
-      q=['flower', 'car']
-    ).execute()
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/samples/django_sample/buzz/__init__.py b/samples/django_sample/plus/__init__.py
similarity index 100%
rename from samples/django_sample/buzz/__init__.py
rename to samples/django_sample/plus/__init__.py
diff --git a/samples/django_sample/buzz/models.py b/samples/django_sample/plus/models.py
similarity index 100%
rename from samples/django_sample/buzz/models.py
rename to samples/django_sample/plus/models.py
diff --git a/samples/django_sample/buzz/tests.py b/samples/django_sample/plus/tests.py
similarity index 100%
rename from samples/django_sample/buzz/tests.py
rename to samples/django_sample/plus/tests.py
diff --git a/samples/django_sample/buzz/views.py b/samples/django_sample/plus/views.py
similarity index 70%
rename from samples/django_sample/buzz/views.py
rename to samples/django_sample/plus/views.py
index c942aaf..8cc5838 100644
--- a/samples/django_sample/buzz/views.py
+++ b/samples/django_sample/plus/views.py
@@ -8,14 +8,14 @@
 
 from oauth2client.django_orm import Storage
 from oauth2client.client import OAuth2WebServerFlow
-from django_sample.buzz.models import CredentialsModel
-from django_sample.buzz.models import FlowModel
+from django_sample.plus.models import CredentialsModel
+from django_sample.plus.models import FlowModel
 from apiclient.discovery import build
 
 from django.http import HttpResponseRedirect
 from django.shortcuts import render_to_response
 
-STEP2_URI = 'http://localhost:8000/auth_return'
+STEP2_URI = 'http://localhost:8000/oauth2callback'
 
 
 @login_required
@@ -24,10 +24,10 @@
   credential = storage.get()
   if credential is None or credential.invalid == True:
     flow = OAuth2WebServerFlow(
-        client_id='837647042410.apps.googleusercontent.com',
-        client_secret='+SWwMCL9d8gWtzPRa1lXw5R8',
-        scope='https://www.googleapis.com/auth/buzz',
-        user_agent='buzz-django-sample/1.0',
+        client_id='[[Insert Client ID here.]]',
+        client_secret='[[Insert Client Secret here.]]',
+        scope='https://www.googleapis.com/auth/plus.me',
+        user_agent='plus-django-sample/1.0',
         )
 
     authorize_url = flow.step1_get_authorize_url(STEP2_URI)
@@ -37,13 +37,13 @@
   else:
     http = httplib2.Http()
     http = credential.authorize(http)
-    service = build("buzz", "v1", http=http)
+    service = build("plus", "v1", http=http)
     activities = service.activities()
-    activitylist = activities.list(scope='@consumption',
-                                   userId='@me').execute()
+    activitylist = activities.list(collection='public',
+                                   userId='me').execute()
     logging.info(activitylist)
 
-    return render_to_response('buzz/welcome.html', {
+    return render_to_response('plus/welcome.html', {
                 'activitylist': activitylist,
                 })
 
diff --git a/samples/django_sample/settings.py b/samples/django_sample/settings.py
index d0d7c7e..df10f0a 100644
--- a/samples/django_sample/settings.py
+++ b/samples/django_sample/settings.py
@@ -80,5 +80,5 @@
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.sites',
-    'django_sample.buzz'
+    'django_sample.plus'
 )
diff --git a/samples/django_sample/templates/buzz/welcome.html b/samples/django_sample/templates/buzz/welcome.html
deleted file mode 100644
index 07e8027..0000000
--- a/samples/django_sample/templates/buzz/welcome.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-<html>
-  <head>
-    <title>Buzz Stuff</title>
-    <style type=text/css>
-      td  { vertical-align: top; padding: 0.5em }
-      img { border:0 }
-    </style>
-  </head>
-  <body>
-      <table border=0>
-      {% for item in activitylist.items %}
-      <tr valign=top>
-        <td>
-          {% if item.actor.thumbnailUrl %}
-            <a href="{{ item.actor.profileUrl }}">
-              <img src="{{ item.actor.thumbnailUrl }}">
-            </a>
-          {% endif %}
-          <br>
-          <a href="{{ item.actor.profileUrl }}">{{ item.actor.name }}</a></td>
-      <td>
-        {{ item.object.content|safe }}
-        </td>
-        <td>
-          <a href="{{ item.object.links.alternate.0.href }}"><img
-            src="/static/go.png"></a>
-        </td>
-      </tr>
-      {% endfor %}
-      </table>
-  </body>
-</html>
diff --git a/samples/django_sample/templates/buzz/login.html b/samples/django_sample/templates/plus/login.html
similarity index 100%
rename from samples/django_sample/templates/buzz/login.html
rename to samples/django_sample/templates/plus/login.html
diff --git a/samples/django_sample/templates/plus/welcome.html b/samples/django_sample/templates/plus/welcome.html
new file mode 100644
index 0000000..d43698b
--- /dev/null
+++ b/samples/django_sample/templates/plus/welcome.html
@@ -0,0 +1,17 @@
+
+<html>
+  <head>
+    <title>Your Google+ Activity</title>
+    <style type=text/css>
+      td  { vertical-align: top; padding: 0.5em }
+      img { border:0 }
+    </style>
+  </head>
+  <body>
+    <table border=1>
+      {% for item in activitylist.items %}
+      <tr><td>{{ item.object.content|safe }}</td></tr>
+      {% endfor %}
+    </table>
+  </body>
+</html>
diff --git a/samples/django_sample/urls.py b/samples/django_sample/urls.py
index aeba620..4c67ff2 100644
--- a/samples/django_sample/urls.py
+++ b/samples/django_sample/urls.py
@@ -7,8 +7,8 @@
 
 urlpatterns = patterns('',
     # Example:
-    (r'^$', 'django_sample.buzz.views.index'),
-    (r'^auth_return', 'django_sample.buzz.views.auth_return'),
+    (r'^$', 'django_sample.plus.views.index'),
+    (r'^oauth2callback', 'django_sample.plus.views.auth_return'),
 
     # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
     # to INSTALLED_APPS to enable admin documentation:
@@ -17,7 +17,7 @@
     # Uncomment the next line to enable the admin:
     (r'^admin/', include(admin.site.urls)),
     (r'^accounts/login/$', 'django.contrib.auth.views.login',
-                        {'template_name': 'buzz/login.html'}),
+                        {'template_name': 'plus/login.html'}),
 
     (r'^static/(?P<path>.*)$', 'django.views.static.serve',
         {'document_root': os.path.join(os.path.dirname(__file__), 'static')
diff --git a/samples/local/main.py b/samples/local/main.py
deleted file mode 100644
index 98fb0a4..0000000
--- a/samples/local/main.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright 2010 Google Inc. All Rights Reserved.
-
-"""Simple command-line example for running against a
-  local server.
-
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-# Enable this sample to be run from the top-level directory
-import os
-import sys
-sys.path.insert(0, os.getcwd())
-
-from apiclient.discovery import build
-
-import httplib2
-# httplib2.debuglevel = 4
-import pickle
-import pprint
-
-DISCOVERY_URI = ('http://localhost:3990/discovery/v0.2beta1/describe/'
-  '{api}/{apiVersion}')
-
-
-def main():
-  http = httplib2.Http()
-
-  service = build("buzz", "v1", http=http, discoveryServiceUrl=DISCOVERY_URI)
-  help(service.activities().list)
-  print service.activities().list(userId='@self', scope='@me', c='foo').uri
-
-if __name__ == '__main__':
-  main()
diff --git a/samples/localdiscovery/buzz.json b/samples/localdiscovery/buzz.json
deleted file mode 100644
index cd121a2..0000000
--- a/samples/localdiscovery/buzz.json
+++ /dev/null
@@ -1,3727 +0,0 @@
-{
- "kind": "discovery#restDescription",
- "id": "buzz:v1",
- "name": "buzz",
- "version": "v1",
- "title": "Buzz API",
- "description": "Lets you share updates, photos, videos, and more with your friends around the world",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/buzz-16.png",
-  "x32": "http://www.google.com/images/icons/product/buzz-32.png"
- },
- "documentationLink": "http://code.google.com/apis/buzz/v1/using_rest.html",
- "labels": [
-  "labs"
- ],
- "protocol": "rest",
- "basePath": "/buzz/v1/",
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/buzz": {
-     "description": "Manage your Buzz activity and address book"
-    },
-    "https://www.googleapis.com/auth/buzz.readonly": {
-     "description": "View your Buzz activity and address book"
-    },
-    "https://www.googleapis.com/auth/picasa": {
-     "description": "Manage your photos and videos"
-    }
-   }
-  }
- },
- "features": [
-  "dataWrapper"
- ],
- "schemas": {
-  "Activity": {
-   "id": "Activity",
-   "type": "object",
-   "properties": {
-    "actor": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "any"
-      },
-      "name": {
-       "type": "any"
-      },
-      "profileUrl": {
-       "type": "any"
-      },
-      "thumbnailUrl": {
-       "type": "any"
-      }
-     }
-    },
-    "address": {
-     "type": "any"
-    },
-    "annotation": {
-     "type": "any"
-    },
-    "categories": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "label": {
-        "type": "any"
-       },
-       "schema": {
-        "type": "any"
-       },
-       "term": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "crosspostSource": {
-     "type": "any"
-    },
-    "detectedlLang": {
-     "type": "any"
-    },
-    "geocode": {
-     "type": "any"
-    },
-    "id": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#activity"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "liked": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "count": {
-          "type": "integer"
-         },
-         "href": {
-          "type": "any"
-         },
-         "type": {
-          "type": "any"
-         }
-        }
-       }
-      }
-     },
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "object": {
-     "type": "object",
-     "properties": {
-      "actor": {
-       "type": "object",
-       "properties": {
-        "id": {
-         "type": "any"
-        },
-        "name": {
-         "type": "any"
-        },
-        "profileUrl": {
-         "type": "any"
-        },
-        "thumbnailUrl": {
-         "type": "any"
-        }
-       }
-      },
-      "attachments": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "content": {
-          "type": "any"
-         },
-         "id": {
-          "type": "any"
-         },
-         "links": {
-          "type": "object",
-          "additionalProperties": {
-           "type": "array",
-           "items": {
-            "type": "object",
-            "properties": {
-             "count": {
-              "type": "any"
-             },
-             "height": {
-              "type": "any"
-             },
-             "href": {
-              "type": "any"
-             },
-             "title": {
-              "type": "any"
-             },
-             "type": {
-              "type": "any"
-             },
-             "updated": {
-              "type": "string"
-             },
-             "width": {
-              "type": "any"
-             }
-            }
-           }
-          }
-         },
-         "title": {
-          "type": "any"
-         },
-         "type": {
-          "type": "string"
-         }
-        }
-       }
-      },
-      "comments": {
-       "type": "array",
-       "items": {
-        "$ref": "Comment"
-       }
-      },
-      "content": {
-       "type": "any"
-      },
-      "detectedlLang": {
-       "type": "any"
-      },
-      "id": {
-       "type": "any"
-      },
-      "liked": {
-       "type": "array",
-       "items": {
-        "$ref": "Person"
-       }
-      },
-      "links": {
-       "type": "object",
-       "additionalProperties": {
-        "type": "array",
-        "items": {
-         "type": "object",
-         "properties": {
-          "href": {
-           "type": "any"
-          },
-          "type": {
-           "type": "any"
-          }
-         }
-        }
-       }
-      },
-      "originalContent": {
-       "type": "any"
-      },
-      "shareOriginal": {
-       "$ref": "Activity"
-      },
-      "targetLang": {
-       "type": "any"
-      },
-      "type": {
-       "type": "string"
-      },
-      "untranslatedContent": {
-       "type": "any"
-      }
-     }
-    },
-    "placeId": {
-     "type": "any"
-    },
-    "placeName": {
-     "type": "any"
-    },
-    "placeholder": {
-     "type": "any"
-    },
-    "published": {
-     "type": "string"
-    },
-    "radius": {
-     "type": "any"
-    },
-    "source": {
-     "type": "object",
-     "properties": {
-      "title": {
-       "type": "any"
-      }
-     }
-    },
-    "targetLang": {
-     "type": "any"
-    },
-    "title": {
-     "type": "any"
-    },
-    "untranslatedTitle": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    },
-    "verbs": {
-     "type": "array",
-     "items": {
-      "type": "string"
-     }
-    },
-    "visibility": {
-     "type": "object",
-     "properties": {
-      "entries": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "id": {
-          "type": "any"
-         },
-         "title": {
-          "type": "any"
-         }
-        }
-       }
-      }
-     }
-    }
-   }
-  },
-  "ActivityFeed": {
-   "id": "ActivityFeed",
-   "type": "object",
-   "properties": {
-    "id": {
-     "type": "any"
-    },
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Activity"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#activityFeed"
-    },
-    "links": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "title": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    }
-   }
-  },
-  "Album": {
-   "id": "Album",
-   "type": "object",
-   "properties": {
-    "created": {
-     "type": "string"
-    },
-    "description": {
-     "type": "string"
-    },
-    "firstPhotoId": {
-     "type": "integer"
-    },
-    "id": {
-     "type": "integer"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#album"
-    },
-    "lastModified": {
-     "type": "string"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "alternate": {
-       "$ref": "Link"
-      },
-      "enclosure": {
-       "$ref": "Link"
-      }
-     }
-    },
-    "owner": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "string"
-      },
-      "name": {
-       "type": "string"
-      },
-      "profileUrl": {
-       "type": "string"
-      },
-      "thumbnailUrl": {
-       "type": "string"
-      }
-     }
-    },
-    "tags": {
-     "type": "array",
-     "items": {
-      "type": "string"
-     }
-    },
-    "title": {
-     "type": "string"
-    },
-    "version": {
-     "type": "integer"
-    }
-   }
-  },
-  "AlbumLite": {
-   "id": "AlbumLite",
-   "type": "object",
-   "properties": {
-    "collection": {
-     "type": "object",
-     "properties": {
-      "album": {
-       "type": "any"
-      },
-      "albumId": {
-       "type": "any"
-      },
-      "photo": {
-       "type": "object",
-       "properties": {
-        "photoUrl": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#albumLite"
-    }
-   }
-  },
-  "AlbumsFeed": {
-   "id": "AlbumsFeed",
-   "type": "object",
-   "properties": {
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Album"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#albumsFeed"
-    }
-   }
-  },
-  "ChiliPhotosResourceJson": {
-   "id": "ChiliPhotosResourceJson",
-   "type": "object",
-   "properties": {
-    "album": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "integer"
-      },
-      "page_link": {
-       "$ref": "Link"
-      }
-     }
-    },
-    "created": {
-     "type": "string"
-    },
-    "description": {
-     "type": "string"
-    },
-    "fileSize": {
-     "type": "integer"
-    },
-    "id": {
-     "type": "integer"
-    },
-    "kind": {
-     "type": "string"
-    },
-    "lastModified": {
-     "type": "string"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "alternate": {
-       "type": "array",
-       "items": {
-        "$ref": "Link"
-       }
-      }
-     },
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "$ref": "Link"
-      }
-     }
-    },
-    "owner": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "string"
-      },
-      "name": {
-       "type": "string"
-      },
-      "profileUrl": {
-       "type": "string"
-      },
-      "thumbnailUrl": {
-       "type": "string"
-      }
-     }
-    },
-    "timestamp": {
-     "type": "number"
-    },
-    "title": {
-     "type": "string"
-    },
-    "version": {
-     "type": "integer"
-    },
-    "video": {
-     "$ref": "Video"
-    }
-   }
-  },
-  "Comment": {
-   "id": "Comment",
-   "type": "object",
-   "properties": {
-    "actor": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "any"
-      },
-      "name": {
-       "type": "any"
-      },
-      "profileUrl": {
-       "type": "any"
-      },
-      "thumbnailUrl": {
-       "type": "any"
-      }
-     }
-    },
-    "content": {
-     "type": "any"
-    },
-    "detectedLang": {
-     "type": "any"
-    },
-    "id": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#comment"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "inReplyTo": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "href": {
-          "type": "any"
-         },
-         "ref": {
-          "type": "any"
-         },
-         "source": {
-          "type": "any"
-         }
-        }
-       }
-      }
-     },
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "originalContent": {
-     "type": "any"
-    },
-    "placeholder": {
-     "type": "any"
-    },
-    "published": {
-     "type": "string"
-    },
-    "targetLang": {
-     "type": "any"
-    },
-    "untranslatedContent": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    }
-   }
-  },
-  "CommentFeed": {
-   "id": "CommentFeed",
-   "type": "object",
-   "properties": {
-    "id": {
-     "type": "any"
-    },
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Comment"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#commentFeed"
-    },
-    "links": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "title": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    }
-   }
-  },
-  "CountFeed": {
-   "id": "CountFeed",
-   "type": "object",
-   "properties": {
-    "counts": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "timestamp": {
-         "type": "string"
-        }
-       }
-      }
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#countFeed"
-    }
-   }
-  },
-  "Group": {
-   "id": "Group",
-   "type": "object",
-   "properties": {
-    "id": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#group"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "self": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "href": {
-          "type": "any"
-         },
-         "type": {
-          "type": "string",
-          "default": "application/json"
-         }
-        }
-       }
-      }
-     }
-    },
-    "memberCount": {
-     "type": "any"
-    },
-    "title": {
-     "type": "any"
-    }
-   }
-  },
-  "GroupFeed": {
-   "id": "GroupFeed",
-   "type": "object",
-   "properties": {
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Group"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#groupFeed"
-    },
-    "links": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    }
-   }
-  },
-  "Link": {
-   "id": "Link",
-   "type": "object",
-   "properties": {
-    "count": {
-     "type": "integer"
-    },
-    "height": {
-     "type": "integer"
-    },
-    "href": {
-     "type": "string"
-    },
-    "title": {
-     "type": "string"
-    },
-    "type": {
-     "type": "string"
-    },
-    "updated": {
-     "type": "string"
-    },
-    "width": {
-     "type": "integer"
-    }
-   }
-  },
-  "PeopleFeed": {
-   "id": "PeopleFeed",
-   "type": "object",
-   "properties": {
-    "entry": {
-     "type": "array",
-     "items": {
-      "$ref": "Person"
-     }
-    },
-    "itemsPerPage": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#peopleFeed"
-    },
-    "startIndex": {
-     "type": "any"
-    },
-    "totalResults": {
-     "type": "any"
-    }
-   }
-  },
-  "Person": {
-   "id": "Person",
-   "type": "object",
-   "properties": {
-    "aboutMe": {
-     "type": "any"
-    },
-    "accounts": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "domain": {
-        "type": "any"
-       },
-       "userid": {
-        "type": "any"
-       },
-       "username": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "activities": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "addresses": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "country": {
-        "type": "any"
-       },
-       "formatted": {
-        "type": "any"
-       },
-       "locality": {
-        "type": "any"
-       },
-       "postalCode": {
-        "type": "any"
-       },
-       "primary": {
-        "type": "any"
-       },
-       "region": {
-        "type": "any"
-       },
-       "streetAddress": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "anniversary": {
-     "type": "any"
-    },
-    "birthday": {
-     "type": "any"
-    },
-    "bodyType": {
-     "type": "any"
-    },
-    "books": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "cars": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "children": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "connected": {
-     "type": "any"
-    },
-    "currentLocation": {
-     "type": "any"
-    },
-    "displayName": {
-     "type": "any"
-    },
-    "drinker": {
-     "type": "any"
-    },
-    "emails": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "ethnicity": {
-     "type": "any"
-    },
-    "fashion": {
-     "type": "any"
-    },
-    "food": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "gender": {
-     "type": "any"
-    },
-    "happiestWhen": {
-     "type": "any"
-    },
-    "hasApp": {
-     "type": "any"
-    },
-    "heroes": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "humor": {
-     "type": "any"
-    },
-    "id": {
-     "type": "any"
-    },
-    "ims": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "interests": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "jobInterests": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#person"
-    },
-    "languages": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "languagesSpoken": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "livingArrangement": {
-     "type": "any"
-    },
-    "lookingFor": {
-     "type": "any"
-    },
-    "movies": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "music": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "name": {
-     "type": "object",
-     "properties": {
-      "familyName": {
-       "type": "any"
-      },
-      "formatted": {
-       "type": "any"
-      },
-      "givenName": {
-       "type": "any"
-      },
-      "honorificPrefix": {
-       "type": "any"
-      },
-      "honorificSuffix": {
-       "type": "any"
-      },
-      "middleName": {
-       "type": "any"
-      }
-     }
-    },
-    "nickname": {
-     "type": "any"
-    },
-    "note": {
-     "type": "any"
-    },
-    "organizations": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "department": {
-        "type": "any"
-       },
-       "description": {
-        "type": "any"
-       },
-       "endDate": {
-        "type": "any"
-       },
-       "location": {
-        "type": "any"
-       },
-       "name": {
-        "type": "any"
-       },
-       "primary": {
-        "type": "any"
-       },
-       "startDate": {
-        "type": "any"
-       },
-       "title": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "pets": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "phoneNumbers": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "photos": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "height": {
-        "type": "any"
-       },
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       },
-       "width": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "politicalViews": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "preferredUsername": {
-     "type": "any"
-    },
-    "profileSong": {
-     "type": "any"
-    },
-    "profileUrl": {
-     "type": "any"
-    },
-    "profileVideo": {
-     "type": "any"
-    },
-    "published": {
-     "type": "string"
-    },
-    "quotes": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "relationshipStatus": {
-     "type": "any"
-    },
-    "relationships": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "religion": {
-     "type": "any"
-    },
-    "romance": {
-     "type": "any"
-    },
-    "scaredOf": {
-     "type": "any"
-    },
-    "sexualOrientation": {
-     "type": "any"
-    },
-    "smoker": {
-     "type": "any"
-    },
-    "sports": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "status": {
-     "type": "any"
-    },
-    "tags": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "thumbnailUrl": {
-     "type": "any"
-    },
-    "turnOffs": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "turnOns": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "tvShows": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "updated": {
-     "type": "string"
-    },
-    "urls": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "utcOffset": {
-     "type": "any"
-    }
-   }
-  },
-  "PhotosFeed": {
-   "id": "PhotosFeed",
-   "type": "object",
-   "properties": {
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "ChiliPhotosResourceJson"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#photosFeed"
-    }
-   }
-  },
-  "Related": {
-   "id": "Related",
-   "type": "object",
-   "properties": {
-    "href": {
-     "type": "any"
-    },
-    "id": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#related"
-    },
-    "summary": {
-     "type": "any"
-    },
-    "title": {
-     "type": "any"
-    }
-   }
-  },
-  "RelatedFeed": {
-   "id": "RelatedFeed",
-   "type": "object",
-   "properties": {
-    "id": {
-     "type": "any"
-    },
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Related"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#relatedFeed"
-    },
-    "links": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "title": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    }
-   }
-  },
-  "Video": {
-   "id": "Video",
-   "type": "object",
-   "properties": {
-    "duration": {
-     "type": "integer"
-    },
-    "size": {
-     "type": "integer"
-    },
-    "status": {
-     "type": "string"
-    },
-    "streams": {
-     "type": "array",
-     "items": {
-      "$ref": "Link"
-     }
-    }
-   }
-  }
- },
- "resources": {
-  "activities": {
-   "methods": {
-    "count": {
-     "id": "chili.activities.count",
-     "path": "activities/count",
-     "httpMethod": "GET",
-     "description": "Get a count of link shares",
-     "parameters": {
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "url": {
-       "type": "string",
-       "description": "URLs for which to get share counts.",
-       "repeated": true,
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "CountFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "delete": {
-     "id": "chili.activities.delete",
-     "path": "activities/{userId}/{scope}/{postId}",
-     "httpMethod": "DELETE",
-     "description": "Delete an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity to delete.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@liked",
-        "@muted",
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Activities liked by the user.",
-        "Activities muted by the user.",
-        "Activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user whose post to delete.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "extractPeopleFromSearch": {
-     "id": "chili.activities.extractPeopleFromSearch",
-     "path": "activities/search/@people",
-     "httpMethod": "GET",
-     "description": "Search for people by topic",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "bbox": {
-       "type": "string",
-       "description": "Bounding box to use in a geographic location query.",
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "lat": {
-       "type": "string",
-       "description": "Latitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "lon": {
-       "type": "string",
-       "description": "Longitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "pid": {
-       "type": "string",
-       "description": "ID of a place to use in a geographic location query.",
-       "location": "query"
-      },
-      "q": {
-       "type": "string",
-       "description": "Full-text search query string.",
-       "location": "query"
-      },
-      "radius": {
-       "type": "string",
-       "description": "Radius to use in a geographic location query.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "get": {
-     "id": "chili.activities.get",
-     "path": "activities/{userId}/@self/{postId}",
-     "httpMethod": "GET",
-     "description": "Get an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-comments": {
-       "type": "integer",
-       "description": "Maximum number of comments to include.",
-       "default": "0",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "max-liked": {
-       "type": "integer",
-       "description": "Maximum number of likes to include.",
-       "default": "0",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the post to get.",
-       "required": true,
-       "location": "path"
-      },
-      "truncateAtom": {
-       "type": "boolean",
-       "description": "Truncate the value of the atom:content element.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user whose post to get.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "postId"
-     ],
-     "response": {
-      "$ref": "Activity"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "insert": {
-     "id": "chili.activities.insert",
-     "path": "activities/{userId}/@self",
-     "httpMethod": "POST",
-     "description": "Create a new activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "preview": {
-       "type": "boolean",
-       "description": "If true, only preview the action.",
-       "default": "false",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "request": {
-      "$ref": "Activity"
-     },
-     "response": {
-      "$ref": "Activity"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "list": {
-     "id": "chili.activities.list",
-     "path": "activities/{userId}/{scope}",
-     "httpMethod": "GET",
-     "description": "List activities",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-comments": {
-       "type": "integer",
-       "description": "Maximum number of comments to include.",
-       "default": "0",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "max-liked": {
-       "type": "integer",
-       "description": "Maximum number of likes to include.",
-       "default": "0",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection of activities to list.",
-       "required": true,
-       "enum": [
-        "@comments",
-        "@consumption",
-        "@liked",
-        "@public",
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Limit to activities commented on by the user.",
-        "Limit to activities to be consumed by the user.",
-        "Limit to activities liked by the user.",
-        "Limit to public activities posted by the user.",
-        "Limit to activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "truncateAtom": {
-       "type": "boolean",
-       "description": "Truncate the value of the atom:content element.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope"
-     ],
-     "response": {
-      "$ref": "ActivityFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "search": {
-     "id": "chili.activities.search",
-     "path": "activities/search",
-     "httpMethod": "GET",
-     "description": "Search for activities",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "bbox": {
-       "type": "string",
-       "description": "Bounding box to use in a geographic location query.",
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "lat": {
-       "type": "string",
-       "description": "Latitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "lon": {
-       "type": "string",
-       "description": "Longitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "pid": {
-       "type": "string",
-       "description": "ID of a place to use in a geographic location query.",
-       "location": "query"
-      },
-      "q": {
-       "type": "string",
-       "description": "Full-text search query string.",
-       "location": "query"
-      },
-      "radius": {
-       "type": "string",
-       "description": "Radius to use in a geographic location query.",
-       "location": "query"
-      },
-      "truncateAtom": {
-       "type": "boolean",
-       "description": "Truncate the value of the atom:content element.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "ActivityFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "track": {
-     "id": "chili.activities.track",
-     "path": "activities/track",
-     "httpMethod": "GET",
-     "description": "Get real-time activity tracking information",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "bbox": {
-       "type": "string",
-       "description": "Bounding box to use in a geographic location query.",
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "lat": {
-       "type": "string",
-       "description": "Latitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "lon": {
-       "type": "string",
-       "description": "Longitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "pid": {
-       "type": "string",
-       "description": "ID of a place to use in a geographic location query.",
-       "location": "query"
-      },
-      "q": {
-       "type": "string",
-       "description": "Full-text search query string.",
-       "location": "query"
-      },
-      "radius": {
-       "type": "string",
-       "description": "Radius to use in a geographic location query.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "ActivityFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "update": {
-     "id": "chili.activities.update",
-     "path": "activities/{userId}/{scope}/{postId}",
-     "httpMethod": "PUT",
-     "description": "Update an activity",
-     "parameters": {
-      "abuseType": {
-       "type": "string",
-       "location": "query"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity to update.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@abuse",
-        "@liked",
-        "@muted",
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Activities reported by the user.",
-        "Activities liked by the user.",
-        "Activities muted by the user.",
-        "Activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user whose post to update.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId"
-     ],
-     "request": {
-      "$ref": "Activity"
-     },
-     "response": {
-      "$ref": "Activity"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    }
-   }
-  },
-  "comments": {
-   "methods": {
-    "delete": {
-     "id": "chili.comments.delete",
-     "path": "activities/{userId}/@self/{postId}/@comments/{commentId}",
-     "httpMethod": "DELETE",
-     "description": "Delete a comment",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "commentId": {
-       "type": "string",
-       "description": "ID of the comment being referenced.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity for which to delete the comment.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "postId",
-      "commentId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "get": {
-     "id": "chili.comments.get",
-     "path": "activities/{userId}/@self/{postId}/@comments/{commentId}",
-     "httpMethod": "GET",
-     "description": "Get a comment",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "commentId": {
-       "type": "string",
-       "description": "ID of the comment being referenced.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity for which to get comments.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "postId",
-      "commentId"
-     ],
-     "response": {
-      "$ref": "Comment"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "insert": {
-     "id": "chili.comments.insert",
-     "path": "activities/{userId}/@self/{postId}/@comments",
-     "httpMethod": "POST",
-     "description": "Create a comment",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity on which to comment.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user on whose behalf to comment.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "postId"
-     ],
-     "request": {
-      "$ref": "Comment"
-     },
-     "response": {
-      "$ref": "Comment"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "list": {
-     "id": "chili.comments.list",
-     "path": "activities/{userId}/{scope}/{postId}/@comments",
-     "httpMethod": "GET",
-     "description": "List comments",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity for which to get comments.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user for whose post to get comments.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId"
-     ],
-     "response": {
-      "$ref": "CommentFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "update": {
-     "id": "chili.comments.update",
-     "path": "activities/{userId}/{scope}/{postId}/@comments/{commentId}",
-     "httpMethod": "PUT",
-     "description": "Update a comment",
-     "parameters": {
-      "abuseType": {
-       "type": "string",
-       "location": "query"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "commentId": {
-       "type": "string",
-       "description": "ID of the comment being referenced.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity for which to update the comment.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@abuse",
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Comments reported by the user.",
-        "Comments posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId",
-      "commentId"
-     ],
-     "request": {
-      "$ref": "Comment"
-     },
-     "response": {
-      "$ref": "Comment"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    }
-   }
-  },
-  "groups": {
-   "methods": {
-    "delete": {
-     "id": "chili.groups.delete",
-     "path": "people/{userId}/@groups/{groupId}",
-     "httpMethod": "DELETE",
-     "description": "Delete a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group to delete.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "get": {
-     "id": "chili.groups.get",
-     "path": "people/{userId}/@groups/{groupId}/@self",
-     "httpMethod": "GET",
-     "description": "Get a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group to get.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId"
-     ],
-     "response": {
-      "$ref": "Group"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "insert": {
-     "id": "chili.groups.insert",
-     "path": "people/{userId}/@groups",
-     "httpMethod": "POST",
-     "description": "Create a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "request": {
-      "$ref": "Group"
-     },
-     "response": {
-      "$ref": "Group"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "list": {
-     "id": "chili.groups.list",
-     "path": "people/{userId}/@groups",
-     "httpMethod": "GET",
-     "description": "Get a user's groups",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "response": {
-      "$ref": "GroupFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "update": {
-     "id": "chili.groups.update",
-     "path": "people/{userId}/@groups/{groupId}/@self",
-     "httpMethod": "PUT",
-     "description": "Update a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group to update.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId"
-     ],
-     "request": {
-      "$ref": "Group"
-     },
-     "response": {
-      "$ref": "Group"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    }
-   }
-  },
-  "people": {
-   "methods": {
-    "delete": {
-     "id": "chili.people.delete",
-     "path": "people/{userId}/@groups/{groupId}/{personId}",
-     "httpMethod": "DELETE",
-     "description": "Remove a person from a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group from which to remove the person.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "personId": {
-       "type": "string",
-       "description": "ID of the person to remove from the group.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the owner of the group.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId",
-      "personId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "get": {
-     "id": "chili.people.get",
-     "path": "people/{userId}/@self",
-     "httpMethod": "GET",
-     "description": "Get a user profile",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "response": {
-      "$ref": "Person"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "liked": {
-     "id": "chili.people.liked",
-     "path": "activities/{userId}/{scope}/{postId}/{groupId}",
-     "httpMethod": "GET",
-     "description": "Get people who liked an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "required": true,
-       "enum": [
-        "@liked"
-       ],
-       "enumDescriptions": [
-        "People who liked this activity."
-       ],
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity that was liked.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId",
-      "groupId"
-     ],
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "list": {
-     "id": "chili.people.list",
-     "path": "people/{userId}/@groups/{groupId}",
-     "httpMethod": "GET",
-     "description": "Get people in a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group for which to list users.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId"
-     ],
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "reshared": {
-     "id": "chili.people.reshared",
-     "path": "activities/{userId}/{scope}/{postId}/{groupId}",
-     "httpMethod": "GET",
-     "description": "Get people who reshared an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "required": true,
-       "enum": [
-        "@reshared"
-       ],
-       "enumDescriptions": [
-        "People who reshared this activity."
-       ],
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity that was reshared.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId",
-      "groupId"
-     ],
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "search": {
-     "id": "chili.people.search",
-     "path": "people/search",
-     "httpMethod": "GET",
-     "description": "Search for people",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "q": {
-       "type": "string",
-       "description": "Full-text search query string.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "update": {
-     "id": "chili.people.update",
-     "path": "people/{userId}/@groups/{groupId}/{personId}",
-     "httpMethod": "PUT",
-     "description": "Add a person to a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group to which to add the person.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "personId": {
-       "type": "string",
-       "description": "ID of the person to add to the group.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the owner of the group.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId",
-      "personId"
-     ],
-     "request": {
-      "$ref": "Person"
-     },
-     "response": {
-      "$ref": "Person"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    }
-   }
-  },
-  "photoAlbums": {
-   "methods": {
-    "delete": {
-     "id": "chili.photoAlbums.delete",
-     "path": "photos/{userId}/@self/{albumId}",
-     "httpMethod": "DELETE",
-     "description": "Delete a photo album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to delete.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "get": {
-     "id": "chili.photoAlbums.get",
-     "path": "photos/{userId}/@self/{albumId}",
-     "httpMethod": "GET",
-     "description": "Get a photo album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to get.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "response": {
-      "$ref": "Album"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "insert": {
-     "id": "chili.photoAlbums.insert",
-     "path": "photos/{userId}/@self",
-     "httpMethod": "POST",
-     "description": "Create a photo album",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "request": {
-      "$ref": "Album"
-     },
-     "response": {
-      "$ref": "Album"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "list": {
-     "id": "chili.photoAlbums.list",
-     "path": "photos/{userId}/{scope}",
-     "httpMethod": "GET",
-     "description": "List a user's photo albums",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection of albums to list.",
-       "required": true,
-       "enum": [
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Albums posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope"
-     ],
-     "response": {
-      "$ref": "AlbumsFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    }
-   }
-  },
-  "photos": {
-   "methods": {
-    "delete": {
-     "id": "chili.photos.delete",
-     "path": "photos/{userId}/@self/{albumId}/@photos/{photoId}",
-     "httpMethod": "DELETE",
-     "description": "Delete a photo",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to which to photo belongs.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "photoId": {
-       "type": "string",
-       "description": "ID of the photo to delete.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId",
-      "photoId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "get": {
-     "id": "chili.photos.get",
-     "path": "photos/{userId}/@self/{albumId}/@photos/{photoId}",
-     "httpMethod": "GET",
-     "description": "Get photo metadata",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album containing the photo.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "photoId": {
-       "type": "string",
-       "description": "ID of the photo for which to get metadata.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId",
-      "photoId"
-     ],
-     "response": {
-      "$ref": "ChiliPhotosResourceJson"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "insert": {
-     "id": "chili.photos.insert",
-     "path": "photos/{userId}/{albumId}",
-     "httpMethod": "POST",
-     "description": "Upload a photo to an album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to which to upload.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "request": {
-      "$ref": "AlbumLite"
-     },
-     "response": {
-      "$ref": "AlbumLite"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "insert2": {
-     "id": "chili.photos.insert2",
-     "path": "photos/{userId}/@self/{albumId}/@photos",
-     "httpMethod": "POST",
-     "description": "Upload a photo to an album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to which to upload.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "request": {
-      "$ref": "ChiliPhotosResourceJson"
-     },
-     "response": {
-      "$ref": "ChiliPhotosResourceJson"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "listByAlbum": {
-     "id": "chili.photos.listByAlbum",
-     "path": "photos/{userId}/@self/{albumId}/@photos",
-     "httpMethod": "GET",
-     "description": "List photos in an album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album for which to list photos.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "response": {
-      "$ref": "PhotosFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "listByScope": {
-     "id": "chili.photos.listByScope",
-     "path": "photos/{userId}/@self/{scope}/@photos",
-     "httpMethod": "GET",
-     "description": "Get a user's photos",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection of photos to list.",
-       "required": true,
-       "enum": [
-        "@recent"
-       ],
-       "enumDescriptions": [
-        "Recent photos uploaded by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope"
-     ],
-     "response": {
-      "$ref": "PhotosFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    }
-   }
-  },
-  "related": {
-   "methods": {
-    "list": {
-     "id": "chili.related.list",
-     "path": "activities/{userId}/{scope}/{postId}/@related",
-     "httpMethod": "GET",
-     "description": "Get related links for an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity to which to get related links.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId"
-     ],
-     "response": {
-      "$ref": "RelatedFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    }
-   }
-  }
- }
-}
diff --git a/samples/localdiscovery/buzz.py b/samples/localdiscovery/buzz.py
deleted file mode 100644
index 411ad27..0000000
--- a/samples/localdiscovery/buzz.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright 2010 Google Inc. All Rights Reserved.
-
-"""Simple command-line example for Buzz.
-
-Command-line application that retrieves the users
-latest content and then adds a new entry.
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-from apiclient.discovery import build_from_document
-
-import httplib2
-import os
-import pprint
-
-def main():
-  http = httplib2.Http()
-
-  # Load the local copy of the discovery document
-  f = file(os.path.join(os.path.dirname(__file__), "buzz.json"), "r")
-  discovery = f.read()
-  f.close()
-
-  # Construct a service from the local documents
-  service = build_from_document(discovery,
-      base="https://www.googleapis.com/",
-      http=http)
-
-  pprint.pprint(service.activities().search(q='lady gaga').execute())
-
-
-if __name__ == '__main__':
-  main()
diff --git a/samples/new_project_template/apiclient b/samples/new_project_template/apiclient
deleted file mode 120000
index 24fe0bc..0000000
--- a/samples/new_project_template/apiclient
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/apiclient
\ No newline at end of file
diff --git a/samples/new_project_template/app.yaml b/samples/new_project_template/app.yaml
deleted file mode 100644
index c0d43d5..0000000
--- a/samples/new_project_template/app.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-application: jcg-testing-01
-version: 1
-runtime: python
-api_version: 1
-
-handlers:
-- url: /oauth2callback
-  script: oauth2client/appengine.py
-
-- url: .*
-  script: main.py
-
diff --git a/samples/new_project_template/gflags.py b/samples/new_project_template/gflags.py
deleted file mode 120000
index 5a2ff94..0000000
--- a/samples/new_project_template/gflags.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags.py
\ No newline at end of file
diff --git a/samples/new_project_template/gflags_validators.py b/samples/new_project_template/gflags_validators.py
deleted file mode 120000
index 25d8ce8..0000000
--- a/samples/new_project_template/gflags_validators.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags_validators.py
\ No newline at end of file
diff --git a/samples/new_project_template/httplib2 b/samples/new_project_template/httplib2
deleted file mode 120000
index 4cd2774..0000000
--- a/samples/new_project_template/httplib2
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/httplib2
\ No newline at end of file
diff --git a/samples/new_project_template/index.yaml b/samples/new_project_template/index.yaml
deleted file mode 100644
index a3b9e05..0000000
--- a/samples/new_project_template/index.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-indexes:
-
-# AUTOGENERATED
-
-# This index.yaml is automatically updated whenever the dev_appserver
-# detects that a new type of query is run.  If you want to manage the
-# index.yaml file manually, remove the above marker line (the line
-# saying "# AUTOGENERATED").  If you want to manage some indexes
-# manually, move them above the marker line.  The index.yaml file is
-# automatically uploaded to the admin console when you next deploy
-# your application using appcfg.py.
diff --git a/samples/new_project_template/main.py b/samples/new_project_template/main.py
deleted file mode 100755
index c451e67..0000000
--- a/samples/new_project_template/main.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2007 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Starting template for Google App Engine applications.
-
-Use this project as a starting point if you are just beginning to build a Google
-App Engine project. Remember to fill in the OAuth 2.0 client_id and
-client_secret which can be obtained from the Developer Console
-<https://code.google.com/apis/console/>
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-
-import httplib2
-import logging
-import os
-import pickle
-
-from apiclient.discovery import build
-from oauth2client.appengine import CredentialsProperty
-from oauth2client.appengine import StorageByKeyName
-from oauth2client.client import OAuth2WebServerFlow
-from google.appengine.api import memcache
-from google.appengine.api import users
-from google.appengine.ext import db
-from google.appengine.ext import webapp
-from google.appengine.ext.webapp import template
-from google.appengine.ext.webapp import util
-from google.appengine.ext.webapp.util import login_required
-
-# Set up a Flow object to be used if we need to authenticate. This
-# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
-# the information it needs to authenticate. Note that it is called
-# the Web Server Flow, but it can also handle the flow for native
-# applications <http://code.google.com/apis/accounts/docs/OAuth2.html#IA>
-# The client_id and client_secret are copied from the Identity tab on
-# the Google APIs Console <http://code.google.com/apis/console>
-
-FLOW = OAuth2WebServerFlow(
-    client_id='<client id goes here>',
-    client_secret='<client secret goes here>',
-    scope='https://www.googleapis.com/auth/buzz',
-    user_agent='my-sample-app/1.0')
-
-
-class Credentials(db.Model):
-  credentials = CredentialsProperty()
-
-
-class MainHandler(webapp.RequestHandler):
-
-  @login_required
-  def get(self):
-    user = users.get_current_user()
-    credentials = StorageByKeyName(
-        Credentials, user.user_id(), 'credentials').get()
-
-    if not credentials or credentials.invalid:
-      return begin_oauth_flow(self, user)
-
-    http = credentials.authorize(httplib2.Http())
-
-    # Build a service object for interacting with the API. Visit
-    # the Google APIs Console <http://code.google.com/apis/console>
-    # to get a developerKey for your own application.
-    service = build("buzz", "v1", http=http)
-    followers = service.people().list(
-        userId='@me', groupId='@followers').execute()
-    text = 'Hello, you have %s followers!' % followers['totalResults']
-
-    path = os.path.join(os.path.dirname(__file__), 'welcome.html')
-    self.response.out.write(template.render(path, {'text': text }))
-
-
-def begin_oauth_flow(request_handler, user):
-  callback = request_handler.request.relative_url('/oauth2callback')
-  authorize_url = FLOW.step1_get_authorize_url(callback)
-  # Here we are using memcache to store the flow temporarily while the user
-  # is directed to authorize our service. You could also store the flow
-  # in the datastore depending on your utilization of memcache, just remember
-  # in that case to clean up the flow after you are done with it.
-  memcache.set(user.user_id(), pickle.dumps(FLOW))
-  request_handler.redirect(authorize_url)
-
-
-class OAuthHandler(webapp.RequestHandler):
-
-  @login_required
-  def get(self):
-    user = users.get_current_user()
-    flow = pickle.loads(memcache.get(user.user_id()))
-    # This code should be ammended with application specific error
-    # handling. The following cases should be considered:
-    # 1. What if the flow doesn't exist in memcache? Or is corrupt?
-    # 2. What if the step2_exchange fails?
-    if flow:
-      credentials = flow.step2_exchange(self.request.params)
-      StorageByKeyName(
-          Credentials, user.user_id(), 'credentials').put(credentials)
-      self.redirect("/")
-    else:
-      # Add application specific error handling here.
-      pass
-
-
-def main():
-  application = webapp.WSGIApplication(
-      [
-      ('/', MainHandler),
-      ('/oauth2callback', OAuthHandler)
-      ],
-      debug=True)
-  util.run_wsgi_app(application)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/samples/new_project_template/oauth2 b/samples/new_project_template/oauth2
deleted file mode 120000
index ee61c25..0000000
--- a/samples/new_project_template/oauth2
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/oauth2
\ No newline at end of file
diff --git a/samples/new_project_template/oauth2client b/samples/new_project_template/oauth2client
deleted file mode 120000
index 9013119..0000000
--- a/samples/new_project_template/oauth2client
+++ /dev/null
@@ -1 +0,0 @@
-../../oauth2client/
\ No newline at end of file
diff --git a/samples/new_project_template/uritemplate b/samples/new_project_template/uritemplate
deleted file mode 120000
index 1c98e41..0000000
--- a/samples/new_project_template/uritemplate
+++ /dev/null
@@ -1 +0,0 @@
-../appengine/uritemplate
\ No newline at end of file
diff --git a/samples/new_project_template/welcome.html b/samples/new_project_template/welcome.html
deleted file mode 100644
index 0117f50..0000000
--- a/samples/new_project_template/welcome.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<html>
-  <head>
-    <title>Bootcamp Translations</title>
-  </head>
-  <body>
-    <p>{{ text }}</p>
-  </body>
-</html>
diff --git a/samples/oauth2/dailymotion/gflags.py b/samples/oauth2/dailymotion/gflags.py
deleted file mode 120000
index 157177e..0000000
--- a/samples/oauth2/dailymotion/gflags.py
+++ /dev/null
@@ -1 +0,0 @@
-../../../gflags.py
\ No newline at end of file
diff --git a/samples/oauth2/dailymotion/gflags_validators.py b/samples/oauth2/dailymotion/gflags_validators.py
deleted file mode 120000
index 9d359e0..0000000
--- a/samples/oauth2/dailymotion/gflags_validators.py
+++ /dev/null
@@ -1 +0,0 @@
-../../../gflags_validators.py
\ No newline at end of file
diff --git a/samples/oauth2/dailymotion/httplib2 b/samples/oauth2/dailymotion/httplib2
deleted file mode 120000
index 69b02ef..0000000
--- a/samples/oauth2/dailymotion/httplib2
+++ /dev/null
@@ -1 +0,0 @@
-../../../httplib2/
\ No newline at end of file
diff --git a/samples/oauth2/dailymotion/oauth2client b/samples/oauth2/dailymotion/oauth2client
deleted file mode 120000
index 0a1ec33..0000000
--- a/samples/oauth2/dailymotion/oauth2client
+++ /dev/null
@@ -1 +0,0 @@
-../../../oauth2client/
\ No newline at end of file
diff --git a/samples/oauth2/dailymotion/simplejson b/samples/oauth2/dailymotion/simplejson
deleted file mode 120000
index eeaa2f0..0000000
--- a/samples/oauth2/dailymotion/simplejson
+++ /dev/null
@@ -1 +0,0 @@
-../../../simplejson/
\ No newline at end of file
diff --git a/samples/oauth2/dailymotion/uritemplate b/samples/oauth2/dailymotion/uritemplate
deleted file mode 120000
index 5952908..0000000
--- a/samples/oauth2/dailymotion/uritemplate
+++ /dev/null
@@ -1 +0,0 @@
-../../../uritemplate/
\ No newline at end of file
diff --git a/samples/oauth2/django_sample/__init__.py b/samples/oauth2/django_sample/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/samples/oauth2/django_sample/__init__.py
+++ /dev/null
diff --git a/samples/oauth2/django_sample/buzz/__init__.py b/samples/oauth2/django_sample/buzz/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/samples/oauth2/django_sample/buzz/__init__.py
+++ /dev/null
diff --git a/samples/oauth2/django_sample/buzz/models.py b/samples/oauth2/django_sample/buzz/models.py
deleted file mode 100644
index 69c180c..0000000
--- a/samples/oauth2/django_sample/buzz/models.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import pickle
-import base64
-
-from django.contrib import admin
-from django.contrib.auth.models import User
-from django.db import models
-
-from oauth2client.django_orm import FlowField
-from oauth2client.django_orm import CredentialsField
-
-# The Flow could also be stored in memcache since it is short lived.
-
-
-class FlowModel(models.Model):
-  id = models.ForeignKey(User, primary_key=True)
-  flow = FlowField()
-
-
-class CredentialsModel(models.Model):
-  id = models.ForeignKey(User, primary_key=True)
-  credential = CredentialsField()
-
-
-class CredentialsAdmin(admin.ModelAdmin):
-    pass
-
-
-class FlowAdmin(admin.ModelAdmin):
-    pass
-
-
-admin.site.register(CredentialsModel, CredentialsAdmin)
-admin.site.register(FlowModel, FlowAdmin)
diff --git a/samples/oauth2/django_sample/buzz/tests.py b/samples/oauth2/django_sample/buzz/tests.py
deleted file mode 100644
index 927cadf..0000000
--- a/samples/oauth2/django_sample/buzz/tests.py
+++ /dev/null
@@ -1,24 +0,0 @@
-"""
-This file demonstrates two different styles of tests (one doctest and one
-unittest). These will both pass when you run "manage.py test".
-
-Replace these with more appropriate tests for your application.
-"""
-
-from django.test import TestCase
-
-
-class SimpleTest(TestCase):
-
-    def test_basic_addition(self):
-        """
-        Tests that 1 + 1 always equals 2.
-        """
-        self.failUnlessEqual(1 + 1, 2)
-
-__test__ = {"doctest": """
-Another way to test that 1 + 1 is equal to 2.
-
->>> 1 + 1 == 2
-True
-"""}
diff --git a/samples/oauth2/django_sample/buzz/views.py b/samples/oauth2/django_sample/buzz/views.py
deleted file mode 100644
index 9a051ea..0000000
--- a/samples/oauth2/django_sample/buzz/views.py
+++ /dev/null
@@ -1,60 +0,0 @@
-import os
-import logging
-import httplib2
-
-from django.http import HttpResponse
-from django.core.urlresolvers import reverse
-from django.contrib.auth.decorators import login_required
-
-from oauth2client.django_orm import Storage
-from oauth2client.client import OAuth2WebServerFlow
-from django_sample.buzz.models import CredentialsModel
-from django_sample.buzz.models import FlowModel
-from apiclient.discovery import build
-
-from django.http import HttpResponseRedirect
-from django.shortcuts import render_to_response
-
-STEP2_URI = 'http://localhost:8000/auth_return'
-FLOW = OAuth2WebServerFlow(
-    client_id='837647042410.apps.googleusercontent.com',
-    client_secret='+SWwMCL9d8gWtzPRa1lXw5R8',
-    scope='https://www.googleapis.com/auth/buzz',
-    user_agent='buzz-django-sample/1.0',
-    )
-
-@login_required
-def index(request):
-  storage = Storage(CredentialsModel, 'id', request.user, 'credential')
-  credential = storage.get()
-  if credential is None or credential.invalid == True:
-
-    authorize_url = FLOW.step1_get_authorize_url(STEP2_URI)
-    f = FlowModel(id=request.user, flow=FLOW)
-    f.save()
-    return HttpResponseRedirect(authorize_url)
-  else:
-    http = httplib2.Http()
-    http = credential.authorize(http)
-    service = build("buzz", "v1", http=http)
-    activities = service.activities()
-    activitylist = activities.list(scope='@consumption',
-                                   userId='@me').execute()
-    logging.info(activitylist)
-
-    return render_to_response('buzz/welcome.html', {
-                'activitylist': activitylist,
-                })
-
-
-@login_required
-def auth_return(request):
-    try:
-      f = FlowModel.objects.get(id=request.user)
-      credential = f.flow.step2_exchange(request.REQUEST)
-      storage = Storage(CredentialsModel, 'id', request.user, 'credential')
-      storage.put(credential)
-      f.delete()
-      return HttpResponseRedirect("/")
-    except FlowModel.DoesNotExist:
-      pass
diff --git a/samples/oauth2/django_sample/manage.py b/samples/oauth2/django_sample/manage.py
deleted file mode 100755
index 0b932da..0000000
--- a/samples/oauth2/django_sample/manage.py
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/python
-from django.core.management import execute_manager
-try:
-    import settings # Assumed to be in the same directory.
-except ImportError:
-    import sys
-    sys.stderr.write("""Error: Can't find the file 'settings.py' in the
-directory containing %r. It appears you've customized things. You'll
-have to run django-admin.py, passing it your settings module.
-(If the file settings.py does indeed exist, it's causing an ImportError
-somehow.)\n""" % __file__)
-    sys.exit(1)
-
-if __name__ == "__main__":
-    execute_manager(settings)
diff --git a/samples/oauth2/django_sample/settings.py b/samples/oauth2/django_sample/settings.py
deleted file mode 100644
index 565d2e5..0000000
--- a/samples/oauth2/django_sample/settings.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# Django settings for django_sample project.
-import os
-
-DEBUG = True
-TEMPLATE_DEBUG = DEBUG
-
-ADMINS = (
-    # ('Your Name', 'your_email@domain.com'),
-)
-
-MANAGERS = ADMINS
-
-DATABASE_ENGINE = 'sqlite3'
-DATABASE_NAME = 'database.sqlite3'
-DATABASE_USER = ''
-DATABASE_PASSWORD = ''
-DATABASE_HOST = ''
-DATABASE_PORT = ''
-
-# Local time zone for this installation. Choices can be found here:
-# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
-# although not all choices may be available on all operating systems.
-# If running in a Windows environment this must be set to the same as your
-# system time zone.
-TIME_ZONE = 'America/New_York'
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'en-us'
-
-SITE_ID = 1
-
-# If you set this to False, Django will make some optimizations so as not
-# to load the internationalization machinery.
-USE_I18N = True
-
-# Absolute path to the directory that holds media.
-# Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = ''
-
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash if there is a path component (optional in other cases).
-# Examples: "http://media.lawrence.com", "http://example.com/media/"
-MEDIA_URL = ''
-
-# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
-# trailing slash.
-# Examples: "http://foo.com/media/", "/media/".
-ADMIN_MEDIA_PREFIX = '/media/'
-
-# Make this unique, and don't share it with anybody.
-SECRET_KEY = '_=9hq-$t_uv1ckf&s!y2$9g$1dm*6p1cl%*!^mg=7gr)!zj32d'
-
-# List of callables that know how to import templates from various sources.
-TEMPLATE_LOADERS = (
-    'django.template.loaders.filesystem.load_template_source',
-    'django.template.loaders.app_directories.load_template_source',
-#     'django.template.loaders.eggs.load_template_source',
-)
-
-MIDDLEWARE_CLASSES = (
-    'django.middleware.common.CommonMiddleware',
-    'django.contrib.sessions.middleware.SessionMiddleware',
-    'django.contrib.auth.middleware.AuthenticationMiddleware',
-)
-
-ROOT_URLCONF = 'django_sample.urls'
-
-TEMPLATE_DIRS = (
-    # Put strings here, like "/home/html/django_templates"
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-    os.path.join(os.path.dirname(__file__), 'templates')
-)
-
-INSTALLED_APPS = (
-    'django.contrib.admin',
-    'django.contrib.auth',
-    'django.contrib.contenttypes',
-    'django.contrib.sessions',
-    'django.contrib.sites',
-    'django_sample.buzz'
-)
diff --git a/samples/oauth2/django_sample/static/go.png b/samples/oauth2/django_sample/static/go.png
deleted file mode 100644
index e5aacda..0000000
--- a/samples/oauth2/django_sample/static/go.png
+++ /dev/null
Binary files differ
diff --git a/samples/oauth2/django_sample/templates/buzz/login.html b/samples/oauth2/django_sample/templates/buzz/login.html
deleted file mode 100644
index 567bf68..0000000
--- a/samples/oauth2/django_sample/templates/buzz/login.html
+++ /dev/null
@@ -1,23 +0,0 @@
-{% block content %}
-
-{% if form.errors %}
-<p>Your username and password didn't match. Please try again.</p>
-{% endif %}
-
-<form method="post" action="{% url django.contrib.auth.views.login %}">
-<table>
-<tr>
-    <td>{{ form.username.label_tag }}</td>
-    <td>{{ form.username }}</td>
-</tr>
-<tr>
-    <td>{{ form.password.label_tag }}</td>
-    <td>{{ form.password }}</td>
-</tr>
-</table>
-
-<input type="submit" value="login" />
-<input type="hidden" name="next" value="{{ next }}" />
-</form>
-
-{% endblock %}
diff --git a/samples/oauth2/django_sample/templates/buzz/welcome.html b/samples/oauth2/django_sample/templates/buzz/welcome.html
deleted file mode 100644
index 07e8027..0000000
--- a/samples/oauth2/django_sample/templates/buzz/welcome.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-<html>
-  <head>
-    <title>Buzz Stuff</title>
-    <style type=text/css>
-      td  { vertical-align: top; padding: 0.5em }
-      img { border:0 }
-    </style>
-  </head>
-  <body>
-      <table border=0>
-      {% for item in activitylist.items %}
-      <tr valign=top>
-        <td>
-          {% if item.actor.thumbnailUrl %}
-            <a href="{{ item.actor.profileUrl }}">
-              <img src="{{ item.actor.thumbnailUrl }}">
-            </a>
-          {% endif %}
-          <br>
-          <a href="{{ item.actor.profileUrl }}">{{ item.actor.name }}</a></td>
-      <td>
-        {{ item.object.content|safe }}
-        </td>
-        <td>
-          <a href="{{ item.object.links.alternate.0.href }}"><img
-            src="/static/go.png"></a>
-        </td>
-      </tr>
-      {% endfor %}
-      </table>
-  </body>
-</html>
diff --git a/samples/oauth2/django_sample/urls.py b/samples/oauth2/django_sample/urls.py
deleted file mode 100644
index aeba620..0000000
--- a/samples/oauth2/django_sample/urls.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import os
-from django.conf.urls.defaults import *
-
-# Uncomment the next two lines to enable the admin:
-from django.contrib import admin
-admin.autodiscover()
-
-urlpatterns = patterns('',
-    # Example:
-    (r'^$', 'django_sample.buzz.views.index'),
-    (r'^auth_return', 'django_sample.buzz.views.auth_return'),
-
-    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
-    # to INSTALLED_APPS to enable admin documentation:
-    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
-
-    # Uncomment the next line to enable the admin:
-    (r'^admin/', include(admin.site.urls)),
-    (r'^accounts/login/$', 'django.contrib.auth.views.login',
-                        {'template_name': 'buzz/login.html'}),
-
-    (r'^static/(?P<path>.*)$', 'django.views.static.serve',
-        {'document_root': os.path.join(os.path.dirname(__file__), 'static')
-}),
-)
diff --git a/samples/buzz/client_secrets.json b/samples/plus/client_secrets.json
similarity index 100%
rename from samples/buzz/client_secrets.json
rename to samples/plus/client_secrets.json
diff --git a/samples/buzz/buzz.py b/samples/plus/plus.py
similarity index 77%
rename from samples/buzz/buzz.py
rename to samples/plus/plus.py
index 6334ed6..6b9dbf0 100644
--- a/samples/buzz/buzz.py
+++ b/samples/plus/plus.py
@@ -15,22 +15,22 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-"""Simple command-line sample for Buzz.
+"""Simple command-line sample for the Google+ API.
 
 Command-line application that retrieves the users latest content and
 then adds a new entry.
 
 Usage:
-  $ python buzz.py
+  $ python plus.py
 
 You can also get help on all the command-line flags the program understands
 by running:
 
-  $ python buzz.py --help
+  $ python plus.py --help
 
 To get detailed log output run:
 
-  $ python buzz.py --logging_level=DEBUG
+  $ python plus.py --logging_level=DEBUG
 """
 
 __author__ = 'jcgregorio@google.com (Joe Gregorio)'
@@ -73,7 +73,7 @@
 
 # Set up a Flow object to be used if we need to authenticate.
 FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
-    scope='https://www.googleapis.com/auth/buzz',
+    scope='https://www.googleapis.com/auth/plus.me',
     message=MISSING_CLIENT_SECRETS_MESSAGE)
 
 
@@ -99,7 +99,7 @@
   # If the Credentials don't exist or are invalid run through the native client
   # flow. The Storage object will ensure that if successful the good
   # Credentials will get written back to a file.
-  storage = Storage('buzz.dat')
+  storage = Storage('plus.dat')
   credentials = storage.get()
 
   if credentials is None or credentials.invalid:
@@ -110,26 +110,25 @@
   http = httplib2.Http()
   http = credentials.authorize(http)
 
-  service = build("buzz", "v1", http=http)
+  service = build("plus", "v1", http=http)
 
   try:
+    person = service.people().get(userId='me').execute(http)
 
-    activities = service.activities()
+    print "Got your ID: %s" % person['displayName']
+    print
+    print "%-040s -> %s" % ("[Activitity ID]", "[Content]")
 
-    # Retrieve the first two activities
-    activitylist = activities.list(
-        max_results='2', scope='@self', userId='@me').execute()
-    print "Retrieved the first two activities"
+    # Don't execute the request until we reach the paging loop below
+    request = service.activities().list(
+        userId=person['id'], collection='public')
+    # Loop over every activity and print the ID and a short snippet of content.
+    while ( request != None ):
+      activities_doc = request.execute()
+      for item in activities_doc.get('items', []):
+        print '%-040s -> %s' % (item['id'], item['object']['content'][:30])
 
-    # Retrieve the next two activities
-    if activitylist:
-      activitylist = activities.list_next(activitylist).execute()
-      print "Retrieved the next two activities"
-
-    # List the number of followers
-    followers = service.people().list(
-        userId='@me', groupId='@followers').execute(http)
-    print 'Hello, you have %s followers!' % followers['totalResults']
+      request = service.activities().list_next(request, activities_doc)
 
   except AccessTokenRefreshError:
     print ("The credentials have been revoked or expired, please re-run"
diff --git a/samples/src/buzz.py b/samples/src/buzz.py
deleted file mode 100644
index 10451e2..0000000
--- a/samples/src/buzz.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# version: v1
-# scope: https://www.googleapis.com/auth/buzz
-# title: Simple command-line sample for Buzz.
-# description: Command-line application that retrieves the users latest content and then adds a new entry.
-
-  activities = service.activities()
-
-  # Retrieve the first two activities
-  activitylist = activities.list(
-      max_results='2', scope='@self', userId='@me').execute()
-  print "Retrieved the first two activities"
-
-  # Retrieve the next two activities
-  if activitylist:
-    activitylist = activities.list_next(activitylist).execute()
-    print "Retrieved the next two activities"
-
-  # Add a new activity
-  new_activity_body = {
-      'title': 'Testing insert',
-      'object': {
-        'content':
-        u'Just a short note to show that insert is working. ☄',
-        'type': 'note'}
-      }
-  activity = activities.insert(userId='@me', body=new_activity_body).execute()
-  print "Added a new activity"
-
-  activitylist = activities.list(
-      max_results='2', scope='@self', userId='@me').execute()
-
-  # Add a comment to that activity
-  comment_body = {
-      "content": "This is a comment"
-      }
-  item = activitylist['items'][0]
-  comment = service.comments().insert(
-      userId=item['actor']['id'], postId=item['id'], body=comment_body
-      ).execute()
-  print 'Added a comment to the new activity'
-  pprint.pprint(comment)
diff --git a/samples/tasks_appengine/apiclient b/samples/tasks_appengine/apiclient
deleted file mode 120000
index 22e4c9c..0000000
--- a/samples/tasks_appengine/apiclient
+++ /dev/null
@@ -1 +0,0 @@
-../../apiclient/
\ No newline at end of file
diff --git a/samples/tasks_appengine/gflags.py b/samples/tasks_appengine/gflags.py
deleted file mode 120000
index 5a2ff94..0000000
--- a/samples/tasks_appengine/gflags.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags.py
\ No newline at end of file
diff --git a/samples/tasks_appengine/gflags_validators.py b/samples/tasks_appengine/gflags_validators.py
deleted file mode 120000
index 25d8ce8..0000000
--- a/samples/tasks_appengine/gflags_validators.py
+++ /dev/null
@@ -1 +0,0 @@
-../../gflags_validators.py
\ No newline at end of file
diff --git a/samples/tasks_appengine/httplib2 b/samples/tasks_appengine/httplib2
deleted file mode 120000
index 488ae9f..0000000
--- a/samples/tasks_appengine/httplib2
+++ /dev/null
@@ -1 +0,0 @@
-../../httplib2/
\ No newline at end of file
diff --git a/samples/tasks_appengine/oauth2client b/samples/tasks_appengine/oauth2client
deleted file mode 120000
index 9013119..0000000
--- a/samples/tasks_appengine/oauth2client
+++ /dev/null
@@ -1 +0,0 @@
-../../oauth2client/
\ No newline at end of file
diff --git a/samples/tasks_appengine/uritemplate b/samples/tasks_appengine/uritemplate
deleted file mode 120000
index ce92dcb..0000000
--- a/samples/tasks_appengine/uritemplate
+++ /dev/null
@@ -1 +0,0 @@
-../../uritemplate/
\ No newline at end of file
diff --git a/samples/threadqueue/main.py b/samples/threadqueue/main.py
index 6ccea7c..817de59 100644
--- a/samples/threadqueue/main.py
+++ b/samples/threadqueue/main.py
@@ -35,7 +35,6 @@
 
 # A list of URLs to shorten.
 BULK = [
-    "https://code.google.com/apis/buzz/",
     "https://code.google.com/apis/moderator/",
     "https://code.google.com/apis/latitude/",
     "https://code.google.com/apis/urlshortener/",
diff --git a/setup.py b/setup.py
index 219f673..33130e9 100644
--- a/setup.py
+++ b/setup.py
@@ -24,7 +24,6 @@
   'oauth2client',
   'apiclient.ext',
   'apiclient.contrib',
-  'apiclient.contrib.buzz',
   'apiclient.contrib.latitude',
   'apiclient.contrib.moderator',
   'uritemplate',
@@ -46,7 +45,7 @@
   install_requires.append('simplejson')
 
 long_desc = """The Google API Client for Python is a client library for
-accessing the Buzz, Moderator, and Latitude APIs."""
+accessing the Plus, Moderator, and many other Google APIs."""
 
 setup(name="google-api-python-client",
       version="1.0beta6",
diff --git a/setup_oauth2client.py b/setup_oauth2client.py
index e5f6a92..cd5fd4b 100644
--- a/setup_oauth2client.py
+++ b/setup_oauth2client.py
@@ -31,7 +31,7 @@
 try:
   import json
   needs_json = False
-except ImportError
+except ImportError:
   needs_json = True
 
 if needs_json:
@@ -40,7 +40,7 @@
 long_desc = """The oauth2client is a client library for OAuth 2.0."""
 
 setup(name="oauth2client",
-      version="1.0beta5prerelease",
+      version="1.0beta6",
       description="OAuth 2.0 client library",
       long_description=long_desc,
       author="Joe Gregorio",
@@ -48,7 +48,6 @@
       url="http://code.google.com/p/google-api-python-client/",
       install_requires=install_requires,
       packages=packages,
-      py_modules=py_modules,
       license="Apache 2.0",
       keywords="google oauth 2.0 http client",
       classifiers=['Development Status :: 4 - Beta',
diff --git a/simplejson/.__speedups.c b/simplejson/.__speedups.c
deleted file mode 100644
index f38de2c..0000000
--- a/simplejson/.__speedups.c
+++ /dev/null
Binary files differ
diff --git a/simplejson/._decoder.py b/simplejson/._decoder.py
deleted file mode 100644
index f724191..0000000
--- a/simplejson/._decoder.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/._encoder.py b/simplejson/._encoder.py
deleted file mode 100644
index 6463cbb..0000000
--- a/simplejson/._encoder.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/._ordered_dict.py b/simplejson/._ordered_dict.py
deleted file mode 100644
index 31b42a1..0000000
--- a/simplejson/._ordered_dict.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/._scanner.py b/simplejson/._scanner.py
deleted file mode 100644
index a5b51b5..0000000
--- a/simplejson/._scanner.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/._tool.py b/simplejson/._tool.py
deleted file mode 100644
index ef91338..0000000
--- a/simplejson/._tool.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/__init__.py b/simplejson/__init__.py
deleted file mode 100644
index dcfd541..0000000
--- a/simplejson/__init__.py
+++ /dev/null
@@ -1,437 +0,0 @@
-r"""JSON (JavaScript Object Notation) <http://json.org> is a subset of
-JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
-interchange format.
-
-:mod:`simplejson` exposes an API familiar to users of the standard library
-:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained
-version of the :mod:`json` library contained in Python 2.6, but maintains
-compatibility with Python 2.4 and Python 2.5 and (currently) has
-significant performance advantages, even without using the optional C
-extension for speedups.
-
-Encoding basic Python object hierarchies::
-
-    >>> import simplejson as json
-    >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
-    '["foo", {"bar": ["baz", null, 1.0, 2]}]'
-    >>> print json.dumps("\"foo\bar")
-    "\"foo\bar"
-    >>> print json.dumps(u'\u1234')
-    "\u1234"
-    >>> print json.dumps('\\')
-    "\\"
-    >>> print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
-    {"a": 0, "b": 0, "c": 0}
-    >>> from StringIO import StringIO
-    >>> io = StringIO()
-    >>> json.dump(['streaming API'], io)
-    >>> io.getvalue()
-    '["streaming API"]'
-
-Compact encoding::
-
-    >>> import simplejson as json
-    >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
-    '[1,2,3,{"4":5,"6":7}]'
-
-Pretty printing::
-
-    >>> import simplejson as json
-    >>> s = json.dumps({'4': 5, '6': 7}, sort_keys=True, indent='    ')
-    >>> print '\n'.join([l.rstrip() for l in  s.splitlines()])
-    {
-        "4": 5,
-        "6": 7
-    }
-
-Decoding JSON::
-
-    >>> import simplejson as json
-    >>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
-    >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj
-    True
-    >>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar'
-    True
-    >>> from StringIO import StringIO
-    >>> io = StringIO('["streaming API"]')
-    >>> json.load(io)[0] == 'streaming API'
-    True
-
-Specializing JSON object decoding::
-
-    >>> import simplejson as json
-    >>> def as_complex(dct):
-    ...     if '__complex__' in dct:
-    ...         return complex(dct['real'], dct['imag'])
-    ...     return dct
-    ...
-    >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
-    ...     object_hook=as_complex)
-    (1+2j)
-    >>> from decimal import Decimal
-    >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1')
-    True
-
-Specializing JSON object encoding::
-
-    >>> import simplejson as json
-    >>> def encode_complex(obj):
-    ...     if isinstance(obj, complex):
-    ...         return [obj.real, obj.imag]
-    ...     raise TypeError(repr(o) + " is not JSON serializable")
-    ...
-    >>> json.dumps(2 + 1j, default=encode_complex)
-    '[2.0, 1.0]'
-    >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j)
-    '[2.0, 1.0]'
-    >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j))
-    '[2.0, 1.0]'
-
-
-Using simplejson.tool from the shell to validate and pretty-print::
-
-    $ echo '{"json":"obj"}' | python -m simplejson.tool
-    {
-        "json": "obj"
-    }
-    $ echo '{ 1.2:3.4}' | python -m simplejson.tool
-    Expecting property name: line 1 column 2 (char 2)
-"""
-__version__ = '2.1.1'
-__all__ = [
-    'dump', 'dumps', 'load', 'loads',
-    'JSONDecoder', 'JSONDecodeError', 'JSONEncoder',
-    'OrderedDict',
-]
-
-__author__ = 'Bob Ippolito <bob@redivi.com>'
-
-from decimal import Decimal
-
-from decoder import JSONDecoder, JSONDecodeError
-from encoder import JSONEncoder
-def _import_OrderedDict():
-    import collections
-    try:
-        return collections.OrderedDict
-    except AttributeError:
-        import ordered_dict
-        return ordered_dict.OrderedDict
-OrderedDict = _import_OrderedDict()
-
-def _import_c_make_encoder():
-    try:
-        from simplejson._speedups import make_encoder
-        return make_encoder
-    except ImportError:
-        return None
-
-_default_encoder = JSONEncoder(
-    skipkeys=False,
-    ensure_ascii=True,
-    check_circular=True,
-    allow_nan=True,
-    indent=None,
-    separators=None,
-    encoding='utf-8',
-    default=None,
-    use_decimal=False,
-)
-
-def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
-        allow_nan=True, cls=None, indent=None, separators=None,
-        encoding='utf-8', default=None, use_decimal=False, **kw):
-    """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
-    ``.write()``-supporting file-like object).
-
-    If ``skipkeys`` is true then ``dict`` keys that are not basic types
-    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``)
-    will be skipped instead of raising a ``TypeError``.
-
-    If ``ensure_ascii`` is false, then the some chunks written to ``fp``
-    may be ``unicode`` instances, subject to normal Python ``str`` to
-    ``unicode`` coercion rules. Unless ``fp.write()`` explicitly
-    understands ``unicode`` (as in ``codecs.getwriter()``) this is likely
-    to cause an error.
-
-    If ``check_circular`` is false, then the circular reference check
-    for container types will be skipped and a circular reference will
-    result in an ``OverflowError`` (or worse).
-
-    If ``allow_nan`` is false, then it will be a ``ValueError`` to
-    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)
-    in strict compliance of the JSON specification, instead of using the
-    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
-
-    If *indent* is a string, then JSON array elements and object members
-    will be pretty-printed with a newline followed by that string repeated
-    for each level of nesting. ``None`` (the default) selects the most compact
-    representation without any newlines. For backwards compatibility with
-    versions of simplejson earlier than 2.1.0, an integer is also accepted
-    and is converted to a string with that many spaces.
-
-    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
-    then it will be used instead of the default ``(', ', ': ')`` separators.
-    ``(',', ':')`` is the most compact JSON representation.
-
-    ``encoding`` is the character encoding for str instances, default is UTF-8.
-
-    ``default(obj)`` is a function that should return a serializable version
-    of obj or raise TypeError. The default simply raises TypeError.
-
-    If *use_decimal* is true (default: ``False``) then decimal.Decimal
-    will be natively serialized to JSON with full precision.
-
-    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
-    ``.default()`` method to serialize additional types), specify it with
-    the ``cls`` kwarg.
-
-    """
-    # cached encoder
-    if (not skipkeys and ensure_ascii and
-        check_circular and allow_nan and
-        cls is None and indent is None and separators is None and
-        encoding == 'utf-8' and default is None and not kw):
-        iterable = _default_encoder.iterencode(obj)
-    else:
-        if cls is None:
-            cls = JSONEncoder
-        iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
-            check_circular=check_circular, allow_nan=allow_nan, indent=indent,
-            separators=separators, encoding=encoding,
-            default=default, use_decimal=use_decimal, **kw).iterencode(obj)
-    # could accelerate with writelines in some versions of Python, at
-    # a debuggability cost
-    for chunk in iterable:
-        fp.write(chunk)
-
-
-def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
-        allow_nan=True, cls=None, indent=None, separators=None,
-        encoding='utf-8', default=None, use_decimal=False, **kw):
-    """Serialize ``obj`` to a JSON formatted ``str``.
-
-    If ``skipkeys`` is false then ``dict`` keys that are not basic types
-    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``)
-    will be skipped instead of raising a ``TypeError``.
-
-    If ``ensure_ascii`` is false, then the return value will be a
-    ``unicode`` instance subject to normal Python ``str`` to ``unicode``
-    coercion rules instead of being escaped to an ASCII ``str``.
-
-    If ``check_circular`` is false, then the circular reference check
-    for container types will be skipped and a circular reference will
-    result in an ``OverflowError`` (or worse).
-
-    If ``allow_nan`` is false, then it will be a ``ValueError`` to
-    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
-    strict compliance of the JSON specification, instead of using the
-    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
-
-    If ``indent`` is a string, then JSON array elements and object members
-    will be pretty-printed with a newline followed by that string repeated
-    for each level of nesting. ``None`` (the default) selects the most compact
-    representation without any newlines. For backwards compatibility with
-    versions of simplejson earlier than 2.1.0, an integer is also accepted
-    and is converted to a string with that many spaces.
-
-    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
-    then it will be used instead of the default ``(', ', ': ')`` separators.
-    ``(',', ':')`` is the most compact JSON representation.
-
-    ``encoding`` is the character encoding for str instances, default is UTF-8.
-
-    ``default(obj)`` is a function that should return a serializable version
-    of obj or raise TypeError. The default simply raises TypeError.
-
-    If *use_decimal* is true (default: ``False``) then decimal.Decimal
-    will be natively serialized to JSON with full precision.
-
-    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
-    ``.default()`` method to serialize additional types), specify it with
-    the ``cls`` kwarg.
-
-    """
-    # cached encoder
-    if (not skipkeys and ensure_ascii and
-        check_circular and allow_nan and
-        cls is None and indent is None and separators is None and
-        encoding == 'utf-8' and default is None and not use_decimal
-        and not kw):
-        return _default_encoder.encode(obj)
-    if cls is None:
-        cls = JSONEncoder
-    return cls(
-        skipkeys=skipkeys, ensure_ascii=ensure_ascii,
-        check_circular=check_circular, allow_nan=allow_nan, indent=indent,
-        separators=separators, encoding=encoding, default=default,
-        use_decimal=use_decimal, **kw).encode(obj)
-
-
-_default_decoder = JSONDecoder(encoding=None, object_hook=None,
-                               object_pairs_hook=None)
-
-
-def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None,
-        parse_int=None, parse_constant=None, object_pairs_hook=None,
-        use_decimal=False, **kw):
-    """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
-    a JSON document) to a Python object.
-
-    *encoding* determines the encoding used to interpret any
-    :class:`str` objects decoded by this instance (``'utf-8'`` by
-    default).  It has no effect when decoding :class:`unicode` objects.
-
-    Note that currently only encodings that are a superset of ASCII work,
-    strings of other encodings should be passed in as :class:`unicode`.
-
-    *object_hook*, if specified, will be called with the result of every
-    JSON object decoded and its return value will be used in place of the
-    given :class:`dict`.  This can be used to provide custom
-    deserializations (e.g. to support JSON-RPC class hinting).
-
-    *object_pairs_hook* is an optional function that will be called with
-    the result of any object literal decode with an ordered list of pairs.
-    The return value of *object_pairs_hook* will be used instead of the
-    :class:`dict`.  This feature can be used to implement custom decoders
-    that rely on the order that the key and value pairs are decoded (for
-    example, :func:`collections.OrderedDict` will remember the order of
-    insertion). If *object_hook* is also defined, the *object_pairs_hook*
-    takes priority.
-
-    *parse_float*, if specified, will be called with the string of every
-    JSON float to be decoded.  By default, this is equivalent to
-    ``float(num_str)``. This can be used to use another datatype or parser
-    for JSON floats (e.g. :class:`decimal.Decimal`).
-
-    *parse_int*, if specified, will be called with the string of every
-    JSON int to be decoded.  By default, this is equivalent to
-    ``int(num_str)``.  This can be used to use another datatype or parser
-    for JSON integers (e.g. :class:`float`).
-
-    *parse_constant*, if specified, will be called with one of the
-    following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``.  This
-    can be used to raise an exception if invalid JSON numbers are
-    encountered.
-
-    If *use_decimal* is true (default: ``False``) then it implies
-    parse_float=decimal.Decimal for parity with ``dump``.
-
-    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
-    kwarg.
-
-    """
-    return loads(fp.read(),
-        encoding=encoding, cls=cls, object_hook=object_hook,
-        parse_float=parse_float, parse_int=parse_int,
-        parse_constant=parse_constant, object_pairs_hook=object_pairs_hook,
-        use_decimal=use_decimal, **kw)
-
-
-def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
-        parse_int=None, parse_constant=None, object_pairs_hook=None,
-        use_decimal=False, **kw):
-    """Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
-    document) to a Python object.
-
-    *encoding* determines the encoding used to interpret any
-    :class:`str` objects decoded by this instance (``'utf-8'`` by
-    default).  It has no effect when decoding :class:`unicode` objects.
-
-    Note that currently only encodings that are a superset of ASCII work,
-    strings of other encodings should be passed in as :class:`unicode`.
-
-    *object_hook*, if specified, will be called with the result of every
-    JSON object decoded and its return value will be used in place of the
-    given :class:`dict`.  This can be used to provide custom
-    deserializations (e.g. to support JSON-RPC class hinting).
-
-    *object_pairs_hook* is an optional function that will be called with
-    the result of any object literal decode with an ordered list of pairs.
-    The return value of *object_pairs_hook* will be used instead of the
-    :class:`dict`.  This feature can be used to implement custom decoders
-    that rely on the order that the key and value pairs are decoded (for
-    example, :func:`collections.OrderedDict` will remember the order of
-    insertion). If *object_hook* is also defined, the *object_pairs_hook*
-    takes priority.
-
-    *parse_float*, if specified, will be called with the string of every
-    JSON float to be decoded.  By default, this is equivalent to
-    ``float(num_str)``. This can be used to use another datatype or parser
-    for JSON floats (e.g. :class:`decimal.Decimal`).
-
-    *parse_int*, if specified, will be called with the string of every
-    JSON int to be decoded.  By default, this is equivalent to
-    ``int(num_str)``.  This can be used to use another datatype or parser
-    for JSON integers (e.g. :class:`float`).
-
-    *parse_constant*, if specified, will be called with one of the
-    following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``.  This
-    can be used to raise an exception if invalid JSON numbers are
-    encountered.
-
-    If *use_decimal* is true (default: ``False``) then it implies
-    parse_float=decimal.Decimal for parity with ``dump``.
-
-    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
-    kwarg.
-
-    """
-    if (cls is None and encoding is None and object_hook is None and
-            parse_int is None and parse_float is None and
-            parse_constant is None and object_pairs_hook is None
-            and not use_decimal and not kw):
-        return _default_decoder.decode(s)
-    if cls is None:
-        cls = JSONDecoder
-    if object_hook is not None:
-        kw['object_hook'] = object_hook
-    if object_pairs_hook is not None:
-        kw['object_pairs_hook'] = object_pairs_hook
-    if parse_float is not None:
-        kw['parse_float'] = parse_float
-    if parse_int is not None:
-        kw['parse_int'] = parse_int
-    if parse_constant is not None:
-        kw['parse_constant'] = parse_constant
-    if use_decimal:
-        if parse_float is not None:
-            raise TypeError("use_decimal=True implies parse_float=Decimal")
-        kw['parse_float'] = Decimal
-    return cls(encoding=encoding, **kw).decode(s)
-
-
-def _toggle_speedups(enabled):
-    import simplejson.decoder as dec
-    import simplejson.encoder as enc
-    import simplejson.scanner as scan
-    c_make_encoder = _import_c_make_encoder()
-    if enabled:
-        dec.scanstring = dec.c_scanstring or dec.py_scanstring
-        enc.c_make_encoder = c_make_encoder
-        enc.encode_basestring_ascii = (enc.c_encode_basestring_ascii or 
-            enc.py_encode_basestring_ascii)
-        scan.make_scanner = scan.c_make_scanner or scan.py_make_scanner
-    else:
-        dec.scanstring = dec.py_scanstring
-        enc.c_make_encoder = None
-        enc.encode_basestring_ascii = enc.py_encode_basestring_ascii
-        scan.make_scanner = scan.py_make_scanner
-    dec.make_scanner = scan.make_scanner
-    global _default_decoder
-    _default_decoder = JSONDecoder(
-        encoding=None,
-        object_hook=None,
-        object_pairs_hook=None,
-    )
-    global _default_encoder
-    _default_encoder = JSONEncoder(
-       skipkeys=False,
-       ensure_ascii=True,
-       check_circular=True,
-       allow_nan=True,
-       indent=None,
-       separators=None,
-       encoding='utf-8',
-       default=None,
-   )
diff --git a/simplejson/_speedups.c b/simplejson/_speedups.c
deleted file mode 100644
index b06ba50..0000000
--- a/simplejson/_speedups.c
+++ /dev/null
@@ -1,2561 +0,0 @@
-#include "Python.h"
-#include "structmember.h"
-#if PY_VERSION_HEX < 0x02070000 && !defined(PyOS_string_to_double)
-#define PyOS_string_to_double json_PyOS_string_to_double
-static double
-json_PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception);
-static double
-json_PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception) {
-    double x;
-    assert(endptr == NULL);
-    assert(overflow_exception == NULL);
-    PyFPE_START_PROTECT("json_PyOS_string_to_double", return -1.0;)
-    x = PyOS_ascii_atof(s);
-    PyFPE_END_PROTECT(x)
-    return x;
-}
-#endif
-#if PY_VERSION_HEX < 0x02060000 && !defined(Py_TYPE)
-#define Py_TYPE(ob)     (((PyObject*)(ob))->ob_type)
-#endif
-#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
-typedef int Py_ssize_t;
-#define PY_SSIZE_T_MAX INT_MAX
-#define PY_SSIZE_T_MIN INT_MIN
-#define PyInt_FromSsize_t PyInt_FromLong
-#define PyInt_AsSsize_t PyInt_AsLong
-#endif
-#ifndef Py_IS_FINITE
-#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
-#endif
-
-#ifdef __GNUC__
-#define UNUSED __attribute__((__unused__))
-#else
-#define UNUSED
-#endif
-
-#define DEFAULT_ENCODING "utf-8"
-
-#define PyScanner_Check(op) PyObject_TypeCheck(op, &PyScannerType)
-#define PyScanner_CheckExact(op) (Py_TYPE(op) == &PyScannerType)
-#define PyEncoder_Check(op) PyObject_TypeCheck(op, &PyEncoderType)
-#define PyEncoder_CheckExact(op) (Py_TYPE(op) == &PyEncoderType)
-#define Decimal_Check(op) (PyObject_TypeCheck(op, DecimalTypePtr))
-
-static PyTypeObject PyScannerType;
-static PyTypeObject PyEncoderType;
-static PyTypeObject *DecimalTypePtr;
-
-typedef struct _PyScannerObject {
-    PyObject_HEAD
-    PyObject *encoding;
-    PyObject *strict;
-    PyObject *object_hook;
-    PyObject *pairs_hook;
-    PyObject *parse_float;
-    PyObject *parse_int;
-    PyObject *parse_constant;
-    PyObject *memo;
-} PyScannerObject;
-
-static PyMemberDef scanner_members[] = {
-    {"encoding", T_OBJECT, offsetof(PyScannerObject, encoding), READONLY, "encoding"},
-    {"strict", T_OBJECT, offsetof(PyScannerObject, strict), READONLY, "strict"},
-    {"object_hook", T_OBJECT, offsetof(PyScannerObject, object_hook), READONLY, "object_hook"},
-    {"object_pairs_hook", T_OBJECT, offsetof(PyScannerObject, pairs_hook), READONLY, "object_pairs_hook"},
-    {"parse_float", T_OBJECT, offsetof(PyScannerObject, parse_float), READONLY, "parse_float"},
-    {"parse_int", T_OBJECT, offsetof(PyScannerObject, parse_int), READONLY, "parse_int"},
-    {"parse_constant", T_OBJECT, offsetof(PyScannerObject, parse_constant), READONLY, "parse_constant"},
-    {NULL}
-};
-
-typedef struct _PyEncoderObject {
-    PyObject_HEAD
-    PyObject *markers;
-    PyObject *defaultfn;
-    PyObject *encoder;
-    PyObject *indent;
-    PyObject *key_separator;
-    PyObject *item_separator;
-    PyObject *sort_keys;
-    PyObject *skipkeys;
-    PyObject *key_memo;
-    int fast_encode;
-    int allow_nan;
-    int use_decimal;
-} PyEncoderObject;
-
-static PyMemberDef encoder_members[] = {
-    {"markers", T_OBJECT, offsetof(PyEncoderObject, markers), READONLY, "markers"},
-    {"default", T_OBJECT, offsetof(PyEncoderObject, defaultfn), READONLY, "default"},
-    {"encoder", T_OBJECT, offsetof(PyEncoderObject, encoder), READONLY, "encoder"},
-    {"indent", T_OBJECT, offsetof(PyEncoderObject, indent), READONLY, "indent"},
-    {"key_separator", T_OBJECT, offsetof(PyEncoderObject, key_separator), READONLY, "key_separator"},
-    {"item_separator", T_OBJECT, offsetof(PyEncoderObject, item_separator), READONLY, "item_separator"},
-    {"sort_keys", T_OBJECT, offsetof(PyEncoderObject, sort_keys), READONLY, "sort_keys"},
-    {"skipkeys", T_OBJECT, offsetof(PyEncoderObject, skipkeys), READONLY, "skipkeys"},
-    {"key_memo", T_OBJECT, offsetof(PyEncoderObject, key_memo), READONLY, "key_memo"},
-    {NULL}
-};
-
-static Py_ssize_t
-ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars);
-static PyObject *
-ascii_escape_unicode(PyObject *pystr);
-static PyObject *
-ascii_escape_str(PyObject *pystr);
-static PyObject *
-py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr);
-void init_speedups(void);
-static PyObject *
-scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr);
-static PyObject *
-scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr);
-static PyObject *
-_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx);
-static PyObject *
-scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
-static int
-scanner_init(PyObject *self, PyObject *args, PyObject *kwds);
-static void
-scanner_dealloc(PyObject *self);
-static int
-scanner_clear(PyObject *self);
-static PyObject *
-encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
-static int
-encoder_init(PyObject *self, PyObject *args, PyObject *kwds);
-static void
-encoder_dealloc(PyObject *self);
-static int
-encoder_clear(PyObject *self);
-static int
-encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level);
-static int
-encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level);
-static int
-encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level);
-static PyObject *
-_encoded_const(PyObject *obj);
-static void
-raise_errmsg(char *msg, PyObject *s, Py_ssize_t end);
-static PyObject *
-encoder_encode_string(PyEncoderObject *s, PyObject *obj);
-static int
-_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr);
-static PyObject *
-_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr);
-static PyObject *
-encoder_encode_float(PyEncoderObject *s, PyObject *obj);
-
-#define S_CHAR(c) (c >= ' ' && c <= '~' && c != '\\' && c != '"')
-#define IS_WHITESPACE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r'))
-
-#define MIN_EXPANSION 6
-#ifdef Py_UNICODE_WIDE
-#define MAX_EXPANSION (2 * MIN_EXPANSION)
-#else
-#define MAX_EXPANSION MIN_EXPANSION
-#endif
-
-static int
-_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr)
-{
-    /* PyObject to Py_ssize_t converter */
-    *size_ptr = PyInt_AsSsize_t(o);
-    if (*size_ptr == -1 && PyErr_Occurred())
-        return 0;
-    return 1;
-}
-
-static PyObject *
-_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr)
-{
-    /* Py_ssize_t to PyObject converter */
-    return PyInt_FromSsize_t(*size_ptr);
-}
-
-static Py_ssize_t
-ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars)
-{
-    /* Escape unicode code point c to ASCII escape sequences
-    in char *output. output must have at least 12 bytes unused to
-    accommodate an escaped surrogate pair "\uXXXX\uXXXX" */
-    output[chars++] = '\\';
-    switch (c) {
-        case '\\': output[chars++] = (char)c; break;
-        case '"': output[chars++] = (char)c; break;
-        case '\b': output[chars++] = 'b'; break;
-        case '\f': output[chars++] = 'f'; break;
-        case '\n': output[chars++] = 'n'; break;
-        case '\r': output[chars++] = 'r'; break;
-        case '\t': output[chars++] = 't'; break;
-        default:
-#ifdef Py_UNICODE_WIDE
-            if (c >= 0x10000) {
-                /* UTF-16 surrogate pair */
-                Py_UNICODE v = c - 0x10000;
-                c = 0xd800 | ((v >> 10) & 0x3ff);
-                output[chars++] = 'u';
-                output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf];
-                output[chars++] = "0123456789abcdef"[(c >>  8) & 0xf];
-                output[chars++] = "0123456789abcdef"[(c >>  4) & 0xf];
-                output[chars++] = "0123456789abcdef"[(c      ) & 0xf];
-                c = 0xdc00 | (v & 0x3ff);
-                output[chars++] = '\\';
-            }
-#endif
-            output[chars++] = 'u';
-            output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf];
-            output[chars++] = "0123456789abcdef"[(c >>  8) & 0xf];
-            output[chars++] = "0123456789abcdef"[(c >>  4) & 0xf];
-            output[chars++] = "0123456789abcdef"[(c      ) & 0xf];
-    }
-    return chars;
-}
-
-static PyObject *
-ascii_escape_unicode(PyObject *pystr)
-{
-    /* Take a PyUnicode pystr and return a new ASCII-only escaped PyString */
-    Py_ssize_t i;
-    Py_ssize_t input_chars;
-    Py_ssize_t output_size;
-    Py_ssize_t max_output_size;
-    Py_ssize_t chars;
-    PyObject *rval;
-    char *output;
-    Py_UNICODE *input_unicode;
-
-    input_chars = PyUnicode_GET_SIZE(pystr);
-    input_unicode = PyUnicode_AS_UNICODE(pystr);
-
-    /* One char input can be up to 6 chars output, estimate 4 of these */
-    output_size = 2 + (MIN_EXPANSION * 4) + input_chars;
-    max_output_size = 2 + (input_chars * MAX_EXPANSION);
-    rval = PyString_FromStringAndSize(NULL, output_size);
-    if (rval == NULL) {
-        return NULL;
-    }
-    output = PyString_AS_STRING(rval);
-    chars = 0;
-    output[chars++] = '"';
-    for (i = 0; i < input_chars; i++) {
-        Py_UNICODE c = input_unicode[i];
-        if (S_CHAR(c)) {
-            output[chars++] = (char)c;
-        }
-        else {
-            chars = ascii_escape_char(c, output, chars);
-        }
-        if (output_size - chars < (1 + MAX_EXPANSION)) {
-            /* There's more than four, so let's resize by a lot */
-            Py_ssize_t new_output_size = output_size * 2;
-            /* This is an upper bound */
-            if (new_output_size > max_output_size) {
-                new_output_size = max_output_size;
-            }
-            /* Make sure that the output size changed before resizing */
-            if (new_output_size != output_size) {
-                output_size = new_output_size;
-                if (_PyString_Resize(&rval, output_size) == -1) {
-                    return NULL;
-                }
-                output = PyString_AS_STRING(rval);
-            }
-        }
-    }
-    output[chars++] = '"';
-    if (_PyString_Resize(&rval, chars) == -1) {
-        return NULL;
-    }
-    return rval;
-}
-
-static PyObject *
-ascii_escape_str(PyObject *pystr)
-{
-    /* Take a PyString pystr and return a new ASCII-only escaped PyString */
-    Py_ssize_t i;
-    Py_ssize_t input_chars;
-    Py_ssize_t output_size;
-    Py_ssize_t chars;
-    PyObject *rval;
-    char *output;
-    char *input_str;
-
-    input_chars = PyString_GET_SIZE(pystr);
-    input_str = PyString_AS_STRING(pystr);
-
-    /* Fast path for a string that's already ASCII */
-    for (i = 0; i < input_chars; i++) {
-        Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i];
-        if (!S_CHAR(c)) {
-            /* If we have to escape something, scan the string for unicode */
-            Py_ssize_t j;
-            for (j = i; j < input_chars; j++) {
-                c = (Py_UNICODE)(unsigned char)input_str[j];
-                if (c > 0x7f) {
-                    /* We hit a non-ASCII character, bail to unicode mode */
-                    PyObject *uni;
-                    uni = PyUnicode_DecodeUTF8(input_str, input_chars, "strict");
-                    if (uni == NULL) {
-                        return NULL;
-                    }
-                    rval = ascii_escape_unicode(uni);
-                    Py_DECREF(uni);
-                    return rval;
-                }
-            }
-            break;
-        }
-    }
-
-    if (i == input_chars) {
-        /* Input is already ASCII */
-        output_size = 2 + input_chars;
-    }
-    else {
-        /* One char input can be up to 6 chars output, estimate 4 of these */
-        output_size = 2 + (MIN_EXPANSION * 4) + input_chars;
-    }
-    rval = PyString_FromStringAndSize(NULL, output_size);
-    if (rval == NULL) {
-        return NULL;
-    }
-    output = PyString_AS_STRING(rval);
-    output[0] = '"';
-
-    /* We know that everything up to i is ASCII already */
-    chars = i + 1;
-    memcpy(&output[1], input_str, i);
-
-    for (; i < input_chars; i++) {
-        Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i];
-        if (S_CHAR(c)) {
-            output[chars++] = (char)c;
-        }
-        else {
-            chars = ascii_escape_char(c, output, chars);
-        }
-        /* An ASCII char can't possibly expand to a surrogate! */
-        if (output_size - chars < (1 + MIN_EXPANSION)) {
-            /* There's more than four, so let's resize by a lot */
-            output_size *= 2;
-            if (output_size > 2 + (input_chars * MIN_EXPANSION)) {
-                output_size = 2 + (input_chars * MIN_EXPANSION);
-            }
-            if (_PyString_Resize(&rval, output_size) == -1) {
-                return NULL;
-            }
-            output = PyString_AS_STRING(rval);
-        }
-    }
-    output[chars++] = '"';
-    if (_PyString_Resize(&rval, chars) == -1) {
-        return NULL;
-    }
-    return rval;
-}
-
-static void
-raise_errmsg(char *msg, PyObject *s, Py_ssize_t end)
-{
-    /* Use the Python function simplejson.decoder.errmsg to raise a nice
-    looking ValueError exception */
-    static PyObject *JSONDecodeError = NULL;
-    PyObject *exc;
-    if (JSONDecodeError == NULL) {
-        PyObject *decoder = PyImport_ImportModule("simplejson.decoder");
-        if (decoder == NULL)
-            return;
-        JSONDecodeError = PyObject_GetAttrString(decoder, "JSONDecodeError");
-        Py_DECREF(decoder);
-        if (JSONDecodeError == NULL)
-            return;
-    }
-    exc = PyObject_CallFunction(JSONDecodeError, "(zOO&)", msg, s, _convertPyInt_FromSsize_t, &end);
-    if (exc) {
-        PyErr_SetObject(JSONDecodeError, exc);
-        Py_DECREF(exc);
-    }
-}
-
-static PyObject *
-join_list_unicode(PyObject *lst)
-{
-    /* return u''.join(lst) */
-    static PyObject *joinfn = NULL;
-    if (joinfn == NULL) {
-        PyObject *ustr = PyUnicode_FromUnicode(NULL, 0);
-        if (ustr == NULL)
-            return NULL;
-
-        joinfn = PyObject_GetAttrString(ustr, "join");
-        Py_DECREF(ustr);
-        if (joinfn == NULL)
-            return NULL;
-    }
-    return PyObject_CallFunctionObjArgs(joinfn, lst, NULL);
-}
-
-static PyObject *
-join_list_string(PyObject *lst)
-{
-    /* return ''.join(lst) */
-    static PyObject *joinfn = NULL;
-    if (joinfn == NULL) {
-        PyObject *ustr = PyString_FromStringAndSize(NULL, 0);
-        if (ustr == NULL)
-            return NULL;
-
-        joinfn = PyObject_GetAttrString(ustr, "join");
-        Py_DECREF(ustr);
-        if (joinfn == NULL)
-            return NULL;
-    }
-    return PyObject_CallFunctionObjArgs(joinfn, lst, NULL);
-}
-
-static PyObject *
-_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) {
-    /* return (rval, idx) tuple, stealing reference to rval */
-    PyObject *tpl;
-    PyObject *pyidx;
-    /*
-    steal a reference to rval, returns (rval, idx)
-    */
-    if (rval == NULL) {
-        return NULL;
-    }
-    pyidx = PyInt_FromSsize_t(idx);
-    if (pyidx == NULL) {
-        Py_DECREF(rval);
-        return NULL;
-    }
-    tpl = PyTuple_New(2);
-    if (tpl == NULL) {
-        Py_DECREF(pyidx);
-        Py_DECREF(rval);
-        return NULL;
-    }
-    PyTuple_SET_ITEM(tpl, 0, rval);
-    PyTuple_SET_ITEM(tpl, 1, pyidx);
-    return tpl;
-}
-
-#define APPEND_OLD_CHUNK \
-    if (chunk != NULL) { \
-        if (chunks == NULL) { \
-            chunks = PyList_New(0); \
-            if (chunks == NULL) { \
-                goto bail; \
-            } \
-        } \
-        if (PyList_Append(chunks, chunk)) { \
-            goto bail; \
-        } \
-        Py_CLEAR(chunk); \
-    }
-
-static PyObject *
-scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_ssize_t *next_end_ptr)
-{
-    /* Read the JSON string from PyString pystr.
-    end is the index of the first character after the quote.
-    encoding is the encoding of pystr (must be an ASCII superset)
-    if strict is zero then literal control characters are allowed
-    *next_end_ptr is a return-by-reference index of the character
-        after the end quote
-
-    Return value is a new PyString (if ASCII-only) or PyUnicode
-    */
-    PyObject *rval;
-    Py_ssize_t len = PyString_GET_SIZE(pystr);
-    Py_ssize_t begin = end - 1;
-    Py_ssize_t next = begin;
-    int has_unicode = 0;
-    char *buf = PyString_AS_STRING(pystr);
-    PyObject *chunks = NULL;
-    PyObject *chunk = NULL;
-
-    if (end < 0 || len <= end) {
-        PyErr_SetString(PyExc_ValueError, "end is out of bounds");
-        goto bail;
-    }
-    while (1) {
-        /* Find the end of the string or the next escape */
-        Py_UNICODE c = 0;
-        for (next = end; next < len; next++) {
-            c = (unsigned char)buf[next];
-            if (c == '"' || c == '\\') {
-                break;
-            }
-            else if (strict && c <= 0x1f) {
-                raise_errmsg("Invalid control character at", pystr, next);
-                goto bail;
-            }
-            else if (c > 0x7f) {
-                has_unicode = 1;
-            }
-        }
-        if (!(c == '"' || c == '\\')) {
-            raise_errmsg("Unterminated string starting at", pystr, begin);
-            goto bail;
-        }
-        /* Pick up this chunk if it's not zero length */
-        if (next != end) {
-            PyObject *strchunk;
-            APPEND_OLD_CHUNK
-            strchunk = PyString_FromStringAndSize(&buf[end], next - end);
-            if (strchunk == NULL) {
-                goto bail;
-            }
-            if (has_unicode) {
-                chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL);
-                Py_DECREF(strchunk);
-                if (chunk == NULL) {
-                    goto bail;
-                }
-            }
-            else {
-                chunk = strchunk;
-            }
-        }
-        next++;
-        if (c == '"') {
-            end = next;
-            break;
-        }
-        if (next == len) {
-            raise_errmsg("Unterminated string starting at", pystr, begin);
-            goto bail;
-        }
-        c = buf[next];
-        if (c != 'u') {
-            /* Non-unicode backslash escapes */
-            end = next + 1;
-            switch (c) {
-                case '"': break;
-                case '\\': break;
-                case '/': break;
-                case 'b': c = '\b'; break;
-                case 'f': c = '\f'; break;
-                case 'n': c = '\n'; break;
-                case 'r': c = '\r'; break;
-                case 't': c = '\t'; break;
-                default: c = 0;
-            }
-            if (c == 0) {
-                raise_errmsg("Invalid \\escape", pystr, end - 2);
-                goto bail;
-            }
-        }
-        else {
-            c = 0;
-            next++;
-            end = next + 4;
-            if (end >= len) {
-                raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1);
-                goto bail;
-            }
-            /* Decode 4 hex digits */
-            for (; next < end; next++) {
-                Py_UNICODE digit = buf[next];
-                c <<= 4;
-                switch (digit) {
-                    case '0': case '1': case '2': case '3': case '4':
-                    case '5': case '6': case '7': case '8': case '9':
-                        c |= (digit - '0'); break;
-                    case 'a': case 'b': case 'c': case 'd': case 'e':
-                    case 'f':
-                        c |= (digit - 'a' + 10); break;
-                    case 'A': case 'B': case 'C': case 'D': case 'E':
-                    case 'F':
-                        c |= (digit - 'A' + 10); break;
-                    default:
-                        raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5);
-                        goto bail;
-                }
-            }
-#ifdef Py_UNICODE_WIDE
-            /* Surrogate pair */
-            if ((c & 0xfc00) == 0xd800) {
-                Py_UNICODE c2 = 0;
-                if (end + 6 >= len) {
-                    raise_errmsg("Unpaired high surrogate", pystr, end - 5);
-                    goto bail;
-                }
-                if (buf[next++] != '\\' || buf[next++] != 'u') {
-                    raise_errmsg("Unpaired high surrogate", pystr, end - 5);
-                    goto bail;
-                }
-                end += 6;
-                /* Decode 4 hex digits */
-                for (; next < end; next++) {
-                    c2 <<= 4;
-                    Py_UNICODE digit = buf[next];
-                    switch (digit) {
-                        case '0': case '1': case '2': case '3': case '4':
-                        case '5': case '6': case '7': case '8': case '9':
-                            c2 |= (digit - '0'); break;
-                        case 'a': case 'b': case 'c': case 'd': case 'e':
-                        case 'f':
-                            c2 |= (digit - 'a' + 10); break;
-                        case 'A': case 'B': case 'C': case 'D': case 'E':
-                        case 'F':
-                            c2 |= (digit - 'A' + 10); break;
-                        default:
-                            raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5);
-                            goto bail;
-                    }
-                }
-                if ((c2 & 0xfc00) != 0xdc00) {
-                    raise_errmsg("Unpaired high surrogate", pystr, end - 5);
-                    goto bail;
-                }
-                c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00));
-            }
-            else if ((c & 0xfc00) == 0xdc00) {
-                raise_errmsg("Unpaired low surrogate", pystr, end - 5);
-                goto bail;
-            }
-#endif
-        }
-        if (c > 0x7f) {
-            has_unicode = 1;
-        }
-        APPEND_OLD_CHUNK
-        if (has_unicode) {
-            chunk = PyUnicode_FromUnicode(&c, 1);
-            if (chunk == NULL) {
-                goto bail;
-            }
-        }
-        else {
-            char c_char = Py_CHARMASK(c);
-            chunk = PyString_FromStringAndSize(&c_char, 1);
-            if (chunk == NULL) {
-                goto bail;
-            }
-        }
-    }
-
-    if (chunks == NULL) {
-        if (chunk != NULL)
-            rval = chunk;
-        else
-            rval = PyString_FromStringAndSize("", 0);
-    }
-    else {
-        APPEND_OLD_CHUNK
-        rval = join_list_string(chunks);
-        if (rval == NULL) {
-            goto bail;
-        }
-        Py_CLEAR(chunks);
-    }
-
-    *next_end_ptr = end;
-    return rval;
-bail:
-    *next_end_ptr = -1;
-    Py_XDECREF(chunk);
-    Py_XDECREF(chunks);
-    return NULL;
-}
-
-
-static PyObject *
-scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr)
-{
-    /* Read the JSON string from PyUnicode pystr.
-    end is the index of the first character after the quote.
-    if strict is zero then literal control characters are allowed
-    *next_end_ptr is a return-by-reference index of the character
-        after the end quote
-
-    Return value is a new PyUnicode
-    */
-    PyObject *rval;
-    Py_ssize_t len = PyUnicode_GET_SIZE(pystr);
-    Py_ssize_t begin = end - 1;
-    Py_ssize_t next = begin;
-    const Py_UNICODE *buf = PyUnicode_AS_UNICODE(pystr);
-    PyObject *chunks = NULL;
-    PyObject *chunk = NULL;
-
-    if (end < 0 || len <= end) {
-        PyErr_SetString(PyExc_ValueError, "end is out of bounds");
-        goto bail;
-    }
-    while (1) {
-        /* Find the end of the string or the next escape */
-        Py_UNICODE c = 0;
-        for (next = end; next < len; next++) {
-            c = buf[next];
-            if (c == '"' || c == '\\') {
-                break;
-            }
-            else if (strict && c <= 0x1f) {
-                raise_errmsg("Invalid control character at", pystr, next);
-                goto bail;
-            }
-        }
-        if (!(c == '"' || c == '\\')) {
-            raise_errmsg("Unterminated string starting at", pystr, begin);
-            goto bail;
-        }
-        /* Pick up this chunk if it's not zero length */
-        if (next != end) {
-            APPEND_OLD_CHUNK
-            chunk = PyUnicode_FromUnicode(&buf[end], next - end);
-            if (chunk == NULL) {
-                goto bail;
-            }
-        }
-        next++;
-        if (c == '"') {
-            end = next;
-            break;
-        }
-        if (next == len) {
-            raise_errmsg("Unterminated string starting at", pystr, begin);
-            goto bail;
-        }
-        c = buf[next];
-        if (c != 'u') {
-            /* Non-unicode backslash escapes */
-            end = next + 1;
-            switch (c) {
-                case '"': break;
-                case '\\': break;
-                case '/': break;
-                case 'b': c = '\b'; break;
-                case 'f': c = '\f'; break;
-                case 'n': c = '\n'; break;
-                case 'r': c = '\r'; break;
-                case 't': c = '\t'; break;
-                default: c = 0;
-            }
-            if (c == 0) {
-                raise_errmsg("Invalid \\escape", pystr, end - 2);
-                goto bail;
-            }
-        }
-        else {
-            c = 0;
-            next++;
-            end = next + 4;
-            if (end >= len) {
-                raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1);
-                goto bail;
-            }
-            /* Decode 4 hex digits */
-            for (; next < end; next++) {
-                Py_UNICODE digit = buf[next];
-                c <<= 4;
-                switch (digit) {
-                    case '0': case '1': case '2': case '3': case '4':
-                    case '5': case '6': case '7': case '8': case '9':
-                        c |= (digit - '0'); break;
-                    case 'a': case 'b': case 'c': case 'd': case 'e':
-                    case 'f':
-                        c |= (digit - 'a' + 10); break;
-                    case 'A': case 'B': case 'C': case 'D': case 'E':
-                    case 'F':
-                        c |= (digit - 'A' + 10); break;
-                    default:
-                        raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5);
-                        goto bail;
-                }
-            }
-#ifdef Py_UNICODE_WIDE
-            /* Surrogate pair */
-            if ((c & 0xfc00) == 0xd800) {
-                Py_UNICODE c2 = 0;
-                if (end + 6 >= len) {
-                    raise_errmsg("Unpaired high surrogate", pystr, end - 5);
-                    goto bail;
-                }
-                if (buf[next++] != '\\' || buf[next++] != 'u') {
-                    raise_errmsg("Unpaired high surrogate", pystr, end - 5);
-                    goto bail;
-                }
-                end += 6;
-                /* Decode 4 hex digits */
-                for (; next < end; next++) {
-                    c2 <<= 4;
-                    Py_UNICODE digit = buf[next];
-                    switch (digit) {
-                        case '0': case '1': case '2': case '3': case '4':
-                        case '5': case '6': case '7': case '8': case '9':
-                            c2 |= (digit - '0'); break;
-                        case 'a': case 'b': case 'c': case 'd': case 'e':
-                        case 'f':
-                            c2 |= (digit - 'a' + 10); break;
-                        case 'A': case 'B': case 'C': case 'D': case 'E':
-                        case 'F':
-                            c2 |= (digit - 'A' + 10); break;
-                        default:
-                            raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5);
-                            goto bail;
-                    }
-                }
-                if ((c2 & 0xfc00) != 0xdc00) {
-                    raise_errmsg("Unpaired high surrogate", pystr, end - 5);
-                    goto bail;
-                }
-                c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00));
-            }
-            else if ((c & 0xfc00) == 0xdc00) {
-                raise_errmsg("Unpaired low surrogate", pystr, end - 5);
-                goto bail;
-            }
-#endif
-        }
-        APPEND_OLD_CHUNK
-        chunk = PyUnicode_FromUnicode(&c, 1);
-        if (chunk == NULL) {
-            goto bail;
-        }
-    }
-
-    if (chunks == NULL) {
-        if (chunk != NULL)
-            rval = chunk;
-        else
-            rval = PyUnicode_FromUnicode(NULL, 0);
-    }
-    else {
-        APPEND_OLD_CHUNK
-        rval = join_list_unicode(chunks);
-        if (rval == NULL) {
-            goto bail;
-        }
-        Py_CLEAR(chunks);
-    }
-    *next_end_ptr = end;
-    return rval;
-bail:
-    *next_end_ptr = -1;
-    Py_XDECREF(chunk);
-    Py_XDECREF(chunks);
-    return NULL;
-}
-
-PyDoc_STRVAR(pydoc_scanstring,
-    "scanstring(basestring, end, encoding, strict=True) -> (str, end)\n"
-    "\n"
-    "Scan the string s for a JSON string. End is the index of the\n"
-    "character in s after the quote that started the JSON string.\n"
-    "Unescapes all valid JSON string escape sequences and raises ValueError\n"
-    "on attempt to decode an invalid string. If strict is False then literal\n"
-    "control characters are allowed in the string.\n"
-    "\n"
-    "Returns a tuple of the decoded string and the index of the character in s\n"
-    "after the end quote."
-);
-
-static PyObject *
-py_scanstring(PyObject* self UNUSED, PyObject *args)
-{
-    PyObject *pystr;
-    PyObject *rval;
-    Py_ssize_t end;
-    Py_ssize_t next_end = -1;
-    char *encoding = NULL;
-    int strict = 1;
-    if (!PyArg_ParseTuple(args, "OO&|zi:scanstring", &pystr, _convertPyInt_AsSsize_t, &end, &encoding, &strict)) {
-        return NULL;
-    }
-    if (encoding == NULL) {
-        encoding = DEFAULT_ENCODING;
-    }
-    if (PyString_Check(pystr)) {
-        rval = scanstring_str(pystr, end, encoding, strict, &next_end);
-    }
-    else if (PyUnicode_Check(pystr)) {
-        rval = scanstring_unicode(pystr, end, strict, &next_end);
-    }
-    else {
-        PyErr_Format(PyExc_TypeError,
-                     "first argument must be a string, not %.80s",
-                     Py_TYPE(pystr)->tp_name);
-        return NULL;
-    }
-    return _build_rval_index_tuple(rval, next_end);
-}
-
-PyDoc_STRVAR(pydoc_encode_basestring_ascii,
-    "encode_basestring_ascii(basestring) -> str\n"
-    "\n"
-    "Return an ASCII-only JSON representation of a Python string"
-);
-
-static PyObject *
-py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr)
-{
-    /* Return an ASCII-only JSON representation of a Python string */
-    /* METH_O */
-    if (PyString_Check(pystr)) {
-        return ascii_escape_str(pystr);
-    }
-    else if (PyUnicode_Check(pystr)) {
-        return ascii_escape_unicode(pystr);
-    }
-    else {
-        PyErr_Format(PyExc_TypeError,
-                     "first argument must be a string, not %.80s",
-                     Py_TYPE(pystr)->tp_name);
-        return NULL;
-    }
-}
-
-static void
-scanner_dealloc(PyObject *self)
-{
-    /* Deallocate scanner object */
-    scanner_clear(self);
-    Py_TYPE(self)->tp_free(self);
-}
-
-static int
-scanner_traverse(PyObject *self, visitproc visit, void *arg)
-{
-    PyScannerObject *s;
-    assert(PyScanner_Check(self));
-    s = (PyScannerObject *)self;
-    Py_VISIT(s->encoding);
-    Py_VISIT(s->strict);
-    Py_VISIT(s->object_hook);
-    Py_VISIT(s->pairs_hook);
-    Py_VISIT(s->parse_float);
-    Py_VISIT(s->parse_int);
-    Py_VISIT(s->parse_constant);
-    Py_VISIT(s->memo);
-    return 0;
-}
-
-static int
-scanner_clear(PyObject *self)
-{
-    PyScannerObject *s;
-    assert(PyScanner_Check(self));
-    s = (PyScannerObject *)self;
-    Py_CLEAR(s->encoding);
-    Py_CLEAR(s->strict);
-    Py_CLEAR(s->object_hook);
-    Py_CLEAR(s->pairs_hook);
-    Py_CLEAR(s->parse_float);
-    Py_CLEAR(s->parse_int);
-    Py_CLEAR(s->parse_constant);
-    Py_CLEAR(s->memo);
-    return 0;
-}
-
-static PyObject *
-_parse_object_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {
-    /* Read a JSON object from PyString pystr.
-    idx is the index of the first character after the opening curly brace.
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the closing curly brace.
-
-    Returns a new PyObject (usually a dict, but object_hook or
-    object_pairs_hook can change that)
-    */
-    char *str = PyString_AS_STRING(pystr);
-    Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1;
-    PyObject *rval = NULL;
-    PyObject *pairs = NULL;
-    PyObject *item;
-    PyObject *key = NULL;
-    PyObject *val = NULL;
-    char *encoding = PyString_AS_STRING(s->encoding);
-    int strict = PyObject_IsTrue(s->strict);
-    int has_pairs_hook = (s->pairs_hook != Py_None);
-    Py_ssize_t next_idx;
-    if (has_pairs_hook) {
-        pairs = PyList_New(0);
-        if (pairs == NULL)
-            return NULL;
-    }
-    else {
-        rval = PyDict_New();
-        if (rval == NULL)
-            return NULL;
-    }
-
-    /* skip whitespace after { */
-    while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-    /* only loop if the object is non-empty */
-    if (idx <= end_idx && str[idx] != '}') {
-        while (idx <= end_idx) {
-            PyObject *memokey;
-
-            /* read key */
-            if (str[idx] != '"') {
-                raise_errmsg("Expecting property name", pystr, idx);
-                goto bail;
-            }
-            key = scanstring_str(pystr, idx + 1, encoding, strict, &next_idx);
-            if (key == NULL)
-                goto bail;
-            memokey = PyDict_GetItem(s->memo, key);
-            if (memokey != NULL) {
-                Py_INCREF(memokey);
-                Py_DECREF(key);
-                key = memokey;
-            }
-            else {
-                if (PyDict_SetItem(s->memo, key, key) < 0)
-                    goto bail;
-            }
-            idx = next_idx;
-
-            /* skip whitespace between key and : delimiter, read :, skip whitespace */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-            if (idx > end_idx || str[idx] != ':') {
-                raise_errmsg("Expecting : delimiter", pystr, idx);
-                goto bail;
-            }
-            idx++;
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-            /* read any JSON data type */
-            val = scan_once_str(s, pystr, idx, &next_idx);
-            if (val == NULL)
-                goto bail;
-
-            if (has_pairs_hook) {
-                item = PyTuple_Pack(2, key, val);
-                if (item == NULL)
-                    goto bail;
-                Py_CLEAR(key);
-                Py_CLEAR(val);
-                if (PyList_Append(pairs, item) == -1) {
-                    Py_DECREF(item);
-                    goto bail;
-                }
-                Py_DECREF(item);
-            }
-            else {
-                if (PyDict_SetItem(rval, key, val) < 0)
-                    goto bail;
-                Py_CLEAR(key);
-                Py_CLEAR(val);
-            }
-            idx = next_idx;
-
-            /* skip whitespace before } or , */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-            /* bail if the object is closed or we didn't get the , delimiter */
-            if (idx > end_idx) break;
-            if (str[idx] == '}') {
-                break;
-            }
-            else if (str[idx] != ',') {
-                raise_errmsg("Expecting , delimiter", pystr, idx);
-                goto bail;
-            }
-            idx++;
-
-            /* skip whitespace after , delimiter */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-        }
-    }
-    /* verify that idx < end_idx, str[idx] should be '}' */
-    if (idx > end_idx || str[idx] != '}') {
-        raise_errmsg("Expecting object", pystr, end_idx);
-        goto bail;
-    }
-
-    /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */
-    if (s->pairs_hook != Py_None) {
-        val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL);
-        if (val == NULL)
-            goto bail;
-        Py_DECREF(pairs);
-        *next_idx_ptr = idx + 1;
-        return val;
-    }
-
-    /* if object_hook is not None: rval = object_hook(rval) */
-    if (s->object_hook != Py_None) {
-        val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL);
-        if (val == NULL)
-            goto bail;
-        Py_DECREF(rval);
-        rval = val;
-        val = NULL;
-    }
-    *next_idx_ptr = idx + 1;
-    return rval;
-bail:
-    Py_XDECREF(rval);
-    Py_XDECREF(key);
-    Py_XDECREF(val);
-    Py_XDECREF(pairs);
-    return NULL;
-}
-
-static PyObject *
-_parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {
-    /* Read a JSON object from PyUnicode pystr.
-    idx is the index of the first character after the opening curly brace.
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the closing curly brace.
-
-    Returns a new PyObject (usually a dict, but object_hook can change that)
-    */
-    Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
-    Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;
-    PyObject *rval = NULL;
-    PyObject *pairs = NULL;
-    PyObject *item;
-    PyObject *key = NULL;
-    PyObject *val = NULL;
-    int strict = PyObject_IsTrue(s->strict);
-    int has_pairs_hook = (s->pairs_hook != Py_None);
-    Py_ssize_t next_idx;
-
-    if (has_pairs_hook) {
-        pairs = PyList_New(0);
-        if (pairs == NULL)
-            return NULL;
-    }
-    else {
-        rval = PyDict_New();
-        if (rval == NULL)
-            return NULL;
-    }
-    
-    /* skip whitespace after { */
-    while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-    /* only loop if the object is non-empty */
-    if (idx <= end_idx && str[idx] != '}') {
-        while (idx <= end_idx) {
-            PyObject *memokey;
-
-            /* read key */
-            if (str[idx] != '"') {
-                raise_errmsg("Expecting property name", pystr, idx);
-                goto bail;
-            }
-            key = scanstring_unicode(pystr, idx + 1, strict, &next_idx);
-            if (key == NULL)
-                goto bail;
-            memokey = PyDict_GetItem(s->memo, key);
-            if (memokey != NULL) {
-                Py_INCREF(memokey);
-                Py_DECREF(key);
-                key = memokey;
-            }
-            else {
-                if (PyDict_SetItem(s->memo, key, key) < 0)
-                    goto bail;
-            }
-            idx = next_idx;
-
-            /* skip whitespace between key and : delimiter, read :, skip whitespace */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-            if (idx > end_idx || str[idx] != ':') {
-                raise_errmsg("Expecting : delimiter", pystr, idx);
-                goto bail;
-            }
-            idx++;
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-            /* read any JSON term */
-            val = scan_once_unicode(s, pystr, idx, &next_idx);
-            if (val == NULL)
-                goto bail;
-
-            if (has_pairs_hook) {
-                item = PyTuple_Pack(2, key, val);
-                if (item == NULL)
-                    goto bail;
-                Py_CLEAR(key);
-                Py_CLEAR(val);
-                if (PyList_Append(pairs, item) == -1) {
-                    Py_DECREF(item);
-                    goto bail;
-                }
-                Py_DECREF(item);
-            }
-            else {
-                if (PyDict_SetItem(rval, key, val) < 0)
-                    goto bail;
-                Py_CLEAR(key);
-                Py_CLEAR(val);
-            }
-            idx = next_idx;
-
-            /* skip whitespace before } or , */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-            /* bail if the object is closed or we didn't get the , delimiter */
-            if (idx > end_idx) break;
-            if (str[idx] == '}') {
-                break;
-            }
-            else if (str[idx] != ',') {
-                raise_errmsg("Expecting , delimiter", pystr, idx);
-                goto bail;
-            }
-            idx++;
-
-            /* skip whitespace after , delimiter */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-        }
-    }
-
-    /* verify that idx < end_idx, str[idx] should be '}' */
-    if (idx > end_idx || str[idx] != '}') {
-        raise_errmsg("Expecting object", pystr, end_idx);
-        goto bail;
-    }
-
-    /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */
-    if (s->pairs_hook != Py_None) {
-        val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL);
-        if (val == NULL)
-            goto bail;
-        Py_DECREF(pairs);
-        *next_idx_ptr = idx + 1;
-        return val;
-    }
-
-    /* if object_hook is not None: rval = object_hook(rval) */
-    if (s->object_hook != Py_None) {
-        val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL);
-        if (val == NULL)
-            goto bail;
-        Py_DECREF(rval);
-        rval = val;
-        val = NULL;
-    }
-    *next_idx_ptr = idx + 1;
-    return rval;
-bail:
-    Py_XDECREF(rval);
-    Py_XDECREF(key);
-    Py_XDECREF(val);
-    Py_XDECREF(pairs);
-    return NULL;
-}
-
-static PyObject *
-_parse_array_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {
-    /* Read a JSON array from PyString pystr.
-    idx is the index of the first character after the opening brace.
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the closing brace.
-
-    Returns a new PyList
-    */
-    char *str = PyString_AS_STRING(pystr);
-    Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1;
-    PyObject *val = NULL;
-    PyObject *rval = PyList_New(0);
-    Py_ssize_t next_idx;
-    if (rval == NULL)
-        return NULL;
-
-    /* skip whitespace after [ */
-    while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-    /* only loop if the array is non-empty */
-    if (idx <= end_idx && str[idx] != ']') {
-        while (idx <= end_idx) {
-
-            /* read any JSON term and de-tuplefy the (rval, idx) */
-            val = scan_once_str(s, pystr, idx, &next_idx);
-            if (val == NULL) {
-                if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
-                    PyErr_Clear();
-                    raise_errmsg("Expecting object", pystr, idx);
-                }
-                goto bail;
-            }
-
-            if (PyList_Append(rval, val) == -1)
-                goto bail;
-
-            Py_CLEAR(val);
-            idx = next_idx;
-
-            /* skip whitespace between term and , */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-            /* bail if the array is closed or we didn't get the , delimiter */
-            if (idx > end_idx) break;
-            if (str[idx] == ']') {
-                break;
-            }
-            else if (str[idx] != ',') {
-                raise_errmsg("Expecting , delimiter", pystr, idx);
-                goto bail;
-            }
-            idx++;
-
-            /* skip whitespace after , */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-        }
-    }
-
-    /* verify that idx < end_idx, str[idx] should be ']' */
-    if (idx > end_idx || str[idx] != ']') {
-        raise_errmsg("Expecting object", pystr, end_idx);
-        goto bail;
-    }
-    *next_idx_ptr = idx + 1;
-    return rval;
-bail:
-    Py_XDECREF(val);
-    Py_DECREF(rval);
-    return NULL;
-}
-
-static PyObject *
-_parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {
-    /* Read a JSON array from PyString pystr.
-    idx is the index of the first character after the opening brace.
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the closing brace.
-
-    Returns a new PyList
-    */
-    Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
-    Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;
-    PyObject *val = NULL;
-    PyObject *rval = PyList_New(0);
-    Py_ssize_t next_idx;
-    if (rval == NULL)
-        return NULL;
-
-    /* skip whitespace after [ */
-    while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-    /* only loop if the array is non-empty */
-    if (idx <= end_idx && str[idx] != ']') {
-        while (idx <= end_idx) {
-
-            /* read any JSON term  */
-            val = scan_once_unicode(s, pystr, idx, &next_idx);
-            if (val == NULL) {
-                if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
-                    PyErr_Clear();
-                    raise_errmsg("Expecting object", pystr, idx);
-                }
-                goto bail;
-            }
-
-            if (PyList_Append(rval, val) == -1)
-                goto bail;
-
-            Py_CLEAR(val);
-            idx = next_idx;
-
-            /* skip whitespace between term and , */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-
-            /* bail if the array is closed or we didn't get the , delimiter */
-            if (idx > end_idx) break;
-            if (str[idx] == ']') {
-                break;
-            }
-            else if (str[idx] != ',') {
-                raise_errmsg("Expecting , delimiter", pystr, idx);
-                goto bail;
-            }
-            idx++;
-
-            /* skip whitespace after , */
-            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
-        }
-    }
-
-    /* verify that idx < end_idx, str[idx] should be ']' */
-    if (idx > end_idx || str[idx] != ']') {
-        raise_errmsg("Expecting object", pystr, end_idx);
-        goto bail;
-    }
-    *next_idx_ptr = idx + 1;
-    return rval;
-bail:
-    Py_XDECREF(val);
-    Py_DECREF(rval);
-    return NULL;
-}
-
-static PyObject *
-_parse_constant(PyScannerObject *s, char *constant, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {
-    /* Read a JSON constant from PyString pystr.
-    constant is the constant string that was found
-        ("NaN", "Infinity", "-Infinity").
-    idx is the index of the first character of the constant
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the constant.
-
-    Returns the result of parse_constant
-    */
-    PyObject *cstr;
-    PyObject *rval;
-    /* constant is "NaN", "Infinity", or "-Infinity" */
-    cstr = PyString_InternFromString(constant);
-    if (cstr == NULL)
-        return NULL;
-
-    /* rval = parse_constant(constant) */
-    rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL);
-    idx += PyString_GET_SIZE(cstr);
-    Py_DECREF(cstr);
-    *next_idx_ptr = idx;
-    return rval;
-}
-
-static PyObject *
-_match_number_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) {
-    /* Read a JSON number from PyString pystr.
-    idx is the index of the first character of the number
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the number.
-
-    Returns a new PyObject representation of that number:
-        PyInt, PyLong, or PyFloat.
-        May return other types if parse_int or parse_float are set
-    */
-    char *str = PyString_AS_STRING(pystr);
-    Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1;
-    Py_ssize_t idx = start;
-    int is_float = 0;
-    PyObject *rval;
-    PyObject *numstr;
-
-    /* read a sign if it's there, make sure it's not the end of the string */
-    if (str[idx] == '-') {
-        idx++;
-        if (idx > end_idx) {
-            PyErr_SetNone(PyExc_StopIteration);
-            return NULL;
-        }
-    }
-
-    /* read as many integer digits as we find as long as it doesn't start with 0 */
-    if (str[idx] >= '1' && str[idx] <= '9') {
-        idx++;
-        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
-    }
-    /* if it starts with 0 we only expect one integer digit */
-    else if (str[idx] == '0') {
-        idx++;
-    }
-    /* no integer digits, error */
-    else {
-        PyErr_SetNone(PyExc_StopIteration);
-        return NULL;
-    }
-
-    /* if the next char is '.' followed by a digit then read all float digits */
-    if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') {
-        is_float = 1;
-        idx += 2;
-        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
-    }
-
-    /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */
-    if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) {
-
-        /* save the index of the 'e' or 'E' just in case we need to backtrack */
-        Py_ssize_t e_start = idx;
-        idx++;
-
-        /* read an exponent sign if present */
-        if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++;
-
-        /* read all digits */
-        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
-
-        /* if we got a digit, then parse as float. if not, backtrack */
-        if (str[idx - 1] >= '0' && str[idx - 1] <= '9') {
-            is_float = 1;
-        }
-        else {
-            idx = e_start;
-        }
-    }
-
-    /* copy the section we determined to be a number */
-    numstr = PyString_FromStringAndSize(&str[start], idx - start);
-    if (numstr == NULL)
-        return NULL;
-    if (is_float) {
-        /* parse as a float using a fast path if available, otherwise call user defined method */
-        if (s->parse_float != (PyObject *)&PyFloat_Type) {
-            rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL);
-        }
-        else {
-            /* rval = PyFloat_FromDouble(PyOS_ascii_atof(PyString_AS_STRING(numstr))); */
-            double d = PyOS_string_to_double(PyString_AS_STRING(numstr),
-                                             NULL, NULL);
-            if (d == -1.0 && PyErr_Occurred())
-                return NULL;
-            rval = PyFloat_FromDouble(d);
-        }
-    }
-    else {
-        /* parse as an int using a fast path if available, otherwise call user defined method */
-        if (s->parse_int != (PyObject *)&PyInt_Type) {
-            rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL);
-        }
-        else {
-            rval = PyInt_FromString(PyString_AS_STRING(numstr), NULL, 10);
-        }
-    }
-    Py_DECREF(numstr);
-    *next_idx_ptr = idx;
-    return rval;
-}
-
-static PyObject *
-_match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) {
-    /* Read a JSON number from PyUnicode pystr.
-    idx is the index of the first character of the number
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the number.
-
-    Returns a new PyObject representation of that number:
-        PyInt, PyLong, or PyFloat.
-        May return other types if parse_int or parse_float are set
-    */
-    Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
-    Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;
-    Py_ssize_t idx = start;
-    int is_float = 0;
-    PyObject *rval;
-    PyObject *numstr;
-
-    /* read a sign if it's there, make sure it's not the end of the string */
-    if (str[idx] == '-') {
-        idx++;
-        if (idx > end_idx) {
-            PyErr_SetNone(PyExc_StopIteration);
-            return NULL;
-        }
-    }
-
-    /* read as many integer digits as we find as long as it doesn't start with 0 */
-    if (str[idx] >= '1' && str[idx] <= '9') {
-        idx++;
-        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
-    }
-    /* if it starts with 0 we only expect one integer digit */
-    else if (str[idx] == '0') {
-        idx++;
-    }
-    /* no integer digits, error */
-    else {
-        PyErr_SetNone(PyExc_StopIteration);
-        return NULL;
-    }
-
-    /* if the next char is '.' followed by a digit then read all float digits */
-    if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') {
-        is_float = 1;
-        idx += 2;
-        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
-    }
-
-    /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */
-    if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) {
-        Py_ssize_t e_start = idx;
-        idx++;
-
-        /* read an exponent sign if present */
-        if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++;
-
-        /* read all digits */
-        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
-
-        /* if we got a digit, then parse as float. if not, backtrack */
-        if (str[idx - 1] >= '0' && str[idx - 1] <= '9') {
-            is_float = 1;
-        }
-        else {
-            idx = e_start;
-        }
-    }
-
-    /* copy the section we determined to be a number */
-    numstr = PyUnicode_FromUnicode(&str[start], idx - start);
-    if (numstr == NULL)
-        return NULL;
-    if (is_float) {
-        /* parse as a float using a fast path if available, otherwise call user defined method */
-        if (s->parse_float != (PyObject *)&PyFloat_Type) {
-            rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL);
-        }
-        else {
-            rval = PyFloat_FromString(numstr, NULL);
-        }
-    }
-    else {
-        /* no fast path for unicode -> int, just call */
-        rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL);
-    }
-    Py_DECREF(numstr);
-    *next_idx_ptr = idx;
-    return rval;
-}
-
-static PyObject *
-scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr)
-{
-    /* Read one JSON term (of any kind) from PyString pystr.
-    idx is the index of the first character of the term
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the number.
-
-    Returns a new PyObject representation of the term.
-    */
-    char *str = PyString_AS_STRING(pystr);
-    Py_ssize_t length = PyString_GET_SIZE(pystr);
-    if (idx >= length) {
-        PyErr_SetNone(PyExc_StopIteration);
-        return NULL;
-    }
-    switch (str[idx]) {
-        case '"':
-            /* string */
-            return scanstring_str(pystr, idx + 1,
-                PyString_AS_STRING(s->encoding),
-                PyObject_IsTrue(s->strict),
-                next_idx_ptr);
-        case '{':
-            /* object */
-            return _parse_object_str(s, pystr, idx + 1, next_idx_ptr);
-        case '[':
-            /* array */
-            return _parse_array_str(s, pystr, idx + 1, next_idx_ptr);
-        case 'n':
-            /* null */
-            if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') {
-                Py_INCREF(Py_None);
-                *next_idx_ptr = idx + 4;
-                return Py_None;
-            }
-            break;
-        case 't':
-            /* true */
-            if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') {
-                Py_INCREF(Py_True);
-                *next_idx_ptr = idx + 4;
-                return Py_True;
-            }
-            break;
-        case 'f':
-            /* false */
-            if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') {
-                Py_INCREF(Py_False);
-                *next_idx_ptr = idx + 5;
-                return Py_False;
-            }
-            break;
-        case 'N':
-            /* NaN */
-            if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') {
-                return _parse_constant(s, "NaN", idx, next_idx_ptr);
-            }
-            break;
-        case 'I':
-            /* Infinity */
-            if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') {
-                return _parse_constant(s, "Infinity", idx, next_idx_ptr);
-            }
-            break;
-        case '-':
-            /* -Infinity */
-            if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') {
-                return _parse_constant(s, "-Infinity", idx, next_idx_ptr);
-            }
-            break;
-    }
-    /* Didn't find a string, object, array, or named constant. Look for a number. */
-    return _match_number_str(s, pystr, idx, next_idx_ptr);
-}
-
-static PyObject *
-scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr)
-{
-    /* Read one JSON term (of any kind) from PyUnicode pystr.
-    idx is the index of the first character of the term
-    *next_idx_ptr is a return-by-reference index to the first character after
-        the number.
-
-    Returns a new PyObject representation of the term.
-    */
-    Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
-    Py_ssize_t length = PyUnicode_GET_SIZE(pystr);
-    if (idx >= length) {
-        PyErr_SetNone(PyExc_StopIteration);
-        return NULL;
-    }
-    switch (str[idx]) {
-        case '"':
-            /* string */
-            return scanstring_unicode(pystr, idx + 1,
-                PyObject_IsTrue(s->strict),
-                next_idx_ptr);
-        case '{':
-            /* object */
-            return _parse_object_unicode(s, pystr, idx + 1, next_idx_ptr);
-        case '[':
-            /* array */
-            return _parse_array_unicode(s, pystr, idx + 1, next_idx_ptr);
-        case 'n':
-            /* null */
-            if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') {
-                Py_INCREF(Py_None);
-                *next_idx_ptr = idx + 4;
-                return Py_None;
-            }
-            break;
-        case 't':
-            /* true */
-            if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') {
-                Py_INCREF(Py_True);
-                *next_idx_ptr = idx + 4;
-                return Py_True;
-            }
-            break;
-        case 'f':
-            /* false */
-            if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') {
-                Py_INCREF(Py_False);
-                *next_idx_ptr = idx + 5;
-                return Py_False;
-            }
-            break;
-        case 'N':
-            /* NaN */
-            if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') {
-                return _parse_constant(s, "NaN", idx, next_idx_ptr);
-            }
-            break;
-        case 'I':
-            /* Infinity */
-            if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') {
-                return _parse_constant(s, "Infinity", idx, next_idx_ptr);
-            }
-            break;
-        case '-':
-            /* -Infinity */
-            if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') {
-                return _parse_constant(s, "-Infinity", idx, next_idx_ptr);
-            }
-            break;
-    }
-    /* Didn't find a string, object, array, or named constant. Look for a number. */
-    return _match_number_unicode(s, pystr, idx, next_idx_ptr);
-}
-
-static PyObject *
-scanner_call(PyObject *self, PyObject *args, PyObject *kwds)
-{
-    /* Python callable interface to scan_once_{str,unicode} */
-    PyObject *pystr;
-    PyObject *rval;
-    Py_ssize_t idx;
-    Py_ssize_t next_idx = -1;
-    static char *kwlist[] = {"string", "idx", NULL};
-    PyScannerObject *s;
-    assert(PyScanner_Check(self));
-    s = (PyScannerObject *)self;
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:scan_once", kwlist, &pystr, _convertPyInt_AsSsize_t, &idx))
-        return NULL;
-
-    if (PyString_Check(pystr)) {
-        rval = scan_once_str(s, pystr, idx, &next_idx);
-    }
-    else if (PyUnicode_Check(pystr)) {
-        rval = scan_once_unicode(s, pystr, idx, &next_idx);
-    }
-    else {
-        PyErr_Format(PyExc_TypeError,
-                 "first argument must be a string, not %.80s",
-                 Py_TYPE(pystr)->tp_name);
-        return NULL;
-    }
-    PyDict_Clear(s->memo);
-    return _build_rval_index_tuple(rval, next_idx);
-}
-
-static PyObject *
-scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
-    PyScannerObject *s;
-    s = (PyScannerObject *)type->tp_alloc(type, 0);
-    if (s != NULL) {
-        s->encoding = NULL;
-        s->strict = NULL;
-        s->object_hook = NULL;
-        s->pairs_hook = NULL;
-        s->parse_float = NULL;
-        s->parse_int = NULL;
-        s->parse_constant = NULL;
-    }
-    return (PyObject *)s;
-}
-
-static int
-scanner_init(PyObject *self, PyObject *args, PyObject *kwds)
-{
-    /* Initialize Scanner object */
-    PyObject *ctx;
-    static char *kwlist[] = {"context", NULL};
-    PyScannerObject *s;
-
-    assert(PyScanner_Check(self));
-    s = (PyScannerObject *)self;
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:make_scanner", kwlist, &ctx))
-        return -1;
-    
-    if (s->memo == NULL) {
-        s->memo = PyDict_New();
-        if (s->memo == NULL)
-            goto bail;
-    }
-
-    /* PyString_AS_STRING is used on encoding */
-    s->encoding = PyObject_GetAttrString(ctx, "encoding");
-    if (s->encoding == NULL)
-        goto bail;
-    if (s->encoding == Py_None) {
-        Py_DECREF(Py_None);
-        s->encoding = PyString_InternFromString(DEFAULT_ENCODING);
-    }
-    else if (PyUnicode_Check(s->encoding)) {
-        PyObject *tmp = PyUnicode_AsEncodedString(s->encoding, NULL, NULL);
-        Py_DECREF(s->encoding);
-        s->encoding = tmp;
-    }
-    if (s->encoding == NULL || !PyString_Check(s->encoding))
-        goto bail;
-
-    /* All of these will fail "gracefully" so we don't need to verify them */
-    s->strict = PyObject_GetAttrString(ctx, "strict");
-    if (s->strict == NULL)
-        goto bail;
-    s->object_hook = PyObject_GetAttrString(ctx, "object_hook");
-    if (s->object_hook == NULL)
-        goto bail;
-    s->pairs_hook = PyObject_GetAttrString(ctx, "object_pairs_hook");
-    if (s->pairs_hook == NULL)
-        goto bail;
-    s->parse_float = PyObject_GetAttrString(ctx, "parse_float");
-    if (s->parse_float == NULL)
-        goto bail;
-    s->parse_int = PyObject_GetAttrString(ctx, "parse_int");
-    if (s->parse_int == NULL)
-        goto bail;
-    s->parse_constant = PyObject_GetAttrString(ctx, "parse_constant");
-    if (s->parse_constant == NULL)
-        goto bail;
-
-    return 0;
-
-bail:
-    Py_CLEAR(s->encoding);
-    Py_CLEAR(s->strict);
-    Py_CLEAR(s->object_hook);
-    Py_CLEAR(s->pairs_hook);
-    Py_CLEAR(s->parse_float);
-    Py_CLEAR(s->parse_int);
-    Py_CLEAR(s->parse_constant);
-    return -1;
-}
-
-PyDoc_STRVAR(scanner_doc, "JSON scanner object");
-
-static
-PyTypeObject PyScannerType = {
-    PyObject_HEAD_INIT(NULL)
-    0,                    /* tp_internal */
-    "simplejson._speedups.Scanner",       /* tp_name */
-    sizeof(PyScannerObject), /* tp_basicsize */
-    0,                    /* tp_itemsize */
-    scanner_dealloc, /* tp_dealloc */
-    0,                    /* tp_print */
-    0,                    /* tp_getattr */
-    0,                    /* tp_setattr */
-    0,                    /* tp_compare */
-    0,                    /* tp_repr */
-    0,                    /* tp_as_number */
-    0,                    /* tp_as_sequence */
-    0,                    /* tp_as_mapping */
-    0,                    /* tp_hash */
-    scanner_call,         /* tp_call */
-    0,                    /* tp_str */
-    0,/* PyObject_GenericGetAttr, */                    /* tp_getattro */
-    0,/* PyObject_GenericSetAttr, */                    /* tp_setattro */
-    0,                    /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,   /* tp_flags */
-    scanner_doc,          /* tp_doc */
-    scanner_traverse,                    /* tp_traverse */
-    scanner_clear,                    /* tp_clear */
-    0,                    /* tp_richcompare */
-    0,                    /* tp_weaklistoffset */
-    0,                    /* tp_iter */
-    0,                    /* tp_iternext */
-    0,                    /* tp_methods */
-    scanner_members,                    /* tp_members */
-    0,                    /* tp_getset */
-    0,                    /* tp_base */
-    0,                    /* tp_dict */
-    0,                    /* tp_descr_get */
-    0,                    /* tp_descr_set */
-    0,                    /* tp_dictoffset */
-    scanner_init,                    /* tp_init */
-    0,/* PyType_GenericAlloc, */        /* tp_alloc */
-    scanner_new,          /* tp_new */
-    0,/* PyObject_GC_Del, */              /* tp_free */
-};
-
-static PyObject *
-encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
-    PyEncoderObject *s;
-    s = (PyEncoderObject *)type->tp_alloc(type, 0);
-    if (s != NULL) {
-        s->markers = NULL;
-        s->defaultfn = NULL;
-        s->encoder = NULL;
-        s->indent = NULL;
-        s->key_separator = NULL;
-        s->item_separator = NULL;
-        s->sort_keys = NULL;
-        s->skipkeys = NULL;
-        s->key_memo = NULL;
-    }
-    return (PyObject *)s;
-}
-
-static int
-encoder_init(PyObject *self, PyObject *args, PyObject *kwds)
-{
-    /* initialize Encoder object */
-    static char *kwlist[] = {"markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan", "key_memo", "use_decimal", NULL};
-
-    PyEncoderObject *s;
-    PyObject *markers, *defaultfn, *encoder, *indent, *key_separator;
-    PyObject *item_separator, *sort_keys, *skipkeys, *allow_nan, *key_memo, *use_decimal;
-
-    assert(PyEncoder_Check(self));
-    s = (PyEncoderObject *)self;
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOOOOOOOOO:make_encoder", kwlist,
-        &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator,
-        &sort_keys, &skipkeys, &allow_nan, &key_memo, &use_decimal))
-        return -1;
-
-    s->markers = markers;
-    s->defaultfn = defaultfn;
-    s->encoder = encoder;
-    s->indent = indent;
-    s->key_separator = key_separator;
-    s->item_separator = item_separator;
-    s->sort_keys = sort_keys;
-    s->skipkeys = skipkeys;
-    s->key_memo = key_memo;
-    s->fast_encode = (PyCFunction_Check(s->encoder) && PyCFunction_GetFunction(s->encoder) == (PyCFunction)py_encode_basestring_ascii);
-    s->allow_nan = PyObject_IsTrue(allow_nan);
-    s->use_decimal = PyObject_IsTrue(use_decimal);
-
-    Py_INCREF(s->markers);
-    Py_INCREF(s->defaultfn);
-    Py_INCREF(s->encoder);
-    Py_INCREF(s->indent);
-    Py_INCREF(s->key_separator);
-    Py_INCREF(s->item_separator);
-    Py_INCREF(s->sort_keys);
-    Py_INCREF(s->skipkeys);
-    Py_INCREF(s->key_memo);
-    return 0;
-}
-
-static PyObject *
-encoder_call(PyObject *self, PyObject *args, PyObject *kwds)
-{
-    /* Python callable interface to encode_listencode_obj */
-    static char *kwlist[] = {"obj", "_current_indent_level", NULL};
-    PyObject *obj;
-    PyObject *rval;
-    Py_ssize_t indent_level;
-    PyEncoderObject *s;
-    assert(PyEncoder_Check(self));
-    s = (PyEncoderObject *)self;
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:_iterencode", kwlist,
-        &obj, _convertPyInt_AsSsize_t, &indent_level))
-        return NULL;
-    rval = PyList_New(0);
-    if (rval == NULL)
-        return NULL;
-    if (encoder_listencode_obj(s, rval, obj, indent_level)) {
-        Py_DECREF(rval);
-        return NULL;
-    }
-    return rval;
-}
-
-static PyObject *
-_encoded_const(PyObject *obj)
-{
-    /* Return the JSON string representation of None, True, False */
-    if (obj == Py_None) {
-        static PyObject *s_null = NULL;
-        if (s_null == NULL) {
-            s_null = PyString_InternFromString("null");
-        }
-        Py_INCREF(s_null);
-        return s_null;
-    }
-    else if (obj == Py_True) {
-        static PyObject *s_true = NULL;
-        if (s_true == NULL) {
-            s_true = PyString_InternFromString("true");
-        }
-        Py_INCREF(s_true);
-        return s_true;
-    }
-    else if (obj == Py_False) {
-        static PyObject *s_false = NULL;
-        if (s_false == NULL) {
-            s_false = PyString_InternFromString("false");
-        }
-        Py_INCREF(s_false);
-        return s_false;
-    }
-    else {
-        PyErr_SetString(PyExc_ValueError, "not a const");
-        return NULL;
-    }
-}
-
-static PyObject *
-encoder_encode_float(PyEncoderObject *s, PyObject *obj)
-{
-    /* Return the JSON representation of a PyFloat */
-    double i = PyFloat_AS_DOUBLE(obj);
-    if (!Py_IS_FINITE(i)) {
-        if (!s->allow_nan) {
-            PyErr_SetString(PyExc_ValueError, "Out of range float values are not JSON compliant");
-            return NULL;
-        }
-        if (i > 0) {
-            return PyString_FromString("Infinity");
-        }
-        else if (i < 0) {
-            return PyString_FromString("-Infinity");
-        }
-        else {
-            return PyString_FromString("NaN");
-        }
-    }
-    /* Use a better float format here? */
-    return PyObject_Repr(obj);
-}
-
-static PyObject *
-encoder_encode_string(PyEncoderObject *s, PyObject *obj)
-{
-    /* Return the JSON representation of a string */
-    if (s->fast_encode)
-        return py_encode_basestring_ascii(NULL, obj);
-    else
-        return PyObject_CallFunctionObjArgs(s->encoder, obj, NULL);
-}
-
-static int
-_steal_list_append(PyObject *lst, PyObject *stolen)
-{
-    /* Append stolen and then decrement its reference count */
-    int rval = PyList_Append(lst, stolen);
-    Py_DECREF(stolen);
-    return rval;
-}
-
-static int
-encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level)
-{
-    /* Encode Python object obj to a JSON term, rval is a PyList */
-    PyObject *newobj;
-    int rv;
-
-    if (obj == Py_None || obj == Py_True || obj == Py_False) {
-        PyObject *cstr = _encoded_const(obj);
-        if (cstr == NULL)
-            return -1;
-        return _steal_list_append(rval, cstr);
-    }
-    else if (PyString_Check(obj) || PyUnicode_Check(obj))
-    {
-        PyObject *encoded = encoder_encode_string(s, obj);
-        if (encoded == NULL)
-            return -1;
-        return _steal_list_append(rval, encoded);
-    }
-    else if (PyInt_Check(obj) || PyLong_Check(obj)) {
-        PyObject *encoded = PyObject_Str(obj);
-        if (encoded == NULL)
-            return -1;
-        return _steal_list_append(rval, encoded);
-    }
-    else if (PyFloat_Check(obj)) {
-        PyObject *encoded = encoder_encode_float(s, obj);
-        if (encoded == NULL)
-            return -1;
-        return _steal_list_append(rval, encoded);
-    }
-    else if (PyList_Check(obj) || PyTuple_Check(obj)) {
-        return encoder_listencode_list(s, rval, obj, indent_level);
-    }
-    else if (PyDict_Check(obj)) {
-        return encoder_listencode_dict(s, rval, obj, indent_level);
-    }
-    else if (s->use_decimal && Decimal_Check(obj)) {
-        PyObject *encoded = PyObject_Str(obj);
-        if (encoded == NULL)
-            return -1;
-        return _steal_list_append(rval, encoded);
-    }
-    else {
-        PyObject *ident = NULL;
-        if (s->markers != Py_None) {
-            int has_key;
-            ident = PyLong_FromVoidPtr(obj);
-            if (ident == NULL)
-                return -1;
-            has_key = PyDict_Contains(s->markers, ident);
-            if (has_key) {
-                if (has_key != -1)
-                    PyErr_SetString(PyExc_ValueError, "Circular reference detected");
-                Py_DECREF(ident);
-                return -1;
-            }
-            if (PyDict_SetItem(s->markers, ident, obj)) {
-                Py_DECREF(ident);
-                return -1;
-            }
-        }
-        newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL);
-        if (newobj == NULL) {
-            Py_XDECREF(ident);
-            return -1;
-        }
-        rv = encoder_listencode_obj(s, rval, newobj, indent_level);
-        Py_DECREF(newobj);
-        if (rv) {
-            Py_XDECREF(ident);
-            return -1;
-        }
-        if (ident != NULL) {
-            if (PyDict_DelItem(s->markers, ident)) {
-                Py_XDECREF(ident);
-                return -1;
-            }
-            Py_XDECREF(ident);
-        }
-        return rv;
-    }
-}
-
-static int
-encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level)
-{
-    /* Encode Python dict dct a JSON term, rval is a PyList */
-    static PyObject *open_dict = NULL;
-    static PyObject *close_dict = NULL;
-    static PyObject *empty_dict = NULL;
-    static PyObject *iteritems = NULL;
-    PyObject *kstr = NULL;
-    PyObject *ident = NULL;
-    PyObject *key, *value;
-    PyObject *iter = NULL;
-    PyObject *item = NULL;
-    PyObject *encoded = NULL;
-    int skipkeys;
-    Py_ssize_t idx;
-
-    if (open_dict == NULL || close_dict == NULL || empty_dict == NULL || iteritems == NULL) {
-        open_dict = PyString_InternFromString("{");
-        close_dict = PyString_InternFromString("}");
-        empty_dict = PyString_InternFromString("{}");
-        iteritems = PyString_InternFromString("iteritems");
-        if (open_dict == NULL || close_dict == NULL || empty_dict == NULL || iteritems == NULL)
-            return -1;
-    }
-    if (PyDict_Size(dct) == 0)
-        return PyList_Append(rval, empty_dict);
-
-    if (s->markers != Py_None) {
-        int has_key;
-        ident = PyLong_FromVoidPtr(dct);
-        if (ident == NULL)
-            goto bail;
-        has_key = PyDict_Contains(s->markers, ident);
-        if (has_key) {
-            if (has_key != -1)
-                PyErr_SetString(PyExc_ValueError, "Circular reference detected");
-            goto bail;
-        }
-        if (PyDict_SetItem(s->markers, ident, dct)) {
-            goto bail;
-        }
-    }
-
-    if (PyList_Append(rval, open_dict))
-        goto bail;
-
-    if (s->indent != Py_None) {
-        /* TODO: DOES NOT RUN */
-        indent_level += 1;
-        /*
-            newline_indent = '\n' + (_indent * _current_indent_level)
-            separator = _item_separator + newline_indent
-            buf += newline_indent
-        */
-    }
-
-    /* TODO: C speedup not implemented for sort_keys */
-
-    skipkeys = PyObject_IsTrue(s->skipkeys);
-    idx = 0;
-    iter = PyObject_CallMethodObjArgs(dct, iteritems, NULL);
-    if (iter == NULL)
-        goto bail;
-    while ((item = PyIter_Next(iter))) {
-
-        key = PyTuple_GetItem(item, 0);
-        if (key == NULL)
-            goto bail;
-        value = PyTuple_GetItem(item, 1);
-        if (value == NULL)
-            goto bail;
-        
-        encoded = PyDict_GetItem(s->key_memo, key);
-        if (encoded != NULL) {
-            Py_INCREF(encoded);
-        }
-        else if (PyString_Check(key) || PyUnicode_Check(key)) {
-            Py_INCREF(key);
-            kstr = key;
-        }
-        else if (PyFloat_Check(key)) {
-            kstr = encoder_encode_float(s, key);
-            if (kstr == NULL)
-                goto bail;
-        }
-        else if (PyInt_Check(key) || PyLong_Check(key)) {
-            kstr = PyObject_Str(key);
-            if (kstr == NULL)
-                goto bail;
-        }
-        else if (key == Py_True || key == Py_False || key == Py_None) {
-            kstr = _encoded_const(key);
-            if (kstr == NULL)
-                goto bail;
-        }
-        else if (skipkeys) {
-            Py_DECREF(item);
-            continue;
-        }
-        else {
-            /* TODO: include repr of key */
-            PyErr_SetString(PyExc_ValueError, "keys must be a string");
-            goto bail;
-        }
-
-        if (idx) {
-            if (PyList_Append(rval, s->item_separator))
-                goto bail;
-        }
-
-        if (encoded == NULL) {
-            encoded = encoder_encode_string(s, kstr);
-            Py_CLEAR(kstr);
-            if (encoded == NULL)
-                goto bail;
-            if (PyDict_SetItem(s->key_memo, key, encoded))
-                goto bail;
-        }
-        if (PyList_Append(rval, encoded)) {
-            goto bail;
-        }
-        Py_CLEAR(encoded);
-        if (PyList_Append(rval, s->key_separator))
-            goto bail;
-        if (encoder_listencode_obj(s, rval, value, indent_level))
-            goto bail;
-        Py_CLEAR(item);
-        idx += 1;
-    }
-    Py_CLEAR(iter);
-    if (PyErr_Occurred())
-        goto bail;
-    if (ident != NULL) {
-        if (PyDict_DelItem(s->markers, ident))
-            goto bail;
-        Py_CLEAR(ident);
-    }
-    if (s->indent != Py_None) {
-        /* TODO: DOES NOT RUN */
-        indent_level -= 1;
-        /*
-            yield '\n' + (_indent * _current_indent_level)
-        */
-    }
-    if (PyList_Append(rval, close_dict))
-        goto bail;
-    return 0;
-
-bail:
-    Py_XDECREF(encoded);
-    Py_XDECREF(item);
-    Py_XDECREF(iter);
-    Py_XDECREF(kstr);
-    Py_XDECREF(ident);
-    return -1;
-}
-
-
-static int
-encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level)
-{
-    /* Encode Python list seq to a JSON term, rval is a PyList */
-    static PyObject *open_array = NULL;
-    static PyObject *close_array = NULL;
-    static PyObject *empty_array = NULL;
-    PyObject *ident = NULL;
-    PyObject *iter = NULL;
-    PyObject *obj = NULL;
-    int is_true;
-    int i = 0;
-
-    if (open_array == NULL || close_array == NULL || empty_array == NULL) {
-        open_array = PyString_InternFromString("[");
-        close_array = PyString_InternFromString("]");
-        empty_array = PyString_InternFromString("[]");
-        if (open_array == NULL || close_array == NULL || empty_array == NULL)
-            return -1;
-    }
-    ident = NULL;
-    is_true = PyObject_IsTrue(seq);
-    if (is_true == -1)
-        return -1;
-    else if (is_true == 0)
-        return PyList_Append(rval, empty_array);
-
-    if (s->markers != Py_None) {
-        int has_key;
-        ident = PyLong_FromVoidPtr(seq);
-        if (ident == NULL)
-            goto bail;
-        has_key = PyDict_Contains(s->markers, ident);
-        if (has_key) {
-            if (has_key != -1)
-                PyErr_SetString(PyExc_ValueError, "Circular reference detected");
-            goto bail;
-        }
-        if (PyDict_SetItem(s->markers, ident, seq)) {
-            goto bail;
-        }
-    }
-
-    iter = PyObject_GetIter(seq);
-    if (iter == NULL)
-        goto bail;
-
-    if (PyList_Append(rval, open_array))
-        goto bail;
-    if (s->indent != Py_None) {
-        /* TODO: DOES NOT RUN */
-        indent_level += 1;
-        /*
-            newline_indent = '\n' + (_indent * _current_indent_level)
-            separator = _item_separator + newline_indent
-            buf += newline_indent
-        */
-    }
-    while ((obj = PyIter_Next(iter))) {
-        if (i) {
-            if (PyList_Append(rval, s->item_separator))
-                goto bail;
-        }
-        if (encoder_listencode_obj(s, rval, obj, indent_level))
-            goto bail;
-        i++;
-        Py_CLEAR(obj);
-    }
-    Py_CLEAR(iter);
-    if (PyErr_Occurred())
-        goto bail;
-    if (ident != NULL) {
-        if (PyDict_DelItem(s->markers, ident))
-            goto bail;
-        Py_CLEAR(ident);
-    }
-    if (s->indent != Py_None) {
-        /* TODO: DOES NOT RUN */
-        indent_level -= 1;
-        /*
-            yield '\n' + (_indent * _current_indent_level)
-        */
-    }
-    if (PyList_Append(rval, close_array))
-        goto bail;
-    return 0;
-
-bail:
-    Py_XDECREF(obj);
-    Py_XDECREF(iter);
-    Py_XDECREF(ident);
-    return -1;
-}
-
-static void
-encoder_dealloc(PyObject *self)
-{
-    /* Deallocate Encoder */
-    encoder_clear(self);
-    Py_TYPE(self)->tp_free(self);
-}
-
-static int
-encoder_traverse(PyObject *self, visitproc visit, void *arg)
-{
-    PyEncoderObject *s;
-    assert(PyEncoder_Check(self));
-    s = (PyEncoderObject *)self;
-    Py_VISIT(s->markers);
-    Py_VISIT(s->defaultfn);
-    Py_VISIT(s->encoder);
-    Py_VISIT(s->indent);
-    Py_VISIT(s->key_separator);
-    Py_VISIT(s->item_separator);
-    Py_VISIT(s->sort_keys);
-    Py_VISIT(s->skipkeys);
-    Py_VISIT(s->key_memo);
-    return 0;
-}
-
-static int
-encoder_clear(PyObject *self)
-{
-    /* Deallocate Encoder */
-    PyEncoderObject *s;
-    assert(PyEncoder_Check(self));
-    s = (PyEncoderObject *)self;
-    Py_CLEAR(s->markers);
-    Py_CLEAR(s->defaultfn);
-    Py_CLEAR(s->encoder);
-    Py_CLEAR(s->indent);
-    Py_CLEAR(s->key_separator);
-    Py_CLEAR(s->item_separator);
-    Py_CLEAR(s->sort_keys);
-    Py_CLEAR(s->skipkeys);
-    Py_CLEAR(s->key_memo);
-    return 0;
-}
-
-PyDoc_STRVAR(encoder_doc, "_iterencode(obj, _current_indent_level) -> iterable");
-
-static
-PyTypeObject PyEncoderType = {
-    PyObject_HEAD_INIT(NULL)
-    0,                    /* tp_internal */
-    "simplejson._speedups.Encoder",       /* tp_name */
-    sizeof(PyEncoderObject), /* tp_basicsize */
-    0,                    /* tp_itemsize */
-    encoder_dealloc, /* tp_dealloc */
-    0,                    /* tp_print */
-    0,                    /* tp_getattr */
-    0,                    /* tp_setattr */
-    0,                    /* tp_compare */
-    0,                    /* tp_repr */
-    0,                    /* tp_as_number */
-    0,                    /* tp_as_sequence */
-    0,                    /* tp_as_mapping */
-    0,                    /* tp_hash */
-    encoder_call,         /* tp_call */
-    0,                    /* tp_str */
-    0,                    /* tp_getattro */
-    0,                    /* tp_setattro */
-    0,                    /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,   /* tp_flags */
-    encoder_doc,          /* tp_doc */
-    encoder_traverse,     /* tp_traverse */
-    encoder_clear,        /* tp_clear */
-    0,                    /* tp_richcompare */
-    0,                    /* tp_weaklistoffset */
-    0,                    /* tp_iter */
-    0,                    /* tp_iternext */
-    0,                    /* tp_methods */
-    encoder_members,      /* tp_members */
-    0,                    /* tp_getset */
-    0,                    /* tp_base */
-    0,                    /* tp_dict */
-    0,                    /* tp_descr_get */
-    0,                    /* tp_descr_set */
-    0,                    /* tp_dictoffset */
-    encoder_init,         /* tp_init */
-    0,                    /* tp_alloc */
-    encoder_new,          /* tp_new */
-    0,                    /* tp_free */
-};
-
-static PyMethodDef speedups_methods[] = {
-    {"encode_basestring_ascii",
-        (PyCFunction)py_encode_basestring_ascii,
-        METH_O,
-        pydoc_encode_basestring_ascii},
-    {"scanstring",
-        (PyCFunction)py_scanstring,
-        METH_VARARGS,
-        pydoc_scanstring},
-    {NULL, NULL, 0, NULL}
-};
-
-PyDoc_STRVAR(module_doc,
-"simplejson speedups\n");
-
-void
-init_speedups(void)
-{
-    PyObject *m, *decimal;
-    PyScannerType.tp_new = PyType_GenericNew;
-    if (PyType_Ready(&PyScannerType) < 0)
-        return;
-    PyEncoderType.tp_new = PyType_GenericNew;
-    if (PyType_Ready(&PyEncoderType) < 0)
-        return;
-
-    decimal = PyImport_ImportModule("decimal");
-    if (decimal == NULL)
-        return;
-    DecimalTypePtr = (PyTypeObject*)PyObject_GetAttrString(decimal, "Decimal");
-    Py_DECREF(decimal);
-    if (DecimalTypePtr == NULL)
-        return;
-
-    m = Py_InitModule3("_speedups", speedups_methods, module_doc);
-    Py_INCREF((PyObject*)&PyScannerType);
-    PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType);
-    Py_INCREF((PyObject*)&PyEncoderType);
-    PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType);
-}
diff --git a/simplejson/decoder.py b/simplejson/decoder.py
deleted file mode 100644
index 4cf4015..0000000
--- a/simplejson/decoder.py
+++ /dev/null
@@ -1,421 +0,0 @@
-"""Implementation of JSONDecoder
-"""
-import re
-import sys
-import struct
-
-from simplejson.scanner import make_scanner
-def _import_c_scanstring():
-    try:
-        from simplejson._speedups import scanstring
-        return scanstring
-    except ImportError:
-        return None
-c_scanstring = _import_c_scanstring()
-
-__all__ = ['JSONDecoder']
-
-FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
-
-def _floatconstants():
-    _BYTES = '7FF80000000000007FF0000000000000'.decode('hex')
-    # The struct module in Python 2.4 would get frexp() out of range here
-    # when an endian is specified in the format string. Fixed in Python 2.5+
-    if sys.byteorder != 'big':
-        _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1]
-    nan, inf = struct.unpack('dd', _BYTES)
-    return nan, inf, -inf
-
-NaN, PosInf, NegInf = _floatconstants()
-
-
-class JSONDecodeError(ValueError):
-    """Subclass of ValueError with the following additional properties:
-    
-    msg: The unformatted error message
-    doc: The JSON document being parsed
-    pos: The start index of doc where parsing failed
-    end: The end index of doc where parsing failed (may be None)
-    lineno: The line corresponding to pos
-    colno: The column corresponding to pos
-    endlineno: The line corresponding to end (may be None)
-    endcolno: The column corresponding to end (may be None)
-    
-    """
-    def __init__(self, msg, doc, pos, end=None):
-        ValueError.__init__(self, errmsg(msg, doc, pos, end=end))
-        self.msg = msg
-        self.doc = doc
-        self.pos = pos
-        self.end = end
-        self.lineno, self.colno = linecol(doc, pos)
-        if end is not None:
-            self.endlineno, self.endcolno = linecol(doc, pos)
-        else:
-            self.endlineno, self.endcolno = None, None
-
-
-def linecol(doc, pos):
-    lineno = doc.count('\n', 0, pos) + 1
-    if lineno == 1:
-        colno = pos
-    else:
-        colno = pos - doc.rindex('\n', 0, pos)
-    return lineno, colno
-
-
-def errmsg(msg, doc, pos, end=None):
-    # Note that this function is called from _speedups
-    lineno, colno = linecol(doc, pos)
-    if end is None:
-        #fmt = '{0}: line {1} column {2} (char {3})'
-        #return fmt.format(msg, lineno, colno, pos)
-        fmt = '%s: line %d column %d (char %d)'
-        return fmt % (msg, lineno, colno, pos)
-    endlineno, endcolno = linecol(doc, end)
-    #fmt = '{0}: line {1} column {2} - line {3} column {4} (char {5} - {6})'
-    #return fmt.format(msg, lineno, colno, endlineno, endcolno, pos, end)
-    fmt = '%s: line %d column %d - line %d column %d (char %d - %d)'
-    return fmt % (msg, lineno, colno, endlineno, endcolno, pos, end)
-
-
-_CONSTANTS = {
-    '-Infinity': NegInf,
-    'Infinity': PosInf,
-    'NaN': NaN,
-}
-
-STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS)
-BACKSLASH = {
-    '"': u'"', '\\': u'\\', '/': u'/',
-    'b': u'\b', 'f': u'\f', 'n': u'\n', 'r': u'\r', 't': u'\t',
-}
-
-DEFAULT_ENCODING = "utf-8"
-
-def py_scanstring(s, end, encoding=None, strict=True,
-        _b=BACKSLASH, _m=STRINGCHUNK.match):
-    """Scan the string s for a JSON string. End is the index of the
-    character in s after the quote that started the JSON string.
-    Unescapes all valid JSON string escape sequences and raises ValueError
-    on attempt to decode an invalid string. If strict is False then literal
-    control characters are allowed in the string.
-
-    Returns a tuple of the decoded string and the index of the character in s
-    after the end quote."""
-    if encoding is None:
-        encoding = DEFAULT_ENCODING
-    chunks = []
-    _append = chunks.append
-    begin = end - 1
-    while 1:
-        chunk = _m(s, end)
-        if chunk is None:
-            raise JSONDecodeError(
-                "Unterminated string starting at", s, begin)
-        end = chunk.end()
-        content, terminator = chunk.groups()
-        # Content is contains zero or more unescaped string characters
-        if content:
-            if not isinstance(content, unicode):
-                content = unicode(content, encoding)
-            _append(content)
-        # Terminator is the end of string, a literal control character,
-        # or a backslash denoting that an escape sequence follows
-        if terminator == '"':
-            break
-        elif terminator != '\\':
-            if strict:
-                msg = "Invalid control character %r at" % (terminator,)
-                #msg = "Invalid control character {0!r} at".format(terminator)
-                raise JSONDecodeError(msg, s, end)
-            else:
-                _append(terminator)
-                continue
-        try:
-            esc = s[end]
-        except IndexError:
-            raise JSONDecodeError(
-                "Unterminated string starting at", s, begin)
-        # If not a unicode escape sequence, must be in the lookup table
-        if esc != 'u':
-            try:
-                char = _b[esc]
-            except KeyError:
-                msg = "Invalid \\escape: " + repr(esc)
-                raise JSONDecodeError(msg, s, end)
-            end += 1
-        else:
-            # Unicode escape sequence
-            esc = s[end + 1:end + 5]
-            next_end = end + 5
-            if len(esc) != 4:
-                msg = "Invalid \\uXXXX escape"
-                raise JSONDecodeError(msg, s, end)
-            uni = int(esc, 16)
-            # Check for surrogate pair on UCS-4 systems
-            if 0xd800 <= uni <= 0xdbff and sys.maxunicode > 65535:
-                msg = "Invalid \\uXXXX\\uXXXX surrogate pair"
-                if not s[end + 5:end + 7] == '\\u':
-                    raise JSONDecodeError(msg, s, end)
-                esc2 = s[end + 7:end + 11]
-                if len(esc2) != 4:
-                    raise JSONDecodeError(msg, s, end)
-                uni2 = int(esc2, 16)
-                uni = 0x10000 + (((uni - 0xd800) << 10) | (uni2 - 0xdc00))
-                next_end += 6
-            char = unichr(uni)
-            end = next_end
-        # Append the unescaped character
-        _append(char)
-    return u''.join(chunks), end
-
-
-# Use speedup if available
-scanstring = c_scanstring or py_scanstring
-
-WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS)
-WHITESPACE_STR = ' \t\n\r'
-
-def JSONObject((s, end), encoding, strict, scan_once, object_hook,
-        object_pairs_hook, memo=None,
-        _w=WHITESPACE.match, _ws=WHITESPACE_STR):
-    # Backwards compatibility
-    if memo is None:
-        memo = {}
-    memo_get = memo.setdefault
-    pairs = []
-    # Use a slice to prevent IndexError from being raised, the following
-    # check will raise a more specific ValueError if the string is empty
-    nextchar = s[end:end + 1]
-    # Normally we expect nextchar == '"'
-    if nextchar != '"':
-        if nextchar in _ws:
-            end = _w(s, end).end()
-            nextchar = s[end:end + 1]
-        # Trivial empty object
-        if nextchar == '}':
-            if object_pairs_hook is not None:
-                result = object_pairs_hook(pairs)
-                return result, end
-            pairs = {}
-            if object_hook is not None:
-                pairs = object_hook(pairs)
-            return pairs, end + 1
-        elif nextchar != '"':
-            raise JSONDecodeError("Expecting property name", s, end)
-    end += 1
-    while True:
-        key, end = scanstring(s, end, encoding, strict)
-        key = memo_get(key, key)
-
-        # To skip some function call overhead we optimize the fast paths where
-        # the JSON key separator is ": " or just ":".
-        if s[end:end + 1] != ':':
-            end = _w(s, end).end()
-            if s[end:end + 1] != ':':
-                raise JSONDecodeError("Expecting : delimiter", s, end)
-
-        end += 1
-
-        try:
-            if s[end] in _ws:
-                end += 1
-                if s[end] in _ws:
-                    end = _w(s, end + 1).end()
-        except IndexError:
-            pass
-
-        try:
-            value, end = scan_once(s, end)
-        except StopIteration:
-            raise JSONDecodeError("Expecting object", s, end)
-        pairs.append((key, value))
-
-        try:
-            nextchar = s[end]
-            if nextchar in _ws:
-                end = _w(s, end + 1).end()
-                nextchar = s[end]
-        except IndexError:
-            nextchar = ''
-        end += 1
-
-        if nextchar == '}':
-            break
-        elif nextchar != ',':
-            raise JSONDecodeError("Expecting , delimiter", s, end - 1)
-
-        try:
-            nextchar = s[end]
-            if nextchar in _ws:
-                end += 1
-                nextchar = s[end]
-                if nextchar in _ws:
-                    end = _w(s, end + 1).end()
-                    nextchar = s[end]
-        except IndexError:
-            nextchar = ''
-
-        end += 1
-        if nextchar != '"':
-            raise JSONDecodeError("Expecting property name", s, end - 1)
-
-    if object_pairs_hook is not None:
-        result = object_pairs_hook(pairs)
-        return result, end
-    pairs = dict(pairs)
-    if object_hook is not None:
-        pairs = object_hook(pairs)
-    return pairs, end
-
-def JSONArray((s, end), scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR):
-    values = []
-    nextchar = s[end:end + 1]
-    if nextchar in _ws:
-        end = _w(s, end + 1).end()
-        nextchar = s[end:end + 1]
-    # Look-ahead for trivial empty array
-    if nextchar == ']':
-        return values, end + 1
-    _append = values.append
-    while True:
-        try:
-            value, end = scan_once(s, end)
-        except StopIteration:
-            raise JSONDecodeError("Expecting object", s, end)
-        _append(value)
-        nextchar = s[end:end + 1]
-        if nextchar in _ws:
-            end = _w(s, end + 1).end()
-            nextchar = s[end:end + 1]
-        end += 1
-        if nextchar == ']':
-            break
-        elif nextchar != ',':
-            raise JSONDecodeError("Expecting , delimiter", s, end)
-
-        try:
-            if s[end] in _ws:
-                end += 1
-                if s[end] in _ws:
-                    end = _w(s, end + 1).end()
-        except IndexError:
-            pass
-
-    return values, end
-
-class JSONDecoder(object):
-    """Simple JSON <http://json.org> decoder
-
-    Performs the following translations in decoding by default:
-
-    +---------------+-------------------+
-    | JSON          | Python            |
-    +===============+===================+
-    | object        | dict              |
-    +---------------+-------------------+
-    | array         | list              |
-    +---------------+-------------------+
-    | string        | unicode           |
-    +---------------+-------------------+
-    | number (int)  | int, long         |
-    +---------------+-------------------+
-    | number (real) | float             |
-    +---------------+-------------------+
-    | true          | True              |
-    +---------------+-------------------+
-    | false         | False             |
-    +---------------+-------------------+
-    | null          | None              |
-    +---------------+-------------------+
-
-    It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as
-    their corresponding ``float`` values, which is outside the JSON spec.
-
-    """
-
-    def __init__(self, encoding=None, object_hook=None, parse_float=None,
-            parse_int=None, parse_constant=None, strict=True,
-            object_pairs_hook=None):
-        """
-        *encoding* determines the encoding used to interpret any
-        :class:`str` objects decoded by this instance (``'utf-8'`` by
-        default).  It has no effect when decoding :class:`unicode` objects.
-
-        Note that currently only encodings that are a superset of ASCII work,
-        strings of other encodings should be passed in as :class:`unicode`.
-
-        *object_hook*, if specified, will be called with the result of every
-        JSON object decoded and its return value will be used in place of the
-        given :class:`dict`.  This can be used to provide custom
-        deserializations (e.g. to support JSON-RPC class hinting).
-
-        *object_pairs_hook* is an optional function that will be called with
-        the result of any object literal decode with an ordered list of pairs.
-        The return value of *object_pairs_hook* will be used instead of the
-        :class:`dict`.  This feature can be used to implement custom decoders
-        that rely on the order that the key and value pairs are decoded (for
-        example, :func:`collections.OrderedDict` will remember the order of
-        insertion). If *object_hook* is also defined, the *object_pairs_hook*
-        takes priority.
-
-        *parse_float*, if specified, will be called with the string of every
-        JSON float to be decoded.  By default, this is equivalent to
-        ``float(num_str)``. This can be used to use another datatype or parser
-        for JSON floats (e.g. :class:`decimal.Decimal`).
-
-        *parse_int*, if specified, will be called with the string of every
-        JSON int to be decoded.  By default, this is equivalent to
-        ``int(num_str)``.  This can be used to use another datatype or parser
-        for JSON integers (e.g. :class:`float`).
-
-        *parse_constant*, if specified, will be called with one of the
-        following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``.  This
-        can be used to raise an exception if invalid JSON numbers are
-        encountered.
-
-        *strict* controls the parser's behavior when it encounters an
-        invalid control character in a string. The default setting of
-        ``True`` means that unescaped control characters are parse errors, if
-        ``False`` then control characters will be allowed in strings.
-
-        """
-        self.encoding = encoding
-        self.object_hook = object_hook
-        self.object_pairs_hook = object_pairs_hook
-        self.parse_float = parse_float or float
-        self.parse_int = parse_int or int
-        self.parse_constant = parse_constant or _CONSTANTS.__getitem__
-        self.strict = strict
-        self.parse_object = JSONObject
-        self.parse_array = JSONArray
-        self.parse_string = scanstring
-        self.memo = {}
-        self.scan_once = make_scanner(self)
-
-    def decode(self, s, _w=WHITESPACE.match):
-        """Return the Python representation of ``s`` (a ``str`` or ``unicode``
-        instance containing a JSON document)
-
-        """
-        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
-        end = _w(s, end).end()
-        if end != len(s):
-            raise JSONDecodeError("Extra data", s, end, len(s))
-        return obj
-
-    def raw_decode(self, s, idx=0):
-        """Decode a JSON document from ``s`` (a ``str`` or ``unicode``
-        beginning with a JSON document) and return a 2-tuple of the Python
-        representation and the index in ``s`` where the document ended.
-
-        This can be used to decode a JSON document from a string that may
-        have extraneous data at the end.
-
-        """
-        try:
-            obj, end = self.scan_once(s, idx)
-        except StopIteration:
-            raise JSONDecodeError("No JSON object could be decoded", s, idx)
-        return obj, end
diff --git a/simplejson/encoder.py b/simplejson/encoder.py
deleted file mode 100644
index cab8456..0000000
--- a/simplejson/encoder.py
+++ /dev/null
@@ -1,501 +0,0 @@
-"""Implementation of JSONEncoder
-"""
-import re
-from decimal import Decimal
-
-def _import_speedups():
-    try:
-        from simplejson import _speedups
-        return _speedups.encode_basestring_ascii, _speedups.make_encoder
-    except ImportError:
-        return None, None
-c_encode_basestring_ascii, c_make_encoder = _import_speedups()
-
-from simplejson.decoder import PosInf
-
-ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]')
-ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
-HAS_UTF8 = re.compile(r'[\x80-\xff]')
-ESCAPE_DCT = {
-    '\\': '\\\\',
-    '"': '\\"',
-    '\b': '\\b',
-    '\f': '\\f',
-    '\n': '\\n',
-    '\r': '\\r',
-    '\t': '\\t',
-}
-for i in range(0x20):
-    #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i))
-    ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
-
-FLOAT_REPR = repr
-
-def encode_basestring(s):
-    """Return a JSON representation of a Python string
-
-    """
-    if isinstance(s, str) and HAS_UTF8.search(s) is not None:
-        s = s.decode('utf-8')
-    def replace(match):
-        return ESCAPE_DCT[match.group(0)]
-    return u'"' + ESCAPE.sub(replace, s) + u'"'
-
-
-def py_encode_basestring_ascii(s):
-    """Return an ASCII-only JSON representation of a Python string
-
-    """
-    if isinstance(s, str) and HAS_UTF8.search(s) is not None:
-        s = s.decode('utf-8')
-    def replace(match):
-        s = match.group(0)
-        try:
-            return ESCAPE_DCT[s]
-        except KeyError:
-            n = ord(s)
-            if n < 0x10000:
-                #return '\\u{0:04x}'.format(n)
-                return '\\u%04x' % (n,)
-            else:
-                # surrogate pair
-                n -= 0x10000
-                s1 = 0xd800 | ((n >> 10) & 0x3ff)
-                s2 = 0xdc00 | (n & 0x3ff)
-                #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2)
-                return '\\u%04x\\u%04x' % (s1, s2)
-    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
-
-
-encode_basestring_ascii = (
-    c_encode_basestring_ascii or py_encode_basestring_ascii)
-
-class JSONEncoder(object):
-    """Extensible JSON <http://json.org> encoder for Python data structures.
-
-    Supports the following objects and types by default:
-
-    +-------------------+---------------+
-    | Python            | JSON          |
-    +===================+===============+
-    | dict              | object        |
-    +-------------------+---------------+
-    | list, tuple       | array         |
-    +-------------------+---------------+
-    | str, unicode      | string        |
-    +-------------------+---------------+
-    | int, long, float  | number        |
-    +-------------------+---------------+
-    | True              | true          |
-    +-------------------+---------------+
-    | False             | false         |
-    +-------------------+---------------+
-    | None              | null          |
-    +-------------------+---------------+
-
-    To extend this to recognize other objects, subclass and implement a
-    ``.default()`` method with another method that returns a serializable
-    object for ``o`` if possible, otherwise it should call the superclass
-    implementation (to raise ``TypeError``).
-
-    """
-    item_separator = ', '
-    key_separator = ': '
-    def __init__(self, skipkeys=False, ensure_ascii=True,
-            check_circular=True, allow_nan=True, sort_keys=False,
-            indent=None, separators=None, encoding='utf-8', default=None,
-            use_decimal=False):
-        """Constructor for JSONEncoder, with sensible defaults.
-
-        If skipkeys is false, then it is a TypeError to attempt
-        encoding of keys that are not str, int, long, float or None.  If
-        skipkeys is True, such items are simply skipped.
-
-        If ensure_ascii is true, the output is guaranteed to be str
-        objects with all incoming unicode characters escaped.  If
-        ensure_ascii is false, the output will be unicode object.
-
-        If check_circular is true, then lists, dicts, and custom encoded
-        objects will be checked for circular references during encoding to
-        prevent an infinite recursion (which would cause an OverflowError).
-        Otherwise, no such check takes place.
-
-        If allow_nan is true, then NaN, Infinity, and -Infinity will be
-        encoded as such.  This behavior is not JSON specification compliant,
-        but is consistent with most JavaScript based encoders and decoders.
-        Otherwise, it will be a ValueError to encode such floats.
-
-        If sort_keys is true, then the output of dictionaries will be
-        sorted by key; this is useful for regression tests to ensure
-        that JSON serializations can be compared on a day-to-day basis.
-
-        If indent is a string, then JSON array elements and object members
-        will be pretty-printed with a newline followed by that string repeated
-        for each level of nesting. ``None`` (the default) selects the most compact
-        representation without any newlines. For backwards compatibility with
-        versions of simplejson earlier than 2.1.0, an integer is also accepted
-        and is converted to a string with that many spaces.
-
-        If specified, separators should be a (item_separator, key_separator)
-        tuple.  The default is (', ', ': ').  To get the most compact JSON
-        representation you should specify (',', ':') to eliminate whitespace.
-
-        If specified, default is a function that gets called for objects
-        that can't otherwise be serialized.  It should return a JSON encodable
-        version of the object or raise a ``TypeError``.
-
-        If encoding is not None, then all input strings will be
-        transformed into unicode using that encoding prior to JSON-encoding.
-        The default is UTF-8.
-        
-        If use_decimal is true (not the default), ``decimal.Decimal`` will
-        be supported directly by the encoder. For the inverse, decode JSON
-        with ``parse_float=decimal.Decimal``.
-
-        """
-
-        self.skipkeys = skipkeys
-        self.ensure_ascii = ensure_ascii
-        self.check_circular = check_circular
-        self.allow_nan = allow_nan
-        self.sort_keys = sort_keys
-        self.use_decimal = use_decimal
-        if isinstance(indent, (int, long)):
-            indent = ' ' * indent
-        self.indent = indent
-        if separators is not None:
-            self.item_separator, self.key_separator = separators
-        if default is not None:
-            self.default = default
-        self.encoding = encoding
-
-    def default(self, o):
-        """Implement this method in a subclass such that it returns
-        a serializable object for ``o``, or calls the base implementation
-        (to raise a ``TypeError``).
-
-        For example, to support arbitrary iterators, you could
-        implement default like this::
-
-            def default(self, o):
-                try:
-                    iterable = iter(o)
-                except TypeError:
-                    pass
-                else:
-                    return list(iterable)
-                return JSONEncoder.default(self, o)
-
-        """
-        raise TypeError(repr(o) + " is not JSON serializable")
-
-    def encode(self, o):
-        """Return a JSON string representation of a Python data structure.
-
-        >>> from simplejson import JSONEncoder
-        >>> JSONEncoder().encode({"foo": ["bar", "baz"]})
-        '{"foo": ["bar", "baz"]}'
-
-        """
-        # This is for extremely simple cases and benchmarks.
-        if isinstance(o, basestring):
-            if isinstance(o, str):
-                _encoding = self.encoding
-                if (_encoding is not None
-                        and not (_encoding == 'utf-8')):
-                    o = o.decode(_encoding)
-            if self.ensure_ascii:
-                return encode_basestring_ascii(o)
-            else:
-                return encode_basestring(o)
-        # This doesn't pass the iterator directly to ''.join() because the
-        # exceptions aren't as detailed.  The list call should be roughly
-        # equivalent to the PySequence_Fast that ''.join() would do.
-        chunks = self.iterencode(o, _one_shot=True)
-        if not isinstance(chunks, (list, tuple)):
-            chunks = list(chunks)
-        if self.ensure_ascii:
-            return ''.join(chunks)
-        else:
-            return u''.join(chunks)
-
-    def iterencode(self, o, _one_shot=False):
-        """Encode the given object and yield each string
-        representation as available.
-
-        For example::
-
-            for chunk in JSONEncoder().iterencode(bigobject):
-                mysocket.write(chunk)
-
-        """
-        if self.check_circular:
-            markers = {}
-        else:
-            markers = None
-        if self.ensure_ascii:
-            _encoder = encode_basestring_ascii
-        else:
-            _encoder = encode_basestring
-        if self.encoding != 'utf-8':
-            def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding):
-                if isinstance(o, str):
-                    o = o.decode(_encoding)
-                return _orig_encoder(o)
-
-        def floatstr(o, allow_nan=self.allow_nan,
-                _repr=FLOAT_REPR, _inf=PosInf, _neginf=-PosInf):
-            # Check for specials. Note that this type of test is processor
-            # and/or platform-specific, so do tests which don't depend on
-            # the internals.
-
-            if o != o:
-                text = 'NaN'
-            elif o == _inf:
-                text = 'Infinity'
-            elif o == _neginf:
-                text = '-Infinity'
-            else:
-                return _repr(o)
-
-            if not allow_nan:
-                raise ValueError(
-                    "Out of range float values are not JSON compliant: " +
-                    repr(o))
-
-            return text
-
-
-        key_memo = {}
-        if (_one_shot and c_make_encoder is not None
-                and not self.indent and not self.sort_keys):
-            _iterencode = c_make_encoder(
-                markers, self.default, _encoder, self.indent,
-                self.key_separator, self.item_separator, self.sort_keys,
-                self.skipkeys, self.allow_nan, key_memo, self.use_decimal)
-        else:
-            _iterencode = _make_iterencode(
-                markers, self.default, _encoder, self.indent, floatstr,
-                self.key_separator, self.item_separator, self.sort_keys,
-                self.skipkeys, _one_shot, self.use_decimal)
-        try:
-            return _iterencode(o, 0)
-        finally:
-            key_memo.clear()
-
-
-class JSONEncoderForHTML(JSONEncoder):
-    """An encoder that produces JSON safe to embed in HTML.
-
-    To embed JSON content in, say, a script tag on a web page, the
-    characters &, < and > should be escaped. They cannot be escaped
-    with the usual entities (e.g. &amp;) because they are not expanded
-    within <script> tags.
-    """
-
-    def encode(self, o):
-        # Override JSONEncoder.encode because it has hacks for
-        # performance that make things more complicated.
-        chunks = self.iterencode(o, True)
-        if self.ensure_ascii:
-            return ''.join(chunks)
-        else:
-            return u''.join(chunks)
-
-    def iterencode(self, o, _one_shot=False):
-        chunks = super(JSONEncoderForHTML, self).iterencode(o, _one_shot)
-        for chunk in chunks:
-            chunk = chunk.replace('&', '\\u0026')
-            chunk = chunk.replace('<', '\\u003c')
-            chunk = chunk.replace('>', '\\u003e')
-            yield chunk
-
-
-def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
-        _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,
-        _use_decimal,
-        ## HACK: hand-optimized bytecode; turn globals into locals
-        False=False,
-        True=True,
-        ValueError=ValueError,
-        basestring=basestring,
-        Decimal=Decimal,
-        dict=dict,
-        float=float,
-        id=id,
-        int=int,
-        isinstance=isinstance,
-        list=list,
-        long=long,
-        str=str,
-        tuple=tuple,
-    ):
-
-    def _iterencode_list(lst, _current_indent_level):
-        if not lst:
-            yield '[]'
-            return
-        if markers is not None:
-            markerid = id(lst)
-            if markerid in markers:
-                raise ValueError("Circular reference detected")
-            markers[markerid] = lst
-        buf = '['
-        if _indent is not None:
-            _current_indent_level += 1
-            newline_indent = '\n' + (_indent * _current_indent_level)
-            separator = _item_separator + newline_indent
-            buf += newline_indent
-        else:
-            newline_indent = None
-            separator = _item_separator
-        first = True
-        for value in lst:
-            if first:
-                first = False
-            else:
-                buf = separator
-            if isinstance(value, basestring):
-                yield buf + _encoder(value)
-            elif value is None:
-                yield buf + 'null'
-            elif value is True:
-                yield buf + 'true'
-            elif value is False:
-                yield buf + 'false'
-            elif isinstance(value, (int, long)):
-                yield buf + str(value)
-            elif isinstance(value, float):
-                yield buf + _floatstr(value)
-            elif _use_decimal and isinstance(value, Decimal):
-                yield buf + str(value)
-            else:
-                yield buf
-                if isinstance(value, (list, tuple)):
-                    chunks = _iterencode_list(value, _current_indent_level)
-                elif isinstance(value, dict):
-                    chunks = _iterencode_dict(value, _current_indent_level)
-                else:
-                    chunks = _iterencode(value, _current_indent_level)
-                for chunk in chunks:
-                    yield chunk
-        if newline_indent is not None:
-            _current_indent_level -= 1
-            yield '\n' + (_indent * _current_indent_level)
-        yield ']'
-        if markers is not None:
-            del markers[markerid]
-
-    def _iterencode_dict(dct, _current_indent_level):
-        if not dct:
-            yield '{}'
-            return
-        if markers is not None:
-            markerid = id(dct)
-            if markerid in markers:
-                raise ValueError("Circular reference detected")
-            markers[markerid] = dct
-        yield '{'
-        if _indent is not None:
-            _current_indent_level += 1
-            newline_indent = '\n' + (_indent * _current_indent_level)
-            item_separator = _item_separator + newline_indent
-            yield newline_indent
-        else:
-            newline_indent = None
-            item_separator = _item_separator
-        first = True
-        if _sort_keys:
-            items = dct.items()
-            items.sort(key=lambda kv: kv[0])
-        else:
-            items = dct.iteritems()
-        for key, value in items:
-            if isinstance(key, basestring):
-                pass
-            # JavaScript is weakly typed for these, so it makes sense to
-            # also allow them.  Many encoders seem to do something like this.
-            elif isinstance(key, float):
-                key = _floatstr(key)
-            elif key is True:
-                key = 'true'
-            elif key is False:
-                key = 'false'
-            elif key is None:
-                key = 'null'
-            elif isinstance(key, (int, long)):
-                key = str(key)
-            elif _skipkeys:
-                continue
-            else:
-                raise TypeError("key " + repr(key) + " is not a string")
-            if first:
-                first = False
-            else:
-                yield item_separator
-            yield _encoder(key)
-            yield _key_separator
-            if isinstance(value, basestring):
-                yield _encoder(value)
-            elif value is None:
-                yield 'null'
-            elif value is True:
-                yield 'true'
-            elif value is False:
-                yield 'false'
-            elif isinstance(value, (int, long)):
-                yield str(value)
-            elif isinstance(value, float):
-                yield _floatstr(value)
-            elif _use_decimal and isinstance(value, Decimal):
-                yield str(value)
-            else:
-                if isinstance(value, (list, tuple)):
-                    chunks = _iterencode_list(value, _current_indent_level)
-                elif isinstance(value, dict):
-                    chunks = _iterencode_dict(value, _current_indent_level)
-                else:
-                    chunks = _iterencode(value, _current_indent_level)
-                for chunk in chunks:
-                    yield chunk
-        if newline_indent is not None:
-            _current_indent_level -= 1
-            yield '\n' + (_indent * _current_indent_level)
-        yield '}'
-        if markers is not None:
-            del markers[markerid]
-
-    def _iterencode(o, _current_indent_level):
-        if isinstance(o, basestring):
-            yield _encoder(o)
-        elif o is None:
-            yield 'null'
-        elif o is True:
-            yield 'true'
-        elif o is False:
-            yield 'false'
-        elif isinstance(o, (int, long)):
-            yield str(o)
-        elif isinstance(o, float):
-            yield _floatstr(o)
-        elif isinstance(o, (list, tuple)):
-            for chunk in _iterencode_list(o, _current_indent_level):
-                yield chunk
-        elif isinstance(o, dict):
-            for chunk in _iterencode_dict(o, _current_indent_level):
-                yield chunk
-        elif _use_decimal and isinstance(o, Decimal):
-            yield str(o)
-        else:
-            if markers is not None:
-                markerid = id(o)
-                if markerid in markers:
-                    raise ValueError("Circular reference detected")
-                markers[markerid] = o
-            o = _default(o)
-            for chunk in _iterencode(o, _current_indent_level):
-                yield chunk
-            if markers is not None:
-                del markers[markerid]
-
-    return _iterencode
diff --git a/simplejson/ordered_dict.py b/simplejson/ordered_dict.py
deleted file mode 100644
index 87ad888..0000000
--- a/simplejson/ordered_dict.py
+++ /dev/null
@@ -1,119 +0,0 @@
-"""Drop-in replacement for collections.OrderedDict by Raymond Hettinger
-
-http://code.activestate.com/recipes/576693/
-
-"""
-from UserDict import DictMixin
-
-# Modified from original to support Python 2.4, see
-# http://code.google.com/p/simplejson/issues/detail?id=53
-try:
-    all
-except NameError:
-    def all(seq):
-        for elem in seq:
-            if not elem:
-                return False
-        return True
-
-class OrderedDict(dict, DictMixin):
-
-    def __init__(self, *args, **kwds):
-        if len(args) > 1:
-            raise TypeError('expected at most 1 arguments, got %d' % len(args))
-        try:
-            self.__end
-        except AttributeError:
-            self.clear()
-        self.update(*args, **kwds)
-
-    def clear(self):
-        self.__end = end = []
-        end += [None, end, end]         # sentinel node for doubly linked list
-        self.__map = {}                 # key --> [key, prev, next]
-        dict.clear(self)
-
-    def __setitem__(self, key, value):
-        if key not in self:
-            end = self.__end
-            curr = end[1]
-            curr[2] = end[1] = self.__map[key] = [key, curr, end]
-        dict.__setitem__(self, key, value)
-
-    def __delitem__(self, key):
-        dict.__delitem__(self, key)
-        key, prev, next = self.__map.pop(key)
-        prev[2] = next
-        next[1] = prev
-
-    def __iter__(self):
-        end = self.__end
-        curr = end[2]
-        while curr is not end:
-            yield curr[0]
-            curr = curr[2]
-
-    def __reversed__(self):
-        end = self.__end
-        curr = end[1]
-        while curr is not end:
-            yield curr[0]
-            curr = curr[1]
-
-    def popitem(self, last=True):
-        if not self:
-            raise KeyError('dictionary is empty')
-        # Modified from original to support Python 2.4, see
-        # http://code.google.com/p/simplejson/issues/detail?id=53
-        if last:
-            key = reversed(self).next()
-        else:
-            key = iter(self).next()
-        value = self.pop(key)
-        return key, value
-
-    def __reduce__(self):
-        items = [[k, self[k]] for k in self]
-        tmp = self.__map, self.__end
-        del self.__map, self.__end
-        inst_dict = vars(self).copy()
-        self.__map, self.__end = tmp
-        if inst_dict:
-            return (self.__class__, (items,), inst_dict)
-        return self.__class__, (items,)
-
-    def keys(self):
-        return list(self)
-
-    setdefault = DictMixin.setdefault
-    update = DictMixin.update
-    pop = DictMixin.pop
-    values = DictMixin.values
-    items = DictMixin.items
-    iterkeys = DictMixin.iterkeys
-    itervalues = DictMixin.itervalues
-    iteritems = DictMixin.iteritems
-
-    def __repr__(self):
-        if not self:
-            return '%s()' % (self.__class__.__name__,)
-        return '%s(%r)' % (self.__class__.__name__, self.items())
-
-    def copy(self):
-        return self.__class__(self)
-
-    @classmethod
-    def fromkeys(cls, iterable, value=None):
-        d = cls()
-        for key in iterable:
-            d[key] = value
-        return d
-
-    def __eq__(self, other):
-        if isinstance(other, OrderedDict):
-            return len(self)==len(other) and \
-                   all(p==q for p, q in  zip(self.items(), other.items()))
-        return dict.__eq__(self, other)
-
-    def __ne__(self, other):
-        return not self == other
diff --git a/simplejson/scanner.py b/simplejson/scanner.py
deleted file mode 100644
index 54593a3..0000000
--- a/simplejson/scanner.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""JSON token scanner
-"""
-import re
-def _import_c_make_scanner():
-    try:
-        from simplejson._speedups import make_scanner
-        return make_scanner
-    except ImportError:
-        return None
-c_make_scanner = _import_c_make_scanner()
-
-__all__ = ['make_scanner']
-
-NUMBER_RE = re.compile(
-    r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?',
-    (re.VERBOSE | re.MULTILINE | re.DOTALL))
-
-def py_make_scanner(context):
-    parse_object = context.parse_object
-    parse_array = context.parse_array
-    parse_string = context.parse_string
-    match_number = NUMBER_RE.match
-    encoding = context.encoding
-    strict = context.strict
-    parse_float = context.parse_float
-    parse_int = context.parse_int
-    parse_constant = context.parse_constant
-    object_hook = context.object_hook
-    object_pairs_hook = context.object_pairs_hook
-    memo = context.memo
-
-    def _scan_once(string, idx):
-        try:
-            nextchar = string[idx]
-        except IndexError:
-            raise StopIteration
-
-        if nextchar == '"':
-            return parse_string(string, idx + 1, encoding, strict)
-        elif nextchar == '{':
-            return parse_object((string, idx + 1), encoding, strict,
-                _scan_once, object_hook, object_pairs_hook, memo)
-        elif nextchar == '[':
-            return parse_array((string, idx + 1), _scan_once)
-        elif nextchar == 'n' and string[idx:idx + 4] == 'null':
-            return None, idx + 4
-        elif nextchar == 't' and string[idx:idx + 4] == 'true':
-            return True, idx + 4
-        elif nextchar == 'f' and string[idx:idx + 5] == 'false':
-            return False, idx + 5
-
-        m = match_number(string, idx)
-        if m is not None:
-            integer, frac, exp = m.groups()
-            if frac or exp:
-                res = parse_float(integer + (frac or '') + (exp or ''))
-            else:
-                res = parse_int(integer)
-            return res, m.end()
-        elif nextchar == 'N' and string[idx:idx + 3] == 'NaN':
-            return parse_constant('NaN'), idx + 3
-        elif nextchar == 'I' and string[idx:idx + 8] == 'Infinity':
-            return parse_constant('Infinity'), idx + 8
-        elif nextchar == '-' and string[idx:idx + 9] == '-Infinity':
-            return parse_constant('-Infinity'), idx + 9
-        else:
-            raise StopIteration
-
-    def scan_once(string, idx):
-        try:
-            return _scan_once(string, idx)
-        finally:
-            memo.clear()
-
-    return scan_once
-
-make_scanner = c_make_scanner or py_make_scanner
diff --git a/simplejson/tests/.___init__.py b/simplejson/tests/.___init__.py
deleted file mode 100644
index 457e8bf..0000000
--- a/simplejson/tests/.___init__.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/._test_decimal.py b/simplejson/tests/._test_decimal.py
deleted file mode 100644
index 5c62656..0000000
--- a/simplejson/tests/._test_decimal.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/._test_decode.py b/simplejson/tests/._test_decode.py
deleted file mode 100644
index cce2c80..0000000
--- a/simplejson/tests/._test_decode.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/._test_default.py b/simplejson/tests/._test_default.py
deleted file mode 100644
index 3ce0189..0000000
--- a/simplejson/tests/._test_default.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/._test_dump.py b/simplejson/tests/._test_dump.py
deleted file mode 100644
index cc0e9d9..0000000
--- a/simplejson/tests/._test_dump.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/._test_encode_basestring_ascii.py b/simplejson/tests/._test_encode_basestring_ascii.py
deleted file mode 100644
index e253291..0000000
--- a/simplejson/tests/._test_encode_basestring_ascii.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/._test_float.py b/simplejson/tests/._test_float.py
deleted file mode 100644
index 3f84ded..0000000
--- a/simplejson/tests/._test_float.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/._test_separators.py b/simplejson/tests/._test_separators.py
deleted file mode 100644
index 39f8ed2..0000000
--- a/simplejson/tests/._test_separators.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/._test_unicode.py b/simplejson/tests/._test_unicode.py
deleted file mode 100644
index 7f83797..0000000
--- a/simplejson/tests/._test_unicode.py
+++ /dev/null
Binary files differ
diff --git a/simplejson/tests/__init__.py b/simplejson/tests/__init__.py
deleted file mode 100644
index 22d8465..0000000
--- a/simplejson/tests/__init__.py
+++ /dev/null
@@ -1,63 +0,0 @@
-import unittest
-import doctest
-
-
-class OptionalExtensionTestSuite(unittest.TestSuite):
-    def run(self, result):
-        import simplejson
-        run = unittest.TestSuite.run
-        run(self, result)
-        simplejson._toggle_speedups(False)
-        run(self, result)
-        simplejson._toggle_speedups(True)
-        return result
-
-
-def additional_tests(suite=None):
-    import simplejson
-    import simplejson.encoder
-    import simplejson.decoder
-    if suite is None:
-        suite = unittest.TestSuite()
-    for mod in (simplejson, simplejson.encoder, simplejson.decoder):
-        suite.addTest(doctest.DocTestSuite(mod))
-    suite.addTest(doctest.DocFileSuite('../../index.rst'))
-    return suite
-
-
-def all_tests_suite():
-    suite = unittest.TestLoader().loadTestsFromNames([
-        'simplejson.tests.test_check_circular',
-        'simplejson.tests.test_decode',
-        'simplejson.tests.test_default',
-        'simplejson.tests.test_dump',
-        'simplejson.tests.test_encode_basestring_ascii',
-        'simplejson.tests.test_encode_for_html',
-        'simplejson.tests.test_fail',
-        'simplejson.tests.test_float',
-        'simplejson.tests.test_indent',
-        'simplejson.tests.test_pass1',
-        'simplejson.tests.test_pass2',
-        'simplejson.tests.test_pass3',
-        'simplejson.tests.test_recursion',
-        'simplejson.tests.test_scanstring',
-        'simplejson.tests.test_separators',
-        'simplejson.tests.test_speedups',
-        'simplejson.tests.test_unicode',
-        'simplejson.tests.test_decimal',
-    ])
-    suite = additional_tests(suite)
-    return OptionalExtensionTestSuite([suite])
-
-
-def main():
-    runner = unittest.TextTestRunner()
-    suite = all_tests_suite()
-    runner.run(suite)
-
-
-if __name__ == '__main__':
-    import os
-    import sys
-    sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
-    main()
diff --git a/simplejson/tests/test_check_circular.py b/simplejson/tests/test_check_circular.py
deleted file mode 100644
index af6463d..0000000
--- a/simplejson/tests/test_check_circular.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from unittest import TestCase
-import simplejson as json
-
-def default_iterable(obj):
-    return list(obj)
-
-class TestCheckCircular(TestCase):
-    def test_circular_dict(self):
-        dct = {}
-        dct['a'] = dct
-        self.assertRaises(ValueError, json.dumps, dct)
-
-    def test_circular_list(self):
-        lst = []
-        lst.append(lst)
-        self.assertRaises(ValueError, json.dumps, lst)
-
-    def test_circular_composite(self):
-        dct2 = {}
-        dct2['a'] = []
-        dct2['a'].append(dct2)
-        self.assertRaises(ValueError, json.dumps, dct2)
-
-    def test_circular_default(self):
-        json.dumps([set()], default=default_iterable)
-        self.assertRaises(TypeError, json.dumps, [set()])
-
-    def test_circular_off_default(self):
-        json.dumps([set()], default=default_iterable, check_circular=False)
-        self.assertRaises(TypeError, json.dumps, [set()], check_circular=False)
diff --git a/simplejson/tests/test_decimal.py b/simplejson/tests/test_decimal.py
deleted file mode 100644
index a694c7e..0000000
--- a/simplejson/tests/test_decimal.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from decimal import Decimal
-from unittest import TestCase
-
-import simplejson as json
-
-class TestDecimal(TestCase):
-    NUMS = "1.0", "10.00", "1.1", "1234567890.1234567890", "500"
-    def test_decimal_encode(self):
-        for d in map(Decimal, self.NUMS):
-            self.assertEquals(json.dumps(d, use_decimal=True), str(d))
-    
-    def test_decimal_decode(self):
-        for s in self.NUMS:
-            self.assertEquals(json.loads(s, parse_float=Decimal), Decimal(s))
-    
-    def test_decimal_roundtrip(self):
-        for d in map(Decimal, self.NUMS):
-            # The type might not be the same (int and Decimal) but they
-            # should still compare equal.
-            self.assertEquals(
-                json.loads(
-                    json.dumps(d, use_decimal=True), parse_float=Decimal),
-                d)
-            self.assertEquals(
-                json.loads(
-                    json.dumps([d], use_decimal=True), parse_float=Decimal),
-                [d])
-
-    def test_decimal_defaults(self):
-        d = Decimal(1)
-        # use_decimal=False is the default
-        self.assertRaises(TypeError, json.dumps, d, use_decimal=False)
-        self.assertRaises(TypeError, json.dumps, d)
\ No newline at end of file
diff --git a/simplejson/tests/test_decode.py b/simplejson/tests/test_decode.py
deleted file mode 100644
index a5a1c48..0000000
--- a/simplejson/tests/test_decode.py
+++ /dev/null
@@ -1,73 +0,0 @@
-import decimal
-from unittest import TestCase
-from StringIO import StringIO
-
-import simplejson as json
-from simplejson import OrderedDict
-
-class TestDecode(TestCase):
-    if not hasattr(TestCase, 'assertIs'):
-        def assertIs(self, a, b):
-            self.assertTrue(a is b, '%r is %r' % (a, b))
-
-    def test_decimal(self):
-        rval = json.loads('1.1', parse_float=decimal.Decimal)
-        self.assertTrue(isinstance(rval, decimal.Decimal))
-        self.assertEquals(rval, decimal.Decimal('1.1'))
-
-    def test_float(self):
-        rval = json.loads('1', parse_int=float)
-        self.assertTrue(isinstance(rval, float))
-        self.assertEquals(rval, 1.0)
-
-    def test_decoder_optimizations(self):
-        # Several optimizations were made that skip over calls to
-        # the whitespace regex, so this test is designed to try and
-        # exercise the uncommon cases. The array cases are already covered.
-        rval = json.loads('{   "key"    :    "value"    ,  "k":"v"    }')
-        self.assertEquals(rval, {"key":"value", "k":"v"})
-
-    def test_empty_objects(self):
-        s = '{}'
-        self.assertEqual(json.loads(s), eval(s))
-        s = '[]'
-        self.assertEqual(json.loads(s), eval(s))
-        s = '""'
-        self.assertEqual(json.loads(s), eval(s))
-
-    def test_object_pairs_hook(self):
-        s = '{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}'
-        p = [("xkd", 1), ("kcw", 2), ("art", 3), ("hxm", 4),
-             ("qrt", 5), ("pad", 6), ("hoy", 7)]
-        self.assertEqual(json.loads(s), eval(s))
-        self.assertEqual(json.loads(s, object_pairs_hook=lambda x: x), p)
-        self.assertEqual(json.load(StringIO(s),
-                                   object_pairs_hook=lambda x: x), p)
-        od = json.loads(s, object_pairs_hook=OrderedDict)
-        self.assertEqual(od, OrderedDict(p))
-        self.assertEqual(type(od), OrderedDict)
-        # the object_pairs_hook takes priority over the object_hook
-        self.assertEqual(json.loads(s,
-                                    object_pairs_hook=OrderedDict,
-                                    object_hook=lambda x: None),
-                         OrderedDict(p))
-
-    def check_keys_reuse(self, source, loads):
-        rval = loads(source)
-        (a, b), (c, d) = sorted(rval[0]), sorted(rval[1])
-        self.assertIs(a, c)
-        self.assertIs(b, d)
-
-    def test_keys_reuse_str(self):
-        s = u'[{"a_key": 1, "b_\xe9": 2}, {"a_key": 3, "b_\xe9": 4}]'.encode('utf8')
-        self.check_keys_reuse(s, json.loads)
-
-    def test_keys_reuse_unicode(self):
-        s = u'[{"a_key": 1, "b_\xe9": 2}, {"a_key": 3, "b_\xe9": 4}]'
-        self.check_keys_reuse(s, json.loads)
-
-    def test_empty_strings(self):
-        self.assertEqual(json.loads('""'), "")
-        self.assertEqual(json.loads(u'""'), u"")
-        self.assertEqual(json.loads('[""]'), [""])
-        self.assertEqual(json.loads(u'[""]'), [u""])
diff --git a/simplejson/tests/test_default.py b/simplejson/tests/test_default.py
deleted file mode 100644
index 139e42b..0000000
--- a/simplejson/tests/test_default.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from unittest import TestCase
-
-import simplejson as json
-
-class TestDefault(TestCase):
-    def test_default(self):
-        self.assertEquals(
-            json.dumps(type, default=repr),
-            json.dumps(repr(type)))
diff --git a/simplejson/tests/test_dump.py b/simplejson/tests/test_dump.py
deleted file mode 100644
index 8b34004..0000000
--- a/simplejson/tests/test_dump.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from unittest import TestCase
-from cStringIO import StringIO
-
-import simplejson as json
-
-class TestDump(TestCase):
-    def test_dump(self):
-        sio = StringIO()
-        json.dump({}, sio)
-        self.assertEquals(sio.getvalue(), '{}')
-
-    def test_dumps(self):
-        self.assertEquals(json.dumps({}), '{}')
-
-    def test_encode_truefalse(self):
-        self.assertEquals(json.dumps(
-                 {True: False, False: True}, sort_keys=True),
-                 '{"false": true, "true": false}')
-        self.assertEquals(json.dumps(
-                {2: 3.0, 4.0: 5L, False: 1, 6L: True, "7": 0}, sort_keys=True),
-                '{"false": 1, "2": 3.0, "4.0": 5, "6": true, "7": 0}')
-
-    def test_ordered_dict(self):
-        # http://bugs.python.org/issue6105
-        items = [('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]
-        s = json.dumps(json.OrderedDict(items))
-        self.assertEqual(s, '{"one": 1, "two": 2, "three": 3, "four": 4, "five": 5}')
\ No newline at end of file
diff --git a/simplejson/tests/test_encode_basestring_ascii.py b/simplejson/tests/test_encode_basestring_ascii.py
deleted file mode 100644
index b19631a..0000000
--- a/simplejson/tests/test_encode_basestring_ascii.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from unittest import TestCase
-
-import simplejson.encoder
-
-CASES = [
-    (u'/\\"\ucafe\ubabe\uab98\ufcde\ubcda\uef4a\x08\x0c\n\r\t`1~!@#$%^&*()_+-=[]{}|;:\',./<>?', '"/\\\\\\"\\ucafe\\ubabe\\uab98\\ufcde\\ubcda\\uef4a\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:\',./<>?"'),
-    (u'\u0123\u4567\u89ab\ucdef\uabcd\uef4a', '"\\u0123\\u4567\\u89ab\\ucdef\\uabcd\\uef4a"'),
-    (u'controls', '"controls"'),
-    (u'\x08\x0c\n\r\t', '"\\b\\f\\n\\r\\t"'),
-    (u'{"object with 1 member":["array with 1 element"]}', '"{\\"object with 1 member\\":[\\"array with 1 element\\"]}"'),
-    (u' s p a c e d ', '" s p a c e d "'),
-    (u'\U0001d120', '"\\ud834\\udd20"'),
-    (u'\u03b1\u03a9', '"\\u03b1\\u03a9"'),
-    ('\xce\xb1\xce\xa9', '"\\u03b1\\u03a9"'),
-    (u'\u03b1\u03a9', '"\\u03b1\\u03a9"'),
-    ('\xce\xb1\xce\xa9', '"\\u03b1\\u03a9"'),
-    (u'\u03b1\u03a9', '"\\u03b1\\u03a9"'),
-    (u'\u03b1\u03a9', '"\\u03b1\\u03a9"'),
-    (u"`1~!@#$%^&*()_+-={':[,]}|;.</>?", '"`1~!@#$%^&*()_+-={\':[,]}|;.</>?"'),
-    (u'\x08\x0c\n\r\t', '"\\b\\f\\n\\r\\t"'),
-    (u'\u0123\u4567\u89ab\ucdef\uabcd\uef4a', '"\\u0123\\u4567\\u89ab\\ucdef\\uabcd\\uef4a"'),
-]
-
-class TestEncodeBaseStringAscii(TestCase):
-    def test_py_encode_basestring_ascii(self):
-        self._test_encode_basestring_ascii(simplejson.encoder.py_encode_basestring_ascii)
-
-    def test_c_encode_basestring_ascii(self):
-        if not simplejson.encoder.c_encode_basestring_ascii:
-            return
-        self._test_encode_basestring_ascii(simplejson.encoder.c_encode_basestring_ascii)
-
-    def _test_encode_basestring_ascii(self, encode_basestring_ascii):
-        fname = encode_basestring_ascii.__name__
-        for input_string, expect in CASES:
-            result = encode_basestring_ascii(input_string)
-            #self.assertEquals(result, expect,
-            #    '{0!r} != {1!r} for {2}({3!r})'.format(
-            #        result, expect, fname, input_string))
-            self.assertEquals(result, expect,
-                '%r != %r for %s(%r)' % (result, expect, fname, input_string))
diff --git a/simplejson/tests/test_encode_for_html.py b/simplejson/tests/test_encode_for_html.py
deleted file mode 100644
index c2d5f80..0000000
--- a/simplejson/tests/test_encode_for_html.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import unittest
-
-import simplejson.decoder
-import simplejson.encoder
-
-
-class TestEncodeForHTML(unittest.TestCase):
-
-    def setUp(self):
-        self.decoder = simplejson.decoder.JSONDecoder()
-        self.encoder = simplejson.encoder.JSONEncoderForHTML()
-
-    def test_basic_encode(self):
-        self.assertEqual(r'"\u0026"', self.encoder.encode('&'))
-        self.assertEqual(r'"\u003c"', self.encoder.encode('<'))
-        self.assertEqual(r'"\u003e"', self.encoder.encode('>'))
-
-    def test_basic_roundtrip(self):
-        for char in '&<>':
-            self.assertEqual(
-                char, self.decoder.decode(
-                    self.encoder.encode(char)))
-
-    def test_prevent_script_breakout(self):
-        bad_string = '</script><script>alert("gotcha")</script>'
-        self.assertEqual(
-            r'"\u003c/script\u003e\u003cscript\u003e'
-            r'alert(\"gotcha\")\u003c/script\u003e"',
-            self.encoder.encode(bad_string))
-        self.assertEqual(
-            bad_string, self.decoder.decode(
-                self.encoder.encode(bad_string)))
diff --git a/simplejson/tests/test_fail.py b/simplejson/tests/test_fail.py
deleted file mode 100644
index 646c0f4..0000000
--- a/simplejson/tests/test_fail.py
+++ /dev/null
@@ -1,91 +0,0 @@
-from unittest import TestCase
-
-import simplejson as json
-
-# Fri Dec 30 18:57:26 2005
-JSONDOCS = [
-    # http://json.org/JSON_checker/test/fail1.json
-    '"A JSON payload should be an object or array, not a string."',
-    # http://json.org/JSON_checker/test/fail2.json
-    '["Unclosed array"',
-    # http://json.org/JSON_checker/test/fail3.json
-    '{unquoted_key: "keys must be quoted}',
-    # http://json.org/JSON_checker/test/fail4.json
-    '["extra comma",]',
-    # http://json.org/JSON_checker/test/fail5.json
-    '["double extra comma",,]',
-    # http://json.org/JSON_checker/test/fail6.json
-    '[   , "<-- missing value"]',
-    # http://json.org/JSON_checker/test/fail7.json
-    '["Comma after the close"],',
-    # http://json.org/JSON_checker/test/fail8.json
-    '["Extra close"]]',
-    # http://json.org/JSON_checker/test/fail9.json
-    '{"Extra comma": true,}',
-    # http://json.org/JSON_checker/test/fail10.json
-    '{"Extra value after close": true} "misplaced quoted value"',
-    # http://json.org/JSON_checker/test/fail11.json
-    '{"Illegal expression": 1 + 2}',
-    # http://json.org/JSON_checker/test/fail12.json
-    '{"Illegal invocation": alert()}',
-    # http://json.org/JSON_checker/test/fail13.json
-    '{"Numbers cannot have leading zeroes": 013}',
-    # http://json.org/JSON_checker/test/fail14.json
-    '{"Numbers cannot be hex": 0x14}',
-    # http://json.org/JSON_checker/test/fail15.json
-    '["Illegal backslash escape: \\x15"]',
-    # http://json.org/JSON_checker/test/fail16.json
-    '["Illegal backslash escape: \\\'"]',
-    # http://json.org/JSON_checker/test/fail17.json
-    '["Illegal backslash escape: \\017"]',
-    # http://json.org/JSON_checker/test/fail18.json
-    '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]',
-    # http://json.org/JSON_checker/test/fail19.json
-    '{"Missing colon" null}',
-    # http://json.org/JSON_checker/test/fail20.json
-    '{"Double colon":: null}',
-    # http://json.org/JSON_checker/test/fail21.json
-    '{"Comma instead of colon", null}',
-    # http://json.org/JSON_checker/test/fail22.json
-    '["Colon instead of comma": false]',
-    # http://json.org/JSON_checker/test/fail23.json
-    '["Bad value", truth]',
-    # http://json.org/JSON_checker/test/fail24.json
-    "['single quote']",
-    # http://code.google.com/p/simplejson/issues/detail?id=3
-    u'["A\u001FZ control characters in string"]',
-]
-
-SKIPS = {
-    1: "why not have a string payload?",
-    18: "spec doesn't specify any nesting limitations",
-}
-
-class TestFail(TestCase):
-    def test_failures(self):
-        for idx, doc in enumerate(JSONDOCS):
-            idx = idx + 1
-            if idx in SKIPS:
-                json.loads(doc)
-                continue
-            try:
-                json.loads(doc)
-            except json.JSONDecodeError:
-                pass
-            else:
-                #self.fail("Expected failure for fail{0}.json: {1!r}".format(idx, doc))
-                self.fail("Expected failure for fail%d.json: %r" % (idx, doc))
-
-    def test_array_decoder_issue46(self):
-        # http://code.google.com/p/simplejson/issues/detail?id=46
-        for doc in [u'[,]', '[,]']:
-            try:
-                json.loads(doc)
-            except json.JSONDecodeError, e:
-                self.assertEquals(e.pos, 1)
-                self.assertEquals(e.lineno, 1)
-                self.assertEquals(e.colno, 1)
-            except Exception, e:
-                self.fail("Unexpected exception raised %r %s" % (e, e))
-            else:
-                self.fail("Unexpected success parsing '[,]'")
\ No newline at end of file
diff --git a/simplejson/tests/test_float.py b/simplejson/tests/test_float.py
deleted file mode 100644
index 94502c6..0000000
--- a/simplejson/tests/test_float.py
+++ /dev/null
@@ -1,19 +0,0 @@
-import math
-from unittest import TestCase
-
-import simplejson as json
-
-class TestFloat(TestCase):
-    def test_floats(self):
-        for num in [1617161771.7650001, math.pi, math.pi**100,
-                    math.pi**-100, 3.1]:
-            self.assertEquals(float(json.dumps(num)), num)
-            self.assertEquals(json.loads(json.dumps(num)), num)
-            self.assertEquals(json.loads(unicode(json.dumps(num))), num)
-
-    def test_ints(self):
-        for num in [1, 1L, 1<<32, 1<<64]:
-            self.assertEquals(json.dumps(num), str(num))
-            self.assertEquals(int(json.dumps(num)), num)
-            self.assertEquals(json.loads(json.dumps(num)), num)
-            self.assertEquals(json.loads(unicode(json.dumps(num))), num)
diff --git a/simplejson/tests/test_indent.py b/simplejson/tests/test_indent.py
deleted file mode 100644
index 985831b..0000000
--- a/simplejson/tests/test_indent.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from unittest import TestCase
-
-import simplejson as json
-import textwrap
-
-class TestIndent(TestCase):
-    def test_indent(self):
-        h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh',
-             'i-vhbjkhnth',
-             {'nifty': 87}, {'field': 'yes', 'morefield': False} ]
-
-        expect = textwrap.dedent("""\
-        [
-        \t[
-        \t\t"blorpie"
-        \t],
-        \t[
-        \t\t"whoops"
-        \t],
-        \t[],
-        \t"d-shtaeou",
-        \t"d-nthiouh",
-        \t"i-vhbjkhnth",
-        \t{
-        \t\t"nifty": 87
-        \t},
-        \t{
-        \t\t"field": "yes",
-        \t\t"morefield": false
-        \t}
-        ]""")
-
-
-        d1 = json.dumps(h)
-        d2 = json.dumps(h, indent='\t', sort_keys=True, separators=(',', ': '))
-        d3 = json.dumps(h, indent='  ', sort_keys=True, separators=(',', ': '))
-        d4 = json.dumps(h, indent=2, sort_keys=True, separators=(',', ': '))
-
-        h1 = json.loads(d1)
-        h2 = json.loads(d2)
-        h3 = json.loads(d3)
-        h4 = json.loads(d4)
-
-        self.assertEquals(h1, h)
-        self.assertEquals(h2, h)
-        self.assertEquals(h3, h)
-        self.assertEquals(h4, h)
-        self.assertEquals(d3, expect.replace('\t', '  '))
-        self.assertEquals(d4, expect.replace('\t', '  '))
-        # NOTE: Python 2.4 textwrap.dedent converts tabs to spaces,
-        #       so the following is expected to fail. Python 2.4 is not a
-        #       supported platform in simplejson 2.1.0+.
-        self.assertEquals(d2, expect)
diff --git a/simplejson/tests/test_pass1.py b/simplejson/tests/test_pass1.py
deleted file mode 100644
index c3d6302..0000000
--- a/simplejson/tests/test_pass1.py
+++ /dev/null
@@ -1,76 +0,0 @@
-from unittest import TestCase
-
-import simplejson as json
-
-# from http://json.org/JSON_checker/test/pass1.json
-JSON = r'''
-[
-    "JSON Test Pattern pass1",
-    {"object with 1 member":["array with 1 element"]},
-    {},
-    [],
-    -42,
-    true,
-    false,
-    null,
-    {
-        "integer": 1234567890,
-        "real": -9876.543210,
-        "e": 0.123456789e-12,
-        "E": 1.234567890E+34,
-        "":  23456789012E666,
-        "zero": 0,
-        "one": 1,
-        "space": " ",
-        "quote": "\"",
-        "backslash": "\\",
-        "controls": "\b\f\n\r\t",
-        "slash": "/ & \/",
-        "alpha": "abcdefghijklmnopqrstuvwyz",
-        "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",
-        "digit": "0123456789",
-        "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?",
-        "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A",
-        "true": true,
-        "false": false,
-        "null": null,
-        "array":[  ],
-        "object":{  },
-        "address": "50 St. James Street",
-        "url": "http://www.JSON.org/",
-        "comment": "// /* <!-- --",
-        "# -- --> */": " ",
-        " s p a c e d " :[1,2 , 3
-
-,
-
-4 , 5        ,          6           ,7        ],
-        "compact": [1,2,3,4,5,6,7],
-        "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}",
-        "quotes": "&#34; \u0022 %22 0x22 034 &#x22;",
-        "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"
-: "A key can be any string"
-    },
-    0.5 ,98.6
-,
-99.44
-,
-
-1066
-
-
-,"rosebud"]
-'''
-
-class TestPass1(TestCase):
-    def test_parse(self):
-        # test in/out equivalence and parsing
-        res = json.loads(JSON)
-        out = json.dumps(res)
-        self.assertEquals(res, json.loads(out))
-        try:
-            json.dumps(res, allow_nan=False)
-        except ValueError:
-            pass
-        else:
-            self.fail("23456789012E666 should be out of range")
diff --git a/simplejson/tests/test_pass2.py b/simplejson/tests/test_pass2.py
deleted file mode 100644
index de4ee00..0000000
--- a/simplejson/tests/test_pass2.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from unittest import TestCase
-import simplejson as json
-
-# from http://json.org/JSON_checker/test/pass2.json
-JSON = r'''
-[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
-'''
-
-class TestPass2(TestCase):
-    def test_parse(self):
-        # test in/out equivalence and parsing
-        res = json.loads(JSON)
-        out = json.dumps(res)
-        self.assertEquals(res, json.loads(out))
diff --git a/simplejson/tests/test_pass3.py b/simplejson/tests/test_pass3.py
deleted file mode 100644
index f591aba..0000000
--- a/simplejson/tests/test_pass3.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from unittest import TestCase
-
-import simplejson as json
-
-# from http://json.org/JSON_checker/test/pass3.json
-JSON = r'''
-{
-    "JSON Test Pattern pass3": {
-        "The outermost value": "must be an object or array.",
-        "In this test": "It is an object."
-    }
-}
-'''
-
-class TestPass3(TestCase):
-    def test_parse(self):
-        # test in/out equivalence and parsing
-        res = json.loads(JSON)
-        out = json.dumps(res)
-        self.assertEquals(res, json.loads(out))
diff --git a/simplejson/tests/test_recursion.py b/simplejson/tests/test_recursion.py
deleted file mode 100644
index 97422a6..0000000
--- a/simplejson/tests/test_recursion.py
+++ /dev/null
@@ -1,67 +0,0 @@
-from unittest import TestCase
-
-import simplejson as json
-
-class JSONTestObject:
-    pass
-
-
-class RecursiveJSONEncoder(json.JSONEncoder):
-    recurse = False
-    def default(self, o):
-        if o is JSONTestObject:
-            if self.recurse:
-                return [JSONTestObject]
-            else:
-                return 'JSONTestObject'
-        return json.JSONEncoder.default(o)
-
-
-class TestRecursion(TestCase):
-    def test_listrecursion(self):
-        x = []
-        x.append(x)
-        try:
-            json.dumps(x)
-        except ValueError:
-            pass
-        else:
-            self.fail("didn't raise ValueError on list recursion")
-        x = []
-        y = [x]
-        x.append(y)
-        try:
-            json.dumps(x)
-        except ValueError:
-            pass
-        else:
-            self.fail("didn't raise ValueError on alternating list recursion")
-        y = []
-        x = [y, y]
-        # ensure that the marker is cleared
-        json.dumps(x)
-
-    def test_dictrecursion(self):
-        x = {}
-        x["test"] = x
-        try:
-            json.dumps(x)
-        except ValueError:
-            pass
-        else:
-            self.fail("didn't raise ValueError on dict recursion")
-        x = {}
-        y = {"a": x, "b": x}
-        # ensure that the marker is cleared
-        json.dumps(x)
-
-    def test_defaultrecursion(self):
-        enc = RecursiveJSONEncoder()
-        self.assertEquals(enc.encode(JSONTestObject), '"JSONTestObject"')
-        enc.recurse = True
-        try:
-            enc.encode(JSONTestObject)
-        except ValueError:
-            pass
-        else:
-            self.fail("didn't raise ValueError on default recursion")
diff --git a/simplejson/tests/test_scanstring.py b/simplejson/tests/test_scanstring.py
deleted file mode 100644
index a7fcd46..0000000
--- a/simplejson/tests/test_scanstring.py
+++ /dev/null
@@ -1,117 +0,0 @@
-import sys
-from unittest import TestCase
-
-import simplejson as json
-import simplejson.decoder
-
-class TestScanString(TestCase):
-    def test_py_scanstring(self):
-        self._test_scanstring(simplejson.decoder.py_scanstring)
-
-    def test_c_scanstring(self):
-        if not simplejson.decoder.c_scanstring:
-            return
-        self._test_scanstring(simplejson.decoder.c_scanstring)
-
-    def _test_scanstring(self, scanstring):
-        self.assertEquals(
-            scanstring('"z\\ud834\\udd20x"', 1, None, True),
-            (u'z\U0001d120x', 16))
-
-        if sys.maxunicode == 65535:
-            self.assertEquals(
-                scanstring(u'"z\U0001d120x"', 1, None, True),
-                (u'z\U0001d120x', 6))
-        else:
-            self.assertEquals(
-                scanstring(u'"z\U0001d120x"', 1, None, True),
-                (u'z\U0001d120x', 5))
-
-        self.assertEquals(
-            scanstring('"\\u007b"', 1, None, True),
-            (u'{', 8))
-
-        self.assertEquals(
-            scanstring('"A JSON payload should be an object or array, not a string."', 1, None, True),
-            (u'A JSON payload should be an object or array, not a string.', 60))
-
-        self.assertEquals(
-            scanstring('["Unclosed array"', 2, None, True),
-            (u'Unclosed array', 17))
-
-        self.assertEquals(
-            scanstring('["extra comma",]', 2, None, True),
-            (u'extra comma', 14))
-
-        self.assertEquals(
-            scanstring('["double extra comma",,]', 2, None, True),
-            (u'double extra comma', 21))
-
-        self.assertEquals(
-            scanstring('["Comma after the close"],', 2, None, True),
-            (u'Comma after the close', 24))
-
-        self.assertEquals(
-            scanstring('["Extra close"]]', 2, None, True),
-            (u'Extra close', 14))
-
-        self.assertEquals(
-            scanstring('{"Extra comma": true,}', 2, None, True),
-            (u'Extra comma', 14))
-
-        self.assertEquals(
-            scanstring('{"Extra value after close": true} "misplaced quoted value"', 2, None, True),
-            (u'Extra value after close', 26))
-
-        self.assertEquals(
-            scanstring('{"Illegal expression": 1 + 2}', 2, None, True),
-            (u'Illegal expression', 21))
-
-        self.assertEquals(
-            scanstring('{"Illegal invocation": alert()}', 2, None, True),
-            (u'Illegal invocation', 21))
-
-        self.assertEquals(
-            scanstring('{"Numbers cannot have leading zeroes": 013}', 2, None, True),
-            (u'Numbers cannot have leading zeroes', 37))
-
-        self.assertEquals(
-            scanstring('{"Numbers cannot be hex": 0x14}', 2, None, True),
-            (u'Numbers cannot be hex', 24))
-
-        self.assertEquals(
-            scanstring('[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', 21, None, True),
-            (u'Too deep', 30))
-
-        self.assertEquals(
-            scanstring('{"Missing colon" null}', 2, None, True),
-            (u'Missing colon', 16))
-
-        self.assertEquals(
-            scanstring('{"Double colon":: null}', 2, None, True),
-            (u'Double colon', 15))
-
-        self.assertEquals(
-            scanstring('{"Comma instead of colon", null}', 2, None, True),
-            (u'Comma instead of colon', 25))
-
-        self.assertEquals(
-            scanstring('["Colon instead of comma": false]', 2, None, True),
-            (u'Colon instead of comma', 25))
-
-        self.assertEquals(
-            scanstring('["Bad value", truth]', 2, None, True),
-            (u'Bad value', 12))
-
-    def test_issue3623(self):
-        self.assertRaises(ValueError, json.decoder.scanstring, "xxx", 1,
-                          "xxx")
-        self.assertRaises(UnicodeDecodeError,
-                          json.encoder.encode_basestring_ascii, "xx\xff")
-
-    def test_overflow(self):
-        # Python 2.5 does not have maxsize
-        maxsize = getattr(sys, 'maxsize', sys.maxint)
-        self.assertRaises(OverflowError, json.decoder.scanstring, "xxx",
-                          maxsize + 1)
-
diff --git a/simplejson/tests/test_separators.py b/simplejson/tests/test_separators.py
deleted file mode 100644
index cbda93c..0000000
--- a/simplejson/tests/test_separators.py
+++ /dev/null
@@ -1,42 +0,0 @@
-import textwrap
-from unittest import TestCase
-
-import simplejson as json
-
-
-class TestSeparators(TestCase):
-    def test_separators(self):
-        h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', 'i-vhbjkhnth',
-             {'nifty': 87}, {'field': 'yes', 'morefield': False} ]
-
-        expect = textwrap.dedent("""\
-        [
-          [
-            "blorpie"
-          ] ,
-          [
-            "whoops"
-          ] ,
-          [] ,
-          "d-shtaeou" ,
-          "d-nthiouh" ,
-          "i-vhbjkhnth" ,
-          {
-            "nifty" : 87
-          } ,
-          {
-            "field" : "yes" ,
-            "morefield" : false
-          }
-        ]""")
-
-
-        d1 = json.dumps(h)
-        d2 = json.dumps(h, indent='  ', sort_keys=True, separators=(' ,', ' : '))
-
-        h1 = json.loads(d1)
-        h2 = json.loads(d2)
-
-        self.assertEquals(h1, h)
-        self.assertEquals(h2, h)
-        self.assertEquals(d2, expect)
diff --git a/simplejson/tests/test_speedups.py b/simplejson/tests/test_speedups.py
deleted file mode 100644
index 4bf0875..0000000
--- a/simplejson/tests/test_speedups.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import decimal
-from unittest import TestCase
-
-from simplejson import decoder, encoder, scanner
-
-def has_speedups():
-    return encoder.c_make_encoder is not None
-
-class TestDecode(TestCase):
-    def test_make_scanner(self):
-        if not has_speedups():
-            return
-        self.assertRaises(AttributeError, scanner.c_make_scanner, 1)
-
-    def test_make_encoder(self):
-        if not has_speedups():
-            return
-        self.assertRaises(TypeError, encoder.c_make_encoder,
-            None,
-            "\xCD\x7D\x3D\x4E\x12\x4C\xF9\x79\xD7\x52\xBA\x82\xF2\x27\x4A\x7D\xA0\xCA\x75",
-            None)
diff --git a/simplejson/tests/test_unicode.py b/simplejson/tests/test_unicode.py
deleted file mode 100644
index f73e5bf..0000000
--- a/simplejson/tests/test_unicode.py
+++ /dev/null
@@ -1,99 +0,0 @@
-from unittest import TestCase
-
-import simplejson as json
-
-class TestUnicode(TestCase):
-    def test_encoding1(self):
-        encoder = json.JSONEncoder(encoding='utf-8')
-        u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
-        s = u.encode('utf-8')
-        ju = encoder.encode(u)
-        js = encoder.encode(s)
-        self.assertEquals(ju, js)
-
-    def test_encoding2(self):
-        u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
-        s = u.encode('utf-8')
-        ju = json.dumps(u, encoding='utf-8')
-        js = json.dumps(s, encoding='utf-8')
-        self.assertEquals(ju, js)
-
-    def test_encoding3(self):
-        u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
-        j = json.dumps(u)
-        self.assertEquals(j, '"\\u03b1\\u03a9"')
-
-    def test_encoding4(self):
-        u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
-        j = json.dumps([u])
-        self.assertEquals(j, '["\\u03b1\\u03a9"]')
-
-    def test_encoding5(self):
-        u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
-        j = json.dumps(u, ensure_ascii=False)
-        self.assertEquals(j, u'"' + u + u'"')
-
-    def test_encoding6(self):
-        u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
-        j = json.dumps([u], ensure_ascii=False)
-        self.assertEquals(j, u'["' + u + u'"]')
-
-    def test_big_unicode_encode(self):
-        u = u'\U0001d120'
-        self.assertEquals(json.dumps(u), '"\\ud834\\udd20"')
-        self.assertEquals(json.dumps(u, ensure_ascii=False), u'"\U0001d120"')
-
-    def test_big_unicode_decode(self):
-        u = u'z\U0001d120x'
-        self.assertEquals(json.loads('"' + u + '"'), u)
-        self.assertEquals(json.loads('"z\\ud834\\udd20x"'), u)
-
-    def test_unicode_decode(self):
-        for i in range(0, 0xd7ff):
-            u = unichr(i)
-            #s = '"\\u{0:04x}"'.format(i)
-            s = '"\\u%04x"' % (i,)
-            self.assertEquals(json.loads(s), u)
-
-    def test_object_pairs_hook_with_unicode(self):
-        s = u'{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}'
-        p = [(u"xkd", 1), (u"kcw", 2), (u"art", 3), (u"hxm", 4),
-             (u"qrt", 5), (u"pad", 6), (u"hoy", 7)]
-        self.assertEqual(json.loads(s), eval(s))
-        self.assertEqual(json.loads(s, object_pairs_hook=lambda x: x), p)
-        od = json.loads(s, object_pairs_hook=json.OrderedDict)
-        self.assertEqual(od, json.OrderedDict(p))
-        self.assertEqual(type(od), json.OrderedDict)
-        # the object_pairs_hook takes priority over the object_hook
-        self.assertEqual(json.loads(s,
-                                    object_pairs_hook=json.OrderedDict,
-                                    object_hook=lambda x: None),
-                         json.OrderedDict(p))
-
-
-    def test_default_encoding(self):
-        self.assertEquals(json.loads(u'{"a": "\xe9"}'.encode('utf-8')),
-            {'a': u'\xe9'})
-
-    def test_unicode_preservation(self):
-        self.assertEquals(type(json.loads(u'""')), unicode)
-        self.assertEquals(type(json.loads(u'"a"')), unicode)
-        self.assertEquals(type(json.loads(u'["a"]')[0]), unicode)
-
-    def test_ensure_ascii_false_returns_unicode(self):
-        # http://code.google.com/p/simplejson/issues/detail?id=48
-        self.assertEquals(type(json.dumps([], ensure_ascii=False)), unicode)
-        self.assertEquals(type(json.dumps(0, ensure_ascii=False)), unicode)
-        self.assertEquals(type(json.dumps({}, ensure_ascii=False)), unicode)
-        self.assertEquals(type(json.dumps("", ensure_ascii=False)), unicode)
-
-    def test_ensure_ascii_false_bytestring_encoding(self):
-        # http://code.google.com/p/simplejson/issues/detail?id=48
-        doc1 = {u'quux': 'Arr\xc3\xaat sur images'}
-        doc2 = {u'quux': u'Arr\xeat sur images'}
-        doc_ascii = '{"quux": "Arr\\u00eat sur images"}'
-        doc_unicode = u'{"quux": "Arr\xeat sur images"}'
-        self.assertEquals(json.dumps(doc1), doc_ascii)
-        self.assertEquals(json.dumps(doc2), doc_ascii)
-        self.assertEquals(json.dumps(doc1, ensure_ascii=False), doc_unicode)
-        self.assertEquals(json.dumps(doc2, ensure_ascii=False), doc_unicode)
diff --git a/simplejson/tool.py b/simplejson/tool.py
deleted file mode 100644
index 73370db..0000000
--- a/simplejson/tool.py
+++ /dev/null
@@ -1,39 +0,0 @@
-r"""Command-line tool to validate and pretty-print JSON
-
-Usage::
-
-    $ echo '{"json":"obj"}' | python -m simplejson.tool
-    {
-        "json": "obj"
-    }
-    $ echo '{ 1.2:3.4}' | python -m simplejson.tool
-    Expecting property name: line 1 column 2 (char 2)
-
-"""
-import sys
-import simplejson as json
-
-def main():
-    if len(sys.argv) == 1:
-        infile = sys.stdin
-        outfile = sys.stdout
-    elif len(sys.argv) == 2:
-        infile = open(sys.argv[1], 'rb')
-        outfile = sys.stdout
-    elif len(sys.argv) == 3:
-        infile = open(sys.argv[1], 'rb')
-        outfile = open(sys.argv[2], 'wb')
-    else:
-        raise SystemExit(sys.argv[0] + " [infile [outfile]]")
-    try:
-        obj = json.load(infile,
-                        object_pairs_hook=json.OrderedDict,
-                        use_decimal=True)
-    except ValueError, e:
-        raise SystemExit(e)
-    json.dump(obj, outfile, sort_keys=True, indent='    ', use_decimal=True)
-    outfile.write('\n')
-
-
-if __name__ == '__main__':
-    main()
diff --git a/tests/data/buzz.json b/tests/data/buzz.json
deleted file mode 100644
index cd121a2..0000000
--- a/tests/data/buzz.json
+++ /dev/null
@@ -1,3727 +0,0 @@
-{
- "kind": "discovery#restDescription",
- "id": "buzz:v1",
- "name": "buzz",
- "version": "v1",
- "title": "Buzz API",
- "description": "Lets you share updates, photos, videos, and more with your friends around the world",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/buzz-16.png",
-  "x32": "http://www.google.com/images/icons/product/buzz-32.png"
- },
- "documentationLink": "http://code.google.com/apis/buzz/v1/using_rest.html",
- "labels": [
-  "labs"
- ],
- "protocol": "rest",
- "basePath": "/buzz/v1/",
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/buzz": {
-     "description": "Manage your Buzz activity and address book"
-    },
-    "https://www.googleapis.com/auth/buzz.readonly": {
-     "description": "View your Buzz activity and address book"
-    },
-    "https://www.googleapis.com/auth/picasa": {
-     "description": "Manage your photos and videos"
-    }
-   }
-  }
- },
- "features": [
-  "dataWrapper"
- ],
- "schemas": {
-  "Activity": {
-   "id": "Activity",
-   "type": "object",
-   "properties": {
-    "actor": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "any"
-      },
-      "name": {
-       "type": "any"
-      },
-      "profileUrl": {
-       "type": "any"
-      },
-      "thumbnailUrl": {
-       "type": "any"
-      }
-     }
-    },
-    "address": {
-     "type": "any"
-    },
-    "annotation": {
-     "type": "any"
-    },
-    "categories": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "label": {
-        "type": "any"
-       },
-       "schema": {
-        "type": "any"
-       },
-       "term": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "crosspostSource": {
-     "type": "any"
-    },
-    "detectedlLang": {
-     "type": "any"
-    },
-    "geocode": {
-     "type": "any"
-    },
-    "id": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#activity"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "liked": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "count": {
-          "type": "integer"
-         },
-         "href": {
-          "type": "any"
-         },
-         "type": {
-          "type": "any"
-         }
-        }
-       }
-      }
-     },
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "object": {
-     "type": "object",
-     "properties": {
-      "actor": {
-       "type": "object",
-       "properties": {
-        "id": {
-         "type": "any"
-        },
-        "name": {
-         "type": "any"
-        },
-        "profileUrl": {
-         "type": "any"
-        },
-        "thumbnailUrl": {
-         "type": "any"
-        }
-       }
-      },
-      "attachments": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "content": {
-          "type": "any"
-         },
-         "id": {
-          "type": "any"
-         },
-         "links": {
-          "type": "object",
-          "additionalProperties": {
-           "type": "array",
-           "items": {
-            "type": "object",
-            "properties": {
-             "count": {
-              "type": "any"
-             },
-             "height": {
-              "type": "any"
-             },
-             "href": {
-              "type": "any"
-             },
-             "title": {
-              "type": "any"
-             },
-             "type": {
-              "type": "any"
-             },
-             "updated": {
-              "type": "string"
-             },
-             "width": {
-              "type": "any"
-             }
-            }
-           }
-          }
-         },
-         "title": {
-          "type": "any"
-         },
-         "type": {
-          "type": "string"
-         }
-        }
-       }
-      },
-      "comments": {
-       "type": "array",
-       "items": {
-        "$ref": "Comment"
-       }
-      },
-      "content": {
-       "type": "any"
-      },
-      "detectedlLang": {
-       "type": "any"
-      },
-      "id": {
-       "type": "any"
-      },
-      "liked": {
-       "type": "array",
-       "items": {
-        "$ref": "Person"
-       }
-      },
-      "links": {
-       "type": "object",
-       "additionalProperties": {
-        "type": "array",
-        "items": {
-         "type": "object",
-         "properties": {
-          "href": {
-           "type": "any"
-          },
-          "type": {
-           "type": "any"
-          }
-         }
-        }
-       }
-      },
-      "originalContent": {
-       "type": "any"
-      },
-      "shareOriginal": {
-       "$ref": "Activity"
-      },
-      "targetLang": {
-       "type": "any"
-      },
-      "type": {
-       "type": "string"
-      },
-      "untranslatedContent": {
-       "type": "any"
-      }
-     }
-    },
-    "placeId": {
-     "type": "any"
-    },
-    "placeName": {
-     "type": "any"
-    },
-    "placeholder": {
-     "type": "any"
-    },
-    "published": {
-     "type": "string"
-    },
-    "radius": {
-     "type": "any"
-    },
-    "source": {
-     "type": "object",
-     "properties": {
-      "title": {
-       "type": "any"
-      }
-     }
-    },
-    "targetLang": {
-     "type": "any"
-    },
-    "title": {
-     "type": "any"
-    },
-    "untranslatedTitle": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    },
-    "verbs": {
-     "type": "array",
-     "items": {
-      "type": "string"
-     }
-    },
-    "visibility": {
-     "type": "object",
-     "properties": {
-      "entries": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "id": {
-          "type": "any"
-         },
-         "title": {
-          "type": "any"
-         }
-        }
-       }
-      }
-     }
-    }
-   }
-  },
-  "ActivityFeed": {
-   "id": "ActivityFeed",
-   "type": "object",
-   "properties": {
-    "id": {
-     "type": "any"
-    },
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Activity"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#activityFeed"
-    },
-    "links": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "title": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    }
-   }
-  },
-  "Album": {
-   "id": "Album",
-   "type": "object",
-   "properties": {
-    "created": {
-     "type": "string"
-    },
-    "description": {
-     "type": "string"
-    },
-    "firstPhotoId": {
-     "type": "integer"
-    },
-    "id": {
-     "type": "integer"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#album"
-    },
-    "lastModified": {
-     "type": "string"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "alternate": {
-       "$ref": "Link"
-      },
-      "enclosure": {
-       "$ref": "Link"
-      }
-     }
-    },
-    "owner": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "string"
-      },
-      "name": {
-       "type": "string"
-      },
-      "profileUrl": {
-       "type": "string"
-      },
-      "thumbnailUrl": {
-       "type": "string"
-      }
-     }
-    },
-    "tags": {
-     "type": "array",
-     "items": {
-      "type": "string"
-     }
-    },
-    "title": {
-     "type": "string"
-    },
-    "version": {
-     "type": "integer"
-    }
-   }
-  },
-  "AlbumLite": {
-   "id": "AlbumLite",
-   "type": "object",
-   "properties": {
-    "collection": {
-     "type": "object",
-     "properties": {
-      "album": {
-       "type": "any"
-      },
-      "albumId": {
-       "type": "any"
-      },
-      "photo": {
-       "type": "object",
-       "properties": {
-        "photoUrl": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#albumLite"
-    }
-   }
-  },
-  "AlbumsFeed": {
-   "id": "AlbumsFeed",
-   "type": "object",
-   "properties": {
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Album"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#albumsFeed"
-    }
-   }
-  },
-  "ChiliPhotosResourceJson": {
-   "id": "ChiliPhotosResourceJson",
-   "type": "object",
-   "properties": {
-    "album": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "integer"
-      },
-      "page_link": {
-       "$ref": "Link"
-      }
-     }
-    },
-    "created": {
-     "type": "string"
-    },
-    "description": {
-     "type": "string"
-    },
-    "fileSize": {
-     "type": "integer"
-    },
-    "id": {
-     "type": "integer"
-    },
-    "kind": {
-     "type": "string"
-    },
-    "lastModified": {
-     "type": "string"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "alternate": {
-       "type": "array",
-       "items": {
-        "$ref": "Link"
-       }
-      }
-     },
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "$ref": "Link"
-      }
-     }
-    },
-    "owner": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "string"
-      },
-      "name": {
-       "type": "string"
-      },
-      "profileUrl": {
-       "type": "string"
-      },
-      "thumbnailUrl": {
-       "type": "string"
-      }
-     }
-    },
-    "timestamp": {
-     "type": "number"
-    },
-    "title": {
-     "type": "string"
-    },
-    "version": {
-     "type": "integer"
-    },
-    "video": {
-     "$ref": "Video"
-    }
-   }
-  },
-  "Comment": {
-   "id": "Comment",
-   "type": "object",
-   "properties": {
-    "actor": {
-     "type": "object",
-     "properties": {
-      "id": {
-       "type": "any"
-      },
-      "name": {
-       "type": "any"
-      },
-      "profileUrl": {
-       "type": "any"
-      },
-      "thumbnailUrl": {
-       "type": "any"
-      }
-     }
-    },
-    "content": {
-     "type": "any"
-    },
-    "detectedLang": {
-     "type": "any"
-    },
-    "id": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#comment"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "inReplyTo": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "href": {
-          "type": "any"
-         },
-         "ref": {
-          "type": "any"
-         },
-         "source": {
-          "type": "any"
-         }
-        }
-       }
-      }
-     },
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "originalContent": {
-     "type": "any"
-    },
-    "placeholder": {
-     "type": "any"
-    },
-    "published": {
-     "type": "string"
-    },
-    "targetLang": {
-     "type": "any"
-    },
-    "untranslatedContent": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    }
-   }
-  },
-  "CommentFeed": {
-   "id": "CommentFeed",
-   "type": "object",
-   "properties": {
-    "id": {
-     "type": "any"
-    },
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Comment"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#commentFeed"
-    },
-    "links": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "title": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    }
-   }
-  },
-  "CountFeed": {
-   "id": "CountFeed",
-   "type": "object",
-   "properties": {
-    "counts": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "timestamp": {
-         "type": "string"
-        }
-       }
-      }
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#countFeed"
-    }
-   }
-  },
-  "Group": {
-   "id": "Group",
-   "type": "object",
-   "properties": {
-    "id": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#group"
-    },
-    "links": {
-     "type": "object",
-     "properties": {
-      "self": {
-       "type": "array",
-       "items": {
-        "type": "object",
-        "properties": {
-         "href": {
-          "type": "any"
-         },
-         "type": {
-          "type": "string",
-          "default": "application/json"
-         }
-        }
-       }
-      }
-     }
-    },
-    "memberCount": {
-     "type": "any"
-    },
-    "title": {
-     "type": "any"
-    }
-   }
-  },
-  "GroupFeed": {
-   "id": "GroupFeed",
-   "type": "object",
-   "properties": {
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Group"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#groupFeed"
-    },
-    "links": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    }
-   }
-  },
-  "Link": {
-   "id": "Link",
-   "type": "object",
-   "properties": {
-    "count": {
-     "type": "integer"
-    },
-    "height": {
-     "type": "integer"
-    },
-    "href": {
-     "type": "string"
-    },
-    "title": {
-     "type": "string"
-    },
-    "type": {
-     "type": "string"
-    },
-    "updated": {
-     "type": "string"
-    },
-    "width": {
-     "type": "integer"
-    }
-   }
-  },
-  "PeopleFeed": {
-   "id": "PeopleFeed",
-   "type": "object",
-   "properties": {
-    "entry": {
-     "type": "array",
-     "items": {
-      "$ref": "Person"
-     }
-    },
-    "itemsPerPage": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#peopleFeed"
-    },
-    "startIndex": {
-     "type": "any"
-    },
-    "totalResults": {
-     "type": "any"
-    }
-   }
-  },
-  "Person": {
-   "id": "Person",
-   "type": "object",
-   "properties": {
-    "aboutMe": {
-     "type": "any"
-    },
-    "accounts": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "domain": {
-        "type": "any"
-       },
-       "userid": {
-        "type": "any"
-       },
-       "username": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "activities": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "addresses": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "country": {
-        "type": "any"
-       },
-       "formatted": {
-        "type": "any"
-       },
-       "locality": {
-        "type": "any"
-       },
-       "postalCode": {
-        "type": "any"
-       },
-       "primary": {
-        "type": "any"
-       },
-       "region": {
-        "type": "any"
-       },
-       "streetAddress": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "anniversary": {
-     "type": "any"
-    },
-    "birthday": {
-     "type": "any"
-    },
-    "bodyType": {
-     "type": "any"
-    },
-    "books": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "cars": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "children": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "connected": {
-     "type": "any"
-    },
-    "currentLocation": {
-     "type": "any"
-    },
-    "displayName": {
-     "type": "any"
-    },
-    "drinker": {
-     "type": "any"
-    },
-    "emails": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "ethnicity": {
-     "type": "any"
-    },
-    "fashion": {
-     "type": "any"
-    },
-    "food": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "gender": {
-     "type": "any"
-    },
-    "happiestWhen": {
-     "type": "any"
-    },
-    "hasApp": {
-     "type": "any"
-    },
-    "heroes": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "humor": {
-     "type": "any"
-    },
-    "id": {
-     "type": "any"
-    },
-    "ims": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "interests": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "jobInterests": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#person"
-    },
-    "languages": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "languagesSpoken": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "livingArrangement": {
-     "type": "any"
-    },
-    "lookingFor": {
-     "type": "any"
-    },
-    "movies": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "music": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "name": {
-     "type": "object",
-     "properties": {
-      "familyName": {
-       "type": "any"
-      },
-      "formatted": {
-       "type": "any"
-      },
-      "givenName": {
-       "type": "any"
-      },
-      "honorificPrefix": {
-       "type": "any"
-      },
-      "honorificSuffix": {
-       "type": "any"
-      },
-      "middleName": {
-       "type": "any"
-      }
-     }
-    },
-    "nickname": {
-     "type": "any"
-    },
-    "note": {
-     "type": "any"
-    },
-    "organizations": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "department": {
-        "type": "any"
-       },
-       "description": {
-        "type": "any"
-       },
-       "endDate": {
-        "type": "any"
-       },
-       "location": {
-        "type": "any"
-       },
-       "name": {
-        "type": "any"
-       },
-       "primary": {
-        "type": "any"
-       },
-       "startDate": {
-        "type": "any"
-       },
-       "title": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "pets": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "phoneNumbers": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "photos": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "height": {
-        "type": "any"
-       },
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       },
-       "width": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "politicalViews": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "preferredUsername": {
-     "type": "any"
-    },
-    "profileSong": {
-     "type": "any"
-    },
-    "profileUrl": {
-     "type": "any"
-    },
-    "profileVideo": {
-     "type": "any"
-    },
-    "published": {
-     "type": "string"
-    },
-    "quotes": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "relationshipStatus": {
-     "type": "any"
-    },
-    "relationships": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "religion": {
-     "type": "any"
-    },
-    "romance": {
-     "type": "any"
-    },
-    "scaredOf": {
-     "type": "any"
-    },
-    "sexualOrientation": {
-     "type": "any"
-    },
-    "smoker": {
-     "type": "any"
-    },
-    "sports": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "status": {
-     "type": "any"
-    },
-    "tags": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "thumbnailUrl": {
-     "type": "any"
-    },
-    "turnOffs": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "turnOns": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "tvShows": {
-     "type": "array",
-     "items": {
-      "type": "any"
-     }
-    },
-    "updated": {
-     "type": "string"
-    },
-    "urls": {
-     "type": "array",
-     "items": {
-      "type": "object",
-      "properties": {
-       "primary": {
-        "type": "any"
-       },
-       "type": {
-        "type": "any"
-       },
-       "value": {
-        "type": "any"
-       }
-      }
-     }
-    },
-    "utcOffset": {
-     "type": "any"
-    }
-   }
-  },
-  "PhotosFeed": {
-   "id": "PhotosFeed",
-   "type": "object",
-   "properties": {
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "ChiliPhotosResourceJson"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#photosFeed"
-    }
-   }
-  },
-  "Related": {
-   "id": "Related",
-   "type": "object",
-   "properties": {
-    "href": {
-     "type": "any"
-    },
-    "id": {
-     "type": "any"
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#related"
-    },
-    "summary": {
-     "type": "any"
-    },
-    "title": {
-     "type": "any"
-    }
-   }
-  },
-  "RelatedFeed": {
-   "id": "RelatedFeed",
-   "type": "object",
-   "properties": {
-    "id": {
-     "type": "any"
-    },
-    "items": {
-     "type": "array",
-     "items": {
-      "$ref": "Related"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "default": "buzz#relatedFeed"
-    },
-    "links": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "array",
-      "items": {
-       "type": "object",
-       "properties": {
-        "count": {
-         "type": "any"
-        },
-        "height": {
-         "type": "any"
-        },
-        "href": {
-         "type": "any"
-        },
-        "title": {
-         "type": "any"
-        },
-        "type": {
-         "type": "any"
-        },
-        "updated": {
-         "type": "string"
-        },
-        "width": {
-         "type": "any"
-        }
-       }
-      }
-     }
-    },
-    "title": {
-     "type": "any"
-    },
-    "updated": {
-     "type": "string"
-    }
-   }
-  },
-  "Video": {
-   "id": "Video",
-   "type": "object",
-   "properties": {
-    "duration": {
-     "type": "integer"
-    },
-    "size": {
-     "type": "integer"
-    },
-    "status": {
-     "type": "string"
-    },
-    "streams": {
-     "type": "array",
-     "items": {
-      "$ref": "Link"
-     }
-    }
-   }
-  }
- },
- "resources": {
-  "activities": {
-   "methods": {
-    "count": {
-     "id": "chili.activities.count",
-     "path": "activities/count",
-     "httpMethod": "GET",
-     "description": "Get a count of link shares",
-     "parameters": {
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "url": {
-       "type": "string",
-       "description": "URLs for which to get share counts.",
-       "repeated": true,
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "CountFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "delete": {
-     "id": "chili.activities.delete",
-     "path": "activities/{userId}/{scope}/{postId}",
-     "httpMethod": "DELETE",
-     "description": "Delete an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity to delete.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@liked",
-        "@muted",
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Activities liked by the user.",
-        "Activities muted by the user.",
-        "Activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user whose post to delete.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "extractPeopleFromSearch": {
-     "id": "chili.activities.extractPeopleFromSearch",
-     "path": "activities/search/@people",
-     "httpMethod": "GET",
-     "description": "Search for people by topic",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "bbox": {
-       "type": "string",
-       "description": "Bounding box to use in a geographic location query.",
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "lat": {
-       "type": "string",
-       "description": "Latitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "lon": {
-       "type": "string",
-       "description": "Longitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "pid": {
-       "type": "string",
-       "description": "ID of a place to use in a geographic location query.",
-       "location": "query"
-      },
-      "q": {
-       "type": "string",
-       "description": "Full-text search query string.",
-       "location": "query"
-      },
-      "radius": {
-       "type": "string",
-       "description": "Radius to use in a geographic location query.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "get": {
-     "id": "chili.activities.get",
-     "path": "activities/{userId}/@self/{postId}",
-     "httpMethod": "GET",
-     "description": "Get an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-comments": {
-       "type": "integer",
-       "description": "Maximum number of comments to include.",
-       "default": "0",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "max-liked": {
-       "type": "integer",
-       "description": "Maximum number of likes to include.",
-       "default": "0",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the post to get.",
-       "required": true,
-       "location": "path"
-      },
-      "truncateAtom": {
-       "type": "boolean",
-       "description": "Truncate the value of the atom:content element.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user whose post to get.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "postId"
-     ],
-     "response": {
-      "$ref": "Activity"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "insert": {
-     "id": "chili.activities.insert",
-     "path": "activities/{userId}/@self",
-     "httpMethod": "POST",
-     "description": "Create a new activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "preview": {
-       "type": "boolean",
-       "description": "If true, only preview the action.",
-       "default": "false",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "request": {
-      "$ref": "Activity"
-     },
-     "response": {
-      "$ref": "Activity"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "list": {
-     "id": "chili.activities.list",
-     "path": "activities/{userId}/{scope}",
-     "httpMethod": "GET",
-     "description": "List activities",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-comments": {
-       "type": "integer",
-       "description": "Maximum number of comments to include.",
-       "default": "0",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "max-liked": {
-       "type": "integer",
-       "description": "Maximum number of likes to include.",
-       "default": "0",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection of activities to list.",
-       "required": true,
-       "enum": [
-        "@comments",
-        "@consumption",
-        "@liked",
-        "@public",
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Limit to activities commented on by the user.",
-        "Limit to activities to be consumed by the user.",
-        "Limit to activities liked by the user.",
-        "Limit to public activities posted by the user.",
-        "Limit to activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "truncateAtom": {
-       "type": "boolean",
-       "description": "Truncate the value of the atom:content element.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope"
-     ],
-     "response": {
-      "$ref": "ActivityFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "search": {
-     "id": "chili.activities.search",
-     "path": "activities/search",
-     "httpMethod": "GET",
-     "description": "Search for activities",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "bbox": {
-       "type": "string",
-       "description": "Bounding box to use in a geographic location query.",
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "lat": {
-       "type": "string",
-       "description": "Latitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "lon": {
-       "type": "string",
-       "description": "Longitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "pid": {
-       "type": "string",
-       "description": "ID of a place to use in a geographic location query.",
-       "location": "query"
-      },
-      "q": {
-       "type": "string",
-       "description": "Full-text search query string.",
-       "location": "query"
-      },
-      "radius": {
-       "type": "string",
-       "description": "Radius to use in a geographic location query.",
-       "location": "query"
-      },
-      "truncateAtom": {
-       "type": "boolean",
-       "description": "Truncate the value of the atom:content element.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "ActivityFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "track": {
-     "id": "chili.activities.track",
-     "path": "activities/track",
-     "httpMethod": "GET",
-     "description": "Get real-time activity tracking information",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "bbox": {
-       "type": "string",
-       "description": "Bounding box to use in a geographic location query.",
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "lat": {
-       "type": "string",
-       "description": "Latitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "lon": {
-       "type": "string",
-       "description": "Longitude to use in a geographic location query.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "pid": {
-       "type": "string",
-       "description": "ID of a place to use in a geographic location query.",
-       "location": "query"
-      },
-      "q": {
-       "type": "string",
-       "description": "Full-text search query string.",
-       "location": "query"
-      },
-      "radius": {
-       "type": "string",
-       "description": "Radius to use in a geographic location query.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "ActivityFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "update": {
-     "id": "chili.activities.update",
-     "path": "activities/{userId}/{scope}/{postId}",
-     "httpMethod": "PUT",
-     "description": "Update an activity",
-     "parameters": {
-      "abuseType": {
-       "type": "string",
-       "location": "query"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity to update.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@abuse",
-        "@liked",
-        "@muted",
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Activities reported by the user.",
-        "Activities liked by the user.",
-        "Activities muted by the user.",
-        "Activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user whose post to update.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId"
-     ],
-     "request": {
-      "$ref": "Activity"
-     },
-     "response": {
-      "$ref": "Activity"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    }
-   }
-  },
-  "comments": {
-   "methods": {
-    "delete": {
-     "id": "chili.comments.delete",
-     "path": "activities/{userId}/@self/{postId}/@comments/{commentId}",
-     "httpMethod": "DELETE",
-     "description": "Delete a comment",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "commentId": {
-       "type": "string",
-       "description": "ID of the comment being referenced.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity for which to delete the comment.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "postId",
-      "commentId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "get": {
-     "id": "chili.comments.get",
-     "path": "activities/{userId}/@self/{postId}/@comments/{commentId}",
-     "httpMethod": "GET",
-     "description": "Get a comment",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "commentId": {
-       "type": "string",
-       "description": "ID of the comment being referenced.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity for which to get comments.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "postId",
-      "commentId"
-     ],
-     "response": {
-      "$ref": "Comment"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "insert": {
-     "id": "chili.comments.insert",
-     "path": "activities/{userId}/@self/{postId}/@comments",
-     "httpMethod": "POST",
-     "description": "Create a comment",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity on which to comment.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user on whose behalf to comment.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "postId"
-     ],
-     "request": {
-      "$ref": "Comment"
-     },
-     "response": {
-      "$ref": "Comment"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "list": {
-     "id": "chili.comments.list",
-     "path": "activities/{userId}/{scope}/{postId}/@comments",
-     "httpMethod": "GET",
-     "description": "List comments",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity for which to get comments.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user for whose post to get comments.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId"
-     ],
-     "response": {
-      "$ref": "CommentFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "update": {
-     "id": "chili.comments.update",
-     "path": "activities/{userId}/{scope}/{postId}/@comments/{commentId}",
-     "httpMethod": "PUT",
-     "description": "Update a comment",
-     "parameters": {
-      "abuseType": {
-       "type": "string",
-       "location": "query"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "commentId": {
-       "type": "string",
-       "description": "ID of the comment being referenced.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity for which to update the comment.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@abuse",
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Comments reported by the user.",
-        "Comments posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId",
-      "commentId"
-     ],
-     "request": {
-      "$ref": "Comment"
-     },
-     "response": {
-      "$ref": "Comment"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    }
-   }
-  },
-  "groups": {
-   "methods": {
-    "delete": {
-     "id": "chili.groups.delete",
-     "path": "people/{userId}/@groups/{groupId}",
-     "httpMethod": "DELETE",
-     "description": "Delete a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group to delete.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "get": {
-     "id": "chili.groups.get",
-     "path": "people/{userId}/@groups/{groupId}/@self",
-     "httpMethod": "GET",
-     "description": "Get a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group to get.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId"
-     ],
-     "response": {
-      "$ref": "Group"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "insert": {
-     "id": "chili.groups.insert",
-     "path": "people/{userId}/@groups",
-     "httpMethod": "POST",
-     "description": "Create a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "request": {
-      "$ref": "Group"
-     },
-     "response": {
-      "$ref": "Group"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "list": {
-     "id": "chili.groups.list",
-     "path": "people/{userId}/@groups",
-     "httpMethod": "GET",
-     "description": "Get a user's groups",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "response": {
-      "$ref": "GroupFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "update": {
-     "id": "chili.groups.update",
-     "path": "people/{userId}/@groups/{groupId}/@self",
-     "httpMethod": "PUT",
-     "description": "Update a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group to update.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId"
-     ],
-     "request": {
-      "$ref": "Group"
-     },
-     "response": {
-      "$ref": "Group"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    }
-   }
-  },
-  "people": {
-   "methods": {
-    "delete": {
-     "id": "chili.people.delete",
-     "path": "people/{userId}/@groups/{groupId}/{personId}",
-     "httpMethod": "DELETE",
-     "description": "Remove a person from a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group from which to remove the person.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "personId": {
-       "type": "string",
-       "description": "ID of the person to remove from the group.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the owner of the group.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId",
-      "personId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "get": {
-     "id": "chili.people.get",
-     "path": "people/{userId}/@self",
-     "httpMethod": "GET",
-     "description": "Get a user profile",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "response": {
-      "$ref": "Person"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "liked": {
-     "id": "chili.people.liked",
-     "path": "activities/{userId}/{scope}/{postId}/{groupId}",
-     "httpMethod": "GET",
-     "description": "Get people who liked an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "required": true,
-       "enum": [
-        "@liked"
-       ],
-       "enumDescriptions": [
-        "People who liked this activity."
-       ],
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity that was liked.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId",
-      "groupId"
-     ],
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "list": {
-     "id": "chili.people.list",
-     "path": "people/{userId}/@groups/{groupId}",
-     "httpMethod": "GET",
-     "description": "Get people in a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group for which to list users.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId"
-     ],
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "reshared": {
-     "id": "chili.people.reshared",
-     "path": "activities/{userId}/{scope}/{postId}/{groupId}",
-     "httpMethod": "GET",
-     "description": "Get people who reshared an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "required": true,
-       "enum": [
-        "@reshared"
-       ],
-       "enumDescriptions": [
-        "People who reshared this activity."
-       ],
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity that was reshared.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId",
-      "groupId"
-     ],
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "search": {
-     "id": "chili.people.search",
-     "path": "people/search",
-     "httpMethod": "GET",
-     "description": "Search for people",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "q": {
-       "type": "string",
-       "description": "Full-text search query string.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "PeopleFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    },
-    "update": {
-     "id": "chili.people.update",
-     "path": "people/{userId}/@groups/{groupId}/{personId}",
-     "httpMethod": "PUT",
-     "description": "Add a person to a group",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "groupId": {
-       "type": "string",
-       "description": "ID of the group to which to add the person.",
-       "required": true,
-       "location": "path"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "personId": {
-       "type": "string",
-       "description": "ID of the person to add to the group.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the owner of the group.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "groupId",
-      "personId"
-     ],
-     "request": {
-      "$ref": "Person"
-     },
-     "response": {
-      "$ref": "Person"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    }
-   }
-  },
-  "photoAlbums": {
-   "methods": {
-    "delete": {
-     "id": "chili.photoAlbums.delete",
-     "path": "photos/{userId}/@self/{albumId}",
-     "httpMethod": "DELETE",
-     "description": "Delete a photo album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to delete.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "get": {
-     "id": "chili.photoAlbums.get",
-     "path": "photos/{userId}/@self/{albumId}",
-     "httpMethod": "GET",
-     "description": "Get a photo album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to get.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "response": {
-      "$ref": "Album"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "insert": {
-     "id": "chili.photoAlbums.insert",
-     "path": "photos/{userId}/@self",
-     "httpMethod": "POST",
-     "description": "Create a photo album",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId"
-     ],
-     "request": {
-      "$ref": "Album"
-     },
-     "response": {
-      "$ref": "Album"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "list": {
-     "id": "chili.photoAlbums.list",
-     "path": "photos/{userId}/{scope}",
-     "httpMethod": "GET",
-     "description": "List a user's photo albums",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection of albums to list.",
-       "required": true,
-       "enum": [
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Albums posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope"
-     ],
-     "response": {
-      "$ref": "AlbumsFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    }
-   }
-  },
-  "photos": {
-   "methods": {
-    "delete": {
-     "id": "chili.photos.delete",
-     "path": "photos/{userId}/@self/{albumId}/@photos/{photoId}",
-     "httpMethod": "DELETE",
-     "description": "Delete a photo",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to which to photo belongs.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "photoId": {
-       "type": "string",
-       "description": "ID of the photo to delete.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId",
-      "photoId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "get": {
-     "id": "chili.photos.get",
-     "path": "photos/{userId}/@self/{albumId}/@photos/{photoId}",
-     "httpMethod": "GET",
-     "description": "Get photo metadata",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album containing the photo.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "photoId": {
-       "type": "string",
-       "description": "ID of the photo for which to get metadata.",
-       "required": true,
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId",
-      "photoId"
-     ],
-     "response": {
-      "$ref": "ChiliPhotosResourceJson"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "insert": {
-     "id": "chili.photos.insert",
-     "path": "photos/{userId}/{albumId}",
-     "httpMethod": "POST",
-     "description": "Upload a photo to an album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to which to upload.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "request": {
-      "$ref": "AlbumLite"
-     },
-     "response": {
-      "$ref": "AlbumLite"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz"
-     ]
-    },
-    "insert2": {
-     "id": "chili.photos.insert2",
-     "path": "photos/{userId}/@self/{albumId}/@photos",
-     "httpMethod": "POST",
-     "description": "Upload a photo to an album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album to which to upload.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "request": {
-      "$ref": "ChiliPhotosResourceJson"
-     },
-     "response": {
-      "$ref": "ChiliPhotosResourceJson"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "listByAlbum": {
-     "id": "chili.photos.listByAlbum",
-     "path": "photos/{userId}/@self/{albumId}/@photos",
-     "httpMethod": "GET",
-     "description": "List photos in an album",
-     "parameters": {
-      "albumId": {
-       "type": "string",
-       "description": "ID of the album for which to list photos.",
-       "required": true,
-       "location": "path"
-      },
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "albumId"
-     ],
-     "response": {
-      "$ref": "PhotosFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    },
-    "listByScope": {
-     "id": "chili.photos.listByScope",
-     "path": "photos/{userId}/@self/{scope}/@photos",
-     "httpMethod": "GET",
-     "description": "Get a user's photos",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "c": {
-       "type": "string",
-       "description": "A continuation token that allows pagination.",
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "max-results": {
-       "type": "integer",
-       "description": "Maximum number of results to include.",
-       "default": "20",
-       "minimum": "0",
-       "maximum": "4294967295",
-       "location": "query"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection of photos to list.",
-       "required": true,
-       "enum": [
-        "@recent"
-       ],
-       "enumDescriptions": [
-        "Recent photos uploaded by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope"
-     ],
-     "response": {
-      "$ref": "PhotosFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/picasa"
-     ]
-    }
-   }
-  },
-  "related": {
-   "methods": {
-    "list": {
-     "id": "chili.related.list",
-     "path": "activities/{userId}/{scope}/{postId}/@related",
-     "httpMethod": "GET",
-     "description": "Get related links for an activity",
-     "parameters": {
-      "alt": {
-       "type": "string",
-       "description": "Specifies an alternative representation type.",
-       "default": "atom",
-       "enum": [
-        "atom",
-        "json"
-       ],
-       "enumDescriptions": [
-        "Use Atom XML format",
-        "Use JSON format"
-       ],
-       "location": "query"
-      },
-      "hl": {
-       "type": "string",
-       "description": "Language code to limit language results.",
-       "location": "query"
-      },
-      "postId": {
-       "type": "string",
-       "description": "ID of the activity to which to get related links.",
-       "required": true,
-       "location": "path"
-      },
-      "scope": {
-       "type": "string",
-       "description": "The collection to which the activity belongs.",
-       "required": true,
-       "enum": [
-        "@self"
-       ],
-       "enumDescriptions": [
-        "Activities posted by the user."
-       ],
-       "location": "path"
-      },
-      "userId": {
-       "type": "string",
-       "description": "ID of the user being referenced.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "userId",
-      "scope",
-      "postId"
-     ],
-     "response": {
-      "$ref": "RelatedFeed"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/buzz",
-      "https://www.googleapis.com/auth/buzz.readonly"
-     ]
-    }
-   }
-  }
- }
-}
diff --git a/tests/data/plus.json b/tests/data/plus.json
new file mode 100644
index 0000000..fdcd30c
--- /dev/null
+++ b/tests/data/plus.json
@@ -0,0 +1,1218 @@
+{
+ "kind": "discovery#restDescription",
+ "id": "plus:v1",
+ "name": "plus",
+ "version": "v1",
+ "title": "Google+ API",
+ "description": "The Google+ API enables developers to build on top of the Google+ platform.",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/gplus-16.png",
+  "x32": "http://www.google.com/images/icons/product/gplus-32.png"
+ },
+ "documentationLink": "http://developers.google.com/+/api/",
+ "labels": [
+  "labs"
+ ],
+ "protocol": "rest",
+ "basePath": "/plus/v1/",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "json",
+   "enum": [
+    "json"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of application/json"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/plus.me": {
+     "description": "Know who you are on Google"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "Acl": {
+   "id": "Acl",
+   "type": "object",
+   "properties": {
+    "description": {
+     "type": "string",
+     "description": "Description of the access granted, suitable for display."
+    },
+    "items": {
+     "type": "array",
+     "description": "The list of access entries.",
+     "items": {
+      "$ref": "PlusAclentryResource"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies this resource as a collection of access controls. Value: \"plus#acl\".",
+     "default": "plus#acl"
+    }
+   }
+  },
+  "Activity": {
+   "id": "Activity",
+   "type": "object",
+   "properties": {
+    "access": {
+     "$ref": "Acl",
+     "description": "Identifies who has access to see this activity."
+    },
+    "actor": {
+     "type": "object",
+     "description": "The person who performed this activity.",
+     "properties": {
+      "displayName": {
+       "type": "string",
+       "description": "The name of the actor, suitable for display."
+      },
+      "id": {
+       "type": "string",
+       "description": "The ID of the actor's person resource."
+      },
+      "image": {
+       "type": "object",
+       "description": "The image representation of the actor.",
+       "properties": {
+        "url": {
+         "type": "string",
+         "description": "The URL of the actor's profile photo. To re-size the image and crop it to a square, append the query string ?sz=x, where x is the dimension in pixels of each side."
+        }
+       }
+      },
+      "url": {
+       "type": "string",
+       "description": "The link to the actor's Google profile."
+      }
+     }
+    },
+    "address": {
+     "type": "string",
+     "description": "Street address where this activity occurred."
+    },
+    "annotation": {
+     "type": "string",
+     "description": "Additional content added by the person who shared this activity, applicable only when resharing an activity."
+    },
+    "crosspostSource": {
+     "type": "string",
+     "description": "If this activity is a crosspost from another system, this property specifies the ID of the original activity."
+    },
+    "geocode": {
+     "type": "string",
+     "description": "Latitude and longitude where this activity occurred. Format is latitude followed by longitude, space separated."
+    },
+    "id": {
+     "type": "string",
+     "description": "The ID of this activity."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies this resource as an activity. Value: \"plus#activity\".",
+     "default": "plus#activity"
+    },
+    "object": {
+     "type": "object",
+     "description": "The object of this activity.",
+     "properties": {
+      "actor": {
+       "type": "object",
+       "description": "If this activity's object is itself another activity (for example, when a person reshares an activity), this property specifies the original activity's actor.",
+       "properties": {
+        "displayName": {
+         "type": "string",
+         "description": "The original actor's name, suitable for display."
+        },
+        "id": {
+         "type": "string",
+         "description": "ID of the original actor."
+        },
+        "image": {
+         "type": "object",
+         "description": "The image representation of the original actor.",
+         "properties": {
+          "url": {
+           "type": "string",
+           "description": "A URL that points to a thumbnail photo of the original actor."
+          }
+         }
+        },
+        "url": {
+         "type": "string",
+         "description": "A link to the original actor's Google profile."
+        }
+       }
+      },
+      "attachments": {
+       "type": "array",
+       "description": "The media objects attached to this activity.",
+       "items": {
+        "type": "object",
+        "properties": {
+         "categories": {
+          "type": "array",
+          "description": "Specifies zero or more categories the attachment belongs to.",
+          "items": {
+           "type": "object",
+           "properties": {
+            "label": {
+             "type": "string",
+             "description": "The category label, suitable for display (e.g. \"album cover\")."
+            },
+            "schema": {
+             "type": "string",
+             "description": "Domain of schema, e.g. http://google.com."
+            },
+            "term": {
+             "type": "string",
+             "description": "The tag, e.g. album."
+            }
+           }
+          }
+         },
+         "content": {
+          "type": "string",
+          "description": "If the attachment is an article, this property contains a snippet of text from the article."
+         },
+         "contentsource": {
+          "type": "object",
+          "description": "If the attachment is audio, the link to the content.",
+          "properties": {
+           "type": {
+            "type": "string",
+            "description": "Media type of the link."
+           },
+           "url": {
+            "type": "string",
+            "description": "URL of the link."
+           }
+          }
+         },
+         "displayName": {
+          "type": "string",
+          "description": "The title of the attachment (such as a photo caption or an article title)."
+         },
+         "embed": {
+          "type": "object",
+          "description": "If the attachment is a video, the embeddable link.",
+          "properties": {
+           "type": {
+            "type": "string",
+            "description": "Media type of the link."
+           },
+           "url": {
+            "type": "string",
+            "description": "URL of the link."
+           }
+          }
+         },
+         "fullImage": {
+          "type": "object",
+          "description": "The full image url for photo attachments.",
+          "properties": {
+           "height": {
+            "type": "integer",
+            "description": "The height, in pixels, of the linked resource.",
+            "format": "uint32"
+           },
+           "type": {
+            "type": "string",
+            "description": "Media type of the link."
+           },
+           "url": {
+            "type": "string",
+            "description": "URL of the link."
+           },
+           "width": {
+            "type": "integer",
+            "description": "The width, in pixels, of the linked resource.",
+            "format": "uint32"
+           }
+          }
+         },
+         "id": {
+          "type": "string",
+          "description": "The ID of the media object's resource."
+         },
+         "image": {
+          "type": "object",
+          "description": "The preview image for photos or videos.",
+          "properties": {
+           "height": {
+            "type": "integer",
+            "description": "The height, in pixels, of the linked resource.",
+            "format": "uint32"
+           },
+           "type": {
+            "type": "string",
+            "description": "Media type of the link."
+           },
+           "url": {
+            "type": "string",
+            "description": "URL of the link."
+           },
+           "width": {
+            "type": "integer",
+            "description": "The width, in pixels, of the linked resource.",
+            "format": "uint32"
+           }
+          }
+         },
+         "objectType": {
+          "type": "string",
+          "description": "The type of media object. Possible values are:  \n- \"photo\" - A photo. \n- \"video\" - A video. \n- \"article\" - An article, specified by a link."
+         },
+         "url": {
+          "type": "string",
+          "description": "The link to the attachment, should be of type text/html."
+         }
+        }
+       }
+      },
+      "content": {
+       "type": "string",
+       "description": "The HTML-formatted content, suitable for display. When creating or updating an activity, this value must be supplied as plain text in the request. If successful, the response will contain the HTML-formatted content. When updating an activity, use originalContent as the starting value, then assign the updated text to this property."
+      },
+      "id": {
+       "type": "string",
+       "description": "The ID of the object. When resharing an activity, this is the ID of the activity being reshared."
+      },
+      "objectType": {
+       "type": "string",
+       "description": "The type of the object. Possible values are:  \n- \"note\" - Textual content. \n- \"activity\" - A Google+ activity."
+      },
+      "originalContent": {
+       "type": "string",
+       "description": "The content (text) as provided by the author, stored without any HTML formatting. When updating an activity's content, use the value of originalContent as the starting point from which to make edits."
+      },
+      "plusoners": {
+       "type": "object",
+       "description": "People who +1'd this activity.",
+       "properties": {
+        "selfLink": {
+         "type": "string",
+         "description": "The URL for the collection of people who +1'd this activity."
+        },
+        "totalItems": {
+         "type": "integer",
+         "description": "Total number of people who +1'd this activity.",
+         "format": "uint32"
+        }
+       }
+      },
+      "replies": {
+       "type": "object",
+       "description": "Comments in reply to this activity.",
+       "properties": {
+        "selfLink": {
+         "type": "string",
+         "description": "The URL for the collection of comments in reply to this activity."
+        },
+        "totalItems": {
+         "type": "integer",
+         "description": "Total number of comments on this activity.",
+         "format": "uint32"
+        }
+       }
+      },
+      "resharers": {
+       "type": "object",
+       "description": "People who reshared this activity.",
+       "properties": {
+        "selfLink": {
+         "type": "string",
+         "description": "The URL for the collection of resharers."
+        },
+        "totalItems": {
+         "type": "integer",
+         "description": "Total number of people who reshared this activity.",
+         "format": "uint32"
+        }
+       }
+      },
+      "url": {
+       "type": "string",
+       "description": "The URL that points to the linked resource."
+      }
+     }
+    },
+    "placeId": {
+     "type": "string",
+     "description": "ID of the place where this activity occurred."
+    },
+    "placeName": {
+     "type": "string",
+     "description": "Name of the place where this activity occurred."
+    },
+    "placeholder": {
+     "type": "boolean",
+     "description": "True if this activity is a placeholder."
+    },
+    "provider": {
+     "type": "object",
+     "description": "The service provider that initially published this activity.",
+     "properties": {
+      "title": {
+       "type": "string",
+       "description": "Name of the service provider."
+      }
+     }
+    },
+    "published": {
+     "type": "string",
+     "description": "The time at which this activity was initially published. Formatted as an RFC 3339 timestamp.",
+     "format": "date-time"
+    },
+    "radius": {
+     "type": "string",
+     "description": "Radius, in meters, of the region where this activity occurred, centered at the latitude and longitude identified in geocode."
+    },
+    "title": {
+     "type": "string",
+     "description": "Title of this activity."
+    },
+    "updated": {
+     "type": "string",
+     "description": "The time at which this activity was last updated. Formatted as an RFC 3339 timestamp.",
+     "format": "date-time"
+    },
+    "url": {
+     "type": "string",
+     "description": "The link to this activity."
+    },
+    "verb": {
+     "type": "string",
+     "description": "This activity's verb, indicating what action was performed. Possible values are:  \n- \"post\" - Publish content to the stream. \n- \"checkin\" - Check in to a location. \n- \"share\" - Reshare an activity."
+    }
+   }
+  },
+  "ActivityFeed": {
+   "id": "ActivityFeed",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "The ID of this collection of activities."
+    },
+    "items": {
+     "type": "array",
+     "description": "The activities in this page of results.",
+     "items": {
+      "$ref": "Activity"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies this resource as a collection of activities. Value: \"plus#activityFeed\".",
+     "default": "plus#activityFeed"
+    },
+    "nextLink": {
+     "type": "string",
+     "description": "Link to the next page of activities."
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Link to this activity resource."
+    },
+    "title": {
+     "type": "string",
+     "description": "The title of this collection of activities."
+    },
+    "updated": {
+     "type": "string",
+     "description": "The time at which this collection of activities was last updated. Formatted as an RFC 3339 timestamp.",
+     "format": "date-time"
+    }
+   }
+  },
+  "Comment": {
+   "id": "Comment",
+   "type": "object",
+   "properties": {
+    "actor": {
+     "type": "object",
+     "description": "The person who posted this comment.",
+     "properties": {
+      "displayName": {
+       "type": "string",
+       "description": "The name of this actor, suitable for display."
+      },
+      "id": {
+       "type": "string",
+       "description": "The ID of the actor."
+      },
+      "image": {
+       "type": "object",
+       "description": "The image representation of this actor.",
+       "properties": {
+        "url": {
+         "type": "string",
+         "description": "The URL of the actor's profile photo. To re-size the image and crop it to a square, append the query string ?sz=x, where x is the dimension in pixels of each side."
+        }
+       }
+      },
+      "url": {
+       "type": "string",
+       "description": "A link to the person resource for this actor."
+      }
+     }
+    },
+    "id": {
+     "type": "string",
+     "description": "The ID of this comment."
+    },
+    "inReplyTo": {
+     "type": "array",
+     "description": "The activity this comment replied to.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "id": {
+        "type": "string",
+        "description": "The id of the activity."
+       },
+       "url": {
+        "type": "string",
+        "description": "The url of the activity."
+       }
+      }
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies this resource as a comment. Value: \"plus#comment\".",
+     "default": "plus#comment"
+    },
+    "object": {
+     "type": "object",
+     "description": "The object of this comment.",
+     "properties": {
+      "content": {
+       "type": "string",
+       "description": "The content of this comment."
+      },
+      "objectType": {
+       "type": "string",
+       "description": "The object type of this comment. Possible values are:  \n- \"comment\" - A comment in reply to an activity.",
+       "default": "comment"
+      }
+     }
+    },
+    "published": {
+     "type": "string",
+     "description": "The time at which this comment was initially published. Formatted as an RFC 3339 timestamp.",
+     "format": "date-time"
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Link to this comment resource."
+    },
+    "updated": {
+     "type": "string",
+     "description": "The time at which this comment was last updated. Formatted as an RFC 3339 timestamp.",
+     "format": "date-time"
+    },
+    "verb": {
+     "type": "string",
+     "description": "This comment's verb, indicating what action was performed. Possible values are:  \n- \"post\" - Publish content to the stream.",
+     "default": "post"
+    }
+   }
+  },
+  "CommentFeed": {
+   "id": "CommentFeed",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "The ID of this collection of comments."
+    },
+    "items": {
+     "type": "array",
+     "description": "The comments in this page of results.",
+     "items": {
+      "$ref": "Comment"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies this resource as a collection of comments. Value: \"plus#commentFeed\".",
+     "default": "plus#commentFeed"
+    },
+    "nextLink": {
+     "type": "string",
+     "description": "Link to the next page of activities."
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results."
+    },
+    "title": {
+     "type": "string",
+     "description": "The title of this collection of comments."
+    },
+    "updated": {
+     "type": "string",
+     "description": "The time at which this collection of comments was last updated. Formatted as an RFC 3339 timestamp.",
+     "format": "date-time"
+    }
+   }
+  },
+  "PeopleFeed": {
+   "id": "PeopleFeed",
+   "type": "object",
+   "properties": {
+    "items": {
+     "type": "array",
+     "description": "The people in this page of results. Each item will include the id, displayName, image, and url for the person. To retrieve additional profile data, see the people.get method.",
+     "items": {
+      "$ref": "Person"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies this resource as a collection of people. Value: \"plus#peopleFeed\".",
+     "default": "plus#peopleFeed"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Link to this resource."
+    },
+    "title": {
+     "type": "string",
+     "description": "The title of this collection of people."
+    }
+   }
+  },
+  "Person": {
+   "id": "Person",
+   "type": "object",
+   "properties": {
+    "aboutMe": {
+     "type": "string",
+     "description": "A short biography for this person."
+    },
+    "birthday": {
+     "type": "string",
+     "description": "The person's date of birth, represented as YYYY-MM-DD."
+    },
+    "currentLocation": {
+     "type": "string",
+     "description": "The current location for this person."
+    },
+    "displayName": {
+     "type": "string",
+     "description": "The name of this person, suitable for display."
+    },
+    "emails": {
+     "type": "array",
+     "description": "A list of email addresses for this person.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "primary": {
+        "type": "boolean",
+        "description": "If \"true\", indicates this email address is the person's primary one."
+       },
+       "type": {
+        "type": "string",
+        "description": "The type of address. Possible values are:  \n- \"home\" - Home email address. \n- \"work\" - Work email address. \n- \"other\" - Other."
+       },
+       "value": {
+        "type": "string",
+        "description": "The email address."
+       }
+      }
+     }
+    },
+    "gender": {
+     "type": "string",
+     "description": "The person's gender. Possible values are:  \n- \"male\" - Male gender. \n- \"female\" - Female gender. \n- \"other\" - Other."
+    },
+    "hasApp": {
+     "type": "boolean",
+     "description": "If \"true\", indicates that the person has installed the app that is making the request and has chosen to expose this install state to the caller. A value of \"false\" indicates that the install state cannot be determined (it is either not installed or the person has chosen to keep this information private)."
+    },
+    "id": {
+     "type": "string",
+     "description": "The ID of this person."
+    },
+    "image": {
+     "type": "object",
+     "description": "The representation of the person's profile photo.",
+     "properties": {
+      "url": {
+       "type": "string",
+       "description": "The URL of the person's profile photo. To re-size the image and crop it to a square, append the query string ?sz=x, where x is the dimension in pixels of each side."
+      }
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies this resource as a person. Value: \"plus#person\".",
+     "default": "plus#person"
+    },
+    "languagesSpoken": {
+     "type": "array",
+     "description": "The languages spoken by this person.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "name": {
+     "type": "object",
+     "description": "An object representation of the individual components of a person's name.",
+     "properties": {
+      "familyName": {
+       "type": "string",
+       "description": "The family name (last name) of this person."
+      },
+      "formatted": {
+       "type": "string",
+       "description": "The full name of this person, including middle names, suffixes, etc."
+      },
+      "givenName": {
+       "type": "string",
+       "description": "The given name (first name) of this person."
+      },
+      "honorificPrefix": {
+       "type": "string",
+       "description": "The honorific prefixes (such as \"Dr.\" or \"Mrs.\") for this person."
+      },
+      "honorificSuffix": {
+       "type": "string",
+       "description": "The honorific suffixes (such as \"Jr.\") for this person."
+      },
+      "middleName": {
+       "type": "string",
+       "description": "The middle name of this person."
+      }
+     }
+    },
+    "nickname": {
+     "type": "string",
+     "description": "The nickname of this person."
+    },
+    "organizations": {
+     "type": "array",
+     "description": "A list of current or past organizations with which this person is associated.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "department": {
+        "type": "string",
+        "description": "The department within the organization."
+       },
+       "description": {
+        "type": "string",
+        "description": "A short description of the person's role in this organization."
+       },
+       "endDate": {
+        "type": "string",
+        "description": "The date the person left this organization."
+       },
+       "location": {
+        "type": "string",
+        "description": "The location of this organization."
+       },
+       "name": {
+        "type": "string",
+        "description": "The name of the organization."
+       },
+       "primary": {
+        "type": "boolean",
+        "description": "If \"true\", indicates this organization is the person's primary one (typically interpreted as current one)."
+       },
+       "startDate": {
+        "type": "string",
+        "description": "The date the person joined this organization."
+       },
+       "title": {
+        "type": "string",
+        "description": "The person's job title or role within the organization."
+       },
+       "type": {
+        "type": "string",
+        "description": "The type of organization. Possible values are:  \n- \"work\" - Work. \n- \"school\" - School."
+       }
+      }
+     }
+    },
+    "placesLived": {
+     "type": "array",
+     "description": "A list of places where this person has lived.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "primary": {
+        "type": "boolean",
+        "description": "If \"true\", this place of residence is this person's primary residence."
+       },
+       "value": {
+        "type": "string",
+        "description": "A place where this person has lived. For example: \"Seattle, WA\", \"Near Toronto\"."
+       }
+      }
+     }
+    },
+    "relationshipStatus": {
+     "type": "string",
+     "description": "The person's relationship status. Possible values are:  \n- \"single\" - Person is single. \n- \"in_a_relationship\" - Person is in a relationship. \n- \"engaged\" - Person is engaged. \n- \"married\" - Person is married. \n- \"its_complicated\" - The relationship is complicated. \n- \"open_relationship\" - Person is in an open relationship. \n- \"widowed\" - Person is widowed. \n- \"in_domestic_partnership\" - Person is in a domestic partnership. \n- \"in_civil_union\" - Person is in a civil union."
+    },
+    "tagline": {
+     "type": "string",
+     "description": "The brief description (tagline) of this person."
+    },
+    "url": {
+     "type": "string",
+     "description": "The URL of this person's profile."
+    },
+    "urls": {
+     "type": "array",
+     "description": "A list of URLs for this person.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "primary": {
+        "type": "boolean",
+        "description": "If \"true\", this URL is the person's primary URL."
+       },
+       "type": {
+        "type": "string",
+        "description": "The type of URL. Possible values are:  \n- \"home\" - URL for home. \n- \"work\" - URL for work. \n- \"blog\" - URL for blog. \n- \"profile\" - URL for profile. \n- \"other\" - Other."
+       },
+       "value": {
+        "type": "string",
+        "description": "The URL value."
+       }
+      }
+     }
+    }
+   }
+  },
+  "PlusAclentryResource": {
+   "id": "PlusAclentryResource",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "The ID of the entry. For entries of type \"person\" or \"circle\", this is the ID of the resource. For other types, this property is not set."
+    },
+    "type": {
+     "type": "string",
+     "description": "The type of entry describing to whom access is granted. Possible values are:  \n- \"person\" - Access to an individual. \n- \"circle\" - Access to members of a circle. \n- \"myCircles\" - Access to members of all the person's circles. \n- \"extendedCircles\" - Access to members of everyone in a person's circles, plus all of the people in their circles. \n- \"public\" - Access to anyone on the web."
+    }
+   }
+  }
+ },
+ "resources": {
+  "activities": {
+   "methods": {
+    "get": {
+     "id": "plus.activities.get",
+     "path": "activities/{activityId}",
+     "httpMethod": "GET",
+     "description": "Get an activity.",
+     "parameters": {
+      "activityId": {
+       "type": "string",
+       "description": "The ID of the activity to get.",
+       "required": true,
+       "location": "path"
+      },
+      "alt": {
+       "type": "string",
+       "description": "Specifies an alternative representation type.",
+       "default": "json",
+       "enum": [
+        "json"
+       ],
+       "enumDescriptions": [
+        "Use JSON format"
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "activityId"
+     ],
+     "response": {
+      "$ref": "Activity"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/plus.me"
+     ]
+    },
+    "list": {
+     "id": "plus.activities.list",
+     "path": "people/{userId}/activities/{collection}",
+     "httpMethod": "GET",
+     "description": "List all of the activities in the specified collection for a particular user.",
+     "parameters": {
+      "alt": {
+       "type": "string",
+       "description": "Specifies an alternative representation type.",
+       "default": "json",
+       "enum": [
+        "json"
+       ],
+       "enumDescriptions": [
+        "Use JSON format"
+       ],
+       "location": "query"
+      },
+      "collection": {
+       "type": "string",
+       "description": "The collection of activities to list.",
+       "required": true,
+       "enum": [
+        "public"
+       ],
+       "enumDescriptions": [
+        "All public activities created by the specified user."
+       ],
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of activities to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults.",
+       "default": "20",
+       "format": "uint32",
+       "minimum": "1",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "The continuation token, 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.",
+       "location": "query"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user to get activities for. The special value \"me\" can be used to indicate the authenticated user.",
+       "required": true,
+       "pattern": "me|[0-9]+",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userId",
+      "collection"
+     ],
+     "response": {
+      "$ref": "ActivityFeed"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/plus.me"
+     ]
+    },
+    "search": {
+     "id": "plus.activities.search",
+     "path": "activities",
+     "httpMethod": "GET",
+     "description": "Search public activities.",
+     "parameters": {
+      "language": {
+       "type": "string",
+       "description": "Specify the preferred language to search with. See Language Codes for available values.",
+       "default": "",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of activities to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults.",
+       "default": "10",
+       "format": "uint32",
+       "minimum": "1",
+       "maximum": "20",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Specifies how to order search results.",
+       "default": "recent",
+       "enum": [
+        "best",
+        "recent"
+       ],
+       "enumDescriptions": [
+        "Sort activities by relevance to the user, most relevant first.",
+        "Sort activities by published date, most recent first."
+       ],
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "The continuation token, 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. This token may be of any length.",
+       "location": "query"
+      },
+      "query": {
+       "type": "string",
+       "description": "Full-text search query string.",
+       "required": true,
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "query"
+     ],
+     "response": {
+      "$ref": "ActivityFeed"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/plus.me"
+     ]
+    }
+   }
+  },
+  "comments": {
+   "methods": {
+    "get": {
+     "id": "plus.comments.get",
+     "path": "comments/{commentId}",
+     "httpMethod": "GET",
+     "description": "Get a comment.",
+     "parameters": {
+      "commentId": {
+       "type": "string",
+       "description": "The ID of the comment to get.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "commentId"
+     ],
+     "response": {
+      "$ref": "Comment"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/plus.me"
+     ]
+    },
+    "list": {
+     "id": "plus.comments.list",
+     "path": "activities/{activityId}/comments",
+     "httpMethod": "GET",
+     "description": "List all of the comments for an activity.",
+     "parameters": {
+      "activityId": {
+       "type": "string",
+       "description": "The ID of the activity to get comments for.",
+       "required": true,
+       "location": "path"
+      },
+      "alt": {
+       "type": "string",
+       "description": "Specifies an alternative representation type.",
+       "default": "json",
+       "enum": [
+        "json"
+       ],
+       "enumDescriptions": [
+        "Use JSON format"
+       ],
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of comments to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults.",
+       "default": "20",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "The continuation token, 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.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "activityId"
+     ],
+     "response": {
+      "$ref": "CommentFeed"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/plus.me"
+     ]
+    }
+   }
+  },
+  "people": {
+   "methods": {
+    "get": {
+     "id": "plus.people.get",
+     "path": "people/{userId}",
+     "httpMethod": "GET",
+     "description": "Get a person's profile.",
+     "parameters": {
+      "userId": {
+       "type": "string",
+       "description": "The ID of the person to get the profile for. The special value \"me\" can be used to indicate the authenticated user.",
+       "required": true,
+       "pattern": "me|[0-9]+",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userId"
+     ],
+     "response": {
+      "$ref": "Person"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/plus.me"
+     ]
+    },
+    "listByActivity": {
+     "id": "plus.people.listByActivity",
+     "path": "activities/{activityId}/people/{collection}",
+     "httpMethod": "GET",
+     "description": "List all of the people in the specified collection for a particular activity.",
+     "parameters": {
+      "activityId": {
+       "type": "string",
+       "description": "The ID of the activity to get the list of people for.",
+       "required": true,
+       "location": "path"
+      },
+      "collection": {
+       "type": "string",
+       "description": "The collection of people to list.",
+       "required": true,
+       "enum": [
+        "plusoners",
+        "resharers"
+       ],
+       "enumDescriptions": [
+        "List all people who have +1'd this activity.",
+        "List all people who have reshared this activity."
+       ],
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of people to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults.",
+       "default": "20",
+       "format": "uint32",
+       "minimum": "1",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "The continuation token, 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.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "activityId",
+      "collection"
+     ],
+     "response": {
+      "$ref": "PeopleFeed"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/plus.me"
+     ]
+    },
+    "search": {
+     "id": "plus.people.search",
+     "path": "people",
+     "httpMethod": "GET",
+     "description": "Search all public profiles.",
+     "parameters": {
+      "language": {
+       "type": "string",
+       "description": "Specify the preferred language to search with. See Language Codes for available values.",
+       "default": "",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of people to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults.",
+       "default": "10",
+       "format": "uint32",
+       "minimum": "1",
+       "maximum": "20",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "The continuation token, 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. This token may be of any length.",
+       "location": "query"
+      },
+      "query": {
+       "type": "string",
+       "description": "Full-text search query string.",
+       "required": true,
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "query"
+     ],
+     "response": {
+      "$ref": "PeopleFeed"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/plus.me"
+     ]
+    }
+   }
+  }
+ }
+}
diff --git a/tests/test_discovery.py b/tests/test_discovery.py
index b5ac753..3b544b0 100644
--- a/tests/test_discovery.py
+++ b/tests/test_discovery.py
@@ -61,7 +61,7 @@
   def test_failed_to_parse_discovery_json(self):
     self.http = HttpMock(datafile('malformed.json'), {'status': '200'})
     try:
-      buzz = build('buzz', 'v1', self.http)
+      plus = build('plus', 'v1', self.http)
       self.fail("should have raised an exception over malformed JSON.")
     except InvalidJsonError:
       pass
@@ -70,16 +70,16 @@
 class DiscoveryFromDocument(unittest.TestCase):
 
   def test_can_build_from_local_document(self):
-    discovery = file(datafile('buzz.json')).read()
-    buzz = build_from_document(discovery, base="https://www.googleapis.com/")
-    self.assertTrue(buzz is not None)
+    discovery = file(datafile('plus.json')).read()
+    plus = build_from_document(discovery, base="https://www.googleapis.com/")
+    self.assertTrue(plus is not None)
 
   def test_building_with_base_remembers_base(self):
-    discovery = file(datafile('buzz.json')).read()
+    discovery = file(datafile('plus.json')).read()
 
     base = "https://www.example.com/"
-    buzz = build_from_document(discovery, base=base)
-    self.assertEquals(base + "buzz/v1/", buzz._baseUrl)
+    plus = build_from_document(discovery, base=base)
+    self.assertEquals(base + "plus/v1/", plus._baseUrl)
 
 
 class DiscoveryFromHttp(unittest.TestCase):
@@ -120,33 +120,26 @@
 class Discovery(unittest.TestCase):
 
   def test_method_error_checking(self):
-    self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
-    buzz = build('buzz', 'v1', self.http)
+    self.http = HttpMock(datafile('plus.json'), {'status': '200'})
+    plus = build('plus', 'v1', self.http)
 
     # Missing required parameters
     try:
-      buzz.activities().list()
+      plus.activities().list()
       self.fail()
     except TypeError, e:
       self.assertTrue('Missing' in str(e))
 
     # Parameter doesn't match regex
     try:
-      buzz.activities().list(scope='@myself', userId='me')
-      self.fail()
-    except TypeError, e:
-      self.assertTrue('not an allowed value' in str(e))
-
-    # Parameter doesn't match regex
-    try:
-      buzz.activities().list(scope='not@', userId='foo')
+      plus.activities().list(collection='not_a_collection_name', userId='me')
       self.fail()
     except TypeError, e:
       self.assertTrue('not an allowed value' in str(e))
 
     # Unexpected parameter
     try:
-      buzz.activities().list(flubber=12)
+      plus.activities().list(flubber=12)
       self.fail()
     except TypeError, e:
       self.assertTrue('unexpected' in str(e))
@@ -206,21 +199,11 @@
 
     self.assertTrue('x-http-method-override' in resp)
 
-  def test_buzz_resources(self):
-    self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
-    buzz = build('buzz', 'v1', self.http)
-    self.assertTrue(getattr(buzz, 'activities'))
-    self.assertTrue(getattr(buzz, 'photos'))
-    self.assertTrue(getattr(buzz, 'people'))
-    self.assertTrue(getattr(buzz, 'groups'))
-    self.assertTrue(getattr(buzz, 'comments'))
-    self.assertTrue(getattr(buzz, 'related'))
-
-  def test_auth(self):
-    self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
-    buzz = build('buzz', 'v1', self.http)
-    auth = buzz.auth_discovery()
-    self.assertTrue('request' in auth)
+  def test_plus_resources(self):
+    self.http = HttpMock(datafile('plus.json'), {'status': '200'})
+    plus = build('plus', 'v1', self.http)
+    self.assertTrue(getattr(plus, 'activities'))
+    self.assertTrue(getattr(plus, 'people'))
 
   def test_full_featured(self):
     # Zoo should exercise all discovery facets
@@ -331,15 +314,6 @@
     self.assertTrue(request.headers['content-type'], 'application/json')
 
 class Next(unittest.TestCase):
-  def test_next_for_people_liked(self):
-    """Legacy test for Buzz _next support."""
-    self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
-    buzz = build('buzz', 'v1', self.http)
-    people = {'links':
-                  {'next':
-                   [{'href': 'http://www.googleapis.com/next-link'}]}}
-    request = buzz.people().liked_next(people)
-    self.assertEqual(request.uri, 'http://www.googleapis.com/next-link')
 
   def test_next_successful_none_on_no_next_page_token(self):
     self.http = HttpMock(datafile('tasks.json'), {'status': '200'})
@@ -363,29 +337,5 @@
     request = service.currentLocation().get()
 
 
-class DeveloperKey(unittest.TestCase):
-
-  def test_param(self):
-    self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
-    buzz = build('buzz', 'v1', self.http, developerKey='foobie_bletch')
-    activities = {'links':
-                  {'next':
-                   [{'href': 'http://www.googleapis.com/next-link'}]}}
-    request = buzz.activities().list_next(activities)
-    parsed = urlparse.urlparse(request.uri)
-    q = parse_qs(parsed[4])
-    self.assertEqual(q['key'], ['foobie_bletch'])
-
-  def test_next_for_activities_list(self):
-    self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
-    buzz = build('buzz', 'v1', self.http, developerKey='foobie_bletch')
-    activities = {'links':
-                  {'next':
-                   [{'href': 'http://www.googleapis.com/next-link'}]}}
-    request = buzz.activities().list_next(activities)
-    self.assertEqual(request.uri,
-                     'http://www.googleapis.com/next-link?key=foobie_bletch')
-
-
 if __name__ == '__main__':
   unittest.main()
diff --git a/tests/test_mocks.py b/tests/test_mocks.py
index bfe55cf..6822335 100644
--- a/tests/test_mocks.py
+++ b/tests/test_mocks.py
@@ -41,103 +41,104 @@
 
 class Mocks(unittest.TestCase):
   def setUp(self):
-    self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
+    self.http = HttpMock(datafile('plus.json'), {'status': '200'})
+    self.zoo_http = HttpMock(datafile('zoo.json'), {'status': '200'})
 
   def test_default_response(self):
     requestBuilder = RequestMockBuilder({})
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
-    activity = buzz.activities().get(postId='tag:blah', userId='@me').execute()
+    plus = build('plus', 'v1', http=self.http, requestBuilder=requestBuilder)
+    activity = plus.activities().get(activityId='tag:blah').execute()
     self.assertEqual({}, activity)
 
   def test_simple_response(self):
     requestBuilder = RequestMockBuilder({
-        'chili.activities.get': (None, '{"data": {"foo": "bar"}}')
+        'plus.activities.get': (None, '{"data": {"foo": "bar"}}')
         })
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+    plus = build('plus', 'v1', http=self.http, requestBuilder=requestBuilder)
 
-    activity = buzz.activities().get(postId='tag:blah', userId='@me').execute()
+    activity = plus.activities().get(activityId='tag:blah').execute()
     self.assertEqual({"foo": "bar"}, activity)
 
   def test_unexpected_call(self):
     requestBuilder = RequestMockBuilder({}, check_unexpected=True)
 
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+    plus = build('plus', 'v1', http=self.http, requestBuilder=requestBuilder)
 
     try:
-      buzz.activities().get(postId='tag:blah', userId='@me').execute()
+      plus.activities().get(activityId='tag:blah').execute()
       self.fail('UnexpectedMethodError should have been raised')
     except UnexpectedMethodError:
       pass
 
   def test_simple_unexpected_body(self):
     requestBuilder = RequestMockBuilder({
-        'chili.activities.insert': (None, '{"data": {"foo": "bar"}}', None)
+        'zoo.animals.insert': (None, '{"data": {"foo": "bar"}}', None)
         })
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+    zoo = build('zoo', 'v1', http=self.zoo_http, requestBuilder=requestBuilder)
 
     try:
-      buzz.activities().insert(userId='@me', body='{}').execute()
+      zoo.animals().insert(body='{}').execute()
       self.fail('UnexpectedBodyError should have been raised')
     except UnexpectedBodyError:
       pass
 
   def test_simple_expected_body(self):
     requestBuilder = RequestMockBuilder({
-        'chili.activities.insert': (None, '{"data": {"foo": "bar"}}', '{}')
+        'zoo.animals.insert': (None, '{"data": {"foo": "bar"}}', '{}')
         })
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+    zoo = build('zoo', 'v1', http=self.zoo_http, requestBuilder=requestBuilder)
 
     try:
-      buzz.activities().insert(userId='@me', body='').execute()
+      zoo.animals().insert(body='').execute()
       self.fail('UnexpectedBodyError should have been raised')
     except UnexpectedBodyError:
       pass
 
   def test_simple_wrong_body(self):
     requestBuilder = RequestMockBuilder({
-        'chili.activities.insert': (None, '{"data": {"foo": "bar"}}',
+        'zoo.animals.insert': (None, '{"data": {"foo": "bar"}}',
                                     '{"data": {"foo": "bar"}}')
         })
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+    zoo = build('zoo', 'v1', http=self.zoo_http, requestBuilder=requestBuilder)
 
     try:
-      buzz.activities().insert(
-          userId='@me', body='{"data": {"foo": "blah"}}').execute()
+      zoo.animals().insert(
+          body='{"data": {"foo": "blah"}}').execute()
       self.fail('UnexpectedBodyError should have been raised')
     except UnexpectedBodyError:
       pass
 
   def test_simple_matching_str_body(self):
     requestBuilder = RequestMockBuilder({
-        'chili.activities.insert': (None, '{"data": {"foo": "bar"}}',
+        'zoo.animals.insert': (None, '{"data": {"foo": "bar"}}',
                                     '{"data": {"foo": "bar"}}')
         })
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+    zoo = build('zoo', 'v1', http=self.zoo_http, requestBuilder=requestBuilder)
 
-    activity = buzz.activities().insert(
-        userId='@me', body={'data': {'foo': 'bar'}}).execute()
+    activity = zoo.animals().insert(
+        body={'data': {'foo': 'bar'}}).execute()
     self.assertEqual({'foo': 'bar'}, activity)
 
   def test_simple_matching_dict_body(self):
     requestBuilder = RequestMockBuilder({
-        'chili.activities.insert': (None, '{"data": {"foo": "bar"}}',
+        'zoo.animals.insert': (None, '{"data": {"foo": "bar"}}',
                                     {'data': {'foo': 'bar'}})
         })
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+    zoo = build('zoo', 'v1', http=self.zoo_http, requestBuilder=requestBuilder)
 
-    activity = buzz.activities().insert(
-        userId='@me', body={'data': {'foo': 'bar'}}).execute()
+    activity = zoo.animals().insert(
+        body={'data': {'foo': 'bar'}}).execute()
     self.assertEqual({'foo': 'bar'}, activity)
 
   def test_errors(self):
     errorResponse = httplib2.Response({'status': 500, 'reason': 'Server Error'})
     requestBuilder = RequestMockBuilder({
-        'chili.activities.list': (errorResponse, '{}')
+        'plus.activities.list': (errorResponse, '{}')
         })
-    buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+    plus = build('plus', 'v1', http=self.http, requestBuilder=requestBuilder)
 
     try:
-      activity = buzz.activities().list(scope='@self', userId='@me').execute()
+      activity = plus.activities().list(collection='public', userId='me').execute()
       self.fail('An exception should have been thrown')
     except HttpError, e:
       self.assertEqual('{}', e.content)
diff --git a/tests/test_oauth2client.py b/tests/test_oauth2client.py
index 4063e8b..a23d1da 100644
--- a/tests/test_oauth2client.py
+++ b/tests/test_oauth2client.py
@@ -191,6 +191,26 @@
     self.assertEqual(q['response_type'][0], 'code')
     self.assertEqual(q['scope'][0], 'foo')
     self.assertEqual(q['redirect_uri'][0], 'oob')
+    self.assertEqual(q['access_type'][0], 'offline')
+
+  def test_override_flow_access_type(self):
+    """Passing access_type overrides the default."""
+    flow = OAuth2WebServerFlow(
+        client_id='client_id+1',
+        client_secret='secret+1',
+        scope='foo',
+        user_agent='unittest-sample/1.0',
+        access_type='online'
+        )
+    authorize_url = flow.step1_get_authorize_url('oob')
+
+    parsed = urlparse.urlparse(authorize_url)
+    q = parse_qs(parsed[4])
+    self.assertEqual(q['client_id'][0], 'client_id+1')
+    self.assertEqual(q['response_type'][0], 'code')
+    self.assertEqual(q['scope'][0], 'foo')
+    self.assertEqual(q['redirect_uri'][0], 'oob')
+    self.assertEqual(q['access_type'][0], 'online')
 
   def test_exchange_failure(self):
     http = HttpMockSequence([