Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-future for openSUSE:Factory 
checked in at 2023-01-23 18:30:40
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-future (Old)
 and      /work/SRC/openSUSE:Factory/.python-future.new.32243 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-future"

Mon Jan 23 18:30:40 2023 rev:15 rq:1060113 version:0.18.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-future/python-future.changes      
2023-01-06 17:04:42.627896564 +0100
+++ /work/SRC/openSUSE:Factory/.python-future.new.32243/python-future.changes   
2023-01-23 18:30:41.395590356 +0100
@@ -1,0 +2,58 @@
+Sat Jan 21 09:53:11 UTC 2023 - Dirk Müller <dmuel...@suse.com>
+
+- update to 0.18.3:
+  * Backport fix for bpo-38804 (c91d70b)
+  * Fix bug in fix_print.py fixer (dffc579)
+  * Fix bug in fix_raise.py fixer (3401099)
+  * Fix newint bool in py3 (fe645ba)
+  * Fix bug in super() with metaclasses (6e27aac)
+  * docs: fix simple typo, reqest -> request (974eb1f)
+  * Correct eq (c780bf5)
+  * Pass if lint fails (2abe00d)
+  * fix order (f96a219)
+  * Add flake8 to image (046ff18)
+  * Make lint.sh executable (58cc984)
+  * Add docker push to optimize CI (01e8440)
+  * Build System (42b3025)
+  * Add docs build status badge to README.md (3f40bd7)
+  * Use same docs requirements in tox (18ecc5a)
+  * Add docs/requirements.txt (5f9893f)
+  * Add PY37_PLUS, PY38_PLUS, and PY39_PLUS (bee0247)
+  * fix 2.6 test, better comment (ddedcb9)
+  * fix 2.6 test (3f1ff7e)
+  * remove nan test (4dbded1)
+  * include list test values (e3f1a12)
+  * fix other python2 test issues (c051026)
+  * fix missing subTest (f006cad)
+  * import from old imp library on older python versions (fc84fa8)
+  * replace fstrings with format for python 3.4,3.5 (4a687ea)
+  * minor style/spelling fixes (8302d8c)
+  * improve cmp function, add unittest (0d95a40)
+  * Pin typing==3.7.4.1 for Python 3.3 compatiblity (1a48f1b)
+  * Fix various py26 unit test failures (9ca5a14)
+  * Add initial contributing guide with docs build instruction (e55f915)
+  * Add docs building to tox.ini (3ee9e7f)
+  * Support NumPy's specialized int types in builtins.round (b4b54f0)
+  * Added r""" to the docstring to avoid warnings in python3 (5f94572)
+  * Add subclasscheck for past.types.basestring (c9bc0ff)
+  * Correct example in README (681e78c)
+  * Add simple documentation (6c6e3ae)
+  * Add pre-commit hooks (a9c6a37)
+  * Handling of next and next by future.utils.get_next was reversed (52b0ff9)
+  * Add a test for our fix (461d77e)
+  * Compare headers to correct definition of str (3eaa8fd)
+  * Add support for negative ndigits in round; additionally, fixing a bug so
+    that it handles passing in Decimal properly (a4911b9)
+  * Add tkFileDialog to future.movers.tkinter (f6a6549)
+  * Sort before comparing dicts in TestChainMap (6126997)
+  * Fix typo (4dfa099)
+  * Fix formatting in "What's new" (1663dfa)
+  * Fix typo (4236061)
+  * Avoid DeprecationWarning caused by invalid escape (e4b7fa1)
+  * Fixup broken link to external django documentation re: porting to Python 3
+    and unicode_literals (d87713e)
+  * Fixed newdict checking version every time (99030ec)
+  * Add count from 2.7 to 2.6 (1b8ef51)
+- drop CVE-2022-40899.patch (upstream) 
+
+-------------------------------------------------------------------

Old:
----
  CVE-2022-40899.patch
  future-0.18.2.tar.gz

New:
----
  future-0.18.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-future.spec ++++++
--- /var/tmp/diff_new_pack.bHFMSo/_old  2023-01-23 18:30:42.139594949 +0100
+++ /var/tmp/diff_new_pack.bHFMSo/_new  2023-01-23 18:30:42.147594998 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           python-future
-Version:        0.18.2
+Version:        0.18.3
 Release:        0
 Summary:        Single-source support for Python 3 and 2
 # See https://github.com/PythonCharmers/python-future/issues/242 for PSF 
licensing
@@ -32,8 +32,6 @@
 # PATCH-FIX-UPSTREAM python39-build.patch gh#PythonCharmers/python-future#578 
mc...@suse.com
 # Overcome incompatibilites with python 3.9
 Patch2:         python39-build.patch
-# PATCH-FIX-UPSTREAM CVE-2022-40899.patch gh#PythonCharmers/python-future#610 
bsc#1206673
-Patch3:         CVE-2022-40899.patch
 BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes

++++++ future-0.18.2.tar.gz -> future-0.18.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/.travis.yml 
new/future-0.18.3/.travis.yml
--- old/future-0.18.2/.travis.yml       2019-10-31 01:34:11.000000000 +0100
+++ new/future-0.18.3/.travis.yml       2023-01-12 13:38:08.000000000 +0100
@@ -1,45 +1,11 @@
-sudo: false
-language: python
-cache: pip
+language: generic
 
-
-matrix:
-  include:
-    - python: 2.6
-      env: TOXENV=py26
-      dist: trusty
-    - python: 2.7
-      env: TOXENV=py27
-    - python: 3.3
-      env: TOXENV=py33
-      dist: trusty
-      sudo: false
-    - python: 3.4
-      env: TOXENV=py34
-    - python: 3.5
-      env: TOXENV=py35
-    - python: 3.6
-      env: TOXENV=py36
-    - python: 3.7
-      env: TOXENV=py37
-      dist: xenial    # required for Python 3.7 (travis-ci/travis-ci#9069)
-      sudo: required  # required for Python 3.7 (travis-ci/travis-ci#9069)
-
-install:
-  - pip install tox==2.9.1
-  - pip install virtualenv==15.2.0
-  - pip install py==1.4.30
-  - pip install pluggy==0.5.2
+services:
+    - docker
 
 before_script:
-  # Run flake8 tests only on Python 2.7 and 3.7...
-  # 1) stop the build if there are Python syntax errors or undefined names
-  # 2) exit-zero treats all errors as warnings.  The GitHub editor is 127 
chars wide
-  - if [[ $TRAVIS_PYTHON_VERSION == *.7 ]]; then
-      pip install flake8;
-      flake8 . --count --exit-zero --select=E901,E999,F821,F822,F823 
--show-source --statistics;
-      flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 
--statistics; 
-    fi
+    - docker pull jmadler/python-future-builder:latest
 
 script:
-  - tox
+  - ./build.sh
+  - ./lint.sh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/PKG-INFO new/future-0.18.3/PKG-INFO
--- old/future-0.18.2/PKG-INFO  2019-10-31 01:57:06.000000000 +0100
+++ new/future-0.18.3/PKG-INFO  2023-01-13 04:14:32.000000000 +0100
@@ -1,12 +1,11 @@
 Metadata-Version: 1.2
 Name: future
-Version: 0.18.2
+Version: 0.18.3
 Summary: Clean single-source support for Python 3 and 2
 Home-page: https://python-future.org
 Author: Ed Schofield
 Author-email: e...@pythoncharmers.com
 License: MIT
-Description-Content-Type: UNKNOWN
 Description: 
         future: Easy, safe support for Python 2/3 compatibility
         =======================================================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/README.rst new/future-0.18.3/README.rst
--- old/future-0.18.2/README.rst        2019-10-31 01:34:11.000000000 +0100
+++ new/future-0.18.3/README.rst        2023-01-12 13:38:08.000000000 +0100
@@ -3,6 +3,12 @@
 Overview: Easy, clean, reliable Python 2/3 compatibility
 ========================================================
 
+.. image:: https://travis-ci.org/PythonCharmers/python-future.svg?branch=master
+    :target: https://travis-ci.org/PythonCharmers/python-future
+
+.. image:: https://readthedocs.org/projects/python-future/badge/?version=latest
+    :target: https://python-future.readthedocs.io/en/latest/?badge=latest
+
 ``python-future`` is the missing compatibility layer between Python 2 and
 Python 3. It allows you to use a single, clean Python 3.x-compatible
 codebase to support both Python 2 and Python 3 with minimal overhead.
@@ -22,9 +28,6 @@
 Features
 --------
 
-.. image:: https://travis-ci.org/PythonCharmers/python-future.svg?branch=master
-       :target: https://travis-ci.org/PythonCharmers/python-future
-
 -   ``future.builtins`` package (also available as ``builtins`` on Py2) 
provides
     backports and remappings for 20 builtins with different semantics on Py3
     versus Py2
@@ -57,6 +60,8 @@
     decoding the backported ``str`` and ``bytes`` objects. [This feature is
     currently in alpha.]
 
+-   support for pre-commit hooks
+
 .. _code-examples:
 
 Code examples
@@ -261,6 +266,39 @@
 
 For more info, see :ref:`translation`.
 
+Pre-commit hooks
+----------------
+
+`Pre-commit <https://pre-commit.com/>`_ is a framework for managing and 
maintaining
+multi-language pre-commit hooks.
+
+In case you need to port your project from Python 2 to Python 3, you might 
consider
+using such hook during the transition period.
+
+First:
+
+.. code-block:: bash
+
+    $ pip install pre-commit
+
+and then in your project's directory:
+
+.. code-block:: bash
+
+    $ pre-commit install
+
+Next, you need to add this entry to your ``.pre-commit-config.yaml``
+
+.. code-block:: yaml
+
+    -   repo: https://github.com/PythonCharmers/python-future
+        rev: master
+        hooks:
+            - id: futurize
+              args: [--both-stages]
+
+The ``args`` part is optional, by default only stage1 is applied.
+
 Licensing
 ---------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/TESTING.txt 
new/future-0.18.3/TESTING.txt
--- old/future-0.18.2/TESTING.txt       2019-10-31 01:34:11.000000000 +0100
+++ new/future-0.18.3/TESTING.txt       2023-01-12 13:38:08.000000000 +0100
@@ -1,8 +1,6 @@
-Currently the tests are passing on OS X and Linux on Python 2.7 and 3.4.
+A docker image, python-future-builder, is used to do testing and building.  
The test suite can be run with: 
 
-The test suite can be run with:
-
-    $ tox
+    $ bash build.sh
 
 which tests the module under a number of different python versions, where 
available, or with:
 
@@ -10,4 +8,4 @@
 
 To execute a single test:
 
-    $ pytest -k test_chained_exceptions_stacktrace
\ No newline at end of file
+    $ pytest -k test_chained_exceptions_stacktrace
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/build.sh new/future-0.18.3/build.sh
--- old/future-0.18.2/build.sh  1970-01-01 01:00:00.000000000 +0100
+++ new/future-0.18.3/build.sh  2023-01-13 04:08:23.000000000 +0100
@@ -0,0 +1,17 @@
+# XXX: TODO: we should make this include -e once tests pass
+set -xuo pipefail
+
+DOCKER_IMAGE=jmadler/python-future-builder
+# XXX: TODO: Perhaps this version shouldn't be hardcoded
+version=0.18.3
+
+docker build . -t $DOCKER_IMAGE
+docker push $DOCKER_IMAGE:latest
+
+for i in py26 py27 py33 py34 py35 py36 py37 py38 py39; do
+    docker run -ti -v $(realpath dist):/root/python-future/dist $DOCKER_IMAGE 
/root/python-future/setup.sh $version $(basename $i)
+done
+
+python setup.py sdist
+python setup.py clean
+echo You may now run: "twine upload dist/*"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/docs/conf.py 
new/future-0.18.3/docs/conf.py
--- old/future-0.18.2/docs/conf.py      2019-10-31 01:34:11.000000000 +0100
+++ new/future-0.18.3/docs/conf.py      2023-01-12 13:38:08.000000000 +0100
@@ -13,7 +13,6 @@
 
 from __future__ import absolute_import, print_function
 import sys, os
-from future import __version__
 import sphinx_bootstrap_theme
 
 # If extensions (or modules to document with autodoc) are in another directory,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/docs/requirements.txt 
new/future-0.18.3/docs/requirements.txt
--- old/future-0.18.2/docs/requirements.txt     1970-01-01 01:00:00.000000000 
+0100
+++ new/future-0.18.3/docs/requirements.txt     2023-01-12 13:38:08.000000000 
+0100
@@ -0,0 +1,2 @@
+sphinx==3.2.1
+sphinx_bootstrap_theme==0.7.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/docs/str_object.rst 
new/future-0.18.3/docs/str_object.rst
--- old/future-0.18.2/docs/str_object.rst       2019-10-31 01:34:11.000000000 
+0100
+++ new/future-0.18.3/docs/str_object.rst       2023-01-12 13:38:08.000000000 
+0100
@@ -14,7 +14,7 @@
 Py2 having a ``u'...'`` prefix, versus simply ``'...'``, and the removal of
 the :func:`str.decode` method in Py3.
 
-:mod:`future` contains a :class:`newstr`` type that is a backport of the
+:mod:`future` contains a :class:`newstr` type that is a backport of the
 :mod:`str` object from Python 3. This inherits from the Python 2
 :class:`unicode` class but has customizations to improve compatibility with
 Python 3's :class:`str` object. You can use it as follows::
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/docs/unicode_literals.rst 
new/future-0.18.3/docs/unicode_literals.rst
--- old/future-0.18.2/docs/unicode_literals.rst 2019-10-31 01:34:11.000000000 
+0100
+++ new/future-0.18.3/docs/unicode_literals.rst 2023-01-12 13:38:08.000000000 
+0100
@@ -144,7 +144,7 @@
 In favour of ``unicode_literals``
 *********************************
 
-Django recommends importing ``unicode_literals`` as its top `porting tip 
<https://docs.djangoproject.com/en/dev/topics/python3/#unicode-literals>`_ for
+Django recommends importing ``unicode_literals`` as its top `porting tip 
<https://docs.djangoproject.com/en/1.11/topics/python3/#unicode-literals>`_ for
 migrating Django extension modules to Python 3.  The following `quote
 <https://groups.google.com/forum/#!topic/django-developers/2ddIWdicbNY>`_ is
 from Aymeric Augustin on 23 August 2012 regarding why he chose
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/docs/whatsnew.rst 
new/future-0.18.3/docs/whatsnew.rst
--- old/future-0.18.2/docs/whatsnew.rst 2019-10-31 01:56:12.000000000 +0100
+++ new/future-0.18.3/docs/whatsnew.rst 2023-01-13 03:35:58.000000000 +0100
@@ -3,9 +3,66 @@
 What's New
 **********
 
+What's new in version 0.18.3 (2023-01-13)
+=========================================
+This is a minor bug-fix release containing a number of fixes:
+
+- Backport fix for bpo-38804 (c91d70b)
+- Fix bug in fix_print.py fixer (dffc579)
+- Fix bug in fix_raise.py fixer (3401099)
+- Fix newint bool in py3 (fe645ba)
+- Fix bug in super() with metaclasses (6e27aac)
+- docs: fix simple typo, reqest -> request (974eb1f)
+- Correct __eq__ (c780bf5)
+- Pass if lint fails (2abe00d)
+- Update docker image and parcel out to constant variable.  Add comment to 
update version constant (45cf382)
+- fix order (f96a219)
+- Add flake8 to image (046ff18)
+- Make lint.sh executable (58cc984)
+- Add docker push to optimize CI (01e8440)
+- Build System (42b3025)
+- Add docs build status badge to README.md (3f40bd7)
+- Use same docs requirements in tox (18ecc5a)
+- Add docs/requirements.txt (5f9893f)
+- Add PY37_PLUS, PY38_PLUS, and PY39_PLUS (bee0247)
+- fix 2.6 test, better comment (ddedcb9)
+- fix 2.6 test (3f1ff7e)
+- remove nan test (4dbded1)
+- include list test values (e3f1a12)
+- fix other python2 test issues (c051026)
+- fix missing subTest (f006cad)
+- import from old imp library on older python versions (fc84fa8)
+- replace fstrings with format for python 3.4,3.5 (4a687ea)
+- minor style/spelling fixes (8302d8c)
+- improve cmp function, add unittest (0d95a40)
+- Pin typing==3.7.4.1 for Python 3.3 compatiblity (1a48f1b)
+- Fix various py26 unit test failures (9ca5a14)
+- Add initial contributing guide with docs build instruction (e55f915)
+- Add docs building to tox.ini (3ee9e7f)
+- Support NumPy's specialized int types in builtins.round (b4b54f0)
+- Added r""" to the docstring to avoid warnings in python3 (5f94572)
+- Add __subclasscheck__ for past.types.basestring (c9bc0ff)
+- Correct example in README (681e78c)
+- Add simple documentation (6c6e3ae)
+- Add pre-commit hooks (a9c6a37)
+- Handling of __next__ and next by future.utils.get_next was reversed (52b0ff9)
+- Add a test for our fix (461d77e)
+- Compare headers to correct definition of str (3eaa8fd)
+- #322 Add support for negative ndigits in round; additionally, fixing a bug 
so that it handles passing in Decimal properly (a4911b9)
+- Add tkFileDialog to future.movers.tkinter (f6a6549)
+- Sort before comparing dicts in TestChainMap (6126997)
+- Fix typo (4dfa099)
+- Fix formatting in "What's new" (1663dfa)
+- Fix typo (4236061)
+- Avoid DeprecationWarning caused by invalid escape (e4b7fa1)
+- Fixup broken link to external django documentation re: porting to Python 3 
and unicode_literals (d87713e)
+- Fixed newdict checking version every time (99030ec)
+- Add count from 2.7 to 2.6 (1b8ef51)
+
 What's new in version 0.18.2 (2019-10-30)
 =========================================
 This is a minor bug-fix release containing a number of fixes:
+
 - Fix min/max functions with generators, and 'None' default (PR #514)
 - Use BaseException in raise_() (PR #515)
 - Fix builtins.round() for Decimals (Issue #501)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/lint.sh new/future-0.18.3/lint.sh
--- old/future-0.18.2/lint.sh   1970-01-01 01:00:00.000000000 +0100
+++ new/future-0.18.3/lint.sh   2023-01-12 13:38:08.000000000 +0100
@@ -0,0 +1,3 @@
+# TODO: Run under Python 2.7 and 3.7
+flake8 . --count --exit-zero --select=E901,E999,F821,F822,F823 --show-source 
--statistics || true
+flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 
--statistics || true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/setup.sh new/future-0.18.3/setup.sh
--- old/future-0.18.2/setup.sh  1970-01-01 01:00:00.000000000 +0100
+++ new/future-0.18.3/setup.sh  2023-01-12 15:26:35.000000000 +0100
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -exo pipefail
+
+version=$1
+pytag=$2
+
+if [ $pytag = 'py33' ]; then
+    pip3 install virtualenv==16.2.0
+fi
+
+source /root/$pytag/bin/activate
+
+if [ $pytag = 'py26' ]; then
+    pip install importlib
+fi
+pip install pytest unittest2
+python setup.py bdist_wheel --python-tag=$pytag
+pip install dist/future-$version-$pytag-none-any.whl
+pytest tests/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/__init__.py 
new/future-0.18.3/src/future/__init__.py
--- old/future-0.18.2/src/future/__init__.py    2019-10-31 01:56:12.000000000 
+0100
+++ new/future-0.18.3/src/future/__init__.py    2023-01-12 15:38:24.000000000 
+0100
@@ -87,7 +87,7 @@
 __copyright__ = 'Copyright 2013-2019 Python Charmers Pty Ltd'
 __ver_major__ = 0
 __ver_minor__ = 18
-__ver_patch__ = 2
+__ver_patch__ = 3
 __ver_sub__ = ''
 __version__ = "%d.%d.%d%s" % (__ver_major__, __ver_minor__,
                               __ver_patch__, __ver_sub__)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/future-0.18.2/src/future/backports/email/base64mime.py 
new/future-0.18.3/src/future/backports/email/base64mime.py
--- old/future-0.18.2/src/future/backports/email/base64mime.py  2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/future/backports/email/base64mime.py  2023-01-12 
13:38:08.000000000 +0100
@@ -28,6 +28,7 @@
 from __future__ import absolute_import
 from future.builtins import range
 from future.builtins import bytes
+from future.builtins import str
 
 __all__ = [
     'body_decode',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/backports/http/cookiejar.py 
new/future-0.18.3/src/future/backports/http/cookiejar.py
--- old/future-0.18.2/src/future/backports/http/cookiejar.py    2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/future/backports/http/cookiejar.py    2023-01-12 
13:38:08.000000000 +0100
@@ -225,10 +225,14 @@
        (?::(\d\d))?    # optional seconds
     )?                 # optional clock
        \s*
-    ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
+    (?:
+       ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+) # timezone
        \s*
-    (?:\(\w+\))?       # ASCII representation of timezone in parens.
-       \s*$""", re.X | re.ASCII)
+    )?
+    (?:
+       \(\w+\)         # ASCII representation of timezone in parens.
+       \s*
+    )?$""", re.X | re.ASCII)
 def http2time(text):
     """Returns time in seconds since epoch of time represented by a string.
 
@@ -298,9 +302,11 @@
       (?::?(\d\d(?:\.\d*)?))?  # optional seconds (and fractional)
    )?                    # optional clock
       \s*
-   ([-+]?\d\d?:?(:?\d\d)?
-    |Z|z)?               # timezone  (Z is "zero meridian", i.e. GMT)
-      \s*$""", re.X | re. ASCII)
+   (?:
+      ([-+]?\d\d?:?(:?\d\d)?
+       |Z|z)             # timezone  (Z is "zero meridian", i.e. GMT)
+      \s*
+   )?$""", re.X | re. ASCII)
 def iso2time(text):
     """
     As for http2time, but parses the ISO 8601 formats:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/backports/misc.py 
new/future-0.18.3/src/future/backports/misc.py
--- old/future-0.18.2/src/future/backports/misc.py      2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/future/backports/misc.py      2023-01-12 
13:38:08.000000000 +0100
@@ -46,6 +46,16 @@
 
 from itertools import islice
 
+if PY26:
+    # itertools.count in Py 2.6 doesn't accept a step parameter
+    def count(start=0, step=1):
+        while True:
+            yield start
+            start += step
+else:
+    from itertools import count
+
+
 if PY3:
     try:
         from _thread import get_ident
@@ -85,6 +95,10 @@
     return decorating_function
 
 
+# OrderedDict Shim from  Raymond Hettinger, python core dev
+# http://code.activestate.com/recipes/576693-ordered-dictionary-for-py24/
+# here to support version 2.6.
+
 
################################################################################
 ### OrderedDict
 
################################################################################
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/builtins/newround.py 
new/future-0.18.3/src/future/builtins/newround.py
--- old/future-0.18.2/src/future/builtins/newround.py   2019-10-31 
01:56:12.000000000 +0100
+++ new/future-0.18.3/src/future/builtins/newround.py   2023-01-12 
13:38:08.000000000 +0100
@@ -2,6 +2,7 @@
 ``python-future``: pure Python implementation of Python 3 round().
 """
 
+from __future__ import division
 from future.utils import PYPY, PY26, bind_method
 
 # Use the decimal module for simplicity of implementation (and
@@ -29,28 +30,30 @@
     if hasattr(number, '__round__'):
         return number.__round__(ndigits)
 
-    if ndigits < 0:
-        raise NotImplementedError('negative ndigits not supported yet')
     exponent = Decimal('10') ** (-ndigits)
 
-    if PYPY:
-        # Work around issue #24: round() breaks on PyPy with NumPy's types
-        if 'numpy' in repr(type(number)):
-            number = float(number)
+    # Work around issue #24: round() breaks on PyPy with NumPy's types
+    # Also breaks on CPython with NumPy's specialized int types like uint64
+    if 'numpy' in repr(type(number)):
+        number = float(number)
 
     if isinstance(number, Decimal):
         d = number
     else:
         if not PY26:
-            d = Decimal.from_float(number).quantize(exponent,
-                                                rounding=ROUND_HALF_EVEN)
+            d = Decimal.from_float(number)
         else:
-            d = from_float_26(number).quantize(exponent, 
rounding=ROUND_HALF_EVEN)
+            d = from_float_26(number)
+
+    if ndigits < 0:
+        result = newround(d / exponent) * exponent
+    else:
+        result = d.quantize(exponent, rounding=ROUND_HALF_EVEN)
 
     if return_int:
-        return int(d)
+        return int(result)
     else:
-        return float(d)
+        return float(result)
 
 
 ### From Python 2.7's decimal.py. Only needed to support Py2.6:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/builtins/newsuper.py 
new/future-0.18.3/src/future/builtins/newsuper.py
--- old/future-0.18.2/src/future/builtins/newsuper.py   2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/future/builtins/newsuper.py   2023-01-12 
13:38:08.000000000 +0100
@@ -60,44 +60,15 @@
             raise RuntimeError('super() used in a function with no args')
 
         try:
-            # Get the MRO so we can crawl it.
-            mro = type_or_obj.__mro__
-        except (AttributeError, RuntimeError):  # see issue #160
+            typ = find_owner(type_or_obj, f.f_code)
+        except (AttributeError, RuntimeError, TypeError):
+            # see issues #160, #267
             try:
-                mro = type_or_obj.__class__.__mro__
+                typ = find_owner(type_or_obj.__class__, f.f_code)
             except AttributeError:
-                raise RuntimeError('super() used with a non-newstyle class')
-
-        #   A ``for...else`` block?  Yes!  It's odd, but useful.
-        #   If unfamiliar with for...else, see:
-        #
-        #       http://psung.blogspot.com/2007/12/for-else-in-python.html
-        for typ in mro:
-            #  Find the class that owns the currently-executing method.
-            for meth in typ.__dict__.values():
-                # Drill down through any wrappers to the underlying func.
-                # This handles e.g. classmethod() and staticmethod().
-                try:
-                    while not isinstance(meth,FunctionType):
-                        if isinstance(meth, property):
-                            # Calling __get__ on the property will invoke
-                            # user code which might throw exceptions or have
-                            # side effects
-                            meth = meth.fget
-                        else:
-                            try:
-                                meth = meth.__func__
-                            except AttributeError:
-                                meth = meth.__get__(type_or_obj, typ)
-                except (AttributeError, TypeError):
-                    continue
-                if meth.func_code is f.f_code:
-                    break   # Aha!  Found you.
-            else:
-                continue    #  Not found! Move onto the next class in MRO.
-            break    #  Found! Break out of the search loop.
-        else:
-            raise RuntimeError('super() called outside a method')
+                raise RuntimeError('super() used with an old-style class')
+            except TypeError:
+                raise RuntimeError('super() called outside a method')
 
     #  Dispatch to builtin super().
     if type_or_obj is not _SENTINEL:
@@ -105,6 +76,34 @@
     return _builtin_super(typ)
 
 
+def find_owner(cls, code):
+    '''Find the class that owns the currently-executing method.
+    '''
+    for typ in cls.__mro__:
+        for meth in typ.__dict__.values():
+            # Drill down through any wrappers to the underlying func.
+            # This handles e.g. classmethod() and staticmethod().
+            try:
+                while not isinstance(meth,FunctionType):
+                    if isinstance(meth, property):
+                        # Calling __get__ on the property will invoke
+                        # user code which might throw exceptions or have
+                        # side effects
+                        meth = meth.fget
+                    else:
+                        try:
+                            meth = meth.__func__
+                        except AttributeError:
+                            meth = meth.__get__(cls, typ)
+            except (AttributeError, TypeError):
+                continue
+            if meth.func_code is code:
+                return typ   # Aha!  Found you.
+        #  Not found! Move onto the next class in MRO.
+
+    raise TypeError
+
+
 def superm(*args, **kwds):
     f = sys._getframe(1)
     nm = f.f_code.co_name
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/moves/tkinter/filedialog.py 
new/future-0.18.3/src/future/moves/tkinter/filedialog.py
--- old/future-0.18.2/src/future/moves/tkinter/filedialog.py    2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/future/moves/tkinter/filedialog.py    2023-01-12 
13:38:08.000000000 +0100
@@ -10,3 +10,9 @@
     except ImportError:
         raise ImportError('The FileDialog module is missing. Does your Py2 '
                           'installation include tkinter?')
+    
+    try:
+        from tkFileDialog import *
+    except ImportError:
+        raise ImportError('The tkFileDialog module is missing. Does your Py2 '
+                          'installation include tkinter?')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/types/newdict.py 
new/future-0.18.3/src/future/types/newdict.py
--- old/future-0.18.2/src/future/types/newdict.py       2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/future/types/newdict.py       2023-01-12 
13:38:08.000000000 +0100
@@ -23,7 +23,7 @@
 
 
 _builtin_dict = dict
-ver = sys.version_info[:2]
+ver = sys.version_info
 
 
 class BaseNewDict(type):
@@ -38,47 +38,18 @@
     """
     A backport of the Python 3 dict object to Py2
     """
-    def items(self):
-        """
-        On Python 2.7+:
-            D.items() -> a set-like object providing a view on D's items
-        On Python 2.6:
-            D.items() -> an iterator over D's items
-        """
-        if ver == (2, 7):
-            return self.viewitems()
-        elif ver == (2, 6):
-            return self.iteritems()
-        elif ver >= (3, 0):
-            return self.items()
-
-    def keys(self):
-        """
-        On Python 2.7+:
-            D.keys() -> a set-like object providing a view on D's keys
-        On Python 2.6:
-            D.keys() -> an iterator over D's keys
-        """
-        if ver == (2, 7):
-            return self.viewkeys()
-        elif ver == (2, 6):
-            return self.iterkeys()
-        elif ver >= (3, 0):
-            return self.keys()
 
-    def values(self):
-        """
-        On Python 2.7+:
-            D.values() -> a set-like object providing a view on D's values
-        On Python 2.6:
-            D.values() -> an iterator over D's values
-        """
-        if ver == (2, 7):
-            return self.viewvalues()
-        elif ver == (2, 6):
-            return self.itervalues()
-        elif ver >= (3, 0):
-            return self.values()
+    if ver >= (3,):
+        # Inherit items, keys and values from `dict` in 3.x
+        pass
+    elif ver >= (2, 7):
+        items = dict.viewitems
+        keys = dict.viewkeys
+        values = dict.viewvalues
+    else:
+        items = dict.iteritems
+        keys = dict.iterkeys
+        values = dict.itervalues
 
     def __new__(cls, *args, **kwargs):
         """
@@ -93,13 +64,7 @@
             in the keyword argument list.  For example:  dict(one=1, two=2)
         """
 
-        if len(args) == 0:
-            return super(newdict, cls).__new__(cls)
-        elif type(args[0]) == newdict:
-            value = args[0]
-        else:
-            value = args[0]
-        return super(newdict, cls).__new__(cls, value)
+        return super(newdict, cls).__new__(cls, *args)
 
     def __native__(self):
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/types/newint.py 
new/future-0.18.3/src/future/types/newint.py
--- old/future-0.18.2/src/future/types/newint.py        2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/future/types/newint.py        2023-01-12 
13:38:08.000000000 +0100
@@ -284,6 +284,9 @@
         """
         So subclasses can override this, Py3-style
         """
+        if PY3:
+            return super(newint, self).__bool__()
+
         return super(newint, self).__nonzero__()
 
     def __native__(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/types/newrange.py 
new/future-0.18.3/src/future/types/newrange.py
--- old/future-0.18.2/src/future/types/newrange.py      2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/future/types/newrange.py      2023-01-12 
13:38:08.000000000 +0100
@@ -87,7 +87,7 @@
         return (isinstance(other, newrange) and
                 (self._len == 0 == other._len or
                  (self._start, self._step, self._len) ==
-                 (other._start, other._step, self._len)))
+                 (other._start, other._step, other._len)))
 
     def __len__(self):
         return self._len
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future/utils/__init__.py 
new/future-0.18.3/src/future/utils/__init__.py
--- old/future-0.18.2/src/future/utils/__init__.py      2019-10-31 
01:56:12.000000000 +0100
+++ new/future-0.18.3/src/future/utils/__init__.py      2023-01-12 
13:38:08.000000000 +0100
@@ -61,6 +61,9 @@
 PY34_PLUS = sys.version_info[0:2] >= (3, 4)
 PY35_PLUS = sys.version_info[0:2] >= (3, 5)
 PY36_PLUS = sys.version_info[0:2] >= (3, 6)
+PY37_PLUS = sys.version_info[0:2] >= (3, 7)
+PY38_PLUS = sys.version_info[0:2] >= (3, 8)
+PY39_PLUS = sys.version_info[0:2] >= (3, 9)
 PY2 = sys.version_info[0] == 2
 PY26 = sys.version_info[0:2] == (2, 6)
 PY27 = sys.version_info[0:2] == (2, 7)
@@ -527,9 +530,9 @@
         return cls
 
 if PY3:
-    get_next = lambda x: x.next
-else:
     get_next = lambda x: x.__next__
+else:
+    get_next = lambda x: x.next
 
 
 def encode_filename(filename):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future.egg-info/PKG-INFO 
new/future-0.18.3/src/future.egg-info/PKG-INFO
--- old/future-0.18.2/src/future.egg-info/PKG-INFO      2019-10-31 
01:57:05.000000000 +0100
+++ new/future-0.18.3/src/future.egg-info/PKG-INFO      2023-01-13 
04:14:31.000000000 +0100
@@ -1,12 +1,11 @@
 Metadata-Version: 1.2
 Name: future
-Version: 0.18.2
+Version: 0.18.3
 Summary: Clean single-source support for Python 3 and 2
 Home-page: https://python-future.org
 Author: Ed Schofield
 Author-email: e...@pythoncharmers.com
 License: MIT
-Description-Content-Type: UNKNOWN
 Description: 
         future: Easy, safe support for Python 2/3 compatibility
         =======================================================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future.egg-info/SOURCES.txt 
new/future-0.18.3/src/future.egg-info/SOURCES.txt
--- old/future-0.18.2/src/future.egg-info/SOURCES.txt   2019-10-31 
01:57:06.000000000 +0100
+++ new/future-0.18.3/src/future.egg-info/SOURCES.txt   2023-01-13 
04:14:32.000000000 +0100
@@ -3,12 +3,15 @@
 MANIFEST.in
 README.rst
 TESTING.txt
+build.sh
 check_rst.sh
 futurize.py
+lint.sh
 pasteurize.py
 pytest.ini
 setup.cfg
 setup.py
+setup.sh
 docs/Makefile
 docs/automatic_conversion.rst
 docs/bind_method.rst
@@ -44,6 +47,7 @@
 docs/pasteurize.rst
 docs/quickstart.rst
 docs/reference.rst
+docs/requirements.txt
 docs/roadmap.rst
 docs/standard_library_imports.rst
 docs/stdlib_incompatibilities.rst
@@ -347,8 +351,10 @@
 tests/test_future/test_bytes.py
 tests/test_future/test_chainmap.py
 tests/test_future/test_common_iterators.py
+tests/test_future/test_count.py
 tests/test_future/test_decorators.py
 tests/test_future/test_dict.py
+tests/test_future/test_email_generation.py
 tests/test_future/test_email_multipart.py
 tests/test_future/test_explicit_imports.py
 tests/test_future/test_futurize.py
@@ -384,7 +390,9 @@
 tests/test_past/__init__.py
 tests/test_past/test_basestring.py
 tests/test_past/test_builtins.py
+tests/test_past/test_misc.py
 tests/test_past/test_noniterators.py
 tests/test_past/test_olddict.py
 tests/test_past/test_oldstr.py
-tests/test_past/test_translation.py
\ No newline at end of file
+tests/test_past/test_translation.py
+tests/test_past/test_values.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/future.egg-info/top_level.txt 
new/future-0.18.3/src/future.egg-info/top_level.txt
--- old/future-0.18.2/src/future.egg-info/top_level.txt 2019-10-31 
01:57:05.000000000 +0100
+++ new/future-0.18.3/src/future.egg-info/top_level.txt 2023-01-13 
04:14:32.000000000 +0100
@@ -1,17 +1,4 @@
-_dummy_thread
-_markupbase
-_thread
-builtins
-copyreg
 future
-html
-http
 libfuturize
 libpasteurize
 past
-queue
-reprlib
-socketserver
-tkinter
-winreg
-xmlrpc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/future-0.18.2/src/libfuturize/fixes/fix_division_safe.py 
new/future-0.18.3/src/libfuturize/fixes/fix_division_safe.py
--- old/future-0.18.2/src/libfuturize/fixes/fix_division_safe.py        
2019-10-31 01:34:11.000000000 +0100
+++ new/future-0.18.3/src/libfuturize/fixes/fix_division_safe.py        
2023-01-12 13:38:08.000000000 +0100
@@ -92,7 +92,12 @@
                 else:
                     children.append(child.clone())
             if matched:
-                return Node(node.type, children, 
fixers_applied=node.fixers_applied)
+                # In Python 2.6, `Node` does not have the fixers_applied 
attribute
+                # 
https://github.com/python/cpython/blob/8493c0cd66cfc181ac1517268a74f077e9998701/Lib/lib2to3/pytree.py#L235
+                if hasattr(Node, "fixers_applied"):
+                    return Node(node.type, children, 
fixers_applied=node.fixers_applied)
+                else:
+                    return Node(node.type, children)
 
         return False
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/libfuturize/fixes/fix_print.py 
new/future-0.18.3/src/libfuturize/fixes/fix_print.py
--- old/future-0.18.2/src/libfuturize/fixes/fix_print.py        2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/libfuturize/fixes/fix_print.py        2023-01-12 
13:38:08.000000000 +0100
@@ -57,6 +57,16 @@
         if args and args[-1] == Comma():
             args = args[:-1]
             end = " "
+
+            # try to determine if the string ends in a non-space whitespace 
character, in which
+            # case there should be no space at the end of the conversion
+            string_leaves = [leaf for leaf in args[-1].leaves() if leaf.type 
== token.STRING]
+            if (
+                string_leaves
+                and string_leaves[-1].value[0] != "r"  # "raw" string
+                and string_leaves[-1].value[-3:-1] in (r"\t", r"\n", r"\r")
+            ):
+                end = ""
         if args and args[0] == pytree.Leaf(token.RIGHTSHIFT, u">>"):
             assert len(args) >= 2
             file = args[1].clone()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/libfuturize/fixes/fix_raise.py 
new/future-0.18.3/src/libfuturize/fixes/fix_raise.py
--- old/future-0.18.2/src/libfuturize/fixes/fix_raise.py        2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/libfuturize/fixes/fix_raise.py        2023-01-12 
13:38:08.000000000 +0100
@@ -94,7 +94,7 @@
                 args = [exc, Comma(), val]
                 if tb is not None:
                     args += [Comma(), tb]
-                return Call(Name(u"raise_"), args)
+                return Call(Name(u"raise_"), args, prefix=node.prefix)
 
         if tb is not None:
             tb.prefix = ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/past/builtins/misc.py 
new/future-0.18.3/src/past/builtins/misc.py
--- old/future-0.18.2/src/past/builtins/misc.py 2019-10-31 01:34:11.000000000 
+0100
+++ new/future-0.18.3/src/past/builtins/misc.py 2023-01-12 13:38:08.000000000 
+0100
@@ -1,6 +1,8 @@
 from __future__ import unicode_literals
 
 import inspect
+import math
+import numbers
 
 from future.utils import PY2, PY3, exec_
 
@@ -29,8 +31,67 @@
         cmp(x, y) -> integer
 
         Return negative if x<y, zero if x==y, positive if x>y.
+        Python2 had looser comparison allowing cmp None and non Numerical 
types and collections.
+        Try to match the old behavior
         """
-        return (x > y) - (x < y)
+        if isinstance(x, set) and isinstance(y, set):
+            raise TypeError('cannot compare sets using cmp()',)
+        try:
+            if isinstance(x, numbers.Number) and math.isnan(x):
+                if not isinstance(y, numbers.Number):
+                    raise TypeError('cannot compare float("nan"), {type_y} 
with cmp'.format(type_y=type(y)))
+                if isinstance(y, int):
+                    return 1
+                else:
+                    return -1
+            if isinstance(y, numbers.Number) and math.isnan(y):
+                if not isinstance(x, numbers.Number):
+                    raise TypeError('cannot compare {type_x}, float("nan") 
with cmp'.format(type_x=type(x)))
+                if isinstance(x, int):
+                    return -1
+                else:
+                    return 1
+            return (x > y) - (x < y)
+        except TypeError:
+            if x == y:
+                return 0
+            type_order = [
+                type(None),
+                numbers.Number,
+                dict, list,
+                set,
+                (str, bytes),
+            ]
+            x_type_index = y_type_index = None
+            for i, type_match in enumerate(type_order):
+                if isinstance(x, type_match):
+                    x_type_index = i
+                if isinstance(y, type_match):
+                    y_type_index = i
+            if cmp(x_type_index, y_type_index) == 0:
+                if isinstance(x, bytes) and isinstance(y, str):
+                    return cmp(x.decode('ascii'), y)
+                if isinstance(y, bytes) and isinstance(x, str):
+                    return cmp(x, y.decode('ascii'))
+                elif isinstance(x, list):
+                    # if both arguments are lists take the comparison of the 
first non equal value
+                    for x_elem, y_elem in zip(x, y):
+                        elem_cmp_val = cmp(x_elem, y_elem)
+                        if elem_cmp_val != 0:
+                            return elem_cmp_val
+                    # if all elements are equal, return equal/0
+                    return 0
+                elif isinstance(x, dict):
+                    if len(x) != len(y):
+                        return cmp(len(x), len(y))
+                    else:
+                        x_key = min(a for a in x if a not in y or x[a] != y[a])
+                        y_key = min(b for b in y if b not in x or x[b] != y[b])
+                        if x_key != y_key:
+                            return cmp(x_key, y_key)
+                        else:
+                            return cmp(x[x_key], y[y_key])
+            return cmp(x_type_index, y_type_index)
 
     from sys import intern
 
@@ -42,7 +103,13 @@
         return '0' + builtins.oct(number)[2:]
 
     raw_input = input
-    from imp import reload
+
+    try:
+        from importlib import reload
+    except ImportError:
+        # for python2, python3 <= 3.4
+        from imp import reload
+
     unicode = str
     unichr = chr
     xrange = range
@@ -82,7 +149,7 @@
         if not isinstance(mylocals, Mapping):
             raise TypeError('locals must be a mapping')
         with open(filename, "rb") as fin:
-             source = fin.read()
+            source = fin.read()
         code = compile(source, filename, "exec")
         exec_(code, myglobals, mylocals)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/past/types/basestring.py 
new/future-0.18.3/src/past/types/basestring.py
--- old/future-0.18.2/src/past/types/basestring.py      2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/src/past/types/basestring.py      2023-01-12 
13:38:08.000000000 +0100
@@ -25,9 +25,8 @@
     def __instancecheck__(cls, instance):
         return isinstance(instance, (bytes, str))
 
-    def __subclasshook__(cls, thing):
-        # TODO: What should go here?
-        raise NotImplemented
+    def __subclasscheck__(cls, subclass):
+        return super(BaseBaseString, cls).__subclasscheck__(subclass) or 
issubclass(subclass, (bytes, str))
 
 
 class basestring(with_metaclass(BaseBaseString)):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/src/past/types/oldstr.py 
new/future-0.18.3/src/past/types/oldstr.py
--- old/future-0.18.2/src/past/types/oldstr.py  2019-10-31 01:34:11.000000000 
+0100
+++ new/future-0.18.3/src/past/types/oldstr.py  2023-01-12 13:38:08.000000000 
+0100
@@ -20,7 +20,7 @@
 
 
 def unescape(s):
-    """
+    r"""
     Interprets strings with escape sequences
 
     Example:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_future/test_backports.py 
new/future-0.18.3/tests/test_future/test_backports.py
--- old/future-0.18.2/tests/test_future/test_backports.py       2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/tests/test_future/test_backports.py       2023-01-12 
13:38:08.000000000 +0100
@@ -87,7 +87,8 @@
         d['b'] = 20
         d['c'] = 30
         self.assertEqual(d.maps, [{'b':20, 'c':30}, {'a':1, 'b':2}])  # check 
internal state
-        self.assertEqual(d.items(), dict(a=1, b=20, c=30).items())    # check 
items/iter/getitem
+        self.assertEqual(sorted(d.items()),
+                         sorted(dict(a=1, b=20, c=30).items()))       # check 
items/iter/getitem
         self.assertEqual(len(d), 3)                                   # check 
len
         for key in 'abc':                                             # check 
contains
             self.assertIn(key, d)
@@ -96,7 +97,8 @@
 
         del d['b']                                                    # unmask 
a value
         self.assertEqual(d.maps, [{'c':30}, {'a':1, 'b':2}])          # check 
internal state
-        self.assertEqual(d.items(), dict(a=1, b=2, c=30).items())     # check 
items/iter/getitem
+        self.assertEqual(sorted(d.items()),
+                         sorted(dict(a=1, b=2, c=30).items()))        # check 
items/iter/getitem
         self.assertEqual(len(d), 3)                                   # check 
len
         for key in 'abc':                                             # check 
contains
             self.assertIn(key, d)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_future/test_builtins.py 
new/future-0.18.3/tests/test_future/test_builtins.py
--- old/future-0.18.2/tests/test_future/test_builtins.py        2019-10-31 
01:56:12.000000000 +0100
+++ new/future-0.18.3/tests/test_future/test_builtins.py        2023-01-12 
13:38:08.000000000 +0100
@@ -146,7 +146,6 @@
         self.assertTrue(isinstance(round(123.5, 0), float))
         self.assertTrue(isinstance(round(123.5), Integral))
 
-    @unittest.skip('negative ndigits not implemented yet')
     def test_round_negative_ndigits(self):
         self.assertEqual(round(10.1350, 0), 10.0)
         self.assertEqual(round(10.1350, -1), 10.0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_future/test_count.py 
new/future-0.18.3/tests/test_future/test_count.py
--- old/future-0.18.2/tests/test_future/test_count.py   1970-01-01 
01:00:00.000000000 +0100
+++ new/future-0.18.3/tests/test_future/test_count.py   2023-01-12 
13:38:08.000000000 +0100
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+"""
+Tests for the backported class:`range` class.
+"""
+from itertools import count as it_count
+
+from future.backports.misc import count
+from future.tests.base import unittest, skip26
+
+
+class CountTest(unittest.TestCase):
+
+    """Test the count function."""
+
+    def _test_count_func(self, func):
+        self.assertEqual(next(func(1)), 1)
+        self.assertEqual(next(func(start=1)), 1)
+
+        c = func()
+        self.assertEqual(next(c), 0)
+        self.assertEqual(next(c), 1)
+        self.assertEqual(next(c), 2)
+        c = func(1, 1)
+        self.assertEqual(next(c), 1)
+        self.assertEqual(next(c), 2)
+        c = func(step=1)
+        self.assertEqual(next(c), 0)
+        self.assertEqual(next(c), 1)
+        c = func(start=1, step=1)
+        self.assertEqual(next(c), 1)
+        self.assertEqual(next(c), 2)
+
+        c = func(-1)
+        self.assertEqual(next(c), -1)
+        self.assertEqual(next(c), 0)
+        self.assertEqual(next(c), 1)
+        c = func(1, -1)
+        self.assertEqual(next(c), 1)
+        self.assertEqual(next(c), 0)
+        self.assertEqual(next(c), -1)
+        c = func(-1, -1)
+        self.assertEqual(next(c), -1)
+        self.assertEqual(next(c), -2)
+        self.assertEqual(next(c), -3)
+
+    def test_count(self):
+        """Test the count function."""
+        self._test_count_func(count)
+
+    @skip26
+    def test_own_count(self):
+        """Test own count implementation."""
+        self._test_count_func(it_count)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/future-0.18.2/tests/test_future/test_email_generation.py 
new/future-0.18.3/tests/test_future/test_email_generation.py
--- old/future-0.18.2/tests/test_future/test_email_generation.py        
1970-01-01 01:00:00.000000000 +0100
+++ new/future-0.18.3/tests/test_future/test_email_generation.py        
2023-01-12 13:38:08.000000000 +0100
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+"""Tests for email generation."""
+
+from __future__ import unicode_literals
+
+from future.backports.email.mime.multipart import MIMEMultipart
+from future.backports.email.mime.text import MIMEText
+from future.backports.email.utils import formatdate
+from future.tests.base import unittest
+
+
+class EmailGenerationTests(unittest.TestCase):
+    def test_email_custom_header_can_contain_unicode(self):
+        msg = MIMEMultipart()
+        alternative = MIMEMultipart('alternative')
+        alternative.attach(MIMEText('Plain content with Únicødê', 
_subtype='plain', _charset='utf-8'))
+        alternative.attach(MIMEText('HTML content with Únicødê', 
_subtype='html', _charset='utf-8'))
+        msg.attach(alternative)
+
+        msg['Subject'] = 'Subject with Únicødê'
+        msg['From'] = 'sen...@test.com'
+        msg['To'] = 'recipi...@test.com'
+        msg['Date'] = formatdate(None, localtime=True)
+        msg['Message-ID'] = 'anIdWithÚnicødêForThisEmail'
+
+        msg_lines = msg.as_string().split('\n')
+        self.assertEqual(msg_lines[2], 'Subject: 
=?utf-8?b?U3ViamVjdCB3aXRoIMOabmljw7hkw6o=?=')
+        self.assertEqual(msg_lines[6], 'Message-ID: 
=?utf-8?b?YW5JZFdpdGjDmm5pY8O4ZMOqRm9yVGhpc0VtYWls?=')
+        self.assertEqual(msg_lines[17], 
'UGxhaW4gY29udGVudCB3aXRoIMOabmljw7hkw6o=')
+        self.assertEqual(msg_lines[24], 
'SFRNTCBjb250ZW50IHdpdGggw5puaWPDuGTDqg==')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_future/test_futurize.py 
new/future-0.18.3/tests/test_future/test_futurize.py
--- old/future-0.18.2/tests/test_future/test_futurize.py        2019-10-31 
01:56:12.000000000 +0100
+++ new/future-0.18.3/tests/test_future/test_futurize.py        2023-01-12 
13:38:08.000000000 +0100
@@ -436,6 +436,7 @@
         """
         self.convert_check(before, after, ignore_imports=False, run=False)
 
+    @expectedFailurePY26
     def test_input_without_import(self):
         before = """
         a = input()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/future-0.18.2/tests/test_future/test_libfuturize_fixers.py 
new/future-0.18.3/tests/test_future/test_libfuturize_fixers.py
--- old/future-0.18.2/tests/test_future/test_libfuturize_fixers.py      
2019-10-31 01:34:11.000000000 +0100
+++ new/future-0.18.3/tests/test_future/test_libfuturize_fixers.py      
2023-01-12 13:38:08.000000000 +0100
@@ -307,6 +307,37 @@
         a = """print(1, end=' ')"""
         self.check(b, a)
 
+    def test_trailing_comma_4(self):
+        b = """print "a ","""
+        a = """print("a ", end=' ')"""
+        self.check(b, a)
+
+    def test_trailing_comma_5(self):
+        b = r"""print "b\t","""
+        a = r"""print("b\t", end='')"""
+        self.check(b, a)
+
+    def test_trailing_comma_6(self):
+        b = r"""print "c\n","""
+        a = r"""print("c\n", end='')"""
+        self.check(b, a)
+
+    def test_trailing_comma_7(self):
+        b = r"""print "d\r","""
+        a = r"""print("d\r", end='')"""
+        self.check(b, a)
+
+    def test_trailing_comma_8(self):
+        b = r"""print "%s\n" % (1,),"""
+        a = r"""print("%s\n" % (1,), end='')"""
+        self.check(b, a)
+
+
+    def test_trailing_comma_9(self):
+        b = r"""print r"e\n","""
+        a = r"""print(r"e\n", end=' ')"""
+        self.check(b, a)
+
     # >> stuff
 
     def test_vargs_without_trailing_comma(self):
@@ -767,6 +798,20 @@
         raise_(E, Func(arg1, arg2, arg3), tb) # foo"""
         self.check(b, a)
 
+    def test_unknown_value_with_indent(self):
+        b = """
+        while True:
+            print()  # another expression in the same block triggers different 
parsing
+            raise E, V
+        """
+        a = """
+        from future.utils import raise_
+        while True:
+            print()  # another expression in the same block triggers different 
parsing
+            raise_(E, V)
+        """
+        self.check(b, a)
+
     # These should produce a warning
 
     def test_string_exc(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_future/test_super.py 
new/future-0.18.3/tests/test_future/test_super.py
--- old/future-0.18.2/tests/test_future/test_super.py   2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/tests/test_future/test_super.py   2023-01-12 
13:38:08.000000000 +0100
@@ -170,6 +170,18 @@
 
         self.assertEqual(Elite().walk(), 'Defused')
 
+    def test_metaclass(self):
+        class Meta(type):
+            def __init__(cls, name, bases, clsdict):
+                super().__init__(name, bases, clsdict)
+
+        try:
+            class Base(object):
+                __metaclass__ = Meta
+        except Exception as e:
+            self.fail('raised %s with a custom metaclass'
+                      % type(e).__name__)
+
 
 class TestSuperFromTestDescrDotPy(unittest.TestCase):
     """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_future/test_urllibnet.py 
new/future-0.18.3/tests/test_future/test_urllibnet.py
--- old/future-0.18.2/tests/test_future/test_urllibnet.py       2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/tests/test_future/test_urllibnet.py       2023-01-12 
13:38:08.000000000 +0100
@@ -38,7 +38,7 @@
 
 
 class urlopenNetworkTests(unittest.TestCase):
-    """Tests urllib.reqest.urlopen using the network.
+    """Tests urllib.request.urlopen using the network.
 
     These tests are not exhaustive.  Assuming that testing using files does a
     good job overall of some of the basic interface features.  There are no
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_past/test_basestring.py 
new/future-0.18.3/tests/test_past/test_basestring.py
--- old/future-0.18.2/tests/test_past/test_basestring.py        2019-10-31 
01:34:11.000000000 +0100
+++ new/future-0.18.3/tests/test_past/test_basestring.py        2023-01-12 
13:38:08.000000000 +0100
@@ -19,6 +19,25 @@
         s2 = oldstr(b'abc')
         self.assertTrue(isinstance(s2, basestring))
 
+    def test_issubclass(self):
+        self.assertTrue(issubclass(str, basestring))
+        self.assertTrue(issubclass(bytes, basestring))
+        self.assertTrue(issubclass(basestring, basestring))
+        self.assertFalse(issubclass(int, basestring))
+        self.assertFalse(issubclass(list, basestring))
+        self.assertTrue(issubclass(basestring, object))
+
+        class CustomString(basestring):
+            pass
+        class NotString(object):
+            pass
+        class OldStyleClass:
+            pass
+        self.assertTrue(issubclass(CustomString, basestring))
+        self.assertFalse(issubclass(NotString, basestring))
+        self.assertFalse(issubclass(OldStyleClass, basestring))
+
+
 
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_past/test_misc.py 
new/future-0.18.3/tests/test_past/test_misc.py
--- old/future-0.18.2/tests/test_past/test_misc.py      1970-01-01 
01:00:00.000000000 +0100
+++ new/future-0.18.3/tests/test_past/test_misc.py      2023-01-12 
13:38:08.000000000 +0100
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+"""
+Tests for the resurrected Py2-like cmp function
+"""
+
+from __future__ import absolute_import, unicode_literals, print_function
+
+import os.path
+import sys
+import traceback
+from contextlib import contextmanager
+
+from future.tests.base import unittest
+from future.utils import PY3, PY26
+
+if PY3:
+    from past.builtins import cmp
+
+_dir = os.path.dirname(os.path.abspath(__file__))
+sys.path.append(_dir)
+import test_values
+
+
+@contextmanager
+def empty_context_manager(*args, **kwargs):
+    yield dict(args=args, kwargs=kwargs)
+
+
+class TestCmp(unittest.TestCase):
+    def test_cmp(self):
+        for x, y, cmp_python2_value in test_values.cmp_python2_value:
+            if PY26:
+                # set cmp works a bit differently in 2.6, we try to emulate 
2.7 behavior, so skip set cmp tests
+                if isinstance(x, set) or isinstance(y, set):
+                    continue
+            # to get this to run on python <3.4 which lacks subTest
+            with getattr(self, 'subTest', empty_context_manager)(x=x, y=y):
+                try:
+                    past_cmp_value = cmp(x, y)
+                except Exception:
+                    past_cmp_value = 
traceback.format_exc().strip().split('\n')[-1]
+
+                self.assertEqual(cmp_python2_value, past_cmp_value,
+                                 "expected result matching python2 
__builtins__.cmp({x!r},{y!r}) "
+                                 "== {cmp_python2_value} "
+                                 "got past.builtins.cmp({x!r},{y!r}) "
+                                 "== {past_cmp_value} "
+                                 "".format(x=x, y=y, 
past_cmp_value=past_cmp_value,
+                                           
cmp_python2_value=cmp_python2_value))
+
+
+if __name__ == '__main__':
+    unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/future-0.18.2/tests/test_past/test_values.py 
new/future-0.18.3/tests/test_past/test_values.py
--- old/future-0.18.2/tests/test_past/test_values.py    1970-01-01 
01:00:00.000000000 +0100
+++ new/future-0.18.3/tests/test_past/test_values.py    2023-01-12 
13:38:08.000000000 +0100
@@ -0,0 +1,225 @@
+from math import pi
+
+inf, nan = float('inf'), float('nan')
+test_values = [
+    0, 1, 2, -1, -9999999999, 9999999,
+    0.0, inf, pi,
+    [], [[]], [1, 2, 3],
+    set(), set([1, 2, 3]),
+    " ", "", "1", "dsada saA.", "2", "dsa", b"", b"dsa", b" ",
+    {5: 3}, dict(), dict(a=99), dict(a=1, b=2, c=3), None
+]
+
+# cmp_python2_values are pre-calculated from running cmp under python2 first  
values are x and y, last is results of cmp
+cmp_python2_value = [[0, 1, -1], [0, 2, -1], [0, -1, 1], [0, 
-9999999999999999, 1], [0, 9999999999999999, -1],
+                     [0, 0.0, 0], [0, inf, -1], [0, 3.141592653589793, -1], 
[0, [], -1], [0, [[]], -1],
+                     [0, [1, 2, 3], -1], [0, '', -1], [0, ' ', -1], [0, '1', 
-1], [0, 'a bee cd.', -1], [0, '', -1],
+                     [0, ' ', -1], [0, '1', -1], [0, 'a bee cd.', -1], [0, 
set([]), -1], [0, set([1, 2, 3]), -1],
+                     [0, {5: 3}, -1], [0, {}, -1], [0, {'a': 99}, -1], [0, 
{'a': 1, 'c': 3, 'b': 2}, -1],
+                     [0, {'a': 99, 'c': 3, 'b': 5}, -1], [0, None, 1], [1, 0, 
1], [1, 2, -1], [1, -1, 1],
+                     [1, -9999999999999999, 1], [1, 9999999999999999, -1], [1, 
0.0, 1], [1, inf, -1],
+                     [1, 3.141592653589793, -1], [1, [], -1], [1, [[]], -1], 
[1, [1, 2, 3], -1], [1, '', -1],
+                     [1, ' ', -1], [1, '1', -1], [1, 'a bee cd.', -1], [1, '', 
-1], [1, ' ', -1], [1, '1', -1],
+                     [1, 'a bee cd.', -1], [1, set([]), -1], [1, set([1, 2, 
3]), -1], [1, {5: 3}, -1], [1, {}, -1],
+                     [1, {'a': 99}, -1], [1, {'a': 1, 'c': 3, 'b': 2}, -1], 
[1, {'a': 99, 'c': 3, 'b': 5}, -1],
+                     [1, None, 1], [2, 0, 1], [2, 1, 1], [2, -1, 1], [2, 
-9999999999999999, 1],
+                     [2, 9999999999999999, -1], [2, 0.0, 1], [2, inf, -1], [2, 
3.141592653589793, -1], [2, [], -1],
+                     [2, [[]], -1], [2, [1, 2, 3], -1], [2, '', -1], [2, ' ', 
-1], [2, '1', -1], [2, 'a bee cd.', -1],
+                     [2, '', -1], [2, ' ', -1], [2, '1', -1], [2, 'a bee cd.', 
-1], [2, set([]), -1],
+                     [2, set([1, 2, 3]), -1], [2, {5: 3}, -1], [2, {}, -1], 
[2, {'a': 99}, -1],
+                     [2, {'a': 1, 'c': 3, 'b': 2}, -1], [2, {'a': 99, 'c': 3, 
'b': 5}, -1], [2, None, 1], [-1, 0, -1],
+                     [-1, 1, -1], [-1, 2, -1], [-1, -9999999999999999, 1], 
[-1, 9999999999999999, -1], [-1, 0.0, -1],
+                     [-1, inf, -1], [-1, 3.141592653589793, -1], [-1, [], -1], 
[-1, [[]], -1], [-1, [1, 2, 3], -1],
+                     [-1, '', -1], [-1, ' ', -1], [-1, '1', -1], [-1, 'a bee 
cd.', -1], [-1, '', -1], [-1, ' ', -1],
+                     [-1, '1', -1], [-1, 'a bee cd.', -1], [-1, set([]), -1], 
[-1, set([1, 2, 3]), -1],
+                     [-1, {5: 3}, -1], [-1, {}, -1], [-1, {'a': 99}, -1], [-1, 
{'a': 1, 'c': 3, 'b': 2}, -1],
+                     [-1, {'a': 99, 'c': 3, 'b': 5}, -1], [-1, None, 1], 
[-9999999999999999, 0, -1],
+                     [-9999999999999999, 1, -1], [-9999999999999999, 2, -1], 
[-9999999999999999, -1, -1],
+                     [-9999999999999999, 9999999999999999, -1], 
[-9999999999999999, 0.0, -1],
+                     [-9999999999999999, inf, -1], [-9999999999999999, 
3.141592653589793, -1],
+                     [-9999999999999999, [], -1], [-9999999999999999, [[]], 
-1], [-9999999999999999, [1, 2, 3], -1],
+                     [-9999999999999999, '', -1], [-9999999999999999, ' ', 
-1], [-9999999999999999, '1', -1],
+                     [-9999999999999999, 'a bee cd.', -1], [-9999999999999999, 
'', -1], [-9999999999999999, ' ', -1],
+                     [-9999999999999999, '1', -1], [-9999999999999999, 'a bee 
cd.', -1],
+                     [-9999999999999999, set([]), -1], [-9999999999999999, 
set([1, 2, 3]), -1],
+                     [-9999999999999999, {5: 3}, -1], [-9999999999999999, {}, 
-1], [-9999999999999999, {'a': 99}, -1],
+                     [-9999999999999999, {'a': 1, 'c': 3, 'b': 2}, -1],
+                     [-9999999999999999, {'a': 99, 'c': 3, 'b': 5}, -1], 
[-9999999999999999, None, 1],
+                     [9999999999999999, 0, 1], [9999999999999999, 1, 1], 
[9999999999999999, 2, 1],
+                     [9999999999999999, -1, 1], [9999999999999999, 
-9999999999999999, 1], [9999999999999999, 0.0, 1],
+                     [9999999999999999, inf, -1], [9999999999999999, 
3.141592653589793, 1], [9999999999999999, [], -1],
+                     [9999999999999999, [[]], -1], [9999999999999999, [1, 2, 
3], -1], [9999999999999999, '', -1],
+                     [9999999999999999, ' ', -1], [9999999999999999, '1', -1], 
[9999999999999999, 'a bee cd.', -1],
+                     [9999999999999999, '', -1], [9999999999999999, ' ', -1], 
[9999999999999999, '1', -1],
+                     [9999999999999999, 'a bee cd.', -1], [9999999999999999, 
set([]), -1],
+                     [9999999999999999, set([1, 2, 3]), -1], 
[9999999999999999, {5: 3}, -1], [9999999999999999, {}, -1],
+                     [9999999999999999, {'a': 99}, -1], [9999999999999999, 
{'a': 1, 'c': 3, 'b': 2}, -1],
+                     [9999999999999999, {'a': 99, 'c': 3, 'b': 5}, -1], 
[9999999999999999, None, 1], [0.0, 0, 0],
+                     [0.0, 1, -1], [0.0, 2, -1], [0.0, -1, 1], [0.0, 
-9999999999999999, 1], [0.0, 9999999999999999, -1],
+                     [0.0, inf, -1], [0.0, 3.141592653589793, -1], [0.0, [], 
-1], [0.0, [[]], -1], [0.0, [1, 2, 3], -1],
+                     [0.0, '', -1], [0.0, ' ', -1], [0.0, '1', -1], [0.0, 'a 
bee cd.', -1], [0.0, '', -1],
+                     [0.0, ' ', -1], [0.0, '1', -1], [0.0, 'a bee cd.', -1], 
[0.0, set([]), -1],
+                     [0.0, set([1, 2, 3]), -1], [0.0, {5: 3}, -1], [0.0, {}, 
-1], [0.0, {'a': 99}, -1],
+                     [0.0, {'a': 1, 'c': 3, 'b': 2}, -1], [0.0, {'a': 99, 'c': 
3, 'b': 5}, -1], [0.0, None, 1],
+                     [inf, 0, 1], [inf, 1, 1], [inf, 2, 1], [inf, -1, 1], 
[inf, -9999999999999999, 1],
+                     [inf, 9999999999999999, 1], [inf, 0.0, 1], [inf, 
3.141592653589793, 1], [inf, [], -1],
+                     [inf, [[]], -1], [inf, [1, 2, 3], -1], [inf, '', -1], 
[inf, ' ', -1], [inf, '1', -1],
+                     [inf, 'a bee cd.', -1], [inf, '', -1], [inf, ' ', -1], 
[inf, '1', -1], [inf, 'a bee cd.', -1],
+                     [inf, set([]), -1], [inf, set([1, 2, 3]), -1], [inf, {5: 
3}, -1], [inf, {}, -1],
+                     [inf, {'a': 99}, -1], [inf, {'a': 1, 'c': 3, 'b': 2}, 
-1], [inf, {'a': 99, 'c': 3, 'b': 5}, -1],
+                     [inf, None, 1], [3.141592653589793, 0, 1], 
[3.141592653589793, 1, 1], [3.141592653589793, 2, 1],
+                     [3.141592653589793, -1, 1], [3.141592653589793, 
-9999999999999999, 1],
+                     [3.141592653589793, 9999999999999999, -1], 
[3.141592653589793, 0.0, 1],
+                     [3.141592653589793, inf, -1], [3.141592653589793, [], 
-1], [3.141592653589793, [[]], -1],
+                     [3.141592653589793, [1, 2, 3], -1], [3.141592653589793, 
'', -1], [3.141592653589793, ' ', -1],
+                     [3.141592653589793, '1', -1], [3.141592653589793, 'a bee 
cd.', -1], [3.141592653589793, '', -1],
+                     [3.141592653589793, ' ', -1], [3.141592653589793, '1', 
-1], [3.141592653589793, 'a bee cd.', -1],
+                     [3.141592653589793, set([]), -1], [3.141592653589793, 
set([1, 2, 3]), -1],
+                     [3.141592653589793, {5: 3}, -1], [3.141592653589793, {}, 
-1], [3.141592653589793, {'a': 99}, -1],
+                     [3.141592653589793, {'a': 1, 'c': 3, 'b': 2}, -1],
+                     [3.141592653589793, {'a': 99, 'c': 3, 'b': 5}, -1], 
[3.141592653589793, None, 1], [[], 0, 1],
+                     [[], 1, 1], [[], 2, 1], [[], -1, 1], [[], 
-9999999999999999, 1], [[], 9999999999999999, 1],
+                     [[], 0.0, 1], [[], inf, 1], [[], 3.141592653589793, 1], 
[[], [[]], -1], [[], [1, 2, 3], -1],
+                     [[], '', -1], [[], ' ', -1], [[], '1', -1], [[], 'a bee 
cd.', -1], [[], '', -1], [[], ' ', -1],
+                     [[], '1', -1], [[], 'a bee cd.', -1], [[], set([]), -1], 
[[], set([1, 2, 3]), -1], [[], {5: 3}, 1],
+                     [[], {}, 1], [[], {'a': 99}, 1], [[], {'a': 1, 'c': 3, 
'b': 2}, 1],
+                     [[], {'a': 99, 'c': 3, 'b': 5}, 1], [[], None, 1], [[[]], 
0, 1], [[[]], 1, 1], [[[]], 2, 1],
+                     [[[]], -1, 1], [[[]], -9999999999999999, 1], [[[]], 
9999999999999999, 1], [[[]], 0.0, 1],
+                     [[[]], inf, 1], [[[]], 3.141592653589793, 1], [[[]], [], 
1], [[[]], [1, 2, 3], 1], [[[]], '', -1],
+                     [[[]], ' ', -1], [[[]], '1', -1], [[[]], 'a bee cd.', 
-1], [[[]], '', -1], [[[]], ' ', -1],
+                     [[[]], '1', -1], [[[]], 'a bee cd.', -1], [[[]], set([]), 
-1], [[[]], set([1, 2, 3]), -1],
+                     [[[]], {5: 3}, 1], [[[]], {}, 1], [[[]], {'a': 99}, 1], 
[[[]], {'a': 1, 'c': 3, 'b': 2}, 1],
+                     [[[]], {'a': 99, 'c': 3, 'b': 5}, 1], [[[]], None, 1], 
[[1, 2, 3], 0, 1], [[1, 2, 3], 1, 1],
+                     [[1, 2, 3], 2, 1], [[1, 2, 3], -1, 1], [[1, 2, 3], 
-9999999999999999, 1],
+                     [[1, 2, 3], 9999999999999999, 1], [[1, 2, 3], 0.0, 1], 
[[1, 2, 3], inf, 1],
+                     [[1, 2, 3], 3.141592653589793, 1], [[1, 2, 3], [], 1], 
[[1, 2, 3], [[]], -1], [[1, 2, 3], '', -1],
+                     [[1, 2, 3], ' ', -1], [[1, 2, 3], '1', -1], [[1, 2, 3], 
'a bee cd.', -1], [[1, 2, 3], '', -1],
+                     [[1, 2, 3], ' ', -1], [[1, 2, 3], '1', -1], [[1, 2, 3], 
'a bee cd.', -1], [[1, 2, 3], set([]), -1],
+                     [[1, 2, 3], set([1, 2, 3]), -1], [[1, 2, 3], {5: 3}, 1], 
[[1, 2, 3], {}, 1],
+                     [[1, 2, 3], {'a': 99}, 1], [[1, 2, 3], {'a': 1, 'c': 3, 
'b': 2}, 1],
+                     [[1, 2, 3], {'a': 99, 'c': 3, 'b': 5}, 1], [[1, 2, 3], 
None, 1], ['', 0, 1], ['', 1, 1],
+                     ['', 2, 1], ['', -1, 1], ['', -9999999999999999, 1], ['', 
9999999999999999, 1], ['', 0.0, 1],
+                     ['', inf, 1], ['', 3.141592653589793, 1], ['', [], 1], 
['', [[]], 1], ['', [1, 2, 3], 1],
+                     ['', ' ', -1], ['', '1', -1], ['', 'a bee cd.', -1], ['', 
'', 0], ['', ' ', -1], ['', '1', -1],
+                     ['', 'a bee cd.', -1], ['', set([]), 1], ['', set([1, 2, 
3]), 1], ['', {5: 3}, 1], ['', {}, 1],
+                     ['', {'a': 99}, 1], ['', {'a': 1, 'c': 3, 'b': 2}, 1], 
['', {'a': 99, 'c': 3, 'b': 5}, 1],
+                     ['', None, 1], [' ', 0, 1], [' ', 1, 1], [' ', 2, 1], [' 
', -1, 1], [' ', -9999999999999999, 1],
+                     [' ', 9999999999999999, 1], [' ', 0.0, 1], [' ', inf, 1], 
[' ', 3.141592653589793, 1],
+                     [' ', [], 1], [' ', [[]], 1], [' ', [1, 2, 3], 1], [' ', 
'', 1], [' ', '1', -1],
+                     [' ', 'a bee cd.', -1], [' ', '', 1], [' ', ' ', 0], [' 
', '1', -1], [' ', 'a bee cd.', -1],
+                     [' ', set([]), 1], [' ', set([1, 2, 3]), 1], [' ', {5: 
3}, 1], [' ', {}, 1], [' ', {'a': 99}, 1],
+                     [' ', {'a': 1, 'c': 3, 'b': 2}, 1], [' ', {'a': 99, 'c': 
3, 'b': 5}, 1], [' ', None, 1],
+                     ['1', 0, 1], ['1', 1, 1], ['1', 2, 1], ['1', -1, 1], 
['1', -9999999999999999, 1],
+                     ['1', 9999999999999999, 1], ['1', 0.0, 1], ['1', inf, 1], 
['1', 3.141592653589793, 1],
+                     ['1', [], 1], ['1', [[]], 1], ['1', [1, 2, 3], 1], ['1', 
'', 1], ['1', ' ', 1],
+                     ['1', 'a bee cd.', -1], ['1', '', 1], ['1', ' ', 1], 
['1', '1', 0], ['1', 'a bee cd.', -1],
+                     ['1', set([]), 1], ['1', set([1, 2, 3]), 1], ['1', {5: 
3}, 1], ['1', {}, 1], ['1', {'a': 99}, 1],
+                     ['1', {'a': 1, 'c': 3, 'b': 2}, 1], ['1', {'a': 99, 'c': 
3, 'b': 5}, 1], ['1', None, 1],
+                     ['a bee cd.', 0, 1], ['a bee cd.', 1, 1], ['a bee cd.', 
2, 1], ['a bee cd.', -1, 1],
+                     ['a bee cd.', -9999999999999999, 1], ['a bee cd.', 
9999999999999999, 1], ['a bee cd.', 0.0, 1],
+                     ['a bee cd.', inf, 1], ['a bee cd.', 3.141592653589793, 
1], ['a bee cd.', [], 1],
+                     ['a bee cd.', [[]], 1], ['a bee cd.', [1, 2, 3], 1], ['a 
bee cd.', '', 1], ['a bee cd.', ' ', 1],
+                     ['a bee cd.', '1', 1], ['a bee cd.', '', 1], ['a bee 
cd.', ' ', 1], ['a bee cd.', '1', 1],
+                     ['a bee cd.', 'a bee cd.', 0], ['a bee cd.', set([]), 1], 
['a bee cd.', set([1, 2, 3]), 1],
+                     ['a bee cd.', {5: 3}, 1], ['a bee cd.', {}, 1], ['a bee 
cd.', {'a': 99}, 1],
+                     ['a bee cd.', {'a': 1, 'c': 3, 'b': 2}, 1], ['a bee cd.', 
{'a': 99, 'c': 3, 'b': 5}, 1],
+                     ['a bee cd.', None, 1], ['', 0, 1], ['', 1, 1], ['', 2, 
1], ['', -1, 1],
+                     ['', -9999999999999999, 1], ['', 9999999999999999, 1], 
['', 0.0, 1], ['', inf, 1],
+                     ['', 3.141592653589793, 1], ['', [], 1], ['', [[]], 1], 
['', [1, 2, 3], 1], ['', '', 0],
+                     ['', ' ', -1], ['', '1', -1], ['', 'a bee cd.', -1], ['', 
' ', -1], ['', '1', -1],
+                     ['', 'a bee cd.', -1], ['', set([]), 1], ['', set([1, 2, 
3]), 1], ['', {5: 3}, 1], ['', {}, 1],
+                     ['', {'a': 99}, 1], ['', {'a': 1, 'c': 3, 'b': 2}, 1], 
['', {'a': 99, 'c': 3, 'b': 5}, 1],
+                     ['', None, 1], [' ', 0, 1], [' ', 1, 1], [' ', 2, 1], [' 
', -1, 1], [' ', -9999999999999999, 1],
+                     [' ', 9999999999999999, 1], [' ', 0.0, 1], [' ', inf, 1], 
[' ', 3.141592653589793, 1],
+                     [' ', [], 1], [' ', [[]], 1], [' ', [1, 2, 3], 1], [' ', 
'', 1], [' ', ' ', 0], [' ', '1', -1],
+                     [' ', 'a bee cd.', -1], [' ', '', 1], [' ', '1', -1], [' 
', 'a bee cd.', -1], [' ', set([]), 1],
+                     [' ', set([1, 2, 3]), 1], [' ', {5: 3}, 1], [' ', {}, 1], 
[' ', {'a': 99}, 1],
+                     [' ', {'a': 1, 'c': 3, 'b': 2}, 1], [' ', {'a': 99, 'c': 
3, 'b': 5}, 1], [' ', None, 1],
+                     ['1', 0, 1], ['1', 1, 1], ['1', 2, 1], ['1', -1, 1], 
['1', -9999999999999999, 1],
+                     ['1', 9999999999999999, 1], ['1', 0.0, 1], ['1', inf, 1], 
['1', 3.141592653589793, 1],
+                     ['1', [], 1], ['1', [[]], 1], ['1', [1, 2, 3], 1], ['1', 
'', 1], ['1', ' ', 1], ['1', '1', 0],
+                     ['1', 'a bee cd.', -1], ['1', '', 1], ['1', ' ', 1], 
['1', 'a bee cd.', -1], ['1', set([]), 1],
+                     ['1', set([1, 2, 3]), 1], ['1', {5: 3}, 1], ['1', {}, 1], 
['1', {'a': 99}, 1],
+                     ['1', {'a': 1, 'c': 3, 'b': 2}, 1], ['1', {'a': 99, 'c': 
3, 'b': 5}, 1], ['1', None, 1],
+                     ['a bee cd.', 0, 1], ['a bee cd.', 1, 1], ['a bee cd.', 
2, 1], ['a bee cd.', -1, 1],
+                     ['a bee cd.', -9999999999999999, 1], ['a bee cd.', 
9999999999999999, 1], ['a bee cd.', 0.0, 1],
+                     ['a bee cd.', inf, 1], ['a bee cd.', 3.141592653589793, 
1], ['a bee cd.', [], 1],
+                     ['a bee cd.', [[]], 1], ['a bee cd.', [1, 2, 3], 1], ['a 
bee cd.', '', 1], ['a bee cd.', ' ', 1],
+                     ['a bee cd.', '1', 1], ['a bee cd.', 'a bee cd.', 0], ['a 
bee cd.', '', 1], ['a bee cd.', ' ', 1],
+                     ['a bee cd.', '1', 1], ['a bee cd.', set([]), 1], ['a bee 
cd.', set([1, 2, 3]), 1],
+                     ['a bee cd.', {5: 3}, 1], ['a bee cd.', {}, 1], ['a bee 
cd.', {'a': 99}, 1],
+                     ['a bee cd.', {'a': 1, 'c': 3, 'b': 2}, 1], ['a bee cd.', 
{'a': 99, 'c': 3, 'b': 5}, 1],
+                     ['a bee cd.', None, 1], [set([]), 0, 1], [set([]), 1, 1], 
[set([]), 2, 1], [set([]), -1, 1],
+                     [set([]), -9999999999999999, 1], [set([]), 
9999999999999999, 1], [set([]), 0.0, 1],
+                     [set([]), inf, 1], [set([]), 3.141592653589793, 1], 
[set([]), [], 1], [set([]), [[]], 1],
+                     [set([]), [1, 2, 3], 1], [set([]), '', -1], [set([]), ' 
', -1], [set([]), '1', -1],
+                     [set([]), 'a bee cd.', -1], [set([]), '', -1], [set([]), 
' ', -1], [set([]), '1', -1],
+                     [set([]), 'a bee cd.', -1],
+                     [set([]), set([1, 2, 3]), 'TypeError: cannot compare sets 
using cmp()'], [set([]), {5: 3}, 1],
+                     [set([]), {}, 1], [set([]), {'a': 99}, 1], [set([]), 
{'a': 1, 'c': 3, 'b': 2}, 1],
+                     [set([]), {'a': 99, 'c': 3, 'b': 5}, 1], [set([]), None, 
1], [set([1, 2, 3]), 0, 1],
+                     [set([1, 2, 3]), 1, 1], [set([1, 2, 3]), 2, 1], [set([1, 
2, 3]), -1, 1],
+                     [set([1, 2, 3]), -9999999999999999, 1], [set([1, 2, 3]), 
9999999999999999, 1],
+                     [set([1, 2, 3]), 0.0, 1], [set([1, 2, 3]), inf, 1], 
[set([1, 2, 3]), 3.141592653589793, 1],
+                     [set([1, 2, 3]), [], 1], [set([1, 2, 3]), [[]], 1], 
[set([1, 2, 3]), [1, 2, 3], 1],
+                     [set([1, 2, 3]), '', -1], [set([1, 2, 3]), ' ', -1], 
[set([1, 2, 3]), '1', -1],
+                     [set([1, 2, 3]), 'a bee cd.', -1], [set([1, 2, 3]), '', 
-1], [set([1, 2, 3]), ' ', -1],
+                     [set([1, 2, 3]), '1', -1], [set([1, 2, 3]), 'a bee cd.', 
-1],
+                     [set([1, 2, 3]), set([]), 'TypeError: cannot compare sets 
using cmp()'],
+                     [set([1, 2, 3]), {5: 3}, 1], [set([1, 2, 3]), {}, 1], 
[set([1, 2, 3]), {'a': 99}, 1],
+                     [set([1, 2, 3]), {'a': 1, 'c': 3, 'b': 2}, 1], [set([1, 
2, 3]), {'a': 99, 'c': 3, 'b': 5}, 1],
+                     [set([1, 2, 3]), None, 1], [{5: 3}, 0, 1], [{5: 3}, 1, 
1], [{5: 3}, 2, 1], [{5: 3}, -1, 1],
+                     [{5: 3}, -9999999999999999, 1], [{5: 3}, 
9999999999999999, 1], [{5: 3}, 0.0, 1], [{5: 3}, inf, 1],
+                     [{5: 3}, 3.141592653589793, 1], [{5: 3}, [], -1], [{5: 
3}, [[]], -1], [{5: 3}, [1, 2, 3], -1],
+                     [{5: 3}, '', -1], [{5: 3}, ' ', -1], [{5: 3}, '1', -1], 
[{5: 3}, 'a bee cd.', -1],
+                     [{5: 3}, '', -1], [{5: 3}, ' ', -1], [{5: 3}, '1', -1], 
[{5: 3}, 'a bee cd.', -1],
+                     [{5: 3}, set([]), -1], [{5: 3}, set([1, 2, 3]), -1], [{5: 
3}, {}, 1], [{5: 3}, {'a': 99}, -1],
+                     [{5: 3}, {'a': 1, 'c': 3, 'b': 2}, -1], [{5: 3}, {'a': 
99, 'c': 3, 'b': 5}, -1], [{5: 3}, None, 1],
+                     [{}, 0, 1], [{}, 1, 1], [{}, 2, 1], [{}, -1, 1], [{}, 
-9999999999999999, 1],
+                     [{}, 9999999999999999, 1], [{}, 0.0, 1], [{}, inf, 1], 
[{}, 3.141592653589793, 1], [{}, [], -1],
+                     [{}, [[]], -1], [{}, [1, 2, 3], -1], [{}, '', -1], [{}, ' 
', -1], [{}, '1', -1],
+                     [{}, 'a bee cd.', -1], [{}, '', -1], [{}, ' ', -1], [{}, 
'1', -1], [{}, 'a bee cd.', -1],
+                     [{}, set([]), -1], [{}, set([1, 2, 3]), -1], [{}, {5: 3}, 
-1], [{}, {'a': 99}, -1],
+                     [{}, {'a': 1, 'c': 3, 'b': 2}, -1], [{}, {'a': 99, 'c': 
3, 'b': 5}, -1], [{}, None, 1],
+                     [{'a': 99}, 0, 1], [{'a': 99}, 1, 1], [{'a': 99}, 2, 1], 
[{'a': 99}, -1, 1],
+                     [{'a': 99}, -9999999999999999, 1], [{'a': 99}, 
9999999999999999, 1], [{'a': 99}, 0.0, 1],
+                     [{'a': 99}, inf, 1], [{'a': 99}, 3.141592653589793, 1], 
[{'a': 99}, [], -1], [{'a': 99}, [[]], -1],
+                     [{'a': 99}, [1, 2, 3], -1], [{'a': 99}, '', -1], [{'a': 
99}, ' ', -1], [{'a': 99}, '1', -1],
+                     [{'a': 99}, 'a bee cd.', -1], [{'a': 99}, '', -1], [{'a': 
99}, ' ', -1], [{'a': 99}, '1', -1],
+                     [{'a': 99}, 'a bee cd.', -1], [{'a': 99}, set([]), -1], 
[{'a': 99}, set([1, 2, 3]), -1],
+                     [{'a': 99}, {5: 3}, 1], [{'a': 99}, {}, 1], [{'a': 99}, 
{'a': 1, 'c': 3, 'b': 2}, -1],
+                     [{'a': 99}, {'a': 99, 'c': 3, 'b': 5}, -1], [{'a': 99}, 
None, 1], [{'a': 1, 'c': 3, 'b': 2}, 0, 1],
+                     [{'a': 1, 'c': 3, 'b': 2}, 1, 1], [{'a': 1, 'c': 3, 'b': 
2}, 2, 1],
+                     [{'a': 1, 'c': 3, 'b': 2}, -1, 1], [{'a': 1, 'c': 3, 'b': 
2}, -9999999999999999, 1],
+                     [{'a': 1, 'c': 3, 'b': 2}, 9999999999999999, 1], [{'a': 
1, 'c': 3, 'b': 2}, 0.0, 1],
+                     [{'a': 1, 'c': 3, 'b': 2}, inf, 1], [{'a': 1, 'c': 3, 
'b': 2}, 3.141592653589793, 1],
+                     [{'a': 1, 'c': 3, 'b': 2}, [], -1], [{'a': 1, 'c': 3, 
'b': 2}, [[]], -1],
+                     [{'a': 1, 'c': 3, 'b': 2}, [1, 2, 3], -1], [{'a': 1, 'c': 
3, 'b': 2}, '', -1],
+                     [{'a': 1, 'c': 3, 'b': 2}, ' ', -1], [{'a': 1, 'c': 3, 
'b': 2}, '1', -1],
+                     [{'a': 1, 'c': 3, 'b': 2}, 'a bee cd.', -1], [{'a': 1, 
'c': 3, 'b': 2}, '', -1],
+                     [{'a': 1, 'c': 3, 'b': 2}, ' ', -1], [{'a': 1, 'c': 3, 
'b': 2}, '1', -1],
+                     [{'a': 1, 'c': 3, 'b': 2}, 'a bee cd.', -1], [{'a': 1, 
'c': 3, 'b': 2}, set([]), -1],
+                     [{'a': 1, 'c': 3, 'b': 2}, set([1, 2, 3]), -1], [{'a': 1, 
'c': 3, 'b': 2}, {5: 3}, 1],
+                     [{'a': 1, 'c': 3, 'b': 2}, {}, 1], [{'a': 1, 'c': 3, 'b': 
2}, {'a': 99}, 1],
+                     [{'a': 1, 'c': 3, 'b': 2}, {'a': 99, 'c': 3, 'b': 5}, 
-1], [{'a': 1, 'c': 3, 'b': 2}, None, 1],
+                     [{'a': 99, 'c': 3, 'b': 5}, 0, 1], [{'a': 99, 'c': 3, 
'b': 5}, 1, 1],
+                     [{'a': 99, 'c': 3, 'b': 5}, 2, 1], [{'a': 99, 'c': 3, 
'b': 5}, -1, 1],
+                     [{'a': 99, 'c': 3, 'b': 5}, -9999999999999999, 1],
+                     [{'a': 99, 'c': 3, 'b': 5}, 9999999999999999, 1], [{'a': 
99, 'c': 3, 'b': 5}, 0.0, 1],
+                     [{'a': 99, 'c': 3, 'b': 5}, inf, 1], [{'a': 99, 'c': 3, 
'b': 5}, 3.141592653589793, 1],
+                     [{'a': 99, 'c': 3, 'b': 5}, [], -1], [{'a': 99, 'c': 3, 
'b': 5}, [[]], -1],
+                     [{'a': 99, 'c': 3, 'b': 5}, [1, 2, 3], -1], [{'a': 99, 
'c': 3, 'b': 5}, '', -1],
+                     [{'a': 99, 'c': 3, 'b': 5}, ' ', -1], [{'a': 99, 'c': 3, 
'b': 5}, '1', -1],
+                     [{'a': 99, 'c': 3, 'b': 5}, 'a bee cd.', -1], [{'a': 99, 
'c': 3, 'b': 5}, '', -1],
+                     [{'a': 99, 'c': 3, 'b': 5}, ' ', -1], [{'a': 99, 'c': 3, 
'b': 5}, '1', -1],
+                     [{'a': 99, 'c': 3, 'b': 5}, 'a bee cd.', -1], [{'a': 99, 
'c': 3, 'b': 5}, set([]), -1],
+                     [{'a': 99, 'c': 3, 'b': 5}, set([1, 2, 3]), -1], [{'a': 
99, 'c': 3, 'b': 5}, {5: 3}, 1],
+                     [{'a': 99, 'c': 3, 'b': 5}, {}, 1], [{'a': 99, 'c': 3, 
'b': 5}, {'a': 99}, 1],
+                     [{'a': 99, 'c': 3, 'b': 5}, {'a': 1, 'c': 3, 'b': 2}, 1], 
[{'a': 99, 'c': 3, 'b': 5}, None, 1],
+                     [None, 0, -1], [None, 1, -1], [None, 2, -1], [None, -1, 
-1], [None, -9999999999999999, -1],
+                     [None, 9999999999999999, -1], [None, 0.0, -1], [None, 
inf, -1], [None, 3.141592653589793, -1],
+                     [None, [], -1], [None, [[]], -1], [None, [1, 2, 3], -1], 
[None, '', -1], [None, ' ', -1],
+                     [None, '1', -1], [None, 'a bee cd.', -1], [None, '', -1], 
[None, ' ', -1], [None, '1', -1],
+                     [None, 'a bee cd.', -1], [None, set([]), -1], [None, 
set([1, 2, 3]), -1], [None, {5: 3}, -1],
+                     [None, {}, -1], [None, {'a': 99}, -1], [None, {'a': 1, 
'c': 3, 'b': 2}, -1],
+                     [None, {'a': 99, 'c': 3, 'b': 5}, -1]]

Reply via email to