Updated to support Python 3.x