/* Generated by Cython 0.23.2 */

/* BEGIN: Cython Metadata
{
    "distutils": {
        "depends": [],
        "extra_compile_args": [
            "-Wno-unused-parameter",
            "-Wno-unused-function"
        ],
        "include_dirs": [
            "/Users/seang/code/frs-wheel-builds/venv34/lib/python3.4/site-packages/numpy/core/include",
            "/Users/seang/code/frs-wheel-builds/parts/gdal/include"
        ],
        "libraries": [
            "gdal"
        ],
        "library_dirs": [
            "/Users/seang/code/frs-wheel-builds/parts/gdal/lib"
        ]
    }
}
END: Cython Metadata */

#define PY_SSIZE_T_CLEAN
#include "Python.h"
#ifndef Py_PYTHON_H
    #error Python headers needed to compile C extensions, please install development version of Python.
#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000)
    #error Cython requires Python 2.6+ or Python 3.2+.
#else
#define CYTHON_ABI "0_23_2"
#include <stddef.h>
#ifndef offsetof
#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
#endif
#if !defined(WIN32) && !defined(MS_WINDOWS)
  #ifndef __stdcall
    #define __stdcall
  #endif
  #ifndef __cdecl
    #define __cdecl
  #endif
  #ifndef __fastcall
    #define __fastcall
  #endif
#endif
#ifndef DL_IMPORT
  #define DL_IMPORT(t) t
#endif
#ifndef DL_EXPORT
  #define DL_EXPORT(t) t
#endif
#ifndef PY_LONG_LONG
  #define PY_LONG_LONG LONG_LONG
#endif
#ifndef Py_HUGE_VAL
  #define Py_HUGE_VAL HUGE_VAL
#endif
#ifdef PYPY_VERSION
#define CYTHON_COMPILING_IN_PYPY 1
#define CYTHON_COMPILING_IN_CPYTHON 0
#else
#define CYTHON_COMPILING_IN_PYPY 0
#define CYTHON_COMPILING_IN_CPYTHON 1
#endif
#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000
#define CYTHON_USE_PYLONG_INTERNALS 1
#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
#define Py_OptimizeFlag 0
#endif
#define __PYX_BUILD_PY_SSIZE_T "n"
#define CYTHON_FORMAT_SSIZE_T "z"
#if PY_MAJOR_VERSION < 3
  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
          PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyClass_Type
#else
  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyType_Type
#endif
#ifndef Py_TPFLAGS_CHECKTYPES
  #define Py_TPFLAGS_CHECKTYPES 0
#endif
#ifndef Py_TPFLAGS_HAVE_INDEX
  #define Py_TPFLAGS_HAVE_INDEX 0
#endif
#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
#endif
#ifndef Py_TPFLAGS_HAVE_FINALIZE
  #define Py_TPFLAGS_HAVE_FINALIZE 0
#endif
#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
  #define CYTHON_PEP393_ENABLED 1
  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ?\
                                              0 : _PyUnicode_Ready((PyObject *)(op)))
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
  #define __Pyx_PyUnicode_KIND(u)         PyUnicode_KIND(u)
  #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
#else
  #define CYTHON_PEP393_ENABLED 0
  #define __Pyx_PyUnicode_READY(op)       (0)
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
  #define __Pyx_PyUnicode_KIND(u)         (sizeof(Py_UNICODE))
  #define __Pyx_PyUnicode_DATA(u)         ((void*)PyUnicode_AS_UNICODE(u))
  #define __Pyx_PyUnicode_READ(k, d, i)   ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
#endif
#if CYTHON_COMPILING_IN_PYPY
  #define __Pyx_PyUnicode_Concat(a, b)      PyNumber_Add(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  PyNumber_Add(a, b)
#else
  #define __Pyx_PyUnicode_Concat(a, b)      PyUnicode_Concat(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
      PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
#endif
#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
  #define PyUnicode_Contains(u, s)  PySequence_Contains(u, s)
#endif
#define __Pyx_PyString_FormatSafe(a, b)   ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
#define __Pyx_PyUnicode_FormatSafe(a, b)  ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyString_Format(a, b)  PyUnicode_Format(a, b)
#else
  #define __Pyx_PyString_Format(a, b)  PyString_Format(a, b)
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBaseString_Type            PyUnicode_Type
  #define PyStringObject               PyUnicodeObject
  #define PyString_Type                PyUnicode_Type
  #define PyString_Check               PyUnicode_Check
  #define PyString_CheckExact          PyUnicode_CheckExact
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
  #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
#else
  #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj))
  #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
#endif
#ifndef PySet_CheckExact
  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
#endif
#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
#if PY_MAJOR_VERSION >= 3
  #define PyIntObject                  PyLongObject
  #define PyInt_Type                   PyLong_Type
  #define PyInt_Check(op)              PyLong_Check(op)
  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
  #define PyInt_FromString             PyLong_FromString
  #define PyInt_FromUnicode            PyLong_FromUnicode
  #define PyInt_FromLong               PyLong_FromLong
  #define PyInt_FromSize_t             PyLong_FromSize_t
  #define PyInt_FromSsize_t            PyLong_FromSsize_t
  #define PyInt_AsLong                 PyLong_AsLong
  #define PyInt_AS_LONG                PyLong_AS_LONG
  #define PyInt_AsSsize_t              PyLong_AsSsize_t
  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
  #define PyNumber_Int                 PyNumber_Long
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBoolObject                 PyLongObject
#endif
#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
  #ifndef PyUnicode_InternFromString
    #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
  #endif
#endif
#if PY_VERSION_HEX < 0x030200A4
  typedef long Py_hash_t;
  #define __Pyx_PyInt_FromHash_t PyInt_FromLong
  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
#else
  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
#else
  #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
#endif
#if PY_VERSION_HEX >= 0x030500B1
#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
typedef struct {
    unaryfunc am_await;
    unaryfunc am_aiter;
    unaryfunc am_anext;
} __Pyx_PyAsyncMethodsStruct;
#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
#else
#define __Pyx_PyType_AsAsync(obj) NULL
#endif
#ifndef CYTHON_RESTRICT
  #if defined(__GNUC__)
    #define CYTHON_RESTRICT __restrict__
  #elif defined(_MSC_VER) && _MSC_VER >= 1400
    #define CYTHON_RESTRICT __restrict
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_RESTRICT restrict
  #else
    #define CYTHON_RESTRICT
  #endif
#endif
#define __Pyx_void_to_None(void_result) (void_result, Py_INCREF(Py_None), Py_None)

#ifndef CYTHON_INLINE
  #if defined(__GNUC__)
    #define CYTHON_INLINE __inline__
  #elif defined(_MSC_VER)
    #define CYTHON_INLINE __inline
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_INLINE inline
  #else
    #define CYTHON_INLINE
  #endif
#endif

#if defined(WIN32) || defined(MS_WINDOWS)
  #define _USE_MATH_DEFINES
#endif
#include <math.h>
#ifdef NAN
#define __PYX_NAN() ((float) NAN)
#else
static CYTHON_INLINE float __PYX_NAN() {
  float value;
  memset(&value, 0xFF, sizeof(value));
  return value;
}
#endif


#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
#else
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
#endif

#ifndef __PYX_EXTERN_C
  #ifdef __cplusplus
    #define __PYX_EXTERN_C extern "C"
  #else
    #define __PYX_EXTERN_C extern
  #endif
#endif

#define __PYX_HAVE__rasterio___base
#define __PYX_HAVE_API__rasterio___base
#include "string.h"
#include "stdlib.h"
#include "cpl_conv.h"
#include "cpl_string.h"
#include "cpl_vsi.h"
#include "ogr_srs_api.h"
#include "gdal.h"
#include "gdalwarper.h"
#include "gdal_alg.h"
#include "ogr_core.h"
#include "ogr_api.h"
#ifdef _OPENMP
#include <omp.h>
#endif /* _OPENMP */

#ifdef PYREX_WITHOUT_ASSERTIONS
#define CYTHON_WITHOUT_ASSERTIONS
#endif

#ifndef CYTHON_UNUSED
# if defined(__GNUC__)
#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
#     define CYTHON_UNUSED __attribute__ ((__unused__))
#   else
#     define CYTHON_UNUSED
#   endif
# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
#   define CYTHON_UNUSED __attribute__ ((__unused__))
# else
#   define CYTHON_UNUSED
# endif
#endif
#ifndef CYTHON_NCP_UNUSED
# if CYTHON_COMPILING_IN_CPYTHON
#  define CYTHON_NCP_UNUSED
# else
#  define CYTHON_NCP_UNUSED CYTHON_UNUSED
# endif
#endif
typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding;
                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry;

#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0
#define __PYX_DEFAULT_STRING_ENCODING ""
#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#define __Pyx_uchar_cast(c) ((unsigned char)c)
#define __Pyx_long_cast(x) ((long)x)
#define __Pyx_fits_Py_ssize_t(v, type, is_signed)  (\
    (sizeof(type) < sizeof(Py_ssize_t))  ||\
    (sizeof(type) > sizeof(Py_ssize_t) &&\
          likely(v < (type)PY_SSIZE_T_MAX ||\
                 v == (type)PY_SSIZE_T_MAX)  &&\
          (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\
                                v == (type)PY_SSIZE_T_MIN)))  ||\
    (sizeof(type) == sizeof(Py_ssize_t) &&\
          (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\
                               v == (type)PY_SSIZE_T_MAX)))  )
#if defined (__cplusplus) && __cplusplus >= 201103L
    #include <cstdlib>
    #define __Pyx_sst_abs(value) std::abs(value)
#elif SIZEOF_INT >= SIZEOF_SIZE_T
    #define __Pyx_sst_abs(value) abs(value)
#elif SIZEOF_LONG >= SIZEOF_SIZE_T
    #define __Pyx_sst_abs(value) labs(value)
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define __Pyx_sst_abs(value) llabs(value)
#elif defined (_MSC_VER) && defined (_M_X64)
    #define __Pyx_sst_abs(value) _abs64(value)
#elif defined (__GNUC__)
    #define __Pyx_sst_abs(value) __builtin_llabs(value)
#else
    #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
#endif
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*);
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
#define __Pyx_PyBytes_FromString        PyBytes_FromString
#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
#if PY_MAJOR_VERSION < 3
    #define __Pyx_PyStr_FromString        __Pyx_PyBytes_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#else
    #define __Pyx_PyStr_FromString        __Pyx_PyUnicode_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
#endif
#define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_FromCString(s)  __Pyx_PyObject_FromString((const char*)s)
#define __Pyx_PyBytes_FromCString(s)   __Pyx_PyBytes_FromString((const char*)s)
#define __Pyx_PyByteArray_FromCString(s)   __Pyx_PyByteArray_FromString((const char*)s)
#define __Pyx_PyStr_FromCString(s)     __Pyx_PyStr_FromString((const char*)s)
#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
#if PY_MAJOR_VERSION < 3
static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
{
    const Py_UNICODE *u_end = u;
    while (*u_end++) ;
    return (size_t)(u_end - u - 1);
}
#else
#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen
#endif
#define __Pyx_PyUnicode_FromUnicode(u)       PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
#define __Pyx_PyUnicode_AsUnicode            PyUnicode_AsUnicode
#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False))
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
#if CYTHON_COMPILING_IN_CPYTHON
#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
#else
#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
#endif
#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
static int __Pyx_sys_getdefaultencoding_not_ascii;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys;
    PyObject* default_encoding = NULL;
    PyObject* ascii_chars_u = NULL;
    PyObject* ascii_chars_b = NULL;
    const char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (!sys) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
    Py_DECREF(sys);
    if (!default_encoding) goto bad;
    default_encoding_c = PyBytes_AsString(default_encoding);
    if (!default_encoding_c) goto bad;
    if (strcmp(default_encoding_c, "ascii") == 0) {
        __Pyx_sys_getdefaultencoding_not_ascii = 0;
    } else {
        char ascii_chars[128];
        int c;
        for (c = 0; c < 128; c++) {
            ascii_chars[c] = c;
        }
        __Pyx_sys_getdefaultencoding_not_ascii = 1;
        ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
        if (!ascii_chars_u) goto bad;
        ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
        if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
            PyErr_Format(
                PyExc_ValueError,
                "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
                default_encoding_c);
            goto bad;
        }
        Py_DECREF(ascii_chars_u);
        Py_DECREF(ascii_chars_b);
    }
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(default_encoding);
    Py_XDECREF(ascii_chars_u);
    Py_XDECREF(ascii_chars_b);
    return -1;
}
#endif
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL)
#else
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
static char* __PYX_DEFAULT_STRING_ENCODING;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys;
    PyObject* default_encoding = NULL;
    char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (!sys) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
    Py_DECREF(sys);
    if (!default_encoding) goto bad;
    default_encoding_c = PyBytes_AsString(default_encoding);
    if (!default_encoding_c) goto bad;
    __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c));
    if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
    strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(default_encoding);
    return -1;
}
#endif
#endif


/* Test for GCC > 2.95 */
#if defined(__GNUC__)     && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
  #define likely(x)   __builtin_expect(!!(x), 1)
  #define unlikely(x) __builtin_expect(!!(x), 0)
#else /* !__GNUC__ or GCC < 2.95 */
  #define likely(x)   (x)
  #define unlikely(x) (x)
#endif /* __GNUC__ */

static PyObject *__pyx_m;
static PyObject *__pyx_d;
static PyObject *__pyx_b;
static PyObject *__pyx_empty_tuple;
static PyObject *__pyx_empty_bytes;
static int __pyx_lineno;
static int __pyx_clineno = 0;
static const char * __pyx_cfilenm= __FILE__;
static const char *__pyx_filename;


static const char *__pyx_f[] = {
  "rasterio/_base.pyx",
};

/* "_ogr.pxd":2
 * 
 * ctypedef int OGRErr             # <<<<<<<<<<<<<<
 * ctypedef struct OGREnvelope:
 *     double MinX
 */
typedef int __pyx_t_8rasterio_4_ogr_OGRErr;

/*--- Type declarations ---*/
struct __pyx_obj_8rasterio_5_base_DatasetReader;
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows;
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index;
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr;
struct __pyx_t_8rasterio_4_ogr_OGREnvelope;
typedef struct __pyx_t_8rasterio_4_ogr_OGREnvelope __pyx_t_8rasterio_4_ogr_OGREnvelope;

/* "_ogr.pxd":3
 * 
 * ctypedef int OGRErr
 * ctypedef struct OGREnvelope:             # <<<<<<<<<<<<<<
 *     double MinX
 *     double MaxX
 */
struct __pyx_t_8rasterio_4_ogr_OGREnvelope {
  double MinX;
  double MaxX;
  double MinY;
  double MaxY;
};

/* "rasterio/_base.pxd":3
 * # Base class.
 * 
 * cdef class DatasetReader:             # <<<<<<<<<<<<<<
 *     # Read-only access to dataset metadata. No IO!
 * 
 */
struct __pyx_obj_8rasterio_5_base_DatasetReader {
  PyObject_HEAD
  struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader *__pyx_vtab;
  void *_hds;
  PyObject *name;
  PyObject *mode;
  PyObject *width;
  PyObject *height;
  PyObject *shape;
  PyObject *driver;
  PyObject *_count;
  PyObject *_dtypes;
  PyObject *_closed;
  PyObject *_crs;
  PyObject *_crs_wkt;
  PyObject *_transform;
  PyObject *_block_shapes;
  PyObject *_nodatavals;
  PyObject *_read;
  PyObject *env;
};


/* "rasterio/_base.pyx":319
 *             return self.nodatavals[0]
 * 
 *     def block_windows(self, bidx=0):             # <<<<<<<<<<<<<<
 *         """Returns an iterator over a band's block windows and their
 *         indexes.
 */
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows {
  PyObject_HEAD
  PyObject *__pyx_v_bidx;
  PyObject *__pyx_v_block_shapes;
  PyObject *__pyx_v_col;
  PyObject *__pyx_v_d;
  PyObject *__pyx_v_h;
  PyObject *__pyx_v_height;
  int __pyx_v_i;
  int __pyx_v_j;
  PyObject *__pyx_v_m;
  PyObject *__pyx_v_ncols;
  PyObject *__pyx_v_nrows;
  PyObject *__pyx_v_row;
  struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self;
  PyObject *__pyx_v_w;
  PyObject *__pyx_v_width;
  long __pyx_t_0;
  int __pyx_t_1;
  long __pyx_t_2;
  int __pyx_t_3;
};


/* "rasterio/_base.pyx":804
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index {
  PyObject_HEAD
  PyObject *__pyx_v_window;
};


/* "rasterio/_base.pyx":805
 * 
 * def window_index(window):
 *     return tuple(slice(*w) for w in window)             # <<<<<<<<<<<<<<
 * 
 * 
 */
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr {
  PyObject_HEAD
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *__pyx_outer_scope;
  PyObject *__pyx_v_w;
  PyObject *__pyx_t_0;
  Py_ssize_t __pyx_t_1;
  PyObject *(*__pyx_t_2)(PyObject *);
};



/* "rasterio/_base.pyx":33
 * 
 * 
 * cdef class DatasetReader(object):             # <<<<<<<<<<<<<<
 * 
 *     def __init__(self, path):
 */

struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader {
  void *(*band)(struct __pyx_obj_8rasterio_5_base_DatasetReader *, int);
};
static struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader *__pyx_vtabptr_8rasterio_5_base_DatasetReader;

/* --- Runtime support code (head) --- */
#ifndef CYTHON_REFNANNY
  #define CYTHON_REFNANNY 0
#endif
#if CYTHON_REFNANNY
  typedef struct {
    void (*INCREF)(void*, PyObject*, int);
    void (*DECREF)(void*, PyObject*, int);
    void (*GOTREF)(void*, PyObject*, int);
    void (*GIVEREF)(void*, PyObject*, int);
    void* (*SetupContext)(const char*, int, const char*);
    void (*FinishContext)(void**);
  } __Pyx_RefNannyAPIStruct;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname);
  #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
#ifdef WITH_THREAD
  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
          if (acquire_gil) {\
              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
              PyGILState_Release(__pyx_gilstate_save);\
          } else {\
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
          }
#else
  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
#endif
  #define __Pyx_RefNannyFinishContext()\
          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
  #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_XINCREF(r)  do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)
  #define __Pyx_XDECREF(r)  do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)
  #define __Pyx_XGOTREF(r)  do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)
  #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
#else
  #define __Pyx_RefNannyDeclarations
  #define __Pyx_RefNannySetupContext(name, acquire_gil)
  #define __Pyx_RefNannyFinishContext()
  #define __Pyx_INCREF(r) Py_INCREF(r)
  #define __Pyx_DECREF(r) Py_DECREF(r)
  #define __Pyx_GOTREF(r)
  #define __Pyx_GIVEREF(r)
  #define __Pyx_XINCREF(r) Py_XINCREF(r)
  #define __Pyx_XDECREF(r) Py_XDECREF(r)
  #define __Pyx_XGOTREF(r)
  #define __Pyx_XGIVEREF(r)
#endif
#define __Pyx_XDECREF_SET(r, v) do {\
        PyObject *tmp = (PyObject *) r;\
        r = v; __Pyx_XDECREF(tmp);\
    } while (0)
#define __Pyx_DECREF_SET(r, v) do {\
        PyObject *tmp = (PyObject *) r;\
        r = v; __Pyx_DECREF(tmp);\
    } while (0)
#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) {
    PyTypeObject* tp = Py_TYPE(obj);
    if (likely(tp->tp_getattro))
        return tp->tp_getattro(obj, attr_name);
#if PY_MAJOR_VERSION < 3
    if (likely(tp->tp_getattr))
        return tp->tp_getattr(obj, PyString_AS_STRING(attr_name));
#endif
    return PyObject_GetAttr(obj, attr_name);
}
#else
#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
#endif

static PyObject *__Pyx_GetBuiltinName(PyObject *name);

static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);

static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);

static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
    const char* function_name);

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, long intval, int inplace);
#else
#define __Pyx_PyInt_EqObjC(op1, op2, intval, inplace)\
    PyObject_RichCompare(op1, op2, Py_EQ)
    #endif

static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name);

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
#else
#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
#endif

static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
#else
#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
#endif

#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000
static CYTHON_INLINE PyObject* __Pyx_PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name) {
    PyObject *res;
    PyTypeObject *tp = Py_TYPE(obj);
#if PY_MAJOR_VERSION < 3
    if (unlikely(PyInstance_Check(obj)))
        return __Pyx_PyObject_GetAttrStr(obj, attr_name);
#endif
    res = _PyType_Lookup(tp, attr_name);
    if (likely(res)) {
        descrgetfunc f = Py_TYPE(res)->tp_descr_get;
        if (!f) {
            Py_INCREF(res);
        } else {
            res = f(res, obj, (PyObject *)tp);
        }
    } else {
        PyErr_SetObject(PyExc_AttributeError, attr_name);
    }
    return res;
}
#else
#define __Pyx_PyObject_LookupSpecial(o,n) __Pyx_PyObject_GetAttrStr(o,n)
#endif

static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb);
static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb);

static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);

#include <string.h>

static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
         const char* cstring, Py_ssize_t start, Py_ssize_t stop,
         const char* encoding, const char* errors,
         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors));

static void __Pyx_WriteUnraisable(const char *name, int clineno,
                                  int lineno, const char *filename,
                                  int full_traceback, int nogil);

static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);

static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals);

#if PY_MAJOR_VERSION >= 3
#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
#else
#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
#endif

static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);

static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);

static CYTHON_INLINE int __Pyx_IterFinish(void);

static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected);

static double __Pyx__PyObject_AsDouble(PyObject* obj);
#if CYTHON_COMPILING_IN_PYPY
#define __Pyx_PyObject_AsDouble(obj)\
(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) :\
 likely(PyInt_CheckExact(obj)) ?\
 PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
#else
#define __Pyx_PyObject_AsDouble(obj)\
((likely(PyFloat_CheckExact(obj))) ?\
 PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_RemainderObjC(PyObject *op1, PyObject *op2, long intval, int inplace);
#else
#define __Pyx_PyInt_RemainderObjC(op1, op2, intval, inplace)\
    (inplace ? PyNumber_InPlaceRemainder(op1, op2) : PyNumber_Remainder(op1, op2))
#endif

static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb);
static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb);

#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\
    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\
               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck);
#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck);
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
                                                     int is_list, int wraparound, int boundscheck);

static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);

#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\
    (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\
               __Pyx_SetItemInt_Generic(o, to_py_func(i), v)))
static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v);
static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v,
                                               int is_list, int wraparound, int boundscheck);

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace);
#else
#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\
    (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2))
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
    PyListObject* L = (PyListObject*) list;
    Py_ssize_t len = Py_SIZE(list);
    if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
        Py_INCREF(x);
        PyList_SET_ITEM(list, len, x);
        Py_SIZE(list) = len+1;
        return 0;
    }
    return PyList_Append(list, x);
}
#else
#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
#endif

static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg);

static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x);

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long intval, int inplace);
#else
#define __Pyx_PyInt_SubtractObjC(op1, op2, intval, inplace)\
    (inplace ? PyNumber_InPlaceSubtract(op1, op2) : PyNumber_Subtract(op1, op2))
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyFloat_DivideObjC(PyObject *op1, PyObject *op2, double floatval, int inplace);
#else
#define __Pyx_PyFloat_DivideObjC(op1, op2, floatval, inplace)\
    ((inplace ? __Pyx_PyNumber_InPlaceDivide(op1, op2) : __Pyx_PyNumber_Divide(op1, op2)))
    #endif

static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name);

static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L);
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L);
#define __Pyx_PyObject_Pop(L) (likely(PyList_CheckExact(L)) ?\
    __Pyx_PyList_Pop(L) : __Pyx__PyObject_Pop(L))
#else
#define __Pyx_PyList_Pop(L)  __Pyx__PyObject_Pop(L)
#define __Pyx_PyObject_Pop(L)  __Pyx__PyObject_Pop(L)
#endif

typedef struct {
    PyObject *type;
    PyObject **method_name;
    PyCFunction func;
    PyObject *method;
    int flag;
} __Pyx_CachedCFunction;

static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self);
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_CallUnboundCMethod0(cfunc, self)\
    ((likely((cfunc)->func)) ?\
        (likely((cfunc)->flag == METH_NOARGS) ?  (*((cfunc)->func))(self, NULL) :\
         (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ?  ((*(PyCFunctionWithKeywords)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\
             ((cfunc)->flag == METH_VARARGS ?  (*((cfunc)->func))(self, __pyx_empty_tuple) : __Pyx__CallUnboundCMethod0(cfunc, self)))) :\
        __Pyx__CallUnboundCMethod0(cfunc, self))
#else
#define __Pyx_CallUnboundCMethod0(cfunc, self)  __Pyx__CallUnboundCMethod0(cfunc, self)
#endif

static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) {
    int result = PySequence_Contains(seq, item);
    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
}

static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyFloat_SubtractCObj(PyObject *op1, PyObject *op2, double floatval, int inplace);
#else
#define __Pyx_PyFloat_SubtractCObj(op1, op2, floatval, inplace)\
    (inplace ? PyNumber_InPlaceSubtract(op1, op2) : PyNumber_Subtract(op1, op2))
#endif

static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname);

#if PY_MAJOR_VERSION < 3
#define __Pyx_PyString_Join __Pyx_PyBytes_Join
#define __Pyx_PyBaseString_Join(s, v) (PyUnicode_CheckExact(s) ? PyUnicode_Join(s, v) : __Pyx_PyBytes_Join(s, v))
#else
#define __Pyx_PyString_Join PyUnicode_Join
#define __Pyx_PyBaseString_Join PyUnicode_Join
#endif
#if CYTHON_COMPILING_IN_CPYTHON
    #if PY_MAJOR_VERSION < 3
    #define __Pyx_PyBytes_Join _PyString_Join
    #else
    #define __Pyx_PyBytes_Join _PyBytes_Join
    #endif
#else
static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* values);
#endif

static int __Pyx_SetVtable(PyObject *dict, void *vtable);

static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);

static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);

static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases);

static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);

#define __Pyx_CyFunction_USED 1
#include <structmember.h>
#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
#define __Pyx_CYFUNCTION_CCLASS        0x04
#define __Pyx_CyFunction_GetClosure(f)\
    (((__pyx_CyFunctionObject *) (f))->func_closure)
#define __Pyx_CyFunction_GetClassObj(f)\
    (((__pyx_CyFunctionObject *) (f))->func_classobj)
#define __Pyx_CyFunction_Defaults(type, f)\
    ((type *)(((__pyx_CyFunctionObject *) (f))->defaults))
#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\
    ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g)
typedef struct {
    PyCFunctionObject func;
#if PY_VERSION_HEX < 0x030500A0
    PyObject *func_weakreflist;
#endif
    PyObject *func_dict;
    PyObject *func_name;
    PyObject *func_qualname;
    PyObject *func_doc;
    PyObject *func_globals;
    PyObject *func_code;
    PyObject *func_closure;
    PyObject *func_classobj;
    void *defaults;
    int defaults_pyobjects;
    int flags;
    PyObject *defaults_tuple;
    PyObject *defaults_kwdict;
    PyObject *(*defaults_getter)(PyObject *);
    PyObject *func_annotations;
} __pyx_CyFunctionObject;
static PyTypeObject *__pyx_CyFunctionType = 0;
#define __Pyx_CyFunction_NewEx(ml, flags, qualname, self, module, globals, code)\
    __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, qualname, self, module, globals, code)
static PyObject *__Pyx_CyFunction_New(PyTypeObject *, PyMethodDef *ml,
                                      int flags, PyObject* qualname,
                                      PyObject *self,
                                      PyObject *module, PyObject *globals,
                                      PyObject* code);
static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m,
                                                         size_t size,
                                                         int pyobjects);
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
                                                            PyObject *tuple);
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m,
                                                             PyObject *dict);
static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m,
                                                              PyObject *dict);
static int __pyx_CyFunction_init(void);

static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, PyObject *qualname,
                                           PyObject *mkw, PyObject *modname, PyObject *doc);
static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases, PyObject *dict,
                                      PyObject *mkw, int calculate_metaclass, int allow_py2_metaclass);

static PyObject *__Pyx_GetNameInClass(PyObject *nmspace, PyObject *name);

typedef struct {
    int code_line;
    PyCodeObject* code_object;
} __Pyx_CodeObjectCacheEntry;
struct __Pyx_CodeObjectCache {
    int count;
    int max_count;
    __Pyx_CodeObjectCacheEntry* entries;
};
static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
static PyCodeObject *__pyx_find_code_object(int code_line);
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);

static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename);

static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);

static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_short(short value);

static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *);

static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);

typedef PyObject *(*__pyx_coroutine_body_t)(PyObject *, PyObject *);
typedef struct {
    PyObject_HEAD
    __pyx_coroutine_body_t body;
    PyObject *closure;
    PyObject *exc_type;
    PyObject *exc_value;
    PyObject *exc_traceback;
    PyObject *gi_weakreflist;
    PyObject *classobj;
    PyObject *yieldfrom;
    PyObject *gi_name;
    PyObject *gi_qualname;
    int resume_label;
    char is_running;
} __pyx_CoroutineObject;
static __pyx_CoroutineObject *__Pyx__Coroutine_New(PyTypeObject *type, __pyx_coroutine_body_t body,
                                                   PyObject *closure, PyObject *name, PyObject *qualname);
static int __Pyx_Coroutine_clear(PyObject *self);
#if 1 || PY_VERSION_HEX < 0x030300B0
static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
#else
#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
#endif

static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code);

static int __Pyx_patch_abc(void);

#define __Pyx_Generator_USED
static PyTypeObject *__pyx_GeneratorType = 0;
#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
#define __Pyx_Generator_New(body, closure, name, qualname)\
    __Pyx__Coroutine_New(__pyx_GeneratorType, body, closure, name, qualname)
static PyObject *__Pyx_Generator_Next(PyObject *self);
static int __pyx_Generator_init(void);

static int __Pyx_check_binary_version(void);

static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig);

static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);

static void *__pyx_f_8rasterio_5_base_13DatasetReader_band(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, int __pyx_v_bidx); /* proto*/

/* Module declarations from 'libc.string' */

/* Module declarations from 'libc.stdlib' */

/* Module declarations from 'rasterio' */

/* Module declarations from 'rasterio._gdal' */

/* Module declarations from 'rasterio._ogr' */

/* Module declarations from 'rasterio._base' */
static PyTypeObject *__pyx_ptype_8rasterio_5_base_DatasetReader = 0;
static PyTypeObject *__pyx_ptype_8rasterio_5_base___pyx_scope_struct__block_windows = 0;
static PyTypeObject *__pyx_ptype_8rasterio_5_base___pyx_scope_struct_1_window_index = 0;
static PyTypeObject *__pyx_ptype_8rasterio_5_base___pyx_scope_struct_2_genexpr = 0;
static void *__pyx_f_8rasterio_5_base__osr_from_crs(PyObject *); /*proto*/
static PyObject *__pyx_f_8rasterio_5_base_crop_window(PyObject *, int, int, int __pyx_skip_dispatch); /*proto*/
static PyObject *__pyx_f_8rasterio_5_base_eval_window(PyObject *, int, int, int __pyx_skip_dispatch); /*proto*/
#define __Pyx_MODULE_NAME "rasterio._base"
int __pyx_module_is_main_rasterio___base = 0;

/* Implementation of 'rasterio._base' */
static PyObject *__pyx_builtin_property;
static PyObject *__pyx_builtin_ValueError;
static PyObject *__pyx_builtin_range;
static PyObject *__pyx_builtin_FutureWarning;
static PyObject *__pyx_builtin_round;
static PyObject *__pyx_builtin_TypeError;
static PyObject *__pyx_builtin_AssertionError;
static PyObject *__pyx_builtin_zip;
static char __pyx_k_a[] = "a";
static char __pyx_k_b[] = "b";
static char __pyx_k_c[] = "c";
static char __pyx_k_d[] = "d";
static char __pyx_k_i[] = "i";
static char __pyx_k_n[] = "n";
static char __pyx_k_r[] = "r";
static char __pyx_k_s[] = "+%s";
static char __pyx_k_t[] = "t";
static char __pyx_k_x[] = "x";
static char __pyx_k_y[] = "y";
static char __pyx_k_z[] = "z";
static char __pyx_k_ns[] = "ns";
static char __pyx_k_op[] = "op";
static char __pyx_k_xs[] = "xs";
static char __pyx_k_ys[] = "ys";
static char __pyx_k_zs[] = "zs";
static char __pyx_k__13[] = "=";
static char __pyx_k__15[] = "+";
static char __pyx_k__52[] = ":";
static char __pyx_k__54[] = " ";
static char __pyx_k_all[] = "all";
static char __pyx_k_col[] = "col";
static char __pyx_k_crs[] = "crs";
static char __pyx_k_doc[] = "__doc__";
static char __pyx_k_dst[] = "dst";
static char __pyx_k_eps[] = "eps";
static char __pyx_k_get[] = "get";
static char __pyx_k_log[] = "log";
static char __pyx_k_pop[] = "pop";
static char __pyx_k_res[] = "res";
static char __pyx_k_row[] = "row";
static char __pyx_k_s_s[] = "+%s=%s";
static char __pyx_k_src[] = "src";
static char __pyx_k_sys[] = "sys";
static char __pyx_k_top[] = "top";
static char __pyx_k_zip[] = "zip";
static char __pyx_k_EPSG[] = "EPSG";
static char __pyx_k_args[] = "args";
static char __pyx_k_bidx[] = "bidx";
static char __pyx_k_ceil[] = "ceil";
static char __pyx_k_crs1[] = "crs1";
static char __pyx_k_crs2[] = "crs2";
static char __pyx_k_emit[] = "emit";
static char __pyx_k_epsg[] = "epsg:";
static char __pyx_k_exit[] = "__exit__";
static char __pyx_k_info[] = "info";
static char __pyx_k_init[] = "init";
static char __pyx_k_join[] = "join";
static char __pyx_k_kwds[] = "kwds";
static char __pyx_k_left[] = "left";
static char __pyx_k_main[] = "__main__";
static char __pyx_k_math[] = "math";
static char __pyx_k_meta[] = "meta";
static char __pyx_k_name[] = "name";
static char __pyx_k_open[] = "open";
static char __pyx_k_path[] = "path";
static char __pyx_k_self[] = "self";
static char __pyx_k_send[] = "send";
static char __pyx_k_sqrt[] = "sqrt";
static char __pyx_k_stop[] = "stop";
static char __pyx_k_tags[] = "tags";
static char __pyx_k_test[] = "__test__";
static char __pyx_k_type[] = "type";
static char __pyx_k_warn[] = "warn";
static char __pyx_k_close[] = "close";
static char __pyx_k_count[] = "count";
static char __pyx_k_debug[] = "debug";
static char __pyx_k_dtype[] = "dtype";
static char __pyx_k_enter[] = "__enter__";
static char __pyx_k_floor[] = "floor";
static char __pyx_k_items[] = "items";
static char __pyx_k_range[] = "range";
static char __pyx_k_right[] = "right";
static char __pyx_k_round[] = "round";
static char __pyx_k_split[] = "split";
static char __pyx_k_start[] = "start";
static char __pyx_k_strip[] = "strip";
static char __pyx_k_throw[] = "throw";
static char __pyx_k_tiled[] = "tiled";
static char __pyx_k_upper[] = "upper";
static char __pyx_k_utf_8[] = "utf-8";
static char __pyx_k_value[] = "value";
static char __pyx_k_width[] = "width";
static char __pyx_k_Affine[] = "Affine";
static char __pyx_k_affine[] = "affine";
static char __pyx_k_append[] = "append";
static char __pyx_k_bottom[] = "bottom";
static char __pyx_k_bounds[] = "bounds";
static char __pyx_k_closed[] = "closed";
static char __pyx_k_driver[] = "driver";
static char __pyx_k_dtypes[] = "dtypes";
static char __pyx_k_encode[] = "encode";
static char __pyx_k_height[] = "height";
static char __pyx_k_import[] = "__import__";
static char __pyx_k_lstrip[] = "lstrip";
static char __pyx_k_module[] = "__module__";
static char __pyx_k_nodata[] = "nodata";
static char __pyx_k_proj_c[] = "proj_c";
static char __pyx_k_record[] = "record";
static char __pyx_k_res_xs[] = "res_xs";
static char __pyx_k_res_ys[] = "res_ys";
static char __pyx_k_res_zs[] = "res_zs";
static char __pyx_k_retval[] = "retval";
static char __pyx_k_update[] = "update";
static char __pyx_k_window[] = "window";
static char __pyx_k_wktext[] = "wktext";
static char __pyx_k_GDALEnv[] = "GDALEnv";
static char __pyx_k_Handler[] = "Handler";
static char __pyx_k_dst_crs[] = "dst_crs";
static char __pyx_k_genexpr[] = "genexpr";
static char __pyx_k_get_crs[] = "get_crs";
static char __pyx_k_indexes[] = "indexes";
static char __pyx_k_logging[] = "logging";
static char __pyx_k_no_defs[] = "no_defs";
static char __pyx_k_osr_crs[] = "osr_crs";
static char __pyx_k_prepare[] = "__prepare__";
static char __pyx_k_src_crs[] = "src_crs";
static char __pyx_k_to_gdal[] = "to_gdal";
static char __pyx_k_Params_s[] = "Params: %s";
static char __pyx_k_compress[] = "compress";
static char __pyx_k_cpl_errs[] = "cpl_errs";
static char __pyx_k_osr_crs1[] = "osr_crs1";
static char __pyx_k_osr_crs2[] = "osr_crs2";
static char __pyx_k_property[] = "property";
static char __pyx_k_qualname[] = "__qualname__";
static char __pyx_k_rasterio[] = "rasterio";
static char __pyx_k_read_crs[] = "read_crs";
static char __pyx_k_warnings[] = "warnings";
static char __pyx_k_NULL_band[] = "NULL band";
static char __pyx_k_Null_band[] = "Null band";
static char __pyx_k_TypeError[] = "TypeError";
static char __pyx_k_boundless[] = "boundless";
static char __pyx_k_dtype_fwd[] = "dtype_fwd";
static char __pyx_k_epsg_4326[] = "epsg:4326";
static char __pyx_k_from_gdal[] = "from_gdal";
static char __pyx_k_getLogger[] = "getLogger";
static char __pyx_k_get_index[] = "get_index";
static char __pyx_k_metaclass[] = "__metaclass__";
static char __pyx_k_precision[] = "precision";
static char __pyx_k_traceback[] = "traceback";
static char __pyx_k_transform[] = "transform";
static char __pyx_k_INTERLEAVE[] = "INTERLEAVE";
static char __pyx_k_ValueError[] = "ValueError";
static char __pyx_k_addHandler[] = "addHandler";
static char __pyx_k_blockxsize[] = "blockxsize";
static char __pyx_k_blockysize[] = "blockysize";
static char __pyx_k_get_window[] = "get_window";
static char __pyx_k_interleave[] = "interleave";
static char __pyx_k_nodatavals[] = "nodatavals";
static char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
static char __pyx_k_stacklevel[] = "stacklevel";
static char __pyx_k_BoundingBox[] = "BoundingBox";
static char __pyx_k_COMPRESSION[] = "COMPRESSION";
static char __pyx_k_ColorInterp[] = "ColorInterp";
static char __pyx_k_Compression[] = "Compression";
static char __pyx_k_NullHandler[] = "NullHandler";
static char __pyx_k_basicConfig[] = "basicConfig";
static char __pyx_k_compression[] = "compression";
static char __pyx_k_is_same_crs[] = "is_same_crs";
static char __pyx_k_transform_2[] = "_transform";
static char __pyx_k_translation[] = "translation";
static char __pyx_k_warnoptions[] = "warnoptions";
static char __pyx_k_window_stop[] = "window_stop";
static char __pyx_k_Interleaving[] = "Interleaving";
static char __pyx_k_Null_dataset[] = "Null dataset";
static char __pyx_k_block_shapes[] = "block_shapes";
static char __pyx_k_driver_count[] = "driver_count";
static char __pyx_k_dtype_ranges[] = "dtype_ranges";
static char __pyx_k_interleaving[] = "interleaving";
static char __pyx_k_read_crs_wkt[] = "read_crs_wkt";
static char __pyx_k_window_index[] = "window_index";
static char __pyx_k_window_shape[] = "window_shape";
static char __pyx_k_window_start[] = "window_start";
static char __pyx_k_Color_d_d_d_d[] = "Color: (%d, %d, %d, %d)";
static char __pyx_k_FutureWarning[] = "FutureWarning";
static char __pyx_k_block_windows[] = "block_windows";
static char __pyx_k_get_transform[] = "get_transform";
static char __pyx_k_rasterio__err[] = "rasterio._err";
static char __pyx_k_AssertionError[] = "AssertionError";
static char __pyx_k_Nodata_value_f[] = "Nodata value: %f";
static char __pyx_k_get_nodatavals[] = "get_nodatavals";
static char __pyx_k_rasterio__base[] = "rasterio._base";
static char __pyx_k_rasterio_enums[] = "rasterio.enums";
static char __pyx_k_read_transform[] = "read_transform";
static char __pyx_k_IMAGE_STRUCTURE[] = "IMAGE_STRUCTURE";
static char __pyx_k_Null_projection[] = "Null projection";
static char __pyx_k_invalid_width_d[] = "invalid width: %d";
static char __pyx_k_rasterio_coords[] = "rasterio.coords";
static char __pyx_k_NULL_color_table[] = "NULL color table";
static char __pyx_k_Nodata_success_d[] = "Nodata success: %d";
static char __pyx_k_NullHandler_emit[] = "NullHandler.emit";
static char __pyx_k_invalid_height_d[] = "invalid height: %d";
static char __pyx_k_is_projected_crs[] = "is_projected_crs";
static char __pyx_k_tastes_like_gdal[] = "tastes_like_gdal";
static char __pyx_k_is_geographic_crs[] = "is_geographic_crs";
static char __pyx_k_rasterio__drivers[] = "rasterio._drivers";
static char __pyx_k_rio_creation_kwds[] = "rio_creation_kwds";
static char __pyx_k_Invalid_band_index[] = "Invalid band index";
static char __pyx_k_rasterio_transform[] = "rasterio.transform";
static char __pyx_k_Got_coordinate_system[] = "Got coordinate system";
static char __pyx_k_PROJ_4_to_be_imported_r[] = "PROJ.4 to be imported: %r";
static char __pyx_k_NULL_color_at_d_skipping[] = "NULL color at %d, skipping";
static char __pyx_k_DatasetReader_block_windows[] = "DatasetReader.block_windows";
static char __pyx_k_Nodata_values_for_each_band[] = "Nodata values for each band.";
static char __pyx_k_Unexpected_proj_parameter_s[] = "Unexpected proj parameter %s";
static char __pyx_k_window_index_locals_genexpr[] = "window_index.<locals>.genexpr";
static char __pyx_k_invalid_window_col_range_d_d[] = "invalid window: col range (%d, %d)";
static char __pyx_k_invalid_window_row_range_d_d[] = "invalid window: row range (%d, %d)";
static char __pyx_k_s_RasterReader_name_s_mode_s[] = "<%s RasterReader name='%s' mode='%s'>";
static char __pyx_k_Can_t_read_closed_raster_file[] = "Can't read closed raster file";
static char __pyx_k_can_t_read_closed_raster_file[] = "can't read closed raster file";
static char __pyx_k_Failed_to_auto_identify_EPSG_d[] = "Failed to auto identify EPSG: %d";
static char __pyx_k_GDAL_dataset_has_no_projection[] = "GDAL dataset has no projection.";
static char __pyx_k_The_value_of_this_property_will[] = "The value of this property will change in version 1.0. Please see https://github.com/mapbox/rasterio/issues/86 for details.";
static char __pyx_k_Users_seang_code_frs_wheel_buil[] = "/Users/seang/code/frs-wheel-builds/src/rasterio/rasterio/_base.pyx";
static char __pyx_k_A_band_index_must_be_provided_wh[] = "A band index must be provided when band block shapesare inhomogeneous";
static char __pyx_k_A_mapping_of_PROJ_4_coordinate_r[] = "A mapping of PROJ.4 coordinate reference system params.\n        ";
static char __pyx_k_An_OGC_WKT_string_representation[] = "An OGC WKT string representation of the coordinate reference\n        system.\n        ";
static char __pyx_k_An_instance_of_affine_Affine_Thi[] = "An instance of ``affine.Affine``. This property is a\n        transitional feature: see the docstring of ``transform``\n        (above) for more details.\n        ";
static char __pyx_k_Basic_metadata_and_creation_opti[] = "Basic metadata and creation options of this dataset.\n\n        May be passed as keyword arguments to `rasterio.open()` to\n        create a clone of this dataset.\n        ";
static char __pyx_k_Coefficients_of_the_affine_trans[] = "Coefficients of the affine transformation that maps col,row\n        pixel coordinates to x,y coordinates in the specified crs. The\n        coefficients of the augmented matrix are shown below.\n        \n          | x |   | a  b  c | | r |\n          | y | = | d  e  f | | c |\n          | 1 |   | 0  0  1 | | 1 |\n        \n        In Rasterio versions before 1.0 the value of this property\n        is a list of coefficients ``[c, a, b, f, d, e]``. This form\n        is *deprecated* beginning in 0.9 and in version 1.0 this \n        property will be replaced by an instance of ``affine.Affine``,\n        which is a namedtuple with coefficients in the order\n        ``(a, b, c, d, e, f)``.\n\n        Please see https://github.com/mapbox/rasterio/issues/86\n        for more details.\n        ";
static char __pyx_k_Returns_the_lower_left_and_upper[] = "Returns the lower left and upper right bounds of the dataset\n        in the units of its coordinate reference system.\n        \n        The returned value is a tuple:\n        (lower left x, lower left y, upper right x, upper right y)\n        ";
static char __pyx_k_Returns_the_width_height_of_pixe[] = "Returns the (width, height) of pixels in the units of its\n        coordinate reference system.";
static char __pyx_k_The_dataset_s_single_nodata_valu[] = "The dataset's single nodata value.";
static char __pyx_k_Unexpected_NULL_spatial_referenc[] = "Unexpected NULL spatial reference";
static char __pyx_k_Unexpected_Null_spatial_referenc[] = "Unexpected Null spatial reference";
static char __pyx_k_invalid_window_structure_expecti[] = "invalid window structure; expecting ((row_start, row_stop), (col_start, col_stop))";
static PyObject *__pyx_kp_s_A_band_index_must_be_provided_wh;
static PyObject *__pyx_n_s_Affine;
static PyObject *__pyx_n_s_AssertionError;
static PyObject *__pyx_n_s_BoundingBox;
static PyObject *__pyx_n_s_COMPRESSION;
static PyObject *__pyx_kp_s_Can_t_read_closed_raster_file;
static PyObject *__pyx_n_s_ColorInterp;
static PyObject *__pyx_kp_s_Color_d_d_d_d;
static PyObject *__pyx_n_s_Compression;
static PyObject *__pyx_n_s_DatasetReader_block_windows;
static PyObject *__pyx_n_s_EPSG;
static PyObject *__pyx_kp_s_Failed_to_auto_identify_EPSG_d;
static PyObject *__pyx_n_s_FutureWarning;
static PyObject *__pyx_n_s_GDALEnv;
static PyObject *__pyx_kp_s_GDAL_dataset_has_no_projection;
static PyObject *__pyx_kp_s_Got_coordinate_system;
static PyObject *__pyx_n_s_Handler;
static PyObject *__pyx_n_s_IMAGE_STRUCTURE;
static PyObject *__pyx_n_s_INTERLEAVE;
static PyObject *__pyx_n_s_Interleaving;
static PyObject *__pyx_kp_s_Invalid_band_index;
static PyObject *__pyx_kp_s_NULL_band;
static PyObject *__pyx_kp_s_NULL_color_at_d_skipping;
static PyObject *__pyx_kp_s_NULL_color_table;
static PyObject *__pyx_kp_s_Nodata_success_d;
static PyObject *__pyx_kp_s_Nodata_value_f;
static PyObject *__pyx_n_s_NullHandler;
static PyObject *__pyx_n_s_NullHandler_emit;
static PyObject *__pyx_kp_s_Null_band;
static PyObject *__pyx_kp_s_Null_dataset;
static PyObject *__pyx_kp_s_Null_projection;
static PyObject *__pyx_kp_s_PROJ_4_to_be_imported_r;
static PyObject *__pyx_kp_s_Params_s;
static PyObject *__pyx_kp_s_The_value_of_this_property_will;
static PyObject *__pyx_n_s_TypeError;
static PyObject *__pyx_kp_s_Unexpected_NULL_spatial_referenc;
static PyObject *__pyx_kp_s_Unexpected_Null_spatial_referenc;
static PyObject *__pyx_kp_s_Unexpected_proj_parameter_s;
static PyObject *__pyx_kp_s_Users_seang_code_frs_wheel_buil;
static PyObject *__pyx_n_s_ValueError;
static PyObject *__pyx_kp_s__13;
static PyObject *__pyx_kp_s__15;
static PyObject *__pyx_kp_s__52;
static PyObject *__pyx_kp_s__54;
static PyObject *__pyx_n_s_a;
static PyObject *__pyx_n_s_addHandler;
static PyObject *__pyx_n_s_affine;
static PyObject *__pyx_n_s_all;
static PyObject *__pyx_n_s_append;
static PyObject *__pyx_n_s_args;
static PyObject *__pyx_n_s_b;
static PyObject *__pyx_n_s_basicConfig;
static PyObject *__pyx_n_s_bidx;
static PyObject *__pyx_n_s_block_shapes;
static PyObject *__pyx_n_s_block_windows;
static PyObject *__pyx_n_s_blockxsize;
static PyObject *__pyx_n_s_blockysize;
static PyObject *__pyx_n_s_bottom;
static PyObject *__pyx_n_s_boundless;
static PyObject *__pyx_n_s_bounds;
static PyObject *__pyx_n_s_c;
static PyObject *__pyx_kp_s_can_t_read_closed_raster_file;
static PyObject *__pyx_n_s_ceil;
static PyObject *__pyx_n_s_close;
static PyObject *__pyx_n_s_closed;
static PyObject *__pyx_n_s_col;
static PyObject *__pyx_n_s_compress;
static PyObject *__pyx_n_s_compression;
static PyObject *__pyx_n_s_count;
static PyObject *__pyx_n_s_cpl_errs;
static PyObject *__pyx_n_s_crs;
static PyObject *__pyx_n_s_crs1;
static PyObject *__pyx_n_s_crs2;
static PyObject *__pyx_n_s_d;
static PyObject *__pyx_n_s_debug;
static PyObject *__pyx_n_s_doc;
static PyObject *__pyx_n_s_driver;
static PyObject *__pyx_n_s_driver_count;
static PyObject *__pyx_n_s_dst;
static PyObject *__pyx_n_s_dst_crs;
static PyObject *__pyx_n_s_dtype;
static PyObject *__pyx_n_s_dtype_fwd;
static PyObject *__pyx_n_s_dtype_ranges;
static PyObject *__pyx_n_s_dtypes;
static PyObject *__pyx_n_s_emit;
static PyObject *__pyx_n_s_encode;
static PyObject *__pyx_n_s_enter;
static PyObject *__pyx_n_s_eps;
static PyObject *__pyx_kp_s_epsg;
static PyObject *__pyx_kp_s_epsg_4326;
static PyObject *__pyx_n_s_exit;
static PyObject *__pyx_n_s_floor;
static PyObject *__pyx_n_s_from_gdal;
static PyObject *__pyx_n_s_genexpr;
static PyObject *__pyx_n_s_get;
static PyObject *__pyx_n_s_getLogger;
static PyObject *__pyx_n_s_get_crs;
static PyObject *__pyx_n_s_get_index;
static PyObject *__pyx_n_s_get_nodatavals;
static PyObject *__pyx_n_s_get_transform;
static PyObject *__pyx_n_s_get_window;
static PyObject *__pyx_n_s_height;
static PyObject *__pyx_n_s_i;
static PyObject *__pyx_n_s_import;
static PyObject *__pyx_n_s_indexes;
static PyObject *__pyx_n_s_info;
static PyObject *__pyx_n_s_init;
static PyObject *__pyx_n_s_interleave;
static PyObject *__pyx_n_s_interleaving;
static PyObject *__pyx_kp_s_invalid_height_d;
static PyObject *__pyx_kp_s_invalid_width_d;
static PyObject *__pyx_kp_s_invalid_window_col_range_d_d;
static PyObject *__pyx_kp_s_invalid_window_row_range_d_d;
static PyObject *__pyx_kp_s_invalid_window_structure_expecti;
static PyObject *__pyx_n_s_is_geographic_crs;
static PyObject *__pyx_n_s_is_projected_crs;
static PyObject *__pyx_n_s_is_same_crs;
static PyObject *__pyx_n_s_items;
static PyObject *__pyx_n_s_join;
static PyObject *__pyx_n_s_kwds;
static PyObject *__pyx_n_s_left;
static PyObject *__pyx_n_s_log;
static PyObject *__pyx_n_s_logging;
static PyObject *__pyx_n_s_lstrip;
static PyObject *__pyx_n_s_main;
static PyObject *__pyx_n_s_math;
static PyObject *__pyx_n_s_meta;
static PyObject *__pyx_n_s_metaclass;
static PyObject *__pyx_n_s_module;
static PyObject *__pyx_n_s_n;
static PyObject *__pyx_n_s_name;
static PyObject *__pyx_n_s_no_defs;
static PyObject *__pyx_n_s_nodata;
static PyObject *__pyx_n_s_nodatavals;
static PyObject *__pyx_n_s_ns;
static PyObject *__pyx_n_s_op;
static PyObject *__pyx_n_s_open;
static PyObject *__pyx_n_s_osr_crs;
static PyObject *__pyx_n_s_osr_crs1;
static PyObject *__pyx_n_s_osr_crs2;
static PyObject *__pyx_n_s_path;
static PyObject *__pyx_n_s_pop;
static PyObject *__pyx_n_s_precision;
static PyObject *__pyx_n_s_prepare;
static PyObject *__pyx_n_s_proj_c;
static PyObject *__pyx_n_s_property;
static PyObject *__pyx_n_s_pyx_vtable;
static PyObject *__pyx_n_s_qualname;
static PyObject *__pyx_n_s_r;
static PyObject *__pyx_n_s_range;
static PyObject *__pyx_n_s_rasterio;
static PyObject *__pyx_n_s_rasterio__base;
static PyObject *__pyx_n_s_rasterio__drivers;
static PyObject *__pyx_n_s_rasterio__err;
static PyObject *__pyx_n_s_rasterio_coords;
static PyObject *__pyx_n_s_rasterio_enums;
static PyObject *__pyx_n_s_rasterio_transform;
static PyObject *__pyx_n_s_read_crs;
static PyObject *__pyx_n_s_read_crs_wkt;
static PyObject *__pyx_n_s_read_transform;
static PyObject *__pyx_n_s_record;
static PyObject *__pyx_n_s_res;
static PyObject *__pyx_n_s_res_xs;
static PyObject *__pyx_n_s_res_ys;
static PyObject *__pyx_n_s_res_zs;
static PyObject *__pyx_n_s_retval;
static PyObject *__pyx_n_s_right;
static PyObject *__pyx_n_s_rio_creation_kwds;
static PyObject *__pyx_n_s_round;
static PyObject *__pyx_n_s_row;
static PyObject *__pyx_kp_s_s;
static PyObject *__pyx_kp_s_s_RasterReader_name_s_mode_s;
static PyObject *__pyx_kp_s_s_s;
static PyObject *__pyx_n_s_self;
static PyObject *__pyx_n_s_send;
static PyObject *__pyx_n_s_split;
static PyObject *__pyx_n_s_sqrt;
static PyObject *__pyx_n_s_src;
static PyObject *__pyx_n_s_src_crs;
static PyObject *__pyx_n_s_stacklevel;
static PyObject *__pyx_n_s_start;
static PyObject *__pyx_n_s_stop;
static PyObject *__pyx_n_s_strip;
static PyObject *__pyx_n_s_sys;
static PyObject *__pyx_n_s_t;
static PyObject *__pyx_n_s_tags;
static PyObject *__pyx_n_s_tastes_like_gdal;
static PyObject *__pyx_n_s_test;
static PyObject *__pyx_n_s_throw;
static PyObject *__pyx_n_s_tiled;
static PyObject *__pyx_n_s_to_gdal;
static PyObject *__pyx_n_s_top;
static PyObject *__pyx_n_s_traceback;
static PyObject *__pyx_n_s_transform;
static PyObject *__pyx_n_s_transform_2;
static PyObject *__pyx_n_s_translation;
static PyObject *__pyx_n_s_type;
static PyObject *__pyx_n_s_update;
static PyObject *__pyx_n_s_upper;
static PyObject *__pyx_kp_s_utf_8;
static PyObject *__pyx_n_s_value;
static PyObject *__pyx_n_s_warn;
static PyObject *__pyx_n_s_warnings;
static PyObject *__pyx_n_s_warnoptions;
static PyObject *__pyx_n_s_width;
static PyObject *__pyx_n_s_window;
static PyObject *__pyx_n_s_window_index;
static PyObject *__pyx_n_s_window_index_locals_genexpr;
static PyObject *__pyx_n_s_window_shape;
static PyObject *__pyx_n_s_window_start;
static PyObject *__pyx_n_s_window_stop;
static PyObject *__pyx_n_s_wktext;
static PyObject *__pyx_n_s_x;
static PyObject *__pyx_n_s_xs;
static PyObject *__pyx_n_s_y;
static PyObject *__pyx_n_s_ys;
static PyObject *__pyx_n_s_z;
static PyObject *__pyx_n_s_zip;
static PyObject *__pyx_n_s_zs;
static PyObject *__pyx_pf_8rasterio_5_base_11NullHandler_emit(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_record); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader___init__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_path); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_2__repr__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4start(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6read_crs(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8read_crs_wkt(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10read_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_12stop(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_14close(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_16__enter__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_18__exit__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_type, CYTHON_UNUSED PyObject *__pyx_v_value, CYTHON_UNUSED PyObject *__pyx_v_traceback); /* proto */
static void __pyx_pf_8rasterio_5_base_13DatasetReader_20__dealloc__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_22closed(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_24count(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_26indexes(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_28dtypes(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_30block_shapes(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_32get_nodatavals(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10nodatavals___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6nodata___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_34block_windows(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6bounds___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_3res___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_37ul(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_row, PyObject *__pyx_v_col); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_39index(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, CYTHON_UNUSED PyObject *__pyx_v_op); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_41window(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_left, PyObject *__pyx_v_bottom, PyObject *__pyx_v_right, PyObject *__pyx_v_top, PyObject *__pyx_v_boundless); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_43window_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_window); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_45window_bounds(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_window); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_47meta(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_49compression(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_51interleaving(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7profile___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_53lnglat(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_55get_crs(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_3crs___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7crs_wkt___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_57get_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_9transform___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6affine___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_59tags(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx, PyObject *__pyx_v_ns); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_61colorinterp(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_63colormap(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_65kwds(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_67overviews(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_69checksum(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx, PyObject *__pyx_v_window); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4name___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4mode___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5width___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6height___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5shape___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6driver___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6_count___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7_closed___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4_crs___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10_transform___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5_read___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_crop_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_2eval_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_4get_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_affine, PyObject *__pyx_v_op, PyObject *__pyx_v_precision); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_6get_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_left, PyObject *__pyx_v_bottom, PyObject *__pyx_v_right, PyObject *__pyx_v_top, PyObject *__pyx_v_affine, PyObject *__pyx_v_precision); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_8window_shape(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, PyObject *__pyx_v_height, PyObject *__pyx_v_width); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_12window_index_genexpr(PyObject *__pyx_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_10window_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_12tastes_like_gdal(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_t); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_14_transform(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_src_crs, PyObject *__pyx_v_dst_crs, PyObject *__pyx_v_xs, PyObject *__pyx_v_ys, PyObject *__pyx_v_zs); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_16is_geographic_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_18is_projected_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_20is_same_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs1, PyObject *__pyx_v_crs2); /* proto */
static PyObject *__pyx_tp_new_8rasterio_5_base_DatasetReader(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct__block_windows(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_1_window_index(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static __Pyx_CachedCFunction __pyx_umethod_PyList_Type_pop = {0, &__pyx_n_s_pop, 0, 0, 0};
static PyObject *__pyx_float_0_0;
static PyObject *__pyx_float_0_1;
static PyObject *__pyx_float_1_0;
static PyObject *__pyx_float_2_0;
static PyObject *__pyx_float_10_0;
static PyObject *__pyx_int_0;
static PyObject *__pyx_int_1;
static PyObject *__pyx_int_2;
static PyObject *__pyx_int_6;
static PyObject *__pyx_int_neg_1;
static PyObject *__pyx_k__31;
static PyObject *__pyx_k__49;
static PyObject *__pyx_tuple_;
static PyObject *__pyx_tuple__2;
static PyObject *__pyx_tuple__3;
static PyObject *__pyx_tuple__4;
static PyObject *__pyx_tuple__5;
static PyObject *__pyx_tuple__6;
static PyObject *__pyx_tuple__7;
static PyObject *__pyx_tuple__8;
static PyObject *__pyx_tuple__9;
static PyObject *__pyx_tuple__10;
static PyObject *__pyx_tuple__11;
static PyObject *__pyx_tuple__12;
static PyObject *__pyx_tuple__14;
static PyObject *__pyx_tuple__16;
static PyObject *__pyx_tuple__17;
static PyObject *__pyx_tuple__18;
static PyObject *__pyx_tuple__19;
static PyObject *__pyx_tuple__20;
static PyObject *__pyx_tuple__21;
static PyObject *__pyx_tuple__22;
static PyObject *__pyx_tuple__23;
static PyObject *__pyx_tuple__24;
static PyObject *__pyx_tuple__25;
static PyObject *__pyx_tuple__26;
static PyObject *__pyx_tuple__27;
static PyObject *__pyx_tuple__28;
static PyObject *__pyx_tuple__29;
static PyObject *__pyx_tuple__30;
static PyObject *__pyx_tuple__32;
static PyObject *__pyx_tuple__33;
static PyObject *__pyx_tuple__34;
static PyObject *__pyx_tuple__35;
static PyObject *__pyx_tuple__36;
static PyObject *__pyx_tuple__37;
static PyObject *__pyx_tuple__38;
static PyObject *__pyx_tuple__39;
static PyObject *__pyx_tuple__40;
static PyObject *__pyx_tuple__41;
static PyObject *__pyx_tuple__42;
static PyObject *__pyx_tuple__43;
static PyObject *__pyx_tuple__44;
static PyObject *__pyx_tuple__45;
static PyObject *__pyx_tuple__46;
static PyObject *__pyx_tuple__47;
static PyObject *__pyx_tuple__48;
static PyObject *__pyx_tuple__50;
static PyObject *__pyx_tuple__51;
static PyObject *__pyx_tuple__53;
static PyObject *__pyx_tuple__55;
static PyObject *__pyx_tuple__56;
static PyObject *__pyx_tuple__57;
static PyObject *__pyx_tuple__58;
static PyObject *__pyx_tuple__60;
static PyObject *__pyx_tuple__62;
static PyObject *__pyx_tuple__64;
static PyObject *__pyx_tuple__66;
static PyObject *__pyx_tuple__68;
static PyObject *__pyx_tuple__70;
static PyObject *__pyx_tuple__72;
static PyObject *__pyx_tuple__74;
static PyObject *__pyx_tuple__76;
static PyObject *__pyx_codeobj__59;
static PyObject *__pyx_codeobj__61;
static PyObject *__pyx_codeobj__63;
static PyObject *__pyx_codeobj__65;
static PyObject *__pyx_codeobj__67;
static PyObject *__pyx_codeobj__69;
static PyObject *__pyx_codeobj__71;
static PyObject *__pyx_codeobj__73;
static PyObject *__pyx_codeobj__75;
static PyObject *__pyx_codeobj__77;

/* "rasterio/_base.pyx":28
 *     # no handler messages shown
 *     class NullHandler(logging.Handler):
 *         def emit(self, record):             # <<<<<<<<<<<<<<
 *             pass
 *     log.addHandler(NullHandler())
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_11NullHandler_1emit(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_11NullHandler_1emit = {"emit", (PyCFunction)__pyx_pw_8rasterio_5_base_11NullHandler_1emit, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_8rasterio_5_base_11NullHandler_1emit(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  CYTHON_UNUSED PyObject *__pyx_v_self = 0;
  CYTHON_UNUSED PyObject *__pyx_v_record = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("emit (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,&__pyx_n_s_record,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_self)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_record)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("emit", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "emit") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_self = values[0];
    __pyx_v_record = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("emit", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.NullHandler.emit", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_11NullHandler_emit(__pyx_self, __pyx_v_self, __pyx_v_record);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_11NullHandler_emit(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_record) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("emit", 0);

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":35
 * cdef class DatasetReader(object):
 * 
 *     def __init__(self, path):             # <<<<<<<<<<<<<<
 *         self.name = path
 *         self.mode = 'r'
 */

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_path = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_path,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_path = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader___init__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_path);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader___init__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_path) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "rasterio/_base.pyx":36
 * 
 *     def __init__(self, path):
 *         self.name = path             # <<<<<<<<<<<<<<
 *         self.mode = 'r'
 *         self._hds = NULL
 */
  __Pyx_INCREF(__pyx_v_path);
  __Pyx_GIVEREF(__pyx_v_path);
  __Pyx_GOTREF(__pyx_v_self->name);
  __Pyx_DECREF(__pyx_v_self->name);
  __pyx_v_self->name = __pyx_v_path;

  /* "rasterio/_base.pyx":37
 *     def __init__(self, path):
 *         self.name = path
 *         self.mode = 'r'             # <<<<<<<<<<<<<<
 *         self._hds = NULL
 *         self._count = 0
 */
  __Pyx_INCREF(__pyx_n_s_r);
  __Pyx_GIVEREF(__pyx_n_s_r);
  __Pyx_GOTREF(__pyx_v_self->mode);
  __Pyx_DECREF(__pyx_v_self->mode);
  __pyx_v_self->mode = __pyx_n_s_r;

  /* "rasterio/_base.pyx":38
 *         self.name = path
 *         self.mode = 'r'
 *         self._hds = NULL             # <<<<<<<<<<<<<<
 *         self._count = 0
 *         self._closed = True
 */
  __pyx_v_self->_hds = NULL;

  /* "rasterio/_base.pyx":39
 *         self.mode = 'r'
 *         self._hds = NULL
 *         self._count = 0             # <<<<<<<<<<<<<<
 *         self._closed = True
 *         self._dtypes = []
 */
  __Pyx_INCREF(__pyx_int_0);
  __Pyx_GIVEREF(__pyx_int_0);
  __Pyx_GOTREF(__pyx_v_self->_count);
  __Pyx_DECREF(__pyx_v_self->_count);
  __pyx_v_self->_count = __pyx_int_0;

  /* "rasterio/_base.pyx":40
 *         self._hds = NULL
 *         self._count = 0
 *         self._closed = True             # <<<<<<<<<<<<<<
 *         self._dtypes = []
 *         self._block_shapes = None
 */
  __Pyx_INCREF(Py_True);
  __Pyx_GIVEREF(Py_True);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = Py_True;

  /* "rasterio/_base.pyx":41
 *         self._count = 0
 *         self._closed = True
 *         self._dtypes = []             # <<<<<<<<<<<<<<
 *         self._block_shapes = None
 *         self._nodatavals = []
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_dtypes);
  __Pyx_DECREF(__pyx_v_self->_dtypes);
  __pyx_v_self->_dtypes = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":42
 *         self._closed = True
 *         self._dtypes = []
 *         self._block_shapes = None             # <<<<<<<<<<<<<<
 *         self._nodatavals = []
 *         self._crs = None
 */
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_block_shapes);
  __Pyx_DECREF(__pyx_v_self->_block_shapes);
  __pyx_v_self->_block_shapes = Py_None;

  /* "rasterio/_base.pyx":43
 *         self._dtypes = []
 *         self._block_shapes = None
 *         self._nodatavals = []             # <<<<<<<<<<<<<<
 *         self._crs = None
 *         self._crs_wkt = None
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_nodatavals);
  __Pyx_DECREF(__pyx_v_self->_nodatavals);
  __pyx_v_self->_nodatavals = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":44
 *         self._block_shapes = None
 *         self._nodatavals = []
 *         self._crs = None             # <<<<<<<<<<<<<<
 *         self._crs_wkt = None
 *         self._read = False
 */
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_crs);
  __Pyx_DECREF(__pyx_v_self->_crs);
  __pyx_v_self->_crs = Py_None;

  /* "rasterio/_base.pyx":45
 *         self._nodatavals = []
 *         self._crs = None
 *         self._crs_wkt = None             # <<<<<<<<<<<<<<
 *         self._read = False
 *         self.env = None
 */
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_crs_wkt);
  __Pyx_DECREF(__pyx_v_self->_crs_wkt);
  __pyx_v_self->_crs_wkt = Py_None;

  /* "rasterio/_base.pyx":46
 *         self._crs = None
 *         self._crs_wkt = None
 *         self._read = False             # <<<<<<<<<<<<<<
 *         self.env = None
 * 
 */
  __Pyx_INCREF(Py_False);
  __Pyx_GIVEREF(Py_False);
  __Pyx_GOTREF(__pyx_v_self->_read);
  __Pyx_DECREF(__pyx_v_self->_read);
  __pyx_v_self->_read = Py_False;

  /* "rasterio/_base.pyx":47
 *         self._crs_wkt = None
 *         self._read = False
 *         self.env = None             # <<<<<<<<<<<<<<
 * 
 *     def __repr__(self):
 */
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->env);
  __Pyx_DECREF(__pyx_v_self->env);
  __pyx_v_self->env = Py_None;

  /* "rasterio/_base.pyx":35
 * cdef class DatasetReader(object):
 * 
 *     def __init__(self, path):             # <<<<<<<<<<<<<<
 *         self.name = path
 *         self.mode = 'r'
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":49
 *         self.env = None
 * 
 *     def __repr__(self):             # <<<<<<<<<<<<<<
 *         return "<%s RasterReader name='%s' mode='%s'>" % (
 *             self.closed and 'closed' or 'open',
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3__repr__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3__repr__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_2__repr__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_2__repr__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__repr__", 0);

  /* "rasterio/_base.pyx":50
 * 
 *     def __repr__(self):
 *         return "<%s RasterReader name='%s' mode='%s'>" % (             # <<<<<<<<<<<<<<
 *             self.closed and 'closed' or 'open',
 *             self.name,
 */
  __Pyx_XDECREF(__pyx_r);

  /* "rasterio/_base.pyx":51
 *     def __repr__(self):
 *         return "<%s RasterReader name='%s' mode='%s'>" % (
 *             self.closed and 'closed' or 'open',             # <<<<<<<<<<<<<<
 *             self.name,
 *             self.mode)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_closed); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (!__pyx_t_3) {
    goto __pyx_L4_next_or;
  } else {
  }
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_n_s_closed); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_3) {
  } else {
    __Pyx_INCREF(__pyx_n_s_closed);
    __pyx_t_1 = __pyx_n_s_closed;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_L4_next_or:;
  __Pyx_INCREF(__pyx_n_s_open);
  __pyx_t_1 = __pyx_n_s_open;
  __pyx_L3_bool_binop_done:;

  /* "rasterio/_base.pyx":53
 *             self.closed and 'closed' or 'open',
 *             self.name,
 *             self.mode)             # <<<<<<<<<<<<<<
 * 
 *     def start(self):
 */
  __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __Pyx_INCREF(__pyx_v_self->name);
  __Pyx_GIVEREF(__pyx_v_self->name);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->name);
  __Pyx_INCREF(__pyx_v_self->mode);
  __Pyx_GIVEREF(__pyx_v_self->mode);
  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->mode);
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":50
 * 
 *     def __repr__(self):
 *         return "<%s RasterReader name='%s' mode='%s'>" % (             # <<<<<<<<<<<<<<
 *             self.closed and 'closed' or 'open',
 *             self.name,
 */
  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s_RasterReader_name_s_mode_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":49
 *         self.env = None
 * 
 *     def __repr__(self):             # <<<<<<<<<<<<<<
 *         return "<%s RasterReader name='%s' mode='%s'>" % (
 *             self.closed and 'closed' or 'open',
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":55
 *             self.mode)
 * 
 *     def start(self):             # <<<<<<<<<<<<<<
 *         # Is there not a driver manager already?
 *         if driver_count() == 0 and not self.env:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5start(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5start(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("start (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4start(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4start(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_name_b = NULL;
  char const *__pyx_v_fname;
  void *__pyx_v_drv;
  char const *__pyx_v_drv_name;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  int __pyx_t_6;
  char const *__pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("start", 0);

  /* "rasterio/_base.pyx":57
 *     def start(self):
 *         # Is there not a driver manager already?
 *         if driver_count() == 0 and not self.env:             # <<<<<<<<<<<<<<
 *             # create a local manager and enter
 *             self.env = GDALEnv(True)
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_driver_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyInt_EqObjC(__pyx_t_2, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_5) {
  } else {
    __pyx_t_1 = __pyx_t_5;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_self->env); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_6 = ((!__pyx_t_5) != 0);
  __pyx_t_1 = __pyx_t_6;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":59
 *         if driver_count() == 0 and not self.env:
 *             # create a local manager and enter
 *             self.env = GDALEnv(True)             # <<<<<<<<<<<<<<
 *         else:
 *             # create a local manager and enter
 */
    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_GDALEnv); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->env);
    __Pyx_DECREF(__pyx_v_self->env);
    __pyx_v_self->env = __pyx_t_2;
    __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":57
 *     def start(self):
 *         # Is there not a driver manager already?
 *         if driver_count() == 0 and not self.env:             # <<<<<<<<<<<<<<
 *             # create a local manager and enter
 *             self.env = GDALEnv(True)
 */
    goto __pyx_L3;
  }

  /* "rasterio/_base.pyx":62
 *         else:
 *             # create a local manager and enter
 *             self.env = GDALEnv(False)             # <<<<<<<<<<<<<<
 *         self.env.start()
 * 
 */
  /*else*/ {
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_GDALEnv); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GIVEREF(__pyx_t_3);
    __Pyx_GOTREF(__pyx_v_self->env);
    __Pyx_DECREF(__pyx_v_self->env);
    __pyx_v_self->env = __pyx_t_3;
    __pyx_t_3 = 0;
  }
  __pyx_L3:;

  /* "rasterio/_base.pyx":63
 *             # create a local manager and enter
 *             self.env = GDALEnv(False)
 *         self.env.start()             # <<<<<<<<<<<<<<
 * 
 *         name_b = self.name.encode('utf-8')
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->env, __pyx_n_s_start); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":65
 *         self.env.start()
 * 
 *         name_b = self.name.encode('utf-8')             # <<<<<<<<<<<<<<
 *         cdef const char *fname = name_b
 *         with cpl_errs:
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->name, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_name_b = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":66
 * 
 *         name_b = self.name.encode('utf-8')
 *         cdef const char *fname = name_b             # <<<<<<<<<<<<<<
 *         with cpl_errs:
 *             self._hds = _gdal.GDALOpen(fname, 0)
 */
  __pyx_t_7 = __Pyx_PyObject_AsString(__pyx_v_name_b); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_fname = __pyx_t_7;

  /* "rasterio/_base.pyx":67
 *         name_b = self.name.encode('utf-8')
 *         cdef const char *fname = name_b
 *         with cpl_errs:             # <<<<<<<<<<<<<<
 *             self._hds = _gdal.GDALOpen(fname, 0)
 *         if self._hds == NULL:
 */
  /*with:*/ {
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_cpl_errs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = __Pyx_PyObject_LookupSpecial(__pyx_t_2, __pyx_n_s_exit); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_4 = __Pyx_PyObject_LookupSpecial(__pyx_t_2, __pyx_n_s_enter); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_9 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_9)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_9);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (__pyx_t_9) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_9); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    } else {
      __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
    }
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    /*try:*/ {
      {
        if (__pyx_t_10||__pyx_t_11||__pyx_t_12); else {/*mark used*/}
        /*try:*/ {

          /* "rasterio/_base.pyx":68
 *         cdef const char *fname = name_b
 *         with cpl_errs:
 *             self._hds = _gdal.GDALOpen(fname, 0)             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */
          __pyx_v_self->_hds = GDALOpen(__pyx_v_fname, 0);

          /* "rasterio/_base.pyx":67
 *         name_b = self.name.encode('utf-8')
 *         cdef const char *fname = name_b
 *         with cpl_errs:             # <<<<<<<<<<<<<<
 *             self._hds = _gdal.GDALOpen(fname, 0)
 *         if self._hds == NULL:
 */
        }
      }
    }
    /*finally:*/ {
      /*normal exit:*/{
        if (__pyx_t_8) {
          __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__4, NULL);
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_12);
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        }
        goto __pyx_L9;
      }
      __pyx_L9:;
    }
    goto __pyx_L18;
    __pyx_L6_error:;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    goto __pyx_L1_error;
    __pyx_L18:;
  }

  /* "rasterio/_base.pyx":69
 *         with cpl_errs:
 *             self._hds = _gdal.GDALOpen(fname, 0)
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 * 
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":70
 *             self._hds = _gdal.GDALOpen(fname, 0)
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 * 
 *         cdef void *drv
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":69
 *         with cpl_errs:
 *             self._hds = _gdal.GDALOpen(fname, 0)
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 * 
 */
  }

  /* "rasterio/_base.pyx":74
 *         cdef void *drv
 *         cdef const char *drv_name
 *         drv = _gdal.GDALGetDatasetDriver(self._hds)             # <<<<<<<<<<<<<<
 *         drv_name = _gdal.GDALGetDriverShortName(drv)
 *         self.driver = drv_name.decode('utf-8')
 */
  __pyx_v_drv = GDALGetDatasetDriver(__pyx_v_self->_hds);

  /* "rasterio/_base.pyx":75
 *         cdef const char *drv_name
 *         drv = _gdal.GDALGetDatasetDriver(self._hds)
 *         drv_name = _gdal.GDALGetDriverShortName(drv)             # <<<<<<<<<<<<<<
 *         self.driver = drv_name.decode('utf-8')
 * 
 */
  __pyx_v_drv_name = GDALGetDriverShortName(__pyx_v_drv);

  /* "rasterio/_base.pyx":76
 *         drv = _gdal.GDALGetDatasetDriver(self._hds)
 *         drv_name = _gdal.GDALGetDriverShortName(drv)
 *         self.driver = drv_name.decode('utf-8')             # <<<<<<<<<<<<<<
 * 
 *         self._count = _gdal.GDALGetRasterCount(self._hds)
 */
  __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_drv_name, 0, strlen(__pyx_v_drv_name), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->driver);
  __Pyx_DECREF(__pyx_v_self->driver);
  __pyx_v_self->driver = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":78
 *         self.driver = drv_name.decode('utf-8')
 * 
 *         self._count = _gdal.GDALGetRasterCount(self._hds)             # <<<<<<<<<<<<<<
 *         self.width = _gdal.GDALGetRasterXSize(self._hds)
 *         self.height = _gdal.GDALGetRasterYSize(self._hds)
 */
  __pyx_t_2 = __Pyx_PyInt_From_int(GDALGetRasterCount(__pyx_v_self->_hds)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->_count);
  __Pyx_DECREF(__pyx_v_self->_count);
  __pyx_v_self->_count = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":79
 * 
 *         self._count = _gdal.GDALGetRasterCount(self._hds)
 *         self.width = _gdal.GDALGetRasterXSize(self._hds)             # <<<<<<<<<<<<<<
 *         self.height = _gdal.GDALGetRasterYSize(self._hds)
 *         self.shape = (self.height, self.width)
 */
  __pyx_t_2 = __Pyx_PyInt_From_int(GDALGetRasterXSize(__pyx_v_self->_hds)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->width);
  __Pyx_DECREF(__pyx_v_self->width);
  __pyx_v_self->width = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":80
 *         self._count = _gdal.GDALGetRasterCount(self._hds)
 *         self.width = _gdal.GDALGetRasterXSize(self._hds)
 *         self.height = _gdal.GDALGetRasterYSize(self._hds)             # <<<<<<<<<<<<<<
 *         self.shape = (self.height, self.width)
 * 
 */
  __pyx_t_2 = __Pyx_PyInt_From_int(GDALGetRasterYSize(__pyx_v_self->_hds)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->height);
  __Pyx_DECREF(__pyx_v_self->height);
  __pyx_v_self->height = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":81
 *         self.width = _gdal.GDALGetRasterXSize(self._hds)
 *         self.height = _gdal.GDALGetRasterYSize(self._hds)
 *         self.shape = (self.height, self.width)             # <<<<<<<<<<<<<<
 * 
 *         self._transform = self.read_transform()
 */
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_self->height);
  __Pyx_GIVEREF(__pyx_v_self->height);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->height);
  __Pyx_INCREF(__pyx_v_self->width);
  __Pyx_GIVEREF(__pyx_v_self->width);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->width);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->shape);
  __Pyx_DECREF(__pyx_v_self->shape);
  __pyx_v_self->shape = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":83
 *         self.shape = (self.height, self.width)
 * 
 *         self._transform = self.read_transform()             # <<<<<<<<<<<<<<
 *         self._crs = self.read_crs()
 *         self._crs_wkt = self.read_crs_wkt()
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_transform); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->_transform);
  __Pyx_DECREF(__pyx_v_self->_transform);
  __pyx_v_self->_transform = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":84
 * 
 *         self._transform = self.read_transform()
 *         self._crs = self.read_crs()             # <<<<<<<<<<<<<<
 *         self._crs_wkt = self.read_crs_wkt()
 * 
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_crs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->_crs);
  __Pyx_DECREF(__pyx_v_self->_crs);
  __pyx_v_self->_crs = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":85
 *         self._transform = self.read_transform()
 *         self._crs = self.read_crs()
 *         self._crs_wkt = self.read_crs_wkt()             # <<<<<<<<<<<<<<
 * 
 *         # touch self.meta
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_crs_wkt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->_crs_wkt);
  __Pyx_DECREF(__pyx_v_self->_crs_wkt);
  __pyx_v_self->_crs_wkt = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":88
 * 
 *         # touch self.meta
 *         _ = self.meta             # <<<<<<<<<<<<<<
 * 
 *         self._closed = False
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_meta); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v__ = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":90
 *         _ = self.meta
 * 
 *         self._closed = False             # <<<<<<<<<<<<<<
 * 
 *     cdef void *band(self, int bidx):
 */
  __Pyx_INCREF(Py_False);
  __Pyx_GIVEREF(Py_False);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = Py_False;

  /* "rasterio/_base.pyx":55
 *             self.mode)
 * 
 *     def start(self):             # <<<<<<<<<<<<<<
 *         # Is there not a driver manager already?
 *         if driver_count() == 0 and not self.env:
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.start", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_name_b);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":92
 *         self._closed = False
 * 
 *     cdef void *band(self, int bidx):             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */

static void *__pyx_f_8rasterio_5_base_13DatasetReader_band(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, int __pyx_v_bidx) {
  void *__pyx_v_hband;
  void *__pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("band", 0);

  /* "rasterio/_base.pyx":93
 * 
 *     cdef void *band(self, int bidx):
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":94
 *     cdef void *band(self, int bidx):
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":93
 * 
 *     cdef void *band(self, int bidx):
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  }

  /* "rasterio/_base.pyx":95
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *         if hband == NULL:
 *             raise ValueError("Null band")
 */
  __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_v_bidx);

  /* "rasterio/_base.pyx":96
 *             raise ValueError("Null dataset")
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null band")
 *         return hband
 */
  __pyx_t_1 = ((__pyx_v_hband == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":97
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 *             raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *         return hband
 * 
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":96
 *             raise ValueError("Null dataset")
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null band")
 *         return hband
 */
  }

  /* "rasterio/_base.pyx":98
 *         if hband == NULL:
 *             raise ValueError("Null band")
 *         return hband             # <<<<<<<<<<<<<<
 * 
 *     def read_crs(self):
 */
  __pyx_r = __pyx_v_hband;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":92
 *         self._closed = False
 * 
 *     cdef void *band(self, int bidx):             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_WriteUnraisable("rasterio._base.DatasetReader.band", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":100
 *         return hband
 * 
 *     def read_crs(self):             # <<<<<<<<<<<<<<
 *         cdef char *proj_c = NULL
 *         cdef const char * auth_key = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7read_crs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7read_crs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("read_crs (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6read_crs(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6read_crs(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  char *__pyx_v_proj_c;
  char const *__pyx_v_auth_key;
  char const *__pyx_v_auth_val;
  void *__pyx_v_osr;
  PyObject *__pyx_v_crs = NULL;
  char const *__pyx_v_wkt;
  char const *__pyx_v_wkt_b;
  int __pyx_v_retval;
  char const *__pyx_v_key_b;
  PyObject *__pyx_v_key = NULL;
  char const *__pyx_v_val_b;
  PyObject *__pyx_v_val = NULL;
  char *__pyx_v_proj_b;
  PyObject *__pyx_v_value = NULL;
  PyObject *__pyx_v_param = NULL;
  PyObject *__pyx_v_kv = NULL;
  PyObject *__pyx_v_k = NULL;
  PyObject *__pyx_v_v = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  size_t __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_t_9;
  PyObject *(*__pyx_t_10)(PyObject *);
  Py_ssize_t __pyx_t_11;
  PyObject *(*__pyx_t_12)(PyObject *);
  PyObject *__pyx_t_13 = NULL;
  PyObject *__pyx_t_14 = NULL;
  PyObject *__pyx_t_15 = NULL;
  double __pyx_t_16;
  int __pyx_t_17;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("read_crs", 0);

  /* "rasterio/_base.pyx":101
 * 
 *     def read_crs(self):
 *         cdef char *proj_c = NULL             # <<<<<<<<<<<<<<
 *         cdef const char * auth_key = NULL
 *         cdef const char * auth_val = NULL
 */
  __pyx_v_proj_c = NULL;

  /* "rasterio/_base.pyx":102
 *     def read_crs(self):
 *         cdef char *proj_c = NULL
 *         cdef const char * auth_key = NULL             # <<<<<<<<<<<<<<
 *         cdef const char * auth_val = NULL
 *         cdef void *osr = NULL
 */
  __pyx_v_auth_key = NULL;

  /* "rasterio/_base.pyx":103
 *         cdef char *proj_c = NULL
 *         cdef const char * auth_key = NULL
 *         cdef const char * auth_val = NULL             # <<<<<<<<<<<<<<
 *         cdef void *osr = NULL
 *         if self._hds == NULL:
 */
  __pyx_v_auth_val = NULL;

  /* "rasterio/_base.pyx":104
 *         cdef const char * auth_key = NULL
 *         cdef const char * auth_val = NULL
 *         cdef void *osr = NULL             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */
  __pyx_v_osr = NULL;

  /* "rasterio/_base.pyx":105
 *         cdef const char * auth_val = NULL
 *         cdef void *osr = NULL
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         crs = {}
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":106
 *         cdef void *osr = NULL
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":105
 *         cdef const char * auth_val = NULL
 *         cdef void *osr = NULL
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         crs = {}
 */
  }

  /* "rasterio/_base.pyx":107
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 *         crs = {}             # <<<<<<<<<<<<<<
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 */
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_crs = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":108
 *             raise ValueError("Null dataset")
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)             # <<<<<<<<<<<<<<
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")
 */
  __pyx_v_wkt = GDALGetProjectionRef(__pyx_v_self->_hds);

  /* "rasterio/_base.pyx":109
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 */
  __pyx_t_1 = ((__pyx_v_wkt == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":110
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":109
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 */
  }

  /* "rasterio/_base.pyx":111
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt             # <<<<<<<<<<<<<<
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 */
  __pyx_v_wkt_b = __pyx_v_wkt;

  /* "rasterio/_base.pyx":112
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:             # <<<<<<<<<<<<<<
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:
 */
  __pyx_t_3 = strlen(__pyx_v_wkt_b); 
  __pyx_t_1 = ((__pyx_t_3 > 0) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":113
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)             # <<<<<<<<<<<<<<
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")
 */
    __pyx_v_osr = OSRNewSpatialReference(__pyx_v_wkt);

    /* "rasterio/_base.pyx":114
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Unexpected NULL spatial reference")
 *             log.debug("Got coordinate system")
 */
    __pyx_t_1 = ((__pyx_v_osr == NULL) != 0);
    if (__pyx_t_1) {

      /* "rasterio/_base.pyx":115
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *             log.debug("Got coordinate system")
 * 
 */
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_Raise(__pyx_t_2, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":114
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Unexpected NULL spatial reference")
 *             log.debug("Got coordinate system")
 */
    }

    /* "rasterio/_base.pyx":116
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")
 *             log.debug("Got coordinate system")             # <<<<<<<<<<<<<<
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":118
 *             log.debug("Got coordinate system")
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)             # <<<<<<<<<<<<<<
 *             if retval > 0:
 *                 log.info("Failed to auto identify EPSG: %d", retval)
 */
    __pyx_v_retval = OSRAutoIdentifyEPSG(__pyx_v_osr);

    /* "rasterio/_base.pyx":119
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *             if retval > 0:             # <<<<<<<<<<<<<<
 *                 log.info("Failed to auto identify EPSG: %d", retval)
 * 
 */
    __pyx_t_1 = ((__pyx_v_retval > 0) != 0);
    if (__pyx_t_1) {

      /* "rasterio/_base.pyx":120
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *             if retval > 0:
 *                 log.info("Failed to auto identify EPSG: %d", retval)             # <<<<<<<<<<<<<<
 * 
 *             auth_key = _gdal.OSRGetAuthorityName(osr, NULL)
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_info); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_retval); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_6 = NULL;
      __pyx_t_7 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
          __pyx_t_7 = 1;
        }
      }
      __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      if (__pyx_t_6) {
        __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __pyx_t_6 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_Failed_to_auto_identify_EPSG_d);
      __Pyx_GIVEREF(__pyx_kp_s_Failed_to_auto_identify_EPSG_d);
      PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_kp_s_Failed_to_auto_identify_EPSG_d);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4);
      __pyx_t_4 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":119
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *             if retval > 0:             # <<<<<<<<<<<<<<
 *                 log.info("Failed to auto identify EPSG: %d", retval)
 * 
 */
    }

    /* "rasterio/_base.pyx":122
 *                 log.info("Failed to auto identify EPSG: %d", retval)
 * 
 *             auth_key = _gdal.OSRGetAuthorityName(osr, NULL)             # <<<<<<<<<<<<<<
 *             auth_val = _gdal.OSRGetAuthorityCode(osr, NULL)
 * 
 */
    __pyx_v_auth_key = OSRGetAuthorityName(__pyx_v_osr, NULL);

    /* "rasterio/_base.pyx":123
 * 
 *             auth_key = _gdal.OSRGetAuthorityName(osr, NULL)
 *             auth_val = _gdal.OSRGetAuthorityCode(osr, NULL)             # <<<<<<<<<<<<<<
 * 
 *             if auth_key != NULL and auth_val != NULL:
 */
    __pyx_v_auth_val = OSRGetAuthorityCode(__pyx_v_osr, NULL);

    /* "rasterio/_base.pyx":125
 *             auth_val = _gdal.OSRGetAuthorityCode(osr, NULL)
 * 
 *             if auth_key != NULL and auth_val != NULL:             # <<<<<<<<<<<<<<
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')
 */
    __pyx_t_9 = ((__pyx_v_auth_key != NULL) != 0);
    if (__pyx_t_9) {
    } else {
      __pyx_t_1 = __pyx_t_9;
      goto __pyx_L9_bool_binop_done;
    }
    __pyx_t_9 = ((__pyx_v_auth_val != NULL) != 0);
    __pyx_t_1 = __pyx_t_9;
    __pyx_L9_bool_binop_done:;
    if (__pyx_t_1) {

      /* "rasterio/_base.pyx":126
 * 
 *             if auth_key != NULL and auth_val != NULL:
 *                 key_b = auth_key             # <<<<<<<<<<<<<<
 *                 key = key_b.decode('utf-8')
 *                 if key == 'EPSG':
 */
      __pyx_v_key_b = __pyx_v_auth_key;

      /* "rasterio/_base.pyx":127
 *             if auth_key != NULL and auth_val != NULL:
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')             # <<<<<<<<<<<<<<
 *                 if key == 'EPSG':
 *                     val_b = auth_val
 */
      __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_key_b, 0, strlen(__pyx_v_key_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_v_key = __pyx_t_2;
      __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":128
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')
 *                 if key == 'EPSG':             # <<<<<<<<<<<<<<
 *                     val_b = auth_val
 *                     val = val_b.decode('utf-8')
 */
      __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_key, __pyx_n_s_EPSG, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      if (__pyx_t_1) {

        /* "rasterio/_base.pyx":129
 *                 key = key_b.decode('utf-8')
 *                 if key == 'EPSG':
 *                     val_b = auth_val             # <<<<<<<<<<<<<<
 *                     val = val_b.decode('utf-8')
 *                     crs['init'] = "epsg:" + val
 */
        __pyx_v_val_b = __pyx_v_auth_val;

        /* "rasterio/_base.pyx":130
 *                 if key == 'EPSG':
 *                     val_b = auth_val
 *                     val = val_b.decode('utf-8')             # <<<<<<<<<<<<<<
 *                     crs['init'] = "epsg:" + val
 *             else:
 */
        __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_val_b, 0, strlen(__pyx_v_val_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_v_val = __pyx_t_2;
        __pyx_t_2 = 0;

        /* "rasterio/_base.pyx":131
 *                     val_b = auth_val
 *                     val = val_b.decode('utf-8')
 *                     crs['init'] = "epsg:" + val             # <<<<<<<<<<<<<<
 *             else:
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 */
        __pyx_t_2 = PyNumber_Add(__pyx_kp_s_epsg, __pyx_v_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        if (unlikely(PyDict_SetItem(__pyx_v_crs, __pyx_n_s_init, __pyx_t_2) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

        /* "rasterio/_base.pyx":128
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')
 *                 if key == 'EPSG':             # <<<<<<<<<<<<<<
 *                     val_b = auth_val
 *                     val = val_b.decode('utf-8')
 */
      }

      /* "rasterio/_base.pyx":125
 *             auth_val = _gdal.OSRGetAuthorityCode(osr, NULL)
 * 
 *             if auth_key != NULL and auth_val != NULL:             # <<<<<<<<<<<<<<
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')
 */
      goto __pyx_L8;
    }

    /* "rasterio/_base.pyx":133
 *                     crs['init'] = "epsg:" + val
 *             else:
 *                 _gdal.OSRExportToProj4(osr, &proj_c)             # <<<<<<<<<<<<<<
 *                 if proj_c == NULL:
 *                     raise ValueError("Unexpected Null spatial reference")
 */
    /*else*/ {
      OSRExportToProj4(__pyx_v_osr, (&__pyx_v_proj_c));

      /* "rasterio/_base.pyx":134
 *             else:
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 *                 if proj_c == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Unexpected Null spatial reference")
 *                 proj_b = proj_c
 */
      __pyx_t_1 = ((__pyx_v_proj_c == NULL) != 0);
      if (__pyx_t_1) {

        /* "rasterio/_base.pyx":135
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 *                 if proj_c == NULL:
 *                     raise ValueError("Unexpected Null spatial reference")             # <<<<<<<<<<<<<<
 *                 proj_b = proj_c
 *                 log.debug("Params: %s", proj_b)
 */
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_Raise(__pyx_t_2, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "rasterio/_base.pyx":134
 *             else:
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 *                 if proj_c == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Unexpected Null spatial reference")
 *                 proj_b = proj_c
 */
      }

      /* "rasterio/_base.pyx":136
 *                 if proj_c == NULL:
 *                     raise ValueError("Unexpected Null spatial reference")
 *                 proj_b = proj_c             # <<<<<<<<<<<<<<
 *                 log.debug("Params: %s", proj_b)
 *                 value = proj_b.decode()
 */
      __pyx_v_proj_b = __pyx_v_proj_c;

      /* "rasterio/_base.pyx":137
 *                     raise ValueError("Unexpected Null spatial reference")
 *                 proj_b = proj_c
 *                 log.debug("Params: %s", proj_b)             # <<<<<<<<<<<<<<
 *                 value = proj_b.decode()
 *                 value = value.strip()
 */
      __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_debug); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_proj_b); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_4 = NULL;
      __pyx_t_7 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_8);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_8, function);
          __pyx_t_7 = 1;
        }
      }
      __pyx_t_6 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      if (__pyx_t_4) {
        __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_Params_s);
      __Pyx_GIVEREF(__pyx_kp_s_Params_s);
      PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_7, __pyx_kp_s_Params_s);
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_7, __pyx_t_5);
      __pyx_t_5 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":138
 *                 proj_b = proj_c
 *                 log.debug("Params: %s", proj_b)
 *                 value = proj_b.decode()             # <<<<<<<<<<<<<<
 *                 value = value.strip()
 *                 for param in value.split():
 */
      __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_proj_b, 0, strlen(__pyx_v_proj_b), NULL, NULL, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_v_value = __pyx_t_2;
      __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":139
 *                 log.debug("Params: %s", proj_b)
 *                 value = proj_b.decode()
 *                 value = value.strip()             # <<<<<<<<<<<<<<
 *                 for param in value.split():
 *                     kv = param.split("=")
 */
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_strip); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_8, function);
        }
      }
      if (__pyx_t_6) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_2);
      __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":140
 *                 value = proj_b.decode()
 *                 value = value.strip()
 *                 for param in value.split():             # <<<<<<<<<<<<<<
 *                     kv = param.split("=")
 *                     if len(kv) == 2:
 */
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_split); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_8, function);
        }
      }
      if (__pyx_t_6) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
        __pyx_t_8 = __pyx_t_2; __Pyx_INCREF(__pyx_t_8); __pyx_t_7 = 0;
        __pyx_t_10 = NULL;
      } else {
        __pyx_t_7 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_8);
        __pyx_t_10 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      for (;;) {
        if (likely(!__pyx_t_10)) {
          if (likely(PyList_CheckExact(__pyx_t_8))) {
            if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_8)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            #else
            __pyx_t_2 = PySequence_ITEM(__pyx_t_8, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_2);
            #endif
          } else {
            if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            #else
            __pyx_t_2 = PySequence_ITEM(__pyx_t_8, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_2);
            #endif
          }
        } else {
          __pyx_t_2 = __pyx_t_10(__pyx_t_8);
          if (unlikely(!__pyx_t_2)) {
            PyObject* exc_type = PyErr_Occurred();
            if (exc_type) {
              if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
              else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            }
            break;
          }
          __Pyx_GOTREF(__pyx_t_2);
        }
        __Pyx_XDECREF_SET(__pyx_v_param, __pyx_t_2);
        __pyx_t_2 = 0;

        /* "rasterio/_base.pyx":141
 *                 value = value.strip()
 *                 for param in value.split():
 *                     kv = param.split("=")             # <<<<<<<<<<<<<<
 *                     if len(kv) == 2:
 *                         k, v = kv
 */
        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_param, __pyx_n_s_split); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_XDECREF_SET(__pyx_v_kv, __pyx_t_6);
        __pyx_t_6 = 0;

        /* "rasterio/_base.pyx":142
 *                 for param in value.split():
 *                     kv = param.split("=")
 *                     if len(kv) == 2:             # <<<<<<<<<<<<<<
 *                         k, v = kv
 *                         try:
 */
        __pyx_t_11 = PyObject_Length(__pyx_v_kv); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_1 = ((__pyx_t_11 == 2) != 0);
        if (__pyx_t_1) {

          /* "rasterio/_base.pyx":143
 *                     kv = param.split("=")
 *                     if len(kv) == 2:
 *                         k, v = kv             # <<<<<<<<<<<<<<
 *                         try:
 *                             v = float(v)
 */
          if ((likely(PyTuple_CheckExact(__pyx_v_kv))) || (PyList_CheckExact(__pyx_v_kv))) {
            PyObject* sequence = __pyx_v_kv;
            #if CYTHON_COMPILING_IN_CPYTHON
            Py_ssize_t size = Py_SIZE(sequence);
            #else
            Py_ssize_t size = PySequence_Size(sequence);
            #endif
            if (unlikely(size != 2)) {
              if (size > 2) __Pyx_RaiseTooManyValuesError(2);
              else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
              {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            }
            #if CYTHON_COMPILING_IN_CPYTHON
            if (likely(PyTuple_CheckExact(sequence))) {
              __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
              __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
            } else {
              __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
              __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
            }
            __Pyx_INCREF(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_2);
            #else
            __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_6);
            __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_2);
            #endif
          } else {
            Py_ssize_t index = -1;
            __pyx_t_5 = PyObject_GetIter(__pyx_v_kv); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_5);
            __pyx_t_12 = Py_TYPE(__pyx_t_5)->tp_iternext;
            index = 0; __pyx_t_6 = __pyx_t_12(__pyx_t_5); if (unlikely(!__pyx_t_6)) goto __pyx_L16_unpacking_failed;
            __Pyx_GOTREF(__pyx_t_6);
            index = 1; __pyx_t_2 = __pyx_t_12(__pyx_t_5); if (unlikely(!__pyx_t_2)) goto __pyx_L16_unpacking_failed;
            __Pyx_GOTREF(__pyx_t_2);
            if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __pyx_t_12 = NULL;
            __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
            goto __pyx_L17_unpacking_done;
            __pyx_L16_unpacking_failed:;
            __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
            __pyx_t_12 = NULL;
            if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
            {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __pyx_L17_unpacking_done:;
          }
          __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_6);
          __pyx_t_6 = 0;
          __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_2);
          __pyx_t_2 = 0;

          /* "rasterio/_base.pyx":144
 *                     if len(kv) == 2:
 *                         k, v = kv
 *                         try:             # <<<<<<<<<<<<<<
 *                             v = float(v)
 *                             if v % 1 == 0:
 */
          {
            __Pyx_ExceptionSave(&__pyx_t_13, &__pyx_t_14, &__pyx_t_15);
            __Pyx_XGOTREF(__pyx_t_13);
            __Pyx_XGOTREF(__pyx_t_14);
            __Pyx_XGOTREF(__pyx_t_15);
            /*try:*/ {

              /* "rasterio/_base.pyx":145
 *                         k, v = kv
 *                         try:
 *                             v = float(v)             # <<<<<<<<<<<<<<
 *                             if v % 1 == 0:
 *                                 v = int(v)
 */
              __pyx_t_16 = __Pyx_PyObject_AsDouble(__pyx_v_v); if (unlikely(__pyx_t_16 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L18_error;}
              __pyx_t_2 = PyFloat_FromDouble(__pyx_t_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L18_error;}
              __Pyx_GOTREF(__pyx_t_2);
              __Pyx_DECREF_SET(__pyx_v_v, __pyx_t_2);
              __pyx_t_2 = 0;

              /* "rasterio/_base.pyx":146
 *                         try:
 *                             v = float(v)
 *                             if v % 1 == 0:             # <<<<<<<<<<<<<<
 *                                 v = int(v)
 *                         except ValueError:
 */
              __pyx_t_2 = __Pyx_PyInt_RemainderObjC(__pyx_v_v, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L18_error;}
              __Pyx_GOTREF(__pyx_t_2);
              __pyx_t_6 = __Pyx_PyInt_EqObjC(__pyx_t_2, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L18_error;}
              __Pyx_GOTREF(__pyx_t_6);
              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
              __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L18_error;}
              __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
              if (__pyx_t_1) {

                /* "rasterio/_base.pyx":147
 *                             v = float(v)
 *                             if v % 1 == 0:
 *                                 v = int(v)             # <<<<<<<<<<<<<<
 *                         except ValueError:
 *                             # Leave v as a string
 */
                __pyx_t_6 = PyNumber_Int(__pyx_v_v); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L18_error;}
                __Pyx_GOTREF(__pyx_t_6);
                __Pyx_DECREF_SET(__pyx_v_v, __pyx_t_6);
                __pyx_t_6 = 0;

                /* "rasterio/_base.pyx":146
 *                         try:
 *                             v = float(v)
 *                             if v % 1 == 0:             # <<<<<<<<<<<<<<
 *                                 v = int(v)
 *                         except ValueError:
 */
              }

              /* "rasterio/_base.pyx":144
 *                     if len(kv) == 2:
 *                         k, v = kv
 *                         try:             # <<<<<<<<<<<<<<
 *                             v = float(v)
 *                             if v % 1 == 0:
 */
            }
            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
            __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
            __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
            goto __pyx_L25_try_end;
            __pyx_L18_error:;
            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
            __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;

            /* "rasterio/_base.pyx":148
 *                             if v % 1 == 0:
 *                                 v = int(v)
 *                         except ValueError:             # <<<<<<<<<<<<<<
 *                             # Leave v as a string
 *                             pass
 */
            __pyx_t_17 = PyErr_ExceptionMatches(__pyx_builtin_ValueError);
            if (__pyx_t_17) {
              PyErr_Restore(0,0,0);
              goto __pyx_L19_exception_handled;
            }
            goto __pyx_L20_except_error;
            __pyx_L20_except_error:;

            /* "rasterio/_base.pyx":144
 *                     if len(kv) == 2:
 *                         k, v = kv
 *                         try:             # <<<<<<<<<<<<<<
 *                             v = float(v)
 *                             if v % 1 == 0:
 */
            __Pyx_XGIVEREF(__pyx_t_13);
            __Pyx_XGIVEREF(__pyx_t_14);
            __Pyx_XGIVEREF(__pyx_t_15);
            __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15);
            goto __pyx_L1_error;
            __pyx_L19_exception_handled:;
            __Pyx_XGIVEREF(__pyx_t_13);
            __Pyx_XGIVEREF(__pyx_t_14);
            __Pyx_XGIVEREF(__pyx_t_15);
            __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15);
            __pyx_L25_try_end:;
          }

          /* "rasterio/_base.pyx":142
 *                 for param in value.split():
 *                     kv = param.split("=")
 *                     if len(kv) == 2:             # <<<<<<<<<<<<<<
 *                         k, v = kv
 *                         try:
 */
          goto __pyx_L15;
        }

        /* "rasterio/_base.pyx":151
 *                             # Leave v as a string
 *                             pass
 *                     elif len(kv) == 1:             # <<<<<<<<<<<<<<
 *                         k, v = kv[0], True
 *                     else:
 */
        __pyx_t_11 = PyObject_Length(__pyx_v_kv); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_1 = ((__pyx_t_11 == 1) != 0);
        if (__pyx_t_1) {

          /* "rasterio/_base.pyx":152
 *                             pass
 *                     elif len(kv) == 1:
 *                         k, v = kv[0], True             # <<<<<<<<<<<<<<
 *                     else:
 *                         raise ValueError(
 */
          __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_kv, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_2 = Py_True;
          __Pyx_INCREF(__pyx_t_2);
          __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_6);
          __pyx_t_6 = 0;
          __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_2);
          __pyx_t_2 = 0;

          /* "rasterio/_base.pyx":151
 *                             # Leave v as a string
 *                             pass
 *                     elif len(kv) == 1:             # <<<<<<<<<<<<<<
 *                         k, v = kv[0], True
 *                     else:
 */
          goto __pyx_L15;
        }

        /* "rasterio/_base.pyx":154
 *                         k, v = kv[0], True
 *                     else:
 *                         raise ValueError(             # <<<<<<<<<<<<<<
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")
 */
        /*else*/ {

          /* "rasterio/_base.pyx":155
 *                     else:
 *                         raise ValueError(
 *                             "Unexpected proj parameter %s" % param)             # <<<<<<<<<<<<<<
 *                     k = k.lstrip("+")
 *                     crs[k] = v
 */
          __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_Unexpected_proj_parameter_s, __pyx_v_param); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_2);

          /* "rasterio/_base.pyx":154
 *                         k, v = kv[0], True
 *                     else:
 *                         raise ValueError(             # <<<<<<<<<<<<<<
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")
 */
          __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_6);
          __Pyx_GIVEREF(__pyx_t_2);
          PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
          __pyx_t_2 = 0;
          __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_Raise(__pyx_t_2, 0, 0, 0);
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        }
        __pyx_L15:;

        /* "rasterio/_base.pyx":156
 *                         raise ValueError(
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")             # <<<<<<<<<<<<<<
 *                     crs[k] = v
 * 
 */
        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_k, __pyx_n_s_lstrip); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF_SET(__pyx_v_k, __pyx_t_6);
        __pyx_t_6 = 0;

        /* "rasterio/_base.pyx":157
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")
 *                     crs[k] = v             # <<<<<<<<<<<<<<
 * 
 *             _gdal.CPLFree(proj_c)
 */
        if (unlikely(PyDict_SetItem(__pyx_v_crs, __pyx_v_k, __pyx_v_v) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "rasterio/_base.pyx":140
 *                 value = proj_b.decode()
 *                 value = value.strip()
 *                 for param in value.split():             # <<<<<<<<<<<<<<
 *                     kv = param.split("=")
 *                     if len(kv) == 2:
 */
      }
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    }
    __pyx_L8:;

    /* "rasterio/_base.pyx":159
 *                     crs[k] = v
 * 
 *             _gdal.CPLFree(proj_c)             # <<<<<<<<<<<<<<
 *             _gdal.OSRDestroySpatialReference(osr)
 *         else:
 */
    CPLFree(__pyx_v_proj_c);

    /* "rasterio/_base.pyx":160
 * 
 *             _gdal.CPLFree(proj_c)
 *             _gdal.OSRDestroySpatialReference(osr)             # <<<<<<<<<<<<<<
 *         else:
 *             log.debug("GDAL dataset has no projection.")
 */
    OSRDestroySpatialReference(__pyx_v_osr);

    /* "rasterio/_base.pyx":112
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:             # <<<<<<<<<<<<<<
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:
 */
    goto __pyx_L5;
  }

  /* "rasterio/_base.pyx":162
 *             _gdal.OSRDestroySpatialReference(osr)
 *         else:
 *             log.debug("GDAL dataset has no projection.")             # <<<<<<<<<<<<<<
 *         return crs
 * 
 */
  /*else*/ {
    __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_debug); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  }
  __pyx_L5:;

  /* "rasterio/_base.pyx":163
 *         else:
 *             log.debug("GDAL dataset has no projection.")
 *         return crs             # <<<<<<<<<<<<<<
 * 
 *     def read_crs_wkt(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_crs);
  __pyx_r = __pyx_v_crs;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":100
 *         return hband
 * 
 *     def read_crs(self):             # <<<<<<<<<<<<<<
 *         cdef char *proj_c = NULL
 *         cdef const char * auth_key = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.read_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_crs);
  __Pyx_XDECREF(__pyx_v_key);
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XDECREF(__pyx_v_value);
  __Pyx_XDECREF(__pyx_v_param);
  __Pyx_XDECREF(__pyx_v_kv);
  __Pyx_XDECREF(__pyx_v_k);
  __Pyx_XDECREF(__pyx_v_v);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":165
 *         return crs
 * 
 *     def read_crs_wkt(self):             # <<<<<<<<<<<<<<
 *         cdef char *proj_c = NULL
 *         cdef char *key_c = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_9read_crs_wkt(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_9read_crs_wkt(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("read_crs_wkt (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8read_crs_wkt(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8read_crs_wkt(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  char *__pyx_v_proj_c;
  CYTHON_UNUSED char *__pyx_v_key_c;
  void *__pyx_v_osr;
  char const *__pyx_v_wkt;
  char const *__pyx_v_wkt_b;
  int __pyx_v_retval;
  char *__pyx_v_proj_b;
  PyObject *__pyx_v_crs_wkt = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  size_t __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("read_crs_wkt", 0);

  /* "rasterio/_base.pyx":166
 * 
 *     def read_crs_wkt(self):
 *         cdef char *proj_c = NULL             # <<<<<<<<<<<<<<
 *         cdef char *key_c = NULL
 *         cdef void *osr = NULL
 */
  __pyx_v_proj_c = NULL;

  /* "rasterio/_base.pyx":167
 *     def read_crs_wkt(self):
 *         cdef char *proj_c = NULL
 *         cdef char *key_c = NULL             # <<<<<<<<<<<<<<
 *         cdef void *osr = NULL
 *         cdef const char * wkt = NULL
 */
  __pyx_v_key_c = NULL;

  /* "rasterio/_base.pyx":168
 *         cdef char *proj_c = NULL
 *         cdef char *key_c = NULL
 *         cdef void *osr = NULL             # <<<<<<<<<<<<<<
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:
 */
  __pyx_v_osr = NULL;

  /* "rasterio/_base.pyx":169
 *         cdef char *key_c = NULL
 *         cdef void *osr = NULL
 *         cdef const char * wkt = NULL             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */
  __pyx_v_wkt = NULL;

  /* "rasterio/_base.pyx":170
 *         cdef void *osr = NULL
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":171
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":170
 *         cdef void *osr = NULL
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 */
  }

  /* "rasterio/_base.pyx":172
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)             # <<<<<<<<<<<<<<
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")
 */
  __pyx_v_wkt = GDALGetProjectionRef(__pyx_v_self->_hds);

  /* "rasterio/_base.pyx":173
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 */
  __pyx_t_1 = ((__pyx_v_wkt == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":174
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":173
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 */
  }

  /* "rasterio/_base.pyx":175
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt             # <<<<<<<<<<<<<<
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 */
  __pyx_v_wkt_b = __pyx_v_wkt;

  /* "rasterio/_base.pyx":176
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:             # <<<<<<<<<<<<<<
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")
 */
  __pyx_t_3 = strlen(__pyx_v_wkt_b); 
  __pyx_t_1 = ((__pyx_t_3 > 0) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":177
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)             # <<<<<<<<<<<<<<
 *             log.debug("Got coordinate system")
 *             if osr != NULL:
 */
    __pyx_v_osr = OSRNewSpatialReference(__pyx_v_wkt);

    /* "rasterio/_base.pyx":178
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")             # <<<<<<<<<<<<<<
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":179
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")
 *             if osr != NULL:             # <<<<<<<<<<<<<<
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:
 */
    __pyx_t_1 = ((__pyx_v_osr != NULL) != 0);
    if (__pyx_t_1) {

      /* "rasterio/_base.pyx":180
 *             log.debug("Got coordinate system")
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)             # <<<<<<<<<<<<<<
 *                 if retval > 0:
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 */
      __pyx_v_retval = OSRAutoIdentifyEPSG(__pyx_v_osr);

      /* "rasterio/_base.pyx":181
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:             # <<<<<<<<<<<<<<
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 */
      __pyx_t_1 = ((__pyx_v_retval > 0) != 0);
      if (__pyx_t_1) {

        /* "rasterio/_base.pyx":182
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:
 *                     log.info("Failed to auto identify EPSG: %d", retval)             # <<<<<<<<<<<<<<
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:
 */
        __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_info); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_retval); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_6 = NULL;
        __pyx_t_7 = 0;
        if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
          if (likely(__pyx_t_6)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
            __Pyx_INCREF(__pyx_t_6);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_5, function);
            __pyx_t_7 = 1;
          }
        }
        __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_8);
        if (__pyx_t_6) {
          __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __pyx_t_6 = NULL;
        }
        __Pyx_INCREF(__pyx_kp_s_Failed_to_auto_identify_EPSG_d);
        __Pyx_GIVEREF(__pyx_kp_s_Failed_to_auto_identify_EPSG_d);
        PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_kp_s_Failed_to_auto_identify_EPSG_d);
        __Pyx_GIVEREF(__pyx_t_4);
        PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4);
        __pyx_t_4 = 0;
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

        /* "rasterio/_base.pyx":181
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:             # <<<<<<<<<<<<<<
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 */
      }

      /* "rasterio/_base.pyx":183
 *                 if retval > 0:
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)             # <<<<<<<<<<<<<<
 *                 if proj_c == NULL:
 *                     raise ValueError("Null projection")
 */
      OSRExportToWkt(__pyx_v_osr, (&__pyx_v_proj_c));

      /* "rasterio/_base.pyx":184
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null projection")
 *                 proj_b = proj_c
 */
      __pyx_t_1 = ((__pyx_v_proj_c == NULL) != 0);
      if (__pyx_t_1) {

        /* "rasterio/_base.pyx":185
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:
 *                     raise ValueError("Null projection")             # <<<<<<<<<<<<<<
 *                 proj_b = proj_c
 *                 crs_wkt = proj_b.decode('utf-8')
 */
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_Raise(__pyx_t_2, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "rasterio/_base.pyx":184
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null projection")
 *                 proj_b = proj_c
 */
      }

      /* "rasterio/_base.pyx":186
 *                 if proj_c == NULL:
 *                     raise ValueError("Null projection")
 *                 proj_b = proj_c             # <<<<<<<<<<<<<<
 *                 crs_wkt = proj_b.decode('utf-8')
 *                 _gdal.CPLFree(proj_c)
 */
      __pyx_v_proj_b = __pyx_v_proj_c;

      /* "rasterio/_base.pyx":187
 *                     raise ValueError("Null projection")
 *                 proj_b = proj_c
 *                 crs_wkt = proj_b.decode('utf-8')             # <<<<<<<<<<<<<<
 *                 _gdal.CPLFree(proj_c)
 *                 _gdal.OSRDestroySpatialReference(osr)
 */
      __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_proj_b, 0, strlen(__pyx_v_proj_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_v_crs_wkt = __pyx_t_2;
      __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":188
 *                 proj_b = proj_c
 *                 crs_wkt = proj_b.decode('utf-8')
 *                 _gdal.CPLFree(proj_c)             # <<<<<<<<<<<<<<
 *                 _gdal.OSRDestroySpatialReference(osr)
 *         else:
 */
      CPLFree(__pyx_v_proj_c);

      /* "rasterio/_base.pyx":189
 *                 crs_wkt = proj_b.decode('utf-8')
 *                 _gdal.CPLFree(proj_c)
 *                 _gdal.OSRDestroySpatialReference(osr)             # <<<<<<<<<<<<<<
 *         else:
 *             log.debug("GDAL dataset has no projection.")
 */
      OSRDestroySpatialReference(__pyx_v_osr);

      /* "rasterio/_base.pyx":179
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")
 *             if osr != NULL:             # <<<<<<<<<<<<<<
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:
 */
    }

    /* "rasterio/_base.pyx":176
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:             # <<<<<<<<<<<<<<
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")
 */
    goto __pyx_L5;
  }

  /* "rasterio/_base.pyx":191
 *                 _gdal.OSRDestroySpatialReference(osr)
 *         else:
 *             log.debug("GDAL dataset has no projection.")             # <<<<<<<<<<<<<<
 *             crs_wkt = None
 *         return crs_wkt
 */
  /*else*/ {
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":192
 *         else:
 *             log.debug("GDAL dataset has no projection.")
 *             crs_wkt = None             # <<<<<<<<<<<<<<
 *         return crs_wkt
 * 
 */
    __Pyx_INCREF(Py_None);
    __pyx_v_crs_wkt = Py_None;
  }
  __pyx_L5:;

  /* "rasterio/_base.pyx":193
 *             log.debug("GDAL dataset has no projection.")
 *             crs_wkt = None
 *         return crs_wkt             # <<<<<<<<<<<<<<
 * 
 *     def read_transform(self):
 */
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_crs_wkt)) { __Pyx_RaiseUnboundLocalError("crs_wkt"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
  __Pyx_INCREF(__pyx_v_crs_wkt);
  __pyx_r = __pyx_v_crs_wkt;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":165
 *         return crs
 * 
 *     def read_crs_wkt(self):             # <<<<<<<<<<<<<<
 *         cdef char *proj_c = NULL
 *         cdef char *key_c = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.read_crs_wkt", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_crs_wkt);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":195
 *         return crs_wkt
 * 
 *     def read_transform(self):             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11read_transform(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11read_transform(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("read_transform (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10read_transform(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10read_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  double __pyx_v_gt[6];
  PyObject *__pyx_v_transform = NULL;
  long __pyx_v_i;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  long __pyx_t_3;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("read_transform", 0);

  /* "rasterio/_base.pyx":196
 * 
 *     def read_transform(self):
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         cdef double gt[6]
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":197
 *     def read_transform(self):
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         cdef double gt[6]
 *         _gdal.GDALGetGeoTransform(self._hds, gt)
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":196
 * 
 *     def read_transform(self):
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         cdef double gt[6]
 */
  }

  /* "rasterio/_base.pyx":199
 *             raise ValueError("Null dataset")
 *         cdef double gt[6]
 *         _gdal.GDALGetGeoTransform(self._hds, gt)             # <<<<<<<<<<<<<<
 *         transform = [0]*6
 *         for i in range(6):
 */
  GDALGetGeoTransform(__pyx_v_self->_hds, __pyx_v_gt);

  /* "rasterio/_base.pyx":200
 *         cdef double gt[6]
 *         _gdal.GDALGetGeoTransform(self._hds, gt)
 *         transform = [0]*6             # <<<<<<<<<<<<<<
 *         for i in range(6):
 *             transform[i] = gt[i]
 */
  __pyx_t_2 = PyList_New(1 * 6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 6; __pyx_temp++) {
      __Pyx_INCREF(__pyx_int_0);
      __Pyx_GIVEREF(__pyx_int_0);
      PyList_SET_ITEM(__pyx_t_2, __pyx_temp, __pyx_int_0);
    }
  }
  __pyx_v_transform = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":201
 *         _gdal.GDALGetGeoTransform(self._hds, gt)
 *         transform = [0]*6
 *         for i in range(6):             # <<<<<<<<<<<<<<
 *             transform[i] = gt[i]
 *         return transform
 */
  for (__pyx_t_3 = 0; __pyx_t_3 < 6; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;

    /* "rasterio/_base.pyx":202
 *         transform = [0]*6
 *         for i in range(6):
 *             transform[i] = gt[i]             # <<<<<<<<<<<<<<
 *         return transform
 * 
 */
    __pyx_t_2 = PyFloat_FromDouble((__pyx_v_gt[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    if (unlikely(__Pyx_SetItemInt(__pyx_v_transform, __pyx_v_i, __pyx_t_2, long, 1, __Pyx_PyInt_From_long, 1, 1, 0) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  }

  /* "rasterio/_base.pyx":203
 *         for i in range(6):
 *             transform[i] = gt[i]
 *         return transform             # <<<<<<<<<<<<<<
 * 
 *     def stop(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_transform);
  __pyx_r = __pyx_v_transform;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":195
 *         return crs_wkt
 * 
 *     def read_transform(self):             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.read_transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_transform);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":205
 *         return transform
 * 
 *     def stop(self):             # <<<<<<<<<<<<<<
 *         if self._hds != NULL:
 *             _gdal.GDALFlushCache(self._hds)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_13stop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_13stop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("stop (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_12stop(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_12stop(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("stop", 0);

  /* "rasterio/_base.pyx":206
 * 
 *     def stop(self):
 *         if self._hds != NULL:             # <<<<<<<<<<<<<<
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)
 */
  __pyx_t_1 = ((__pyx_v_self->_hds != NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":207
 *     def stop(self):
 *         if self._hds != NULL:
 *             _gdal.GDALFlushCache(self._hds)             # <<<<<<<<<<<<<<
 *             _gdal.GDALClose(self._hds)
 *         if self.env:
 */
    GDALFlushCache(__pyx_v_self->_hds);

    /* "rasterio/_base.pyx":208
 *         if self._hds != NULL:
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)             # <<<<<<<<<<<<<<
 *         if self.env:
 *             self.env.stop()
 */
    GDALClose(__pyx_v_self->_hds);

    /* "rasterio/_base.pyx":206
 * 
 *     def stop(self):
 *         if self._hds != NULL:             # <<<<<<<<<<<<<<
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)
 */
  }

  /* "rasterio/_base.pyx":209
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)
 *         if self.env:             # <<<<<<<<<<<<<<
 *             self.env.stop()
 *         self._hds = NULL
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->env); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":210
 *             _gdal.GDALClose(self._hds)
 *         if self.env:
 *             self.env.stop()             # <<<<<<<<<<<<<<
 *         self._hds = NULL
 * 
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->env, __pyx_n_s_stop); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (__pyx_t_4) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":209
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)
 *         if self.env:             # <<<<<<<<<<<<<<
 *             self.env.stop()
 *         self._hds = NULL
 */
  }

  /* "rasterio/_base.pyx":211
 *         if self.env:
 *             self.env.stop()
 *         self._hds = NULL             # <<<<<<<<<<<<<<
 * 
 *     def close(self):
 */
  __pyx_v_self->_hds = NULL;

  /* "rasterio/_base.pyx":205
 *         return transform
 * 
 *     def stop(self):             # <<<<<<<<<<<<<<
 *         if self._hds != NULL:
 *             _gdal.GDALFlushCache(self._hds)
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.stop", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":213
 *         self._hds = NULL
 * 
 *     def close(self):             # <<<<<<<<<<<<<<
 *         self.stop()
 *         self._closed = True
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_15close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_15close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("close (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_14close(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_14close(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("close", 0);

  /* "rasterio/_base.pyx":214
 * 
 *     def close(self):
 *         self.stop()             # <<<<<<<<<<<<<<
 *         self._closed = True
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_stop); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":215
 *     def close(self):
 *         self.stop()
 *         self._closed = True             # <<<<<<<<<<<<<<
 * 
 *     def __enter__(self):
 */
  __Pyx_INCREF(Py_True);
  __Pyx_GIVEREF(Py_True);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = Py_True;

  /* "rasterio/_base.pyx":213
 *         self._hds = NULL
 * 
 *     def close(self):             # <<<<<<<<<<<<<<
 *         self.stop()
 *         self._closed = True
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":217
 *         self._closed = True
 * 
 *     def __enter__(self):             # <<<<<<<<<<<<<<
 *         return self
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_17__enter__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_17__enter__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__enter__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_16__enter__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_16__enter__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__enter__", 0);

  /* "rasterio/_base.pyx":218
 * 
 *     def __enter__(self):
 *         return self             # <<<<<<<<<<<<<<
 * 
 *     def __exit__(self, type, value, traceback):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;

  /* "rasterio/_base.pyx":217
 *         self._closed = True
 * 
 *     def __enter__(self):             # <<<<<<<<<<<<<<
 *         return self
 * 
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":220
 *         return self
 * 
 *     def __exit__(self, type, value, traceback):             # <<<<<<<<<<<<<<
 *         self.close()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_19__exit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_19__exit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  CYTHON_UNUSED PyObject *__pyx_v_type = 0;
  CYTHON_UNUSED PyObject *__pyx_v_value = 0;
  CYTHON_UNUSED PyObject *__pyx_v_traceback = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__exit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_type,&__pyx_n_s_value,&__pyx_n_s_traceback,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_type)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_traceback)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__exit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_type = values[0];
    __pyx_v_value = values[1];
    __pyx_v_traceback = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__exit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_18__exit__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_type, __pyx_v_value, __pyx_v_traceback);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_18__exit__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_type, CYTHON_UNUSED PyObject *__pyx_v_value, CYTHON_UNUSED PyObject *__pyx_v_traceback) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__exit__", 0);

  /* "rasterio/_base.pyx":221
 * 
 *     def __exit__(self, type, value, traceback):
 *         self.close()             # <<<<<<<<<<<<<<
 * 
 *     def __dealloc__(self):
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":220
 *         return self
 * 
 *     def __exit__(self, type, value, traceback):             # <<<<<<<<<<<<<<
 *         self.close()
 * 
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__exit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":223
 *         self.close()
 * 
 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
 *         if self._hds != NULL:
 *             _gdal.GDALClose(self._hds)
 */

/* Python wrapper */
static void __pyx_pw_8rasterio_5_base_13DatasetReader_21__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_8rasterio_5_base_13DatasetReader_21__dealloc__(PyObject *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_pf_8rasterio_5_base_13DatasetReader_20__dealloc__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

static void __pyx_pf_8rasterio_5_base_13DatasetReader_20__dealloc__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  __Pyx_RefNannySetupContext("__dealloc__", 0);

  /* "rasterio/_base.pyx":224
 * 
 *     def __dealloc__(self):
 *         if self._hds != NULL:             # <<<<<<<<<<<<<<
 *             _gdal.GDALClose(self._hds)
 * 
 */
  __pyx_t_1 = ((__pyx_v_self->_hds != NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":225
 *     def __dealloc__(self):
 *         if self._hds != NULL:
 *             _gdal.GDALClose(self._hds)             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
    GDALClose(__pyx_v_self->_hds);

    /* "rasterio/_base.pyx":224
 * 
 *     def __dealloc__(self):
 *         if self._hds != NULL:             # <<<<<<<<<<<<<<
 *             _gdal.GDALClose(self._hds)
 * 
 */
  }

  /* "rasterio/_base.pyx":223
 *         self.close()
 * 
 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
 *         if self._hds != NULL:
 *             _gdal.GDALClose(self._hds)
 */

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

/* "rasterio/_base.pyx":228
 * 
 *     @property
 *     def closed(self):             # <<<<<<<<<<<<<<
 *         return self._closed
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_23closed(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_23closed(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("closed (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_22closed(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_22closed(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("closed", 0);

  /* "rasterio/_base.pyx":229
 *     @property
 *     def closed(self):
 *         return self._closed             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_closed);
  __pyx_r = __pyx_v_self->_closed;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":228
 * 
 *     @property
 *     def closed(self):             # <<<<<<<<<<<<<<
 *         return self._closed
 * 
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":232
 * 
 *     @property
 *     def count(self):             # <<<<<<<<<<<<<<
 *         if not self._count:
 *             if self._hds == NULL:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_25count(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_25count(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("count (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_24count(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_24count(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("count", 0);

  /* "rasterio/_base.pyx":233
 *     @property
 *     def count(self):
 *         if not self._count:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->_count); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = ((!__pyx_t_1) != 0);
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":234
 *     def count(self):
 *         if not self._count:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Can't read closed raster file")
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 */
    __pyx_t_2 = ((__pyx_v_self->_hds == NULL) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":235
 *         if not self._count:
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")             # <<<<<<<<<<<<<<
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 *         return self._count
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":234
 *     def count(self):
 *         if not self._count:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Can't read closed raster file")
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 */
    }

    /* "rasterio/_base.pyx":236
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")
 *             self._count = _gdal.GDALGetRasterCount(self._hds)             # <<<<<<<<<<<<<<
 *         return self._count
 * 
 */
    __pyx_t_3 = __Pyx_PyInt_From_int(GDALGetRasterCount(__pyx_v_self->_hds)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_3);
    __Pyx_GOTREF(__pyx_v_self->_count);
    __Pyx_DECREF(__pyx_v_self->_count);
    __pyx_v_self->_count = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":233
 *     @property
 *     def count(self):
 *         if not self._count:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")
 */
  }

  /* "rasterio/_base.pyx":237
 *                 raise ValueError("Can't read closed raster file")
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 *         return self._count             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_count);
  __pyx_r = __pyx_v_self->_count;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":232
 * 
 *     @property
 *     def count(self):             # <<<<<<<<<<<<<<
 *         if not self._count:
 *             if self._hds == NULL:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.count", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":240
 * 
 *     @property
 *     def indexes(self):             # <<<<<<<<<<<<<<
 *         return list(range(1, self.count+1))
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_27indexes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_27indexes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("indexes (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_26indexes(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_26indexes(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("indexes", 0);

  /* "rasterio/_base.pyx":241
 *     @property
 *     def indexes(self):
 *         return list(range(1, self.count+1))             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_int_1);
  __Pyx_GIVEREF(__pyx_int_1);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PySequence_List(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":240
 * 
 *     @property
 *     def indexes(self):             # <<<<<<<<<<<<<<
 *         return list(range(1, self.count+1))
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.indexes", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":244
 * 
 *     @property
 *     def dtypes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered list of all band data types."""
 *         cdef void *hband = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_29dtypes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_28dtypes[] = "Returns an ordered list of all band data types.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_29dtypes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("dtypes (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_28dtypes(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_28dtypes(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  void *__pyx_v_hband;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *(*__pyx_t_6)(PyObject *);
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_t_9;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("dtypes", 0);

  /* "rasterio/_base.pyx":246
 *     def dtypes(self):
 *         """Returns an ordered list of all band data types."""
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         if not self._dtypes:
 *             if self._hds == NULL:
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":247
 *         """Returns an ordered list of all band data types."""
 *         cdef void *hband = NULL
 *         if not self._dtypes:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->_dtypes); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = ((!__pyx_t_1) != 0);
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":248
 *         cdef void *hband = NULL
 *         if not self._dtypes:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 */
    __pyx_t_2 = ((__pyx_v_self->_hds == NULL) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":249
 *         if not self._dtypes:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":248
 *         cdef void *hband = NULL
 *         if not self._dtypes:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 */
    }

    /* "rasterio/_base.pyx":250
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 self._dtypes.append(
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_self->_count);
    __Pyx_GIVEREF(__pyx_v_self->_count);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_count);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) {
      __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0;
      __pyx_t_6 = NULL;
    } else {
      __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    for (;;) {
      if (likely(!__pyx_t_6)) {
        if (likely(PyList_CheckExact(__pyx_t_3))) {
          if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        } else {
          if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        }
      } else {
        __pyx_t_4 = __pyx_t_6(__pyx_t_3);
        if (unlikely(!__pyx_t_4)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_4);
      }
      __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":251
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)             # <<<<<<<<<<<<<<
 *                 self._dtypes.append(
 *                     dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)])
 */
      __pyx_t_4 = __Pyx_PyInt_AddObjC(__pyx_v_i, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_7);

      /* "rasterio/_base.pyx":253
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 self._dtypes.append(
 *                     dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)])             # <<<<<<<<<<<<<<
 *         return self._dtypes
 * 
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dtypes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_dtype_fwd); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_7 = GDALGetRasterDataType(__pyx_v_hband);
      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_8, __pyx_t_7, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

      /* "rasterio/_base.pyx":252
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 self._dtypes.append(             # <<<<<<<<<<<<<<
 *                     dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)])
 *         return self._dtypes
 */
      __pyx_t_9 = __Pyx_PyObject_Append(__pyx_v_self->_dtypes, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":250
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 self._dtypes.append(
 */
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":247
 *         """Returns an ordered list of all band data types."""
 *         cdef void *hband = NULL
 *         if not self._dtypes:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  }

  /* "rasterio/_base.pyx":254
 *                 self._dtypes.append(
 *                     dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)])
 *         return self._dtypes             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_dtypes);
  __pyx_r = __pyx_v_self->_dtypes;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":244
 * 
 *     @property
 *     def dtypes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered list of all band data types."""
 *         cdef void *hband = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.dtypes", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":257
 * 
 *     @property
 *     def block_shapes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered list of block shapes for all bands.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_31block_shapes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_30block_shapes[] = "Returns an ordered list of block shapes for all bands.\n        \n        Shapes are tuples and have the same ordering as the dataset's\n        shape: (count of image rows, count of image columns).\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_31block_shapes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("block_shapes (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_30block_shapes(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_30block_shapes(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  void *__pyx_v_hband;
  int __pyx_v_xsize;
  int __pyx_v_ysize;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *(*__pyx_t_6)(PyObject *);
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  int __pyx_t_10;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("block_shapes", 0);

  /* "rasterio/_base.pyx":263
 *         shape: (count of image rows, count of image columns).
 *         """
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":265
 *         cdef void *hband = NULL
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  __pyx_t_1 = (__pyx_v_self->_block_shapes == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":266
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []
 */
    __pyx_t_2 = ((__pyx_v_self->_hds == NULL) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":267
 *         if self._block_shapes is None:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             self._block_shapes = []
 *             for i in range(self._count):
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":266
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []
 */
    }

    /* "rasterio/_base.pyx":268
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
    __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_3);
    __Pyx_GOTREF(__pyx_v_self->_block_shapes);
    __Pyx_DECREF(__pyx_v_self->_block_shapes);
    __pyx_v_self->_block_shapes = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":269
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_self->_count);
    __Pyx_GIVEREF(__pyx_v_self->_count);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_count);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) {
      __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0;
      __pyx_t_6 = NULL;
    } else {
      __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    for (;;) {
      if (likely(!__pyx_t_6)) {
        if (likely(PyList_CheckExact(__pyx_t_3))) {
          if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        } else {
          if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        }
      } else {
        __pyx_t_4 = __pyx_t_6(__pyx_t_3);
        if (unlikely(!__pyx_t_4)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_4);
      }
      __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":270
 *             self._block_shapes = []
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)             # <<<<<<<<<<<<<<
 *                 if hband == NULL:
 *                     raise ValueError("Null band")
 */
      __pyx_t_4 = __Pyx_PyInt_AddObjC(__pyx_v_i, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_7);

      /* "rasterio/_base.pyx":271
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null band")
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 */
      __pyx_t_2 = ((__pyx_v_hband == NULL) != 0);
      if (__pyx_t_2) {

        /* "rasterio/_base.pyx":272
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 *                     raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 *                 self._block_shapes.append((ysize, xsize))
 */
        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "rasterio/_base.pyx":271
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null band")
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 */
      }

      /* "rasterio/_base.pyx":273
 *                 if hband == NULL:
 *                     raise ValueError("Null band")
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)             # <<<<<<<<<<<<<<
 *                 self._block_shapes.append((ysize, xsize))
 *         return self._block_shapes
 */
      GDALGetBlockSize(__pyx_v_hband, (&__pyx_v_xsize), (&__pyx_v_ysize));

      /* "rasterio/_base.pyx":274
 *                     raise ValueError("Null band")
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 *                 self._block_shapes.append((ysize, xsize))             # <<<<<<<<<<<<<<
 *         return self._block_shapes
 * 
 */
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_ysize); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_xsize); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_8);
      PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
      __pyx_t_4 = 0;
      __pyx_t_8 = 0;
      __pyx_t_10 = __Pyx_PyObject_Append(__pyx_v_self->_block_shapes, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

      /* "rasterio/_base.pyx":269
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 */
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":265
 *         cdef void *hband = NULL
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  }

  /* "rasterio/_base.pyx":275
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 *                 self._block_shapes.append((ysize, xsize))
 *         return self._block_shapes             # <<<<<<<<<<<<<<
 * 
 *     def get_nodatavals(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_block_shapes);
  __pyx_r = __pyx_v_self->_block_shapes;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":257
 * 
 *     @property
 *     def block_shapes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered list of block shapes for all bands.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.block_shapes", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":277
 *         return self._block_shapes
 * 
 *     def get_nodatavals(self):             # <<<<<<<<<<<<<<
 *         cdef void *hband = NULL
 *         cdef double nodataval
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_33get_nodatavals(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_33get_nodatavals(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_nodatavals (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_32get_nodatavals(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_32get_nodatavals(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  void *__pyx_v_hband;
  double __pyx_v_nodataval;
  int __pyx_v_success;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *(*__pyx_t_6)(PyObject *);
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  Py_ssize_t __pyx_t_11;
  PyObject *__pyx_t_12 = NULL;
  int __pyx_t_13;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("get_nodatavals", 0);

  /* "rasterio/_base.pyx":278
 * 
 *     def get_nodatavals(self):
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         cdef double nodataval
 *         cdef int success = 0
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":280
 *         cdef void *hband = NULL
 *         cdef double nodataval
 *         cdef int success = 0             # <<<<<<<<<<<<<<
 * 
 *         if not self._nodatavals:
 */
  __pyx_v_success = 0;

  /* "rasterio/_base.pyx":282
 *         cdef int success = 0
 * 
 *         if not self._nodatavals:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->_nodatavals); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = ((!__pyx_t_1) != 0);
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":283
 * 
 *         if not self._nodatavals:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 */
    __pyx_t_2 = ((__pyx_v_self->_hds == NULL) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":284
 *         if not self._nodatavals:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":283
 * 
 *         if not self._nodatavals:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 */
    }

    /* "rasterio/_base.pyx":285
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_self->_count);
    __Pyx_GIVEREF(__pyx_v_self->_count);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_count);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) {
      __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0;
      __pyx_t_6 = NULL;
    } else {
      __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    for (;;) {
      if (likely(!__pyx_t_6)) {
        if (likely(PyList_CheckExact(__pyx_t_3))) {
          if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        } else {
          if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        }
      } else {
        __pyx_t_4 = __pyx_t_6(__pyx_t_3);
        if (unlikely(!__pyx_t_4)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_4);
      }
      __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":286
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)             # <<<<<<<<<<<<<<
 *                 if hband == NULL:
 *                     raise ValueError("Null band")
 */
      __pyx_t_4 = __Pyx_PyInt_AddObjC(__pyx_v_i, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_7);

      /* "rasterio/_base.pyx":287
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null band")
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 */
      __pyx_t_2 = ((__pyx_v_hband == NULL) != 0);
      if (__pyx_t_2) {

        /* "rasterio/_base.pyx":288
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 *                     raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)
 */
        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__29, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "rasterio/_base.pyx":287
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null band")
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 */
      }

      /* "rasterio/_base.pyx":289
 *                 if hband == NULL:
 *                     raise ValueError("Null band")
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]             # <<<<<<<<<<<<<<
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)
 *                 val = nodataval
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dtypes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_dtype_fwd); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_7 = GDALGetRasterDataType(__pyx_v_hband);
      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_8, __pyx_t_7, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":290
 *                     raise ValueError("Null band")
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)             # <<<<<<<<<<<<<<
 *                 val = nodataval
 *                 # GDALGetRasterNoDataValue() has two ways of telling you that
 */
      __pyx_v_nodataval = GDALGetRasterNoDataValue(__pyx_v_hband, (&__pyx_v_success));

      /* "rasterio/_base.pyx":291
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)
 *                 val = nodataval             # <<<<<<<<<<<<<<
 *                 # GDALGetRasterNoDataValue() has two ways of telling you that
 *                 # there's no nodata value. The success flag might come back
 */
      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_nodataval); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":298
 *                 # data type. If so, the band has a nodata value. If not,
 *                 # there's no nodata value.
 *                 if (success == 0 or             # <<<<<<<<<<<<<<
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):
 */
      __pyx_t_1 = ((__pyx_v_success == 0) != 0);
      if (!__pyx_t_1) {
      } else {
        __pyx_t_2 = __pyx_t_1;
        goto __pyx_L9_bool_binop_done;
      }

      /* "rasterio/_base.pyx":299
 *                 # there's no nodata value.
 *                 if (success == 0 or
 *                         val < dtypes.dtype_ranges[dtype][0] or             # <<<<<<<<<<<<<<
 *                         val > dtypes.dtype_ranges[dtype][1]):
 *                     val = None
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dtypes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_dtype_ranges); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyObject_GetItem(__pyx_t_8, __pyx_v_dtype); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_8 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyObject_RichCompare(__pyx_v_val, __pyx_t_8, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (!__pyx_t_1) {
      } else {
        __pyx_t_2 = __pyx_t_1;
        goto __pyx_L9_bool_binop_done;
      }

      /* "rasterio/_base.pyx":300
 *                 if (success == 0 or
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):             # <<<<<<<<<<<<<<
 *                     val = None
 *                 log.debug("Nodata success: %d", success)
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dtypes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_dtype_ranges); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyObject_GetItem(__pyx_t_8, __pyx_v_dtype); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_8 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyObject_RichCompare(__pyx_v_val, __pyx_t_8, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_2 = __pyx_t_1;
      __pyx_L9_bool_binop_done:;

      /* "rasterio/_base.pyx":298
 *                 # data type. If so, the band has a nodata value. If not,
 *                 # there's no nodata value.
 *                 if (success == 0 or             # <<<<<<<<<<<<<<
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):
 */
      if (__pyx_t_2) {

        /* "rasterio/_base.pyx":301
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):
 *                     val = None             # <<<<<<<<<<<<<<
 *                 log.debug("Nodata success: %d", success)
 *                 log.debug("Nodata value: %f", nodataval)
 */
        __Pyx_INCREF(Py_None);
        __Pyx_DECREF_SET(__pyx_v_val, Py_None);

        /* "rasterio/_base.pyx":298
 *                 # data type. If so, the band has a nodata value. If not,
 *                 # there's no nodata value.
 *                 if (success == 0 or             # <<<<<<<<<<<<<<
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):
 */
      }

      /* "rasterio/_base.pyx":302
 *                         val > dtypes.dtype_ranges[dtype][1]):
 *                     val = None
 *                 log.debug("Nodata success: %d", success)             # <<<<<<<<<<<<<<
 *                 log.debug("Nodata value: %f", nodataval)
 *                 self._nodatavals.append(val)
 */
      __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_debug); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_success); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_10 = NULL;
      __pyx_t_11 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_9))) {
        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9);
        if (likely(__pyx_t_10)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
          __Pyx_INCREF(__pyx_t_10);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_9, function);
          __pyx_t_11 = 1;
        }
      }
      __pyx_t_12 = PyTuple_New(2+__pyx_t_11); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_12);
      if (__pyx_t_10) {
        __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_Nodata_success_d);
      __Pyx_GIVEREF(__pyx_kp_s_Nodata_success_d);
      PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_11, __pyx_kp_s_Nodata_success_d);
      __Pyx_GIVEREF(__pyx_t_8);
      PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_11, __pyx_t_8);
      __pyx_t_8 = 0;
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_12, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":303
 *                     val = None
 *                 log.debug("Nodata success: %d", success)
 *                 log.debug("Nodata value: %f", nodataval)             # <<<<<<<<<<<<<<
 *                 self._nodatavals.append(val)
 * 
 */
      __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_debug); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_9 = PyFloat_FromDouble(__pyx_v_nodataval); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_8 = NULL;
      __pyx_t_11 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_12))) {
        __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_12);
        if (likely(__pyx_t_8)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
          __Pyx_INCREF(__pyx_t_8);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_12, function);
          __pyx_t_11 = 1;
        }
      }
      __pyx_t_10 = PyTuple_New(2+__pyx_t_11); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      if (__pyx_t_8) {
        __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_Nodata_value_f);
      __Pyx_GIVEREF(__pyx_kp_s_Nodata_value_f);
      PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_11, __pyx_kp_s_Nodata_value_f);
      __Pyx_GIVEREF(__pyx_t_9);
      PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_11, __pyx_t_9);
      __pyx_t_9 = 0;
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_10, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":304
 *                 log.debug("Nodata success: %d", success)
 *                 log.debug("Nodata value: %f", nodataval)
 *                 self._nodatavals.append(val)             # <<<<<<<<<<<<<<
 * 
 *         return self._nodatavals
 */
      __pyx_t_13 = __Pyx_PyObject_Append(__pyx_v_self->_nodatavals, __pyx_v_val); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":285
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 */
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":282
 *         cdef int success = 0
 * 
 *         if not self._nodatavals:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  }

  /* "rasterio/_base.pyx":306
 *                 self._nodatavals.append(val)
 * 
 *         return self._nodatavals             # <<<<<<<<<<<<<<
 * 
 *     property nodatavals:
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_nodatavals);
  __pyx_r = __pyx_v_self->_nodatavals;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":277
 *         return self._block_shapes
 * 
 *     def get_nodatavals(self):             # <<<<<<<<<<<<<<
 *         cdef void *hband = NULL
 *         cdef double nodataval
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.get_nodatavals", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":311
 *         """Nodata values for each band."""
 * 
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.get_nodatavals()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10nodatavals_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10nodatavals_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10nodatavals___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10nodatavals___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":312
 * 
 *         def __get__(self):
 *             return self.get_nodatavals()             # <<<<<<<<<<<<<<
 * 
 *     property nodata:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_nodatavals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":311
 *         """Nodata values for each band."""
 * 
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.get_nodatavals()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.nodatavals.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":316
 *     property nodata:
 *         """The dataset's single nodata value."""
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.nodatavals[0]
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6nodata_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6nodata_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6nodata___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6nodata___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":317
 *         """The dataset's single nodata value."""
 *         def __get__(self):
 *             return self.nodatavals[0]             # <<<<<<<<<<<<<<
 * 
 *     def block_windows(self, bidx=0):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_nodatavals); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":316
 *     property nodata:
 *         """The dataset's single nodata value."""
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.nodatavals[0]
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.nodata.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_8rasterio_5_base_13DatasetReader_36generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "rasterio/_base.pyx":319
 *             return self.nodatavals[0]
 * 
 *     def block_windows(self, bidx=0):             # <<<<<<<<<<<<<<
 *         """Returns an iterator over a band's block windows and their
 *         indexes.
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_35block_windows(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_34block_windows[] = "Returns an iterator over a band's block windows and their\n        indexes.\n\n        The positional parameter `bidx` takes the index (starting at 1)\n        of the desired band. Block windows are tuples\n\n            ((row_start, row_stop), (col_start, col_stop))\n\n        For example, ((0, 2), (0, 2)) defines a 2 x 2 block at the upper\n        left corner of the raster dataset.\n\n        This iterator yields blocks \"left to right\" and \"top to bottom\"\n        and is similar to Python's enumerate() in that it also returns\n        indexes.\n\n        The primary use of this function is to obtain windows to pass to\n        read_band() for highly efficient access to raster block data.\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_35block_windows(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_bidx = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("block_windows (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_bidx,0};
    PyObject* values[1] = {0};
    values[0] = ((PyObject *)__pyx_int_0);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bidx);
          if (value) { values[0] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "block_windows") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_bidx = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("block_windows", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.block_windows", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_34block_windows(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_bidx);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_34block_windows(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("block_windows", 0);
  __pyx_cur_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)__pyx_tp_new_8rasterio_5_base___pyx_scope_struct__block_windows(__pyx_ptype_8rasterio_5_base___pyx_scope_struct__block_windows, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __pyx_cur_scope->__pyx_v_bidx = __pyx_v_bidx;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_bidx);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_bidx);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_8rasterio_5_base_13DatasetReader_36generator, (PyObject *) __pyx_cur_scope, __pyx_n_s_block_windows, __pyx_n_s_DatasetReader_block_windows); if (unlikely(!gen)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.block_windows", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_8rasterio_5_base_13DatasetReader_36generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *__pyx_cur_scope = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  Py_ssize_t __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  long __pyx_t_8;
  int __pyx_t_9;
  long __pyx_t_10;
  int __pyx_t_11;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    case 1: goto __pyx_L16_resume_from_yield;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":339
 *         """
 *         cdef int i, j
 *         block_shapes = self.block_shapes             # <<<<<<<<<<<<<<
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_block_shapes = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":340
 *         cdef int i, j
 *         block_shapes = self.block_shapes
 *         if bidx < 1:             # <<<<<<<<<<<<<<
 *             if len(set(block_shapes)) > 1:
 *                 raise ValueError(
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_bidx, __pyx_int_1, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":341
 *         block_shapes = self.block_shapes
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:             # <<<<<<<<<<<<<<
 *                 raise ValueError(
 *                     "A band index must be provided when band block shapes"
 */
    __pyx_t_1 = PySet_New(__pyx_cur_scope->__pyx_v_block_shapes); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = PySet_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_2 = ((__pyx_t_3 > 1) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":342
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:
 *                 raise ValueError(             # <<<<<<<<<<<<<<
 *                     "A band index must be provided when band block shapes"
 *                     "are inhomogeneous")
 */
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__30, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":341
 *         block_shapes = self.block_shapes
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:             # <<<<<<<<<<<<<<
 *                 raise ValueError(
 *                     "A band index must be provided when band block shapes"
 */
    }

    /* "rasterio/_base.pyx":345
 *                     "A band index must be provided when band block shapes"
 *                     "are inhomogeneous")
 *             bidx = 1             # <<<<<<<<<<<<<<
 *         h, w = block_shapes[bidx-1]
 *         d, m = divmod(self.height, h)
 */
    __Pyx_INCREF(__pyx_int_1);
    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_bidx);
    __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_bidx, __pyx_int_1);
    __Pyx_GIVEREF(__pyx_int_1);

    /* "rasterio/_base.pyx":340
 *         cdef int i, j
 *         block_shapes = self.block_shapes
 *         if bidx < 1:             # <<<<<<<<<<<<<<
 *             if len(set(block_shapes)) > 1:
 *                 raise ValueError(
 */
  }

  /* "rasterio/_base.pyx":346
 *                     "are inhomogeneous")
 *             bidx = 1
 *         h, w = block_shapes[bidx-1]             # <<<<<<<<<<<<<<
 *         d, m = divmod(self.height, h)
 *         nrows = d + int(m>0)
 */
  __pyx_t_1 = __Pyx_PyInt_SubtractObjC(__pyx_cur_scope->__pyx_v_bidx, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_block_shapes, __pyx_t_1); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
    PyObject* sequence = __pyx_t_4;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_1)) goto __pyx_L6_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L7_unpacking_done;
    __pyx_L6_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L7_unpacking_done:;
  }
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_h = __pyx_t_1;
  __pyx_t_1 = 0;
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_cur_scope->__pyx_v_w = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":347
 *             bidx = 1
 *         h, w = block_shapes[bidx-1]
 *         d, m = divmod(self.height, h)             # <<<<<<<<<<<<<<
 *         nrows = d + int(m>0)
 *         d, m = divmod(self.width, w)
 */
  __pyx_t_4 = __pyx_cur_scope->__pyx_v_self->height;
  __Pyx_INCREF(__pyx_t_4);
  __pyx_t_5 = PyNumber_Divmod(__pyx_t_4, __pyx_cur_scope->__pyx_v_h); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
    PyObject* sequence = __pyx_t_5;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_1);
    #else
    __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    #endif
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L8_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_4);
    index = 1; __pyx_t_1 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_1)) goto __pyx_L8_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L9_unpacking_done;
    __pyx_L8_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L9_unpacking_done:;
  }
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_cur_scope->__pyx_v_d = __pyx_t_4;
  __pyx_t_4 = 0;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_m = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":348
 *         h, w = block_shapes[bidx-1]
 *         d, m = divmod(self.height, h)
 *         nrows = d + int(m>0)             # <<<<<<<<<<<<<<
 *         d, m = divmod(self.width, w)
 *         ncols = d + int(m>0)
 */
  __pyx_t_5 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_m, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_1 = PyNumber_Int(__pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Add(__pyx_cur_scope->__pyx_v_d, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_cur_scope->__pyx_v_nrows = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":349
 *         d, m = divmod(self.height, h)
 *         nrows = d + int(m>0)
 *         d, m = divmod(self.width, w)             # <<<<<<<<<<<<<<
 *         ncols = d + int(m>0)
 *         for j in range(nrows):
 */
  __pyx_t_5 = __pyx_cur_scope->__pyx_v_self->width;
  __Pyx_INCREF(__pyx_t_5);
  __pyx_t_1 = PyNumber_Divmod(__pyx_t_5, __pyx_cur_scope->__pyx_v_w); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_4);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L10_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L10_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_4);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L11_unpacking_done;
    __pyx_L10_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L11_unpacking_done:;
  }
  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_d);
  __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_d, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_t_5 = 0;
  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_m);
  __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_m, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":350
 *         nrows = d + int(m>0)
 *         d, m = divmod(self.width, w)
 *         ncols = d + int(m>0)             # <<<<<<<<<<<<<<
 *         for j in range(nrows):
 *             row = j * h
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_m, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Add(__pyx_cur_scope->__pyx_v_d, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_ncols = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":351
 *         d, m = divmod(self.width, w)
 *         ncols = d + int(m>0)
 *         for j in range(nrows):             # <<<<<<<<<<<<<<
 *             row = j * h
 *             height = min(h, self.height - row)
 */
  __pyx_t_8 = __Pyx_PyInt_As_long(__pyx_cur_scope->__pyx_v_nrows); if (unlikely((__pyx_t_8 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
    __pyx_cur_scope->__pyx_v_j = __pyx_t_9;

    /* "rasterio/_base.pyx":352
 *         ncols = d + int(m>0)
 *         for j in range(nrows):
 *             row = j * h             # <<<<<<<<<<<<<<
 *             height = min(h, self.height - row)
 *             for i in range(ncols):
 */
    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_j); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = PyNumber_Multiply(__pyx_t_1, __pyx_cur_scope->__pyx_v_h); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_row);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_row, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":353
 *         for j in range(nrows):
 *             row = j * h
 *             height = min(h, self.height - row)             # <<<<<<<<<<<<<<
 *             for i in range(ncols):
 *                 col = i * w
 */
    __pyx_t_4 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_self->height, __pyx_cur_scope->__pyx_v_row); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_h);
    __pyx_t_1 = __pyx_cur_scope->__pyx_v_h;
    __pyx_t_6 = PyObject_RichCompare(__pyx_t_4, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (__pyx_t_2) {
      __Pyx_INCREF(__pyx_t_4);
      __pyx_t_5 = __pyx_t_4;
    } else {
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_5 = __pyx_t_1;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __pyx_t_5;
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_height);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_height, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":354
 *             row = j * h
 *             height = min(h, self.height - row)
 *             for i in range(ncols):             # <<<<<<<<<<<<<<
 *                 col = i * w
 *                 width = min(w, self.width - col)
 */
    __pyx_t_10 = __Pyx_PyInt_As_long(__pyx_cur_scope->__pyx_v_ncols); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_cur_scope->__pyx_v_i = __pyx_t_11;

      /* "rasterio/_base.pyx":355
 *             height = min(h, self.height - row)
 *             for i in range(ncols):
 *                 col = i * w             # <<<<<<<<<<<<<<
 *                 width = min(w, self.width - col)
 *                 yield (j, i), ((row, row+height), (col, col+width))
 */
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 355; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = PyNumber_Multiply(__pyx_t_4, __pyx_cur_scope->__pyx_v_w); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 355; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_col);
      __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_col, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_5);
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":356
 *             for i in range(ncols):
 *                 col = i * w
 *                 width = min(w, self.width - col)             # <<<<<<<<<<<<<<
 *                 yield (j, i), ((row, row+height), (col, col+width))
 * 
 */
      __pyx_t_5 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_self->width, __pyx_cur_scope->__pyx_v_col); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_w);
      __pyx_t_4 = __pyx_cur_scope->__pyx_v_w;
      __pyx_t_6 = PyObject_RichCompare(__pyx_t_5, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      if (__pyx_t_2) {
        __Pyx_INCREF(__pyx_t_5);
        __pyx_t_1 = __pyx_t_5;
      } else {
        __Pyx_INCREF(__pyx_t_4);
        __pyx_t_1 = __pyx_t_4;
      }
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = __pyx_t_1;
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_width);
      __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_width, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_5);
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":357
 *                 col = i * w
 *                 width = min(w, self.width - col)
 *                 yield (j, i), ((row, row+height), (col, col+width))             # <<<<<<<<<<<<<<
 * 
 *     property bounds:
 */
      __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_j); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
      __pyx_t_5 = 0;
      __pyx_t_1 = 0;
      __pyx_t_1 = PyNumber_Add(__pyx_cur_scope->__pyx_v_row, __pyx_cur_scope->__pyx_v_height); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_row);
      __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_row);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_cur_scope->__pyx_v_row);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
      __pyx_t_1 = 0;
      __pyx_t_1 = PyNumber_Add(__pyx_cur_scope->__pyx_v_col, __pyx_cur_scope->__pyx_v_width); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_col);
      __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_col);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_cur_scope->__pyx_v_col);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1);
      __pyx_t_1 = 0;
      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6);
      __pyx_t_5 = 0;
      __pyx_t_6 = 0;
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1);
      __pyx_t_4 = 0;
      __pyx_t_1 = 0;
      __pyx_r = __pyx_t_6;
      __pyx_t_6 = 0;
      __pyx_cur_scope->__pyx_t_0 = __pyx_t_8;
      __pyx_cur_scope->__pyx_t_1 = __pyx_t_9;
      __pyx_cur_scope->__pyx_t_2 = __pyx_t_10;
      __pyx_cur_scope->__pyx_t_3 = __pyx_t_11;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_RefNannyFinishContext();
      /* return from generator, yielding value */
      __pyx_generator->resume_label = 1;
      return __pyx_r;
      __pyx_L16_resume_from_yield:;
      __pyx_t_8 = __pyx_cur_scope->__pyx_t_0;
      __pyx_t_9 = __pyx_cur_scope->__pyx_t_1;
      __pyx_t_10 = __pyx_cur_scope->__pyx_t_2;
      __pyx_t_11 = __pyx_cur_scope->__pyx_t_3;
      if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
  }

  /* "rasterio/_base.pyx":319
 *             return self.nodatavals[0]
 * 
 *     def block_windows(self, bidx=0):             # <<<<<<<<<<<<<<
 *         """Returns an iterator over a band's block windows and their
 *         indexes.
 */

  /* function exit code */
  PyErr_SetNone(PyExc_StopIteration);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("block_windows", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":366
 *         (lower left x, lower left y, upper right x, upper right y)
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             return BoundingBox(c, f+e*self.height, c+a*self.width, f)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6bounds_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6bounds_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6bounds___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6bounds___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_a = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_b = NULL;
  PyObject *__pyx_v_c = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_v_e = NULL;
  PyObject *__pyx_v_f = NULL;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *(*__pyx_t_12)(PyObject *);
  Py_ssize_t __pyx_t_13;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":367
 *         """
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine             # <<<<<<<<<<<<<<
 *             return BoundingBox(c, f+e*self.height, c+a*self.width, f)
 * 
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 9)) {
      if (size > 9) __Pyx_RaiseTooManyValuesError(9);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyTuple_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 8); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyList_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 8); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_10);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
      for (i=0; i < 9; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
    __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext;
    for (index=0; index < 9; index++) {
      PyObject* item = __pyx_t_12(__pyx_t_11); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_12 = NULL;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_12 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_a = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_b = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_c = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_d = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_e = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_f = __pyx_t_7;
  __pyx_t_7 = 0;
  __pyx_v__ = __pyx_t_8;
  __pyx_t_8 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_9);
  __pyx_t_9 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_10);
  __pyx_t_10 = 0;

  /* "rasterio/_base.pyx":368
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             return BoundingBox(c, f+e*self.height, c+a*self.width, f)             # <<<<<<<<<<<<<<
 * 
 *     property res:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_BoundingBox); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_9 = PyNumber_Multiply(__pyx_v_e, __pyx_v_self->height); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_8 = PyNumber_Add(__pyx_v_f, __pyx_t_9); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = PyNumber_Multiply(__pyx_v_a, __pyx_v_self->width); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = PyNumber_Add(__pyx_v_c, __pyx_t_9); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = NULL;
  __pyx_t_13 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_10))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
    if (likely(__pyx_t_9)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
      __Pyx_INCREF(__pyx_t_9);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_10, function);
      __pyx_t_13 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(4+__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_9) {
    __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_9); __pyx_t_9 = NULL;
  }
  __Pyx_INCREF(__pyx_v_c);
  __Pyx_GIVEREF(__pyx_v_c);
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_13, __pyx_v_c);
  __Pyx_GIVEREF(__pyx_t_8);
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_13, __pyx_t_8);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_13, __pyx_t_7);
  __Pyx_INCREF(__pyx_v_f);
  __Pyx_GIVEREF(__pyx_v_f);
  PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_13, __pyx_v_f);
  __pyx_t_8 = 0;
  __pyx_t_7 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":366
 *         (lower left x, lower left y, upper right x, upper right y)
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             return BoundingBox(c, f+e*self.height, c+a*self.width, f)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.bounds.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_b);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XDECREF(__pyx_v_e);
  __Pyx_XDECREF(__pyx_v_f);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":373
 *         """Returns the (width, height) of pixels in the units of its
 *         coordinate reference system."""
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3res_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3res_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_3res___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_3res___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_a = NULL;
  PyObject *__pyx_v_b = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_c = NULL;
  PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_v_e = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_f = NULL;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *(*__pyx_t_12)(PyObject *);
  int __pyx_t_13;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":374
 *         coordinate reference system."""
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine             # <<<<<<<<<<<<<<
 *             if b == d == 0:
 *                 return a, -e
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 9)) {
      if (size > 9) __Pyx_RaiseTooManyValuesError(9);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyTuple_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 8); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyList_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 8); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_10);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
      for (i=0; i < 9; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
    __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext;
    for (index=0; index < 9; index++) {
      PyObject* item = __pyx_t_12(__pyx_t_11); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_12 = NULL;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_12 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_a = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_b = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_c = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_d = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_e = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_f = __pyx_t_7;
  __pyx_t_7 = 0;
  __pyx_v__ = __pyx_t_8;
  __pyx_t_8 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_9);
  __pyx_t_9 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_10);
  __pyx_t_10 = 0;

  /* "rasterio/_base.pyx":375
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:             # <<<<<<<<<<<<<<
 *                 return a, -e
 *             else:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_b, __pyx_v_d, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
    __Pyx_DECREF(__pyx_t_1);
    __pyx_t_1 = PyObject_RichCompare(__pyx_v_d, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_13) {

    /* "rasterio/_base.pyx":376
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:
 *                 return a, -e             # <<<<<<<<<<<<<<
 *             else:
 *                 return math.sqrt(a*a+d*d), math.sqrt(b*b+e*e)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyNumber_Negative(__pyx_v_e); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_INCREF(__pyx_v_a);
    __Pyx_GIVEREF(__pyx_v_a);
    PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_a);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_r = __pyx_t_10;
    __pyx_t_10 = 0;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":375
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:             # <<<<<<<<<<<<<<
 *                 return a, -e
 *             else:
 */
  }

  /* "rasterio/_base.pyx":378
 *                 return a, -e
 *             else:
 *                 return math.sqrt(a*a+d*d), math.sqrt(b*b+e*e)             # <<<<<<<<<<<<<<
 * 
 *     def ul(self, row, col):
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sqrt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Multiply(__pyx_v_a, __pyx_v_a); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_8 = PyNumber_Multiply(__pyx_v_d, __pyx_v_d); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_7 = PyNumber_Add(__pyx_t_1, __pyx_t_8); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_9))) {
      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_9);
      if (likely(__pyx_t_8)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
        __Pyx_INCREF(__pyx_t_8);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_9, function);
      }
    }
    if (!__pyx_t_8) {
      __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_t_9, __pyx_t_7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_10);
    } else {
      __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8); __pyx_t_8 = NULL;
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_1, 0+1, __pyx_t_7);
      __pyx_t_7 = 0;
      __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_1, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    }
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sqrt); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Multiply(__pyx_v_b, __pyx_v_b); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_8 = PyNumber_Multiply(__pyx_v_e, __pyx_v_e); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_6 = PyNumber_Add(__pyx_t_1, __pyx_t_8); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) {
      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
      if (likely(__pyx_t_8)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
        __Pyx_INCREF(__pyx_t_8);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_7, function);
      }
    }
    if (!__pyx_t_8) {
      __pyx_t_9 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_GOTREF(__pyx_t_9);
    } else {
      __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8); __pyx_t_8 = NULL;
      __Pyx_GIVEREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_1, 0+1, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_1, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    }
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_10);
    PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_10);
    __Pyx_GIVEREF(__pyx_t_9);
    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_9);
    __pyx_t_10 = 0;
    __pyx_t_9 = 0;
    __pyx_r = __pyx_t_7;
    __pyx_t_7 = 0;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":373
 *         """Returns the (width, height) of pixels in the units of its
 *         coordinate reference system."""
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.res.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_b);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XDECREF(__pyx_v_e);
  __Pyx_XDECREF(__pyx_v_f);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":380
 *                 return math.sqrt(a*a+d*d), math.sqrt(b*b+e*e)
 * 
 *     def ul(self, row, col):             # <<<<<<<<<<<<<<
 *         """Returns the coordinates (x, y) of the upper left corner of a
 *         pixel at `row` and `col` in the units of the dataset's
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_38ul(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_37ul[] = "Returns the coordinates (x, y) of the upper left corner of a \n        pixel at `row` and `col` in the units of the dataset's\n        coordinate reference system.\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_38ul(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_row = 0;
  PyObject *__pyx_v_col = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ul (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_row,&__pyx_n_s_col,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_row)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_col)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ul", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ul") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_row = values[0];
    __pyx_v_col = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ul", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.ul", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_37ul(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_row, __pyx_v_col);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_37ul(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_row, PyObject *__pyx_v_col) {
  PyObject *__pyx_v_a = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_b = NULL;
  PyObject *__pyx_v_c = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_v_e = NULL;
  PyObject *__pyx_v_f = NULL;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *(*__pyx_t_12)(PyObject *);
  int __pyx_t_13;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("ul", 0);
  __Pyx_INCREF(__pyx_v_row);
  __Pyx_INCREF(__pyx_v_col);

  /* "rasterio/_base.pyx":385
 *         coordinate reference system.
 *         """
 *         a, b, c, d, e, f, _, _, _ = self.affine             # <<<<<<<<<<<<<<
 *         if col < 0:
 *             col += self.width
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 9)) {
      if (size > 9) __Pyx_RaiseTooManyValuesError(9);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyTuple_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 8); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyList_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 8); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_10);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
      for (i=0; i < 9; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
    __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext;
    for (index=0; index < 9; index++) {
      PyObject* item = __pyx_t_12(__pyx_t_11); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_12 = NULL;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_12 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_a = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_b = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_c = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_d = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_e = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_f = __pyx_t_7;
  __pyx_t_7 = 0;
  __pyx_v__ = __pyx_t_8;
  __pyx_t_8 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_9);
  __pyx_t_9 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_10);
  __pyx_t_10 = 0;

  /* "rasterio/_base.pyx":386
 *         """
 *         a, b, c, d, e, f, _, _, _ = self.affine
 *         if col < 0:             # <<<<<<<<<<<<<<
 *             col += self.width
 *         if row < 0:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_13) {

    /* "rasterio/_base.pyx":387
 *         a, b, c, d, e, f, _, _, _ = self.affine
 *         if col < 0:
 *             col += self.width             # <<<<<<<<<<<<<<
 *         if row < 0:
 *             row += self.height
 */
    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_col, __pyx_v_self->width); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_col, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "rasterio/_base.pyx":386
 *         """
 *         a, b, c, d, e, f, _, _, _ = self.affine
 *         if col < 0:             # <<<<<<<<<<<<<<
 *             col += self.width
 *         if row < 0:
 */
  }

  /* "rasterio/_base.pyx":388
 *         if col < 0:
 *             col += self.width
 *         if row < 0:             # <<<<<<<<<<<<<<
 *             row += self.height
 *         return c+a*col, f+e*row
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_row, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_13) {

    /* "rasterio/_base.pyx":389
 *             col += self.width
 *         if row < 0:
 *             row += self.height             # <<<<<<<<<<<<<<
 *         return c+a*col, f+e*row
 * 
 */
    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_row, __pyx_v_self->height); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_row, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "rasterio/_base.pyx":388
 *         if col < 0:
 *             col += self.width
 *         if row < 0:             # <<<<<<<<<<<<<<
 *             row += self.height
 *         return c+a*col, f+e*row
 */
  }

  /* "rasterio/_base.pyx":390
 *         if row < 0:
 *             row += self.height
 *         return c+a*col, f+e*row             # <<<<<<<<<<<<<<
 * 
 *     def index(self, x, y, op=math.floor):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_a, __pyx_v_col); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_10 = PyNumber_Add(__pyx_v_c, __pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_e, __pyx_v_row); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = PyNumber_Add(__pyx_v_f, __pyx_t_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_10);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_10);
  __Pyx_GIVEREF(__pyx_t_9);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
  __pyx_t_10 = 0;
  __pyx_t_9 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":380
 *                 return math.sqrt(a*a+d*d), math.sqrt(b*b+e*e)
 * 
 *     def ul(self, row, col):             # <<<<<<<<<<<<<<
 *         """Returns the coordinates (x, y) of the upper left corner of a
 *         pixel at `row` and `col` in the units of the dataset's
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.ul", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_b);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XDECREF(__pyx_v_e);
  __Pyx_XDECREF(__pyx_v_f);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XDECREF(__pyx_v_row);
  __Pyx_XDECREF(__pyx_v_col);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":392
 *         return c+a*col, f+e*row
 * 
 *     def index(self, x, y, op=math.floor):             # <<<<<<<<<<<<<<
 *         """Returns the (row, col) index of the pixel containing (x, y)."""
 *         return get_index(x, y, self.affine)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_40index(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_39index[] = "Returns the (row, col) index of the pixel containing (x, y).";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_40index(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_x = 0;
  PyObject *__pyx_v_y = 0;
  CYTHON_UNUSED PyObject *__pyx_v_op = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("index (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_op,0};
    PyObject* values[3] = {0,0,0};
    values[2] = __pyx_k__31;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("index", 0, 2, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_op);
          if (value) { values[2] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "index") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_x = values[0];
    __pyx_v_y = values[1];
    __pyx_v_op = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("index", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_39index(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_x, __pyx_v_y, __pyx_v_op);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_39index(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, CYTHON_UNUSED PyObject *__pyx_v_op) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("index", 0);

  /* "rasterio/_base.pyx":394
 *     def index(self, x, y, op=math.floor):
 *         """Returns the (row, col) index of the pixel containing (x, y)."""
 *         return get_index(x, y, self.affine)             # <<<<<<<<<<<<<<
 * 
 *     def window(self, left, bottom, right, top, boundless=False):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_index); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  __pyx_t_5 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_5 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_4) {
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
  }
  __Pyx_INCREF(__pyx_v_x);
  __Pyx_GIVEREF(__pyx_v_x);
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_x);
  __Pyx_INCREF(__pyx_v_y);
  __Pyx_GIVEREF(__pyx_v_y);
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_y);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_t_3);
  __pyx_t_3 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":392
 *         return c+a*col, f+e*row
 * 
 *     def index(self, x, y, op=math.floor):             # <<<<<<<<<<<<<<
 *         """Returns the (row, col) index of the pixel containing (x, y)."""
 *         return get_index(x, y, self.affine)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":396
 *         return get_index(x, y, self.affine)
 * 
 *     def window(self, left, bottom, right, top, boundless=False):             # <<<<<<<<<<<<<<
 *         """Returns the window corresponding to the world bounding box.
 *         If boundless is False, window is limited to extent of this dataset."""
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_42window(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_41window[] = "Returns the window corresponding to the world bounding box.\n        If boundless is False, window is limited to extent of this dataset.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_42window(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_left = 0;
  PyObject *__pyx_v_bottom = 0;
  PyObject *__pyx_v_right = 0;
  PyObject *__pyx_v_top = 0;
  PyObject *__pyx_v_boundless = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_left,&__pyx_n_s_bottom,&__pyx_n_s_right,&__pyx_n_s_top,&__pyx_n_s_boundless,0};
    PyObject* values[5] = {0,0,0,0,0};
    values[4] = ((PyObject *)Py_False);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_left)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bottom)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("window", 0, 4, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_right)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("window", 0, 4, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_top)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("window", 0, 4, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_boundless);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "window") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_left = values[0];
    __pyx_v_bottom = values[1];
    __pyx_v_right = values[2];
    __pyx_v_top = values[3];
    __pyx_v_boundless = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("window", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_41window(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_left, __pyx_v_bottom, __pyx_v_right, __pyx_v_top, __pyx_v_boundless);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_41window(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_left, PyObject *__pyx_v_bottom, PyObject *__pyx_v_right, PyObject *__pyx_v_top, PyObject *__pyx_v_boundless) {
  PyObject *__pyx_v_window = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  int __pyx_t_8;
  int __pyx_t_9;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("window", 0);

  /* "rasterio/_base.pyx":400
 *         If boundless is False, window is limited to extent of this dataset."""
 * 
 *         window = get_window(left, bottom, right, top, self.affine)             # <<<<<<<<<<<<<<
 *         if boundless:
 *             return window
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_window); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  __pyx_t_5 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_5 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_4) {
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
  }
  __Pyx_INCREF(__pyx_v_left);
  __Pyx_GIVEREF(__pyx_v_left);
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_left);
  __Pyx_INCREF(__pyx_v_bottom);
  __Pyx_GIVEREF(__pyx_v_bottom);
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_bottom);
  __Pyx_INCREF(__pyx_v_right);
  __Pyx_GIVEREF(__pyx_v_right);
  PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_right);
  __Pyx_INCREF(__pyx_v_top);
  __Pyx_GIVEREF(__pyx_v_top);
  PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_5, __pyx_v_top);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_6, 4+__pyx_t_5, __pyx_t_3);
  __pyx_t_3 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_window = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":401
 * 
 *         window = get_window(left, bottom, right, top, self.affine)
 *         if boundless:             # <<<<<<<<<<<<<<
 *             return window
 *         else:
 */
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_boundless); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_7) {

    /* "rasterio/_base.pyx":402
 *         window = get_window(left, bottom, right, top, self.affine)
 *         if boundless:
 *             return window             # <<<<<<<<<<<<<<
 *         else:
 *             return crop_window(window, self.height, self.width)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_window);
    __pyx_r = __pyx_v_window;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":401
 * 
 *         window = get_window(left, bottom, right, top, self.affine)
 *         if boundless:             # <<<<<<<<<<<<<<
 *             return window
 *         else:
 */
  }

  /* "rasterio/_base.pyx":404
 *             return window
 *         else:
 *             return crop_window(window, self.height, self.width)             # <<<<<<<<<<<<<<
 * 
 *     def window_transform(self, window):
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_v_self->height); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_self->width); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_1 = __pyx_f_8rasterio_5_base_crop_window(__pyx_v_window, __pyx_t_8, __pyx_t_9, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":396
 *         return get_index(x, y, self.affine)
 * 
 *     def window(self, left, bottom, right, top, boundless=False):             # <<<<<<<<<<<<<<
 *         """Returns the window corresponding to the world bounding box.
 *         If boundless is False, window is limited to extent of this dataset."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_window);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":406
 *             return crop_window(window, self.height, self.width)
 * 
 *     def window_transform(self, window):             # <<<<<<<<<<<<<<
 *         """Returns the affine transform for a dataset window."""
 *         (r, _), (c, _) = window
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_44window_transform(PyObject *__pyx_v_self, PyObject *__pyx_v_window); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_43window_transform[] = "Returns the affine transform for a dataset window.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_44window_transform(PyObject *__pyx_v_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window_transform (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_43window_transform(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_window));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_43window_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_v_r = NULL;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_v_c = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *(*__pyx_t_4)(PyObject *);
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  Py_ssize_t __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("window_transform", 0);

  /* "rasterio/_base.pyx":408
 *     def window_transform(self, window):
 *         """Returns the affine transform for a dataset window."""
 *         (r, _), (c, _) = window             # <<<<<<<<<<<<<<
 *         return self.affine * Affine.translation(c or 0, r or 0)
 * 
 */
  if ((likely(PyTuple_CheckExact(__pyx_v_window))) || (PyList_CheckExact(__pyx_v_window))) {
    PyObject* sequence = __pyx_v_window;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    #endif
  } else {
    Py_ssize_t index = -1;
    __pyx_t_3 = PyObject_GetIter(__pyx_v_window); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_2 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_3), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    index = 1; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L6_unpacking_done:;
  }
  __pyx_v_r = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v__ = __pyx_t_5;
  __pyx_t_5 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
    PyObject* sequence = __pyx_t_2;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L8_unpacking_done;
    __pyx_L7_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L8_unpacking_done:;
  }
  __pyx_v_c = __pyx_t_5;
  __pyx_t_5 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_3);
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":409
 *         """Returns the affine transform for a dataset window."""
 *         (r, _), (c, _) = window
 *         return self.affine * Affine.translation(c or 0, r or 0)             # <<<<<<<<<<<<<<
 * 
 *     def window_bounds(self, window):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_Affine); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_translation); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_c); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_7) {
  } else {
    __Pyx_INCREF(__pyx_v_c);
    __pyx_t_3 = __pyx_v_c;
    goto __pyx_L9_bool_binop_done;
  }
  __pyx_t_6 = __Pyx_PyInt_From_long(0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_L9_bool_binop_done:;
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_r); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_7) {
  } else {
    __Pyx_INCREF(__pyx_v_r);
    __pyx_t_6 = __pyx_v_r;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_8 = __Pyx_PyInt_From_long(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_6 = __pyx_t_8;
  __pyx_t_8 = 0;
  __pyx_L11_bool_binop_done:;
  __pyx_t_8 = NULL;
  __pyx_t_9 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_8)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_8);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
      __pyx_t_9 = 1;
    }
  }
  __pyx_t_10 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_10);
  if (__pyx_t_8) {
    __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL;
  }
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_9, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_9, __pyx_t_6);
  __pyx_t_3 = 0;
  __pyx_t_6 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_10, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":406
 *             return crop_window(window, self.height, self.width)
 * 
 *     def window_transform(self, window):             # <<<<<<<<<<<<<<
 *         """Returns the affine transform for a dataset window."""
 *         (r, _), (c, _) = window
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.window_transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_r);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":411
 *         return self.affine * Affine.translation(c or 0, r or 0)
 * 
 *     def window_bounds(self, window):             # <<<<<<<<<<<<<<
 *         """Returns the bounds of a window as x_min, y_min, x_max, y_max."""
 *         ((row_min, row_max), (col_min, col_max)) = window
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_46window_bounds(PyObject *__pyx_v_self, PyObject *__pyx_v_window); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_45window_bounds[] = "Returns the bounds of a window as x_min, y_min, x_max, y_max.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_46window_bounds(PyObject *__pyx_v_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window_bounds (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_45window_bounds(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_window));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_45window_bounds(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_v_row_min = NULL;
  PyObject *__pyx_v_row_max = NULL;
  PyObject *__pyx_v_col_min = NULL;
  PyObject *__pyx_v_col_max = NULL;
  PyObject *__pyx_v_x_min = NULL;
  PyObject *__pyx_v_y_min = NULL;
  PyObject *__pyx_v_x_max = NULL;
  PyObject *__pyx_v_y_max = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *(*__pyx_t_4)(PyObject *);
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("window_bounds", 0);

  /* "rasterio/_base.pyx":413
 *     def window_bounds(self, window):
 *         """Returns the bounds of a window as x_min, y_min, x_max, y_max."""
 *         ((row_min, row_max), (col_min, col_max)) = window             # <<<<<<<<<<<<<<
 *         x_min, y_min = (col_min, row_max) * self.affine
 *         x_max, y_max = (col_max, row_min) * self.affine
 */
  if ((likely(PyTuple_CheckExact(__pyx_v_window))) || (PyList_CheckExact(__pyx_v_window))) {
    PyObject* sequence = __pyx_v_window;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    #endif
  } else {
    Py_ssize_t index = -1;
    __pyx_t_3 = PyObject_GetIter(__pyx_v_window); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_2 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_3), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    index = 1; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L6_unpacking_done:;
  }
  __pyx_v_row_min = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_row_max = __pyx_t_5;
  __pyx_t_5 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
    PyObject* sequence = __pyx_t_2;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L8_unpacking_done;
    __pyx_L7_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L8_unpacking_done:;
  }
  __pyx_v_col_min = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_col_max = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":414
 *         """Returns the bounds of a window as x_min, y_min, x_max, y_max."""
 *         ((row_min, row_max), (col_min, col_max)) = window
 *         x_min, y_min = (col_min, row_max) * self.affine             # <<<<<<<<<<<<<<
 *         x_max, y_max = (col_max, row_min) * self.affine
 *         return x_min, y_min, x_max, y_max
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_col_min);
  __Pyx_GIVEREF(__pyx_v_col_min);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_col_min);
  __Pyx_INCREF(__pyx_v_row_max);
  __Pyx_GIVEREF(__pyx_v_row_max);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_row_max);
  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_temp);
    __Pyx_DECREF(__pyx_t_1);
    __pyx_t_1 = __pyx_temp;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (1) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
    __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
  __pyx_v_x_min = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_y_min = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":415
 *         ((row_min, row_max), (col_min, col_max)) = window
 *         x_min, y_min = (col_min, row_max) * self.affine
 *         x_max, y_max = (col_max, row_min) * self.affine             # <<<<<<<<<<<<<<
 *         return x_min, y_min, x_max, y_max
 * 
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_col_max);
  __Pyx_GIVEREF(__pyx_v_col_max);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_col_max);
  __Pyx_INCREF(__pyx_v_row_min);
  __Pyx_GIVEREF(__pyx_v_row_min);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_row_min);
  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_temp);
    __Pyx_DECREF(__pyx_t_3);
    __pyx_t_3 = __pyx_temp;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (1) {
    PyObject* sequence = __pyx_t_3;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
    __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    #endif
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __pyx_v_x_max = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_v_y_max = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":416
 *         x_min, y_min = (col_min, row_max) * self.affine
 *         x_max, y_max = (col_max, row_min) * self.affine
 *         return x_min, y_min, x_max, y_max             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_x_min);
  __Pyx_GIVEREF(__pyx_v_x_min);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_x_min);
  __Pyx_INCREF(__pyx_v_y_min);
  __Pyx_GIVEREF(__pyx_v_y_min);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_y_min);
  __Pyx_INCREF(__pyx_v_x_max);
  __Pyx_GIVEREF(__pyx_v_x_max);
  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_x_max);
  __Pyx_INCREF(__pyx_v_y_max);
  __Pyx_GIVEREF(__pyx_v_y_max);
  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_y_max);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":411
 *         return self.affine * Affine.translation(c or 0, r or 0)
 * 
 *     def window_bounds(self, window):             # <<<<<<<<<<<<<<
 *         """Returns the bounds of a window as x_min, y_min, x_max, y_max."""
 *         ((row_min, row_max), (col_min, col_max)) = window
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.window_bounds", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_row_min);
  __Pyx_XDECREF(__pyx_v_row_max);
  __Pyx_XDECREF(__pyx_v_col_min);
  __Pyx_XDECREF(__pyx_v_col_max);
  __Pyx_XDECREF(__pyx_v_x_min);
  __Pyx_XDECREF(__pyx_v_y_min);
  __Pyx_XDECREF(__pyx_v_x_max);
  __Pyx_XDECREF(__pyx_v_y_max);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":419
 * 
 *     @property
 *     def meta(self):             # <<<<<<<<<<<<<<
 *         """The basic metadata of this dataset."""
 *         m = {
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_48meta(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_47meta[] = "The basic metadata of this dataset.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_48meta(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("meta (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_47meta(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_47meta(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_m = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("meta", 0);

  /* "rasterio/_base.pyx":422
 *         """The basic metadata of this dataset."""
 *         m = {
 *             'driver': self.driver,             # <<<<<<<<<<<<<<
 *             'dtype': self.dtypes[0],
 *             'nodata': self.nodata,
 */
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_driver, __pyx_v_self->driver) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":423
 *         m = {
 *             'driver': self.driver,
 *             'dtype': self.dtypes[0],             # <<<<<<<<<<<<<<
 *             'nodata': self.nodata,
 *             'width': self.width,
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_dtypes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":424
 *             'driver': self.driver,
 *             'dtype': self.dtypes[0],
 *             'nodata': self.nodata,             # <<<<<<<<<<<<<<
 *             'width': self.width,
 *             'height': self.height,
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_nodata); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_nodata, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":425
 *             'dtype': self.dtypes[0],
 *             'nodata': self.nodata,
 *             'width': self.width,             # <<<<<<<<<<<<<<
 *             'height': self.height,
 *             'count': self.count,
 */
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_width, __pyx_v_self->width) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":426
 *             'nodata': self.nodata,
 *             'width': self.width,
 *             'height': self.height,             # <<<<<<<<<<<<<<
 *             'count': self.count,
 *             'crs': self.crs,
 */
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_height, __pyx_v_self->height) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":427
 *             'width': self.width,
 *             'height': self.height,
 *             'count': self.count,             # <<<<<<<<<<<<<<
 *             'crs': self.crs,
 *             'transform': self.affine.to_gdal(),
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_count, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":428
 *             'height': self.height,
 *             'count': self.count,
 *             'crs': self.crs,             # <<<<<<<<<<<<<<
 *             'transform': self.affine.to_gdal(),
 *             'affine': self.affine,
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_crs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_crs, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":429
 *             'count': self.count,
 *             'crs': self.crs,
 *             'transform': self.affine.to_gdal(),             # <<<<<<<<<<<<<<
 *             'affine': self.affine,
 *         }
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_to_gdal); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  if (__pyx_t_2) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_transform, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":430
 *             'crs': self.crs,
 *             'transform': self.affine.to_gdal(),
 *             'affine': self.affine,             # <<<<<<<<<<<<<<
 *         }
 *         self._read = True
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_affine, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_m = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":432
 *             'affine': self.affine,
 *         }
 *         self._read = True             # <<<<<<<<<<<<<<
 *         return m
 * 
 */
  __Pyx_INCREF(Py_True);
  __Pyx_GIVEREF(Py_True);
  __Pyx_GOTREF(__pyx_v_self->_read);
  __Pyx_DECREF(__pyx_v_self->_read);
  __pyx_v_self->_read = Py_True;

  /* "rasterio/_base.pyx":433
 *         }
 *         self._read = True
 *         return m             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_m);
  __pyx_r = __pyx_v_m;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":419
 * 
 *     @property
 *     def meta(self):             # <<<<<<<<<<<<<<
 *         """The basic metadata of this dataset."""
 *         m = {
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.meta", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_m);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":436
 * 
 *     @property
 *     def compression(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_50compression(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_50compression(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("compression (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_49compression(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_49compression(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("compression", 0);

  /* "rasterio/_base.pyx":437
 *     @property
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')             # <<<<<<<<<<<<<<
 *         if val:
 *             return Compression(val)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ns, __pyx_n_s_IMAGE_STRUCTURE) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__32, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_val = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":438
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:             # <<<<<<<<<<<<<<
 *             return Compression(val)
 *         else:
 */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_4) {

    /* "rasterio/_base.pyx":439
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:
 *             return Compression(val)             # <<<<<<<<<<<<<<
 *         else:
 *             return None
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_Compression); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (!__pyx_t_1) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = NULL;
      __Pyx_INCREF(__pyx_v_val);
      __Pyx_GIVEREF(__pyx_v_val);
      PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_val);
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":438
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:             # <<<<<<<<<<<<<<
 *             return Compression(val)
 *         else:
 */
  }

  /* "rasterio/_base.pyx":441
 *             return Compression(val)
 *         else:
 *             return None             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(Py_None);
    __pyx_r = Py_None;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":436
 * 
 *     @property
 *     def compression(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.compression", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":444
 * 
 *     @property
 *     def interleaving(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_52interleaving(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_52interleaving(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("interleaving (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_51interleaving(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_51interleaving(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("interleaving", 0);

  /* "rasterio/_base.pyx":445
 *     @property
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')             # <<<<<<<<<<<<<<
 *         if val:
 *             return Interleaving(val)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ns, __pyx_n_s_IMAGE_STRUCTURE) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__33, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_val = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":446
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:             # <<<<<<<<<<<<<<
 *             return Interleaving(val)
 *         else:
 */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_4) {

    /* "rasterio/_base.pyx":447
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:
 *             return Interleaving(val)             # <<<<<<<<<<<<<<
 *         else:
 *             return None
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_Interleaving); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (!__pyx_t_1) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = NULL;
      __Pyx_INCREF(__pyx_v_val);
      __Pyx_GIVEREF(__pyx_v_val);
      PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_val);
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":446
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:             # <<<<<<<<<<<<<<
 *             return Interleaving(val)
 *         else:
 */
  }

  /* "rasterio/_base.pyx":449
 *             return Interleaving(val)
 *         else:
 *             return None             # <<<<<<<<<<<<<<
 * 
 *     property profile:
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(Py_None);
    __pyx_r = Py_None;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":444
 * 
 *     @property
 *     def interleaving(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.interleaving", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":457
 *         create a clone of this dataset.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             m = self.meta
 *             m.update(self.tags(ns='rio_creation_kwds'))
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7profile_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7profile_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7profile___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7profile___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_m = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_t_6;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":458
 *         """
 *         def __get__(self):
 *             m = self.meta             # <<<<<<<<<<<<<<
 *             m.update(self.tags(ns='rio_creation_kwds'))
 *             m.update(
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_meta); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_m = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":459
 *         def __get__(self):
 *             m = self.meta
 *             m.update(self.tags(ns='rio_creation_kwds'))             # <<<<<<<<<<<<<<
 *             m.update(
 *                 blockxsize=self.block_shapes[0][1],
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_update); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_ns, __pyx_n_s_rio_creation_kwds) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_4) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = NULL;
    __Pyx_GIVEREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":460
 *             m = self.meta
 *             m.update(self.tags(ns='rio_creation_kwds'))
 *             m.update(             # <<<<<<<<<<<<<<
 *                 blockxsize=self.block_shapes[0][1],
 *                 blockysize=self.block_shapes[0][0],
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);

  /* "rasterio/_base.pyx":461
 *             m.update(self.tags(ns='rio_creation_kwds'))
 *             m.update(
 *                 blockxsize=self.block_shapes[0][1],             # <<<<<<<<<<<<<<
 *                 blockysize=self.block_shapes[0][0],
 *                 tiled=self.block_shapes[0][1] != self.width)
 */
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_blockxsize, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":462
 *             m.update(
 *                 blockxsize=self.block_shapes[0][1],
 *                 blockysize=self.block_shapes[0][0],             # <<<<<<<<<<<<<<
 *                 tiled=self.block_shapes[0][1] != self.width)
 *             if self.compression:
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_blockysize, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":463
 *                 blockxsize=self.block_shapes[0][1],
 *                 blockysize=self.block_shapes[0][0],
 *                 tiled=self.block_shapes[0][1] != self.width)             # <<<<<<<<<<<<<<
 *             if self.compression:
 *                 m['compress'] = self.compression.name
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_v_self->width, Py_NE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_tiled, __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":460
 *             m = self.meta
 *             m.update(self.tags(ns='rio_creation_kwds'))
 *             m.update(             # <<<<<<<<<<<<<<
 *                 blockxsize=self.block_shapes[0][1],
 *                 blockysize=self.block_shapes[0][0],
 */
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":464
 *                 blockysize=self.block_shapes[0][0],
 *                 tiled=self.block_shapes[0][1] != self.width)
 *             if self.compression:             # <<<<<<<<<<<<<<
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:
 */
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_compression); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (__pyx_t_6) {

    /* "rasterio/_base.pyx":465
 *                 tiled=self.block_shapes[0][1] != self.width)
 *             if self.compression:
 *                 m['compress'] = self.compression.name             # <<<<<<<<<<<<<<
 *             if self.interleaving:
 *                 m['interleave'] = self.interleaving.name
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_compression); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_name); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (unlikely(PyObject_SetItem(__pyx_v_m, __pyx_n_s_compress, __pyx_t_2) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":464
 *                 blockysize=self.block_shapes[0][0],
 *                 tiled=self.block_shapes[0][1] != self.width)
 *             if self.compression:             # <<<<<<<<<<<<<<
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:
 */
  }

  /* "rasterio/_base.pyx":466
 *             if self.compression:
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:             # <<<<<<<<<<<<<<
 *                 m['interleave'] = self.interleaving.name
 *             return m
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_interleaving); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_6) {

    /* "rasterio/_base.pyx":467
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:
 *                 m['interleave'] = self.interleaving.name             # <<<<<<<<<<<<<<
 *             return m
 * 
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_interleaving); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(PyObject_SetItem(__pyx_v_m, __pyx_n_s_interleave, __pyx_t_5) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":466
 *             if self.compression:
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:             # <<<<<<<<<<<<<<
 *                 m['interleave'] = self.interleaving.name
 *             return m
 */
  }

  /* "rasterio/_base.pyx":468
 *             if self.interleaving:
 *                 m['interleave'] = self.interleaving.name
 *             return m             # <<<<<<<<<<<<<<
 * 
 *     def lnglat(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_m);
  __pyx_r = __pyx_v_m;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":457
 *         create a clone of this dataset.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             m = self.meta
 *             m.update(self.tags(ns='rio_creation_kwds'))
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.profile.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_m);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":470
 *             return m
 * 
 *     def lnglat(self):             # <<<<<<<<<<<<<<
 *         w, s, e, n = self.bounds
 *         cx = (w + e)/2.0
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_54lnglat(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_54lnglat(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lnglat (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_53lnglat(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_53lnglat(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_w = NULL;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_e = NULL;
  PyObject *__pyx_v_n = NULL;
  PyObject *__pyx_v_cx = NULL;
  PyObject *__pyx_v_cy = NULL;
  PyObject *__pyx_v_lng = NULL;
  PyObject *__pyx_v_lat = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  PyObject *__pyx_t_8 = NULL;
  Py_ssize_t __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("lnglat", 0);

  /* "rasterio/_base.pyx":471
 * 
 *     def lnglat(self):
 *         w, s, e, n = self.bounds             # <<<<<<<<<<<<<<
 *         cx = (w + e)/2.0
 *         cy = (s + n)/2.0
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_bounds); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 4)) {
      if (size > 4) __Pyx_RaiseTooManyValuesError(4);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5};
      for (i=0; i < 4; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5};
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    for (index=0; index < 4; index++) {
      PyObject* item = __pyx_t_7(__pyx_t_6); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_w = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_s = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_e = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_n = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":472
 *     def lnglat(self):
 *         w, s, e, n = self.bounds
 *         cx = (w + e)/2.0             # <<<<<<<<<<<<<<
 *         cy = (s + n)/2.0
 *         lng, lat = _transform(
 */
  __pyx_t_1 = PyNumber_Add(__pyx_v_w, __pyx_v_e); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __Pyx_PyFloat_DivideObjC(__pyx_t_1, __pyx_float_2_0, 2.0, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_cx = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":473
 *         w, s, e, n = self.bounds
 *         cx = (w + e)/2.0
 *         cy = (s + n)/2.0             # <<<<<<<<<<<<<<
 *         lng, lat = _transform(
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)
 */
  __pyx_t_5 = PyNumber_Add(__pyx_v_s, __pyx_v_n); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_1 = __Pyx_PyFloat_DivideObjC(__pyx_t_5, __pyx_float_2_0, 2.0, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_cy = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":474
 *         cx = (w + e)/2.0
 *         cy = (s + n)/2.0
 *         lng, lat = _transform(             # <<<<<<<<<<<<<<
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)
 *         return lng.pop(), lat.pop()
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_transform_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);

  /* "rasterio/_base.pyx":475
 *         cy = (s + n)/2.0
 *         lng, lat = _transform(
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)             # <<<<<<<<<<<<<<
 *         return lng.pop(), lat.pop()
 * 
 */
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_crs); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_init, __pyx_kp_s_epsg_4326) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_cx);
  __Pyx_GIVEREF(__pyx_v_cx);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_v_cx);
  __pyx_t_6 = PyList_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(__pyx_v_cy);
  __Pyx_GIVEREF(__pyx_v_cy);
  PyList_SET_ITEM(__pyx_t_6, 0, __pyx_v_cy);
  __pyx_t_8 = NULL;
  __pyx_t_9 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_8)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_8);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
      __pyx_t_9 = 1;
    }
  }
  __pyx_t_10 = PyTuple_New(5+__pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_10);
  if (__pyx_t_8) {
    __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL;
  }
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_9, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_9, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_10, 2+__pyx_t_9, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_10, 3+__pyx_t_9, __pyx_t_6);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_10, 4+__pyx_t_9, Py_None);
  __pyx_t_4 = 0;
  __pyx_t_3 = 0;
  __pyx_t_2 = 0;
  __pyx_t_6 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_10, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_10);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_10 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_10)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_10);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L6_unpacking_done:;
  }

  /* "rasterio/_base.pyx":474
 *         cx = (w + e)/2.0
 *         cy = (s + n)/2.0
 *         lng, lat = _transform(             # <<<<<<<<<<<<<<
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)
 *         return lng.pop(), lat.pop()
 */
  __pyx_v_lng = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_lat = __pyx_t_10;
  __pyx_t_10 = 0;

  /* "rasterio/_base.pyx":476
 *         lng, lat = _transform(
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)
 *         return lng.pop(), lat.pop()             # <<<<<<<<<<<<<<
 * 
 *     def get_crs(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_Pop(__pyx_v_lng); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_10 = __Pyx_PyObject_Pop(__pyx_v_lat); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_10);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_10);
  __pyx_t_1 = 0;
  __pyx_t_10 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":470
 *             return m
 * 
 *     def lnglat(self):             # <<<<<<<<<<<<<<
 *         w, s, e, n = self.bounds
 *         cx = (w + e)/2.0
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.lnglat", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_w);
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_e);
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_cx);
  __Pyx_XDECREF(__pyx_v_cy);
  __Pyx_XDECREF(__pyx_v_lng);
  __Pyx_XDECREF(__pyx_v_lat);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":478
 *         return lng.pop(), lat.pop()
 * 
 *     def get_crs(self):             # <<<<<<<<<<<<<<
 *         # _read tells us that the CRS was read before and really is
 *         # None.
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_56get_crs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_56get_crs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_crs (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_55get_crs(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_55get_crs(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("get_crs", 0);

  /* "rasterio/_base.pyx":481
 *         # _read tells us that the CRS was read before and really is
 *         # None.
 *         if not self._read and self._crs is None:             # <<<<<<<<<<<<<<
 *             self._crs = self.read_crs()
 *         return self._crs
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_self->_read); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_3 = (__pyx_v_self->_crs == Py_None);
  __pyx_t_2 = (__pyx_t_3 != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":482
 *         # None.
 *         if not self._read and self._crs is None:
 *             self._crs = self.read_crs()             # <<<<<<<<<<<<<<
 *         return self._crs
 * 
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_crs); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_self->_crs);
    __Pyx_DECREF(__pyx_v_self->_crs);
    __pyx_v_self->_crs = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":481
 *         # _read tells us that the CRS was read before and really is
 *         # None.
 *         if not self._read and self._crs is None:             # <<<<<<<<<<<<<<
 *             self._crs = self.read_crs()
 *         return self._crs
 */
  }

  /* "rasterio/_base.pyx":483
 *         if not self._read and self._crs is None:
 *             self._crs = self.read_crs()
 *         return self._crs             # <<<<<<<<<<<<<<
 * 
 *     property crs:
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_crs);
  __pyx_r = __pyx_v_self->_crs;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":478
 *         return lng.pop(), lat.pop()
 * 
 *     def get_crs(self):             # <<<<<<<<<<<<<<
 *         # _read tells us that the CRS was read before and really is
 *         # None.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.get_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":488
 *         """A mapping of PROJ.4 coordinate reference system params.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.get_crs()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3crs_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3crs_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_3crs___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_3crs___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":489
 *         """
 *         def __get__(self):
 *             return self.get_crs()             # <<<<<<<<<<<<<<
 * 
 *     property crs_wkt:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_crs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":488
 *         """A mapping of PROJ.4 coordinate reference system params.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.get_crs()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.crs.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":495
 *         system.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             if not self._read and self._crs_wkt is None:
 *                 self._crs = self.read_crs_wkt()
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7crs_wkt_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7crs_wkt_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7crs_wkt___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7crs_wkt___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":496
 *         """
 *         def __get__(self):
 *             if not self._read and self._crs_wkt is None:             # <<<<<<<<<<<<<<
 *                 self._crs = self.read_crs_wkt()
 *             return self._crs_wkt
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_self->_read); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_3 = (__pyx_v_self->_crs_wkt == Py_None);
  __pyx_t_2 = (__pyx_t_3 != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":497
 *         def __get__(self):
 *             if not self._read and self._crs_wkt is None:
 *                 self._crs = self.read_crs_wkt()             # <<<<<<<<<<<<<<
 *             return self._crs_wkt
 * 
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_crs_wkt); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_self->_crs);
    __Pyx_DECREF(__pyx_v_self->_crs);
    __pyx_v_self->_crs = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":496
 *         """
 *         def __get__(self):
 *             if not self._read and self._crs_wkt is None:             # <<<<<<<<<<<<<<
 *                 self._crs = self.read_crs_wkt()
 *             return self._crs_wkt
 */
  }

  /* "rasterio/_base.pyx":498
 *             if not self._read and self._crs_wkt is None:
 *                 self._crs = self.read_crs_wkt()
 *             return self._crs_wkt             # <<<<<<<<<<<<<<
 * 
 *     def get_transform(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_crs_wkt);
  __pyx_r = __pyx_v_self->_crs_wkt;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":495
 *         system.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             if not self._read and self._crs_wkt is None:
 *                 self._crs = self.read_crs_wkt()
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.crs_wkt.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":500
 *             return self._crs_wkt
 * 
 *     def get_transform(self):             # <<<<<<<<<<<<<<
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_58get_transform(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_57get_transform[] = "Returns a GDAL geotransform in its native form.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_58get_transform(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_transform (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_57get_transform(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_57get_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("get_transform", 0);

  /* "rasterio/_base.pyx":502
 *     def get_transform(self):
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:             # <<<<<<<<<<<<<<
 *             self._transform = self.read_transform()
 *         return self._transform
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_self->_read); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_3 = (__pyx_v_self->_transform == Py_None);
  __pyx_t_2 = (__pyx_t_3 != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":503
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:
 *             self._transform = self.read_transform()             # <<<<<<<<<<<<<<
 *         return self._transform
 * 
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_transform); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_self->_transform);
    __Pyx_DECREF(__pyx_v_self->_transform);
    __pyx_v_self->_transform = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":502
 *     def get_transform(self):
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:             # <<<<<<<<<<<<<<
 *             self._transform = self.read_transform()
 *         return self._transform
 */
  }

  /* "rasterio/_base.pyx":504
 *         if not self._read and self._transform is None:
 *             self._transform = self.read_transform()
 *         return self._transform             # <<<<<<<<<<<<<<
 * 
 *     property transform:
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_transform);
  __pyx_r = __pyx_v_self->_transform;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":500
 *             return self._crs_wkt
 * 
 *     def get_transform(self):             # <<<<<<<<<<<<<<
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.get_transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":525
 *         for more details.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             warnings.warn(
 *                     "The value of this property will change in version 1.0. "
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_9transform_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_9transform_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_9transform___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_9transform___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":526
 *         """
 *         def __get__(self):
 *             warnings.warn(             # <<<<<<<<<<<<<<
 *                     "The value of this property will change in version 1.0. "
 *                     "Please see https://github.com/mapbox/rasterio/issues/86 "
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_warnings); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_warn); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":530
 *                     "Please see https://github.com/mapbox/rasterio/issues/86 "
 *                     "for details.",
 *                     FutureWarning,             # <<<<<<<<<<<<<<
 *                     stacklevel=2)
 *             return self.get_transform()
 */
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_kp_s_The_value_of_this_property_will);
  __Pyx_GIVEREF(__pyx_kp_s_The_value_of_this_property_will);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_s_The_value_of_this_property_will);
  __Pyx_INCREF(__pyx_builtin_FutureWarning);
  __Pyx_GIVEREF(__pyx_builtin_FutureWarning);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_builtin_FutureWarning);

  /* "rasterio/_base.pyx":531
 *                     "for details.",
 *                     FutureWarning,
 *                     stacklevel=2)             # <<<<<<<<<<<<<<
 *             return self.get_transform()
 * 
 */
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_stacklevel, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":526
 *         """
 *         def __get__(self):
 *             warnings.warn(             # <<<<<<<<<<<<<<
 *                     "The value of this property will change in version 1.0. "
 *                     "Please see https://github.com/mapbox/rasterio/issues/86 "
 */
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":532
 *                     FutureWarning,
 *                     stacklevel=2)
 *             return self.get_transform()             # <<<<<<<<<<<<<<
 * 
 *     property affine:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_transform); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_1) {
    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":525
 *         for more details.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             warnings.warn(
 *                     "The value of this property will change in version 1.0. "
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.transform.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":539
 *         (above) for more details.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return Affine.from_gdal(*self.get_transform())
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6affine_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6affine_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6affine___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6affine___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":540
 *         """
 *         def __get__(self):
 *             return Affine.from_gdal(*self.get_transform())             # <<<<<<<<<<<<<<
 * 
 *     def tags(self, bidx=0, ns=None):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_Affine); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_from_gdal); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_transform); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PySequence_Tuple(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":539
 *         (above) for more details.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return Affine.from_gdal(*self.get_transform())
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.affine.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":542
 *             return Affine.from_gdal(*self.get_transform())
 * 
 *     def tags(self, bidx=0, ns=None):             # <<<<<<<<<<<<<<
 *         """Returns a dict containing copies of the dataset or band's
 *         tags.
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_60tags(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_59tags[] = "Returns a dict containing copies of the dataset or band's\n        tags.\n\n        Tags are pairs of key and value strings. Tags belong to\n        namespaces.  The standard namespaces are: default (None) and\n        'IMAGE_STRUCTURE'.  Applications can create their own additional\n        namespaces.\n\n        The optional bidx argument can be used to select the tags of\n        a specific band. The optional ns argument can be used to select\n        a namespace other than the default.\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_60tags(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_bidx = 0;
  PyObject *__pyx_v_ns = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tags (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_bidx,&__pyx_n_s_ns,0};
    PyObject* values[2] = {0,0};
    values[0] = ((PyObject *)__pyx_int_0);
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bidx);
          if (value) { values[0] = value; kw_args--; }
        }
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ns);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tags") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_bidx = values[0];
    __pyx_v_ns = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("tags", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.tags", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_59tags(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_bidx, __pyx_v_ns);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_59tags(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx, PyObject *__pyx_v_ns) {
  char *__pyx_v_item_c;
  void *__pyx_v_hobj;
  char const *__pyx_v_domain_c;
  char **__pyx_v_papszStrList;
  PyObject *__pyx_v_domain_b = NULL;
  int __pyx_v_num_items;
  PyObject *__pyx_v_retval = NULL;
  int __pyx_v_i;
  char *__pyx_v_item_b;
  PyObject *__pyx_v_item = NULL;
  PyObject *__pyx_v_key = NULL;
  PyObject *__pyx_v_value = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  void *__pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  char const *__pyx_t_7;
  int __pyx_t_8;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *(*__pyx_t_11)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("tags", 0);

  /* "rasterio/_base.pyx":559
 *         cdef const char *domain_c
 *         cdef char **papszStrList
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         if bidx > 0:
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":560
 *         cdef char **papszStrList
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx > 0:
 *             if bidx not in self.indexes:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":559
 *         cdef const char *domain_c
 *         cdef char **papszStrList
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         if bidx > 0:
 */
  }

  /* "rasterio/_base.pyx":561
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")
 *         if bidx > 0:             # <<<<<<<<<<<<<<
 *             if bidx not in self.indexes:
 *                 raise ValueError("Invalid band index")
 */
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_bidx, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":562
 *             raise ValueError("can't read closed raster file")
 *         if bidx > 0:
 *             if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Invalid band index")
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_indexes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_v_bidx, __pyx_t_2, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_3 = (__pyx_t_1 != 0);
    if (__pyx_t_3) {

      /* "rasterio/_base.pyx":563
 *         if bidx > 0:
 *             if bidx not in self.indexes:
 *                 raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)
 *             if hobj == NULL:
 */
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_Raise(__pyx_t_2, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":562
 *             raise ValueError("can't read closed raster file")
 *         if bidx > 0:
 *             if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Invalid band index")
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
    }

    /* "rasterio/_base.pyx":564
 *             if bidx not in self.indexes:
 *                 raise ValueError("Invalid band index")
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *             if hobj == NULL:
 *                 raise ValueError("NULL band")
 */
    __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_hobj = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_4);

    /* "rasterio/_base.pyx":565
 *                 raise ValueError("Invalid band index")
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)
 *             if hobj == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("NULL band")
 *         else:
 */
    __pyx_t_3 = ((__pyx_v_hobj == NULL) != 0);
    if (__pyx_t_3) {

      /* "rasterio/_base.pyx":566
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)
 *             if hobj == NULL:
 *                 raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         else:
 *             hobj = self._hds
 */
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_Raise(__pyx_t_2, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":565
 *                 raise ValueError("Invalid band index")
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)
 *             if hobj == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("NULL band")
 *         else:
 */
    }

    /* "rasterio/_base.pyx":561
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")
 *         if bidx > 0:             # <<<<<<<<<<<<<<
 *             if bidx not in self.indexes:
 *                 raise ValueError("Invalid band index")
 */
    goto __pyx_L4;
  }

  /* "rasterio/_base.pyx":568
 *                 raise ValueError("NULL band")
 *         else:
 *             hobj = self._hds             # <<<<<<<<<<<<<<
 *         if ns:
 *             domain_b = ns.encode('utf-8')
 */
  /*else*/ {
    __pyx_t_5 = __pyx_v_self->_hds;
    __pyx_v_hobj = __pyx_t_5;
  }
  __pyx_L4:;

  /* "rasterio/_base.pyx":569
 *         else:
 *             hobj = self._hds
 *         if ns:             # <<<<<<<<<<<<<<
 *             domain_b = ns.encode('utf-8')
 *             domain_c = domain_b
 */
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_ns); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":570
 *             hobj = self._hds
 *         if ns:
 *             domain_b = ns.encode('utf-8')             # <<<<<<<<<<<<<<
 *             domain_c = domain_b
 *         else:
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_ns, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__37, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_domain_b = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "rasterio/_base.pyx":571
 *         if ns:
 *             domain_b = ns.encode('utf-8')
 *             domain_c = domain_b             # <<<<<<<<<<<<<<
 *         else:
 *             domain_c = NULL
 */
    __pyx_t_7 = __Pyx_PyObject_AsString(__pyx_v_domain_b); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_domain_c = __pyx_t_7;

    /* "rasterio/_base.pyx":569
 *         else:
 *             hobj = self._hds
 *         if ns:             # <<<<<<<<<<<<<<
 *             domain_b = ns.encode('utf-8')
 *             domain_c = domain_b
 */
    goto __pyx_L7;
  }

  /* "rasterio/_base.pyx":573
 *             domain_c = domain_b
 *         else:
 *             domain_c = NULL             # <<<<<<<<<<<<<<
 *         papszStrList = _gdal.GDALGetMetadata(hobj, domain_c)
 *         num_items = _gdal.CSLCount(papszStrList)
 */
  /*else*/ {
    __pyx_v_domain_c = NULL;
  }
  __pyx_L7:;

  /* "rasterio/_base.pyx":574
 *         else:
 *             domain_c = NULL
 *         papszStrList = _gdal.GDALGetMetadata(hobj, domain_c)             # <<<<<<<<<<<<<<
 *         num_items = _gdal.CSLCount(papszStrList)
 *         retval = {}
 */
  __pyx_v_papszStrList = GDALGetMetadata(__pyx_v_hobj, __pyx_v_domain_c);

  /* "rasterio/_base.pyx":575
 *             domain_c = NULL
 *         papszStrList = _gdal.GDALGetMetadata(hobj, domain_c)
 *         num_items = _gdal.CSLCount(papszStrList)             # <<<<<<<<<<<<<<
 *         retval = {}
 *         for i in range(num_items):
 */
  __pyx_v_num_items = CSLCount(__pyx_v_papszStrList);

  /* "rasterio/_base.pyx":576
 *         papszStrList = _gdal.GDALGetMetadata(hobj, domain_c)
 *         num_items = _gdal.CSLCount(papszStrList)
 *         retval = {}             # <<<<<<<<<<<<<<
 *         for i in range(num_items):
 *             item_c = papszStrList[i]
 */
  __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_v_retval = ((PyObject*)__pyx_t_6);
  __pyx_t_6 = 0;

  /* "rasterio/_base.pyx":577
 *         num_items = _gdal.CSLCount(papszStrList)
 *         retval = {}
 *         for i in range(num_items):             # <<<<<<<<<<<<<<
 *             item_c = papszStrList[i]
 *             item_b = item_c
 */
  __pyx_t_4 = __pyx_v_num_items;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_4; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;

    /* "rasterio/_base.pyx":578
 *         retval = {}
 *         for i in range(num_items):
 *             item_c = papszStrList[i]             # <<<<<<<<<<<<<<
 *             item_b = item_c
 *             item = item_b.decode('utf-8')
 */
    __pyx_v_item_c = (__pyx_v_papszStrList[__pyx_v_i]);

    /* "rasterio/_base.pyx":579
 *         for i in range(num_items):
 *             item_c = papszStrList[i]
 *             item_b = item_c             # <<<<<<<<<<<<<<
 *             item = item_b.decode('utf-8')
 *             key, value = item.split('=', 1)
 */
    __pyx_v_item_b = __pyx_v_item_c;

    /* "rasterio/_base.pyx":580
 *             item_c = papszStrList[i]
 *             item_b = item_c
 *             item = item_b.decode('utf-8')             # <<<<<<<<<<<<<<
 *             key, value = item.split('=', 1)
 *             retval[key] = value
 */
    __pyx_t_6 = __Pyx_decode_c_string(__pyx_v_item_b, 0, strlen(__pyx_v_item_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_6);
    __pyx_t_6 = 0;

    /* "rasterio/_base.pyx":581
 *             item_b = item_c
 *             item = item_b.decode('utf-8')
 *             key, value = item.split('=', 1)             # <<<<<<<<<<<<<<
 *             retval[key] = value
 *         return retval
 */
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_item, __pyx_n_s_split); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
      PyObject* sequence = __pyx_t_2;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_9 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_9);
      #else
      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      #endif
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_10 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_11 = Py_TYPE(__pyx_t_10)->tp_iternext;
      index = 0; __pyx_t_6 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_6)) goto __pyx_L10_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      index = 1; __pyx_t_9 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_9)) goto __pyx_L10_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_9);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_11 = NULL;
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      goto __pyx_L11_unpacking_done;
      __pyx_L10_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __pyx_t_11 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_L11_unpacking_done:;
    }
    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_6);
    __pyx_t_6 = 0;
    __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_9);
    __pyx_t_9 = 0;

    /* "rasterio/_base.pyx":582
 *             item = item_b.decode('utf-8')
 *             key, value = item.split('=', 1)
 *             retval[key] = value             # <<<<<<<<<<<<<<
 *         return retval
 * 
 */
    if (unlikely(PyDict_SetItem(__pyx_v_retval, __pyx_v_key, __pyx_v_value) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "rasterio/_base.pyx":583
 *             key, value = item.split('=', 1)
 *             retval[key] = value
 *         return retval             # <<<<<<<<<<<<<<
 * 
 *     def colorinterp(self, bidx):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_retval);
  __pyx_r = __pyx_v_retval;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":542
 *             return Affine.from_gdal(*self.get_transform())
 * 
 *     def tags(self, bidx=0, ns=None):             # <<<<<<<<<<<<<<
 *         """Returns a dict containing copies of the dataset or band's
 *         tags.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.tags", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_domain_b);
  __Pyx_XDECREF(__pyx_v_retval);
  __Pyx_XDECREF(__pyx_v_item);
  __Pyx_XDECREF(__pyx_v_key);
  __Pyx_XDECREF(__pyx_v_value);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":585
 *         return retval
 * 
 *     def colorinterp(self, bidx):             # <<<<<<<<<<<<<<
 *         """Returns the color interpretation for a band or None."""
 *         cdef void *hBand
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_62colorinterp(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_61colorinterp[] = "Returns the color interpretation for a band or None.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_62colorinterp(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("colorinterp (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_61colorinterp(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_bidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_61colorinterp(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  void *__pyx_v_hBand;
  int __pyx_v_value;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("colorinterp", 0);

  /* "rasterio/_base.pyx":589
 *         cdef void *hBand
 * 
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":590
 * 
 *         if self._hds == NULL:
 *           raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 590; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 590; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":589
 *         cdef void *hBand
 * 
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 */
  }

  /* "rasterio/_base.pyx":591
 *         if self._hds == NULL:
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_indexes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_v_bidx, __pyx_t_2, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = (__pyx_t_1 != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":592
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__40, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":591
 *         if self._hds == NULL:
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  }

  /* "rasterio/_base.pyx":593
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *         if hBand == NULL:
 *             raise ValueError("NULL band")
 */
  __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_hBand = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_4);

  /* "rasterio/_base.pyx":594
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 */
  __pyx_t_3 = ((__pyx_v_hBand == NULL) != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":595
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 *         return ColorInterp(value)
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__41, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":594
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 */
  }

  /* "rasterio/_base.pyx":596
 *         if hBand == NULL:
 *             raise ValueError("NULL band")
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)             # <<<<<<<<<<<<<<
 *         return ColorInterp(value)
 * 
 */
  __pyx_v_value = GDALGetRasterColorInterpretation(__pyx_v_hBand);

  /* "rasterio/_base.pyx":597
 *             raise ValueError("NULL band")
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 *         return ColorInterp(value)             # <<<<<<<<<<<<<<
 * 
 *     def colormap(self, bidx):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_ColorInterp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_value); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_7)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_7);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (!__pyx_t_7) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_GOTREF(__pyx_t_2);
  } else {
    __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __pyx_t_7 = NULL;
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":585
 *         return retval
 * 
 *     def colorinterp(self, bidx):             # <<<<<<<<<<<<<<
 *         """Returns the color interpretation for a band or None."""
 *         cdef void *hBand
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.colorinterp", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":599
 *         return ColorInterp(value)
 * 
 *     def colormap(self, bidx):             # <<<<<<<<<<<<<<
 *         """Returns a dict containing the colormap for a band or None."""
 *         cdef void *hBand
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_64colormap(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_63colormap[] = "Returns a dict containing the colormap for a band or None.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_64colormap(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("colormap (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_63colormap(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_bidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_63colormap(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  void *__pyx_v_hBand;
  void *__pyx_v_hTable;
  int __pyx_v_i;
  GDALColorEntry const *__pyx_v_color;
  PyObject *__pyx_v_retval = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  Py_ssize_t __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  PyObject *__pyx_t_13 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("colormap", 0);

  /* "rasterio/_base.pyx":605
 *         cdef int i
 *         cdef const _gdal.GDALColorEntry * color
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":606
 *         cdef const _gdal.GDALColorEntry * color
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__42, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":605
 *         cdef int i
 *         cdef const _gdal.GDALColorEntry * color
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 */
  }

  /* "rasterio/_base.pyx":607
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_indexes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_v_bidx, __pyx_t_2, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = (__pyx_t_1 != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":608
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__43, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":607
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  }

  /* "rasterio/_base.pyx":609
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *         if hBand == NULL:
 *             raise ValueError("NULL band")
 */
  __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_hBand = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_4);

  /* "rasterio/_base.pyx":610
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 */
  __pyx_t_3 = ((__pyx_v_hBand == NULL) != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":611
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__44, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":610
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 */
  }

  /* "rasterio/_base.pyx":612
 *         if hBand == NULL:
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)             # <<<<<<<<<<<<<<
 *         if hTable == NULL:
 *             raise ValueError("NULL color table")
 */
  __pyx_v_hTable = GDALGetRasterColorTable(__pyx_v_hBand);

  /* "rasterio/_base.pyx":613
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL color table")
 *         retval = {}
 */
  __pyx_t_3 = ((__pyx_v_hTable == NULL) != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":614
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:
 *             raise ValueError("NULL color table")             # <<<<<<<<<<<<<<
 *         retval = {}
 * 
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__45, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":613
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL color table")
 *         retval = {}
 */
  }

  /* "rasterio/_base.pyx":615
 *         if hTable == NULL:
 *             raise ValueError("NULL color table")
 *         retval = {}             # <<<<<<<<<<<<<<
 * 
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):
 */
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_retval = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":617
 *         retval = {}
 * 
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):             # <<<<<<<<<<<<<<
 *             color = _gdal.GDALGetColorEntry(hTable, i)
 *             if color == NULL:
 */
  __pyx_t_4 = GDALGetColorEntryCount(__pyx_v_hTable);
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_i = __pyx_t_5;

    /* "rasterio/_base.pyx":618
 * 
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):
 *             color = _gdal.GDALGetColorEntry(hTable, i)             # <<<<<<<<<<<<<<
 *             if color == NULL:
 *                 log.warn("NULL color at %d, skipping", i)
 */
    __pyx_v_color = GDALGetColorEntry(__pyx_v_hTable, __pyx_v_i);

    /* "rasterio/_base.pyx":619
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):
 *             color = _gdal.GDALGetColorEntry(hTable, i)
 *             if color == NULL:             # <<<<<<<<<<<<<<
 *                 log.warn("NULL color at %d, skipping", i)
 *                 continue
 */
    __pyx_t_3 = ((__pyx_v_color == NULL) != 0);
    if (__pyx_t_3) {

      /* "rasterio/_base.pyx":620
 *             color = _gdal.GDALGetColorEntry(hTable, i)
 *             if color == NULL:
 *                 log.warn("NULL color at %d, skipping", i)             # <<<<<<<<<<<<<<
 *                 continue
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)
 */
      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_warn); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = NULL;
      __pyx_t_9 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) {
        __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
        if (likely(__pyx_t_8)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
          __Pyx_INCREF(__pyx_t_8);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_7, function);
          __pyx_t_9 = 1;
        }
      }
      __pyx_t_10 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      if (__pyx_t_8) {
        __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_NULL_color_at_d_skipping);
      __Pyx_GIVEREF(__pyx_kp_s_NULL_color_at_d_skipping);
      PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_9, __pyx_kp_s_NULL_color_at_d_skipping);
      __Pyx_GIVEREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_9, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_10, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":621
 *             if color == NULL:
 *                 log.warn("NULL color at %d, skipping", i)
 *                 continue             # <<<<<<<<<<<<<<
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)
 *             retval[i] = (color.c1, color.c2, color.c3, color.c4)
 */
      goto __pyx_L7_continue;

      /* "rasterio/_base.pyx":619
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):
 *             color = _gdal.GDALGetColorEntry(hTable, i)
 *             if color == NULL:             # <<<<<<<<<<<<<<
 *                 log.warn("NULL color at %d, skipping", i)
 *                 continue
 */
    }

    /* "rasterio/_base.pyx":622
 *                 log.warn("NULL color at %d, skipping", i)
 *                 continue
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)             # <<<<<<<<<<<<<<
 *             retval[i] = (color.c1, color.c2, color.c3, color.c4)
 *         return retval
 */
    __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_info); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = __Pyx_PyInt_From_short(__pyx_v_color->c1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_6 = __Pyx_PyInt_From_short(__pyx_v_color->c2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = __Pyx_PyInt_From_short(__pyx_v_color->c3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_11 = __Pyx_PyInt_From_short(__pyx_v_color->c4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    __pyx_t_12 = NULL;
    __pyx_t_9 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_10))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_10, function);
        __pyx_t_9 = 1;
      }
    }
    __pyx_t_13 = PyTuple_New(5+__pyx_t_9); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_13);
    if (__pyx_t_12) {
      __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12); __pyx_t_12 = NULL;
    }
    __Pyx_INCREF(__pyx_kp_s_Color_d_d_d_d);
    __Pyx_GIVEREF(__pyx_kp_s_Color_d_d_d_d);
    PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_9, __pyx_kp_s_Color_d_d_d_d);
    __Pyx_GIVEREF(__pyx_t_7);
    PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_9, __pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_13, 2+__pyx_t_9, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_8);
    PyTuple_SET_ITEM(__pyx_t_13, 3+__pyx_t_9, __pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_11);
    PyTuple_SET_ITEM(__pyx_t_13, 4+__pyx_t_9, __pyx_t_11);
    __pyx_t_7 = 0;
    __pyx_t_6 = 0;
    __pyx_t_8 = 0;
    __pyx_t_11 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_13, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":623
 *                 continue
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)
 *             retval[i] = (color.c1, color.c2, color.c3, color.c4)             # <<<<<<<<<<<<<<
 *         return retval
 * 
 */
    __pyx_t_2 = __Pyx_PyInt_From_short(__pyx_v_color->c1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_10 = __Pyx_PyInt_From_short(__pyx_v_color->c2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __pyx_t_13 = __Pyx_PyInt_From_short(__pyx_v_color->c3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_11 = __Pyx_PyInt_From_short(__pyx_v_color->c4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_10);
    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
    __Pyx_GIVEREF(__pyx_t_13);
    PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_13);
    __Pyx_GIVEREF(__pyx_t_11);
    PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_11);
    __pyx_t_2 = 0;
    __pyx_t_10 = 0;
    __pyx_t_13 = 0;
    __pyx_t_11 = 0;
    __pyx_t_11 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    if (unlikely(PyDict_SetItem(__pyx_v_retval, __pyx_t_11, __pyx_t_8) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_L7_continue:;
  }

  /* "rasterio/_base.pyx":624
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)
 *             retval[i] = (color.c1, color.c2, color.c3, color.c4)
 *         return retval             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_retval);
  __pyx_r = __pyx_v_retval;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":599
 *         return ColorInterp(value)
 * 
 *     def colormap(self, bidx):             # <<<<<<<<<<<<<<
 *         """Returns a dict containing the colormap for a band or None."""
 *         cdef void *hBand
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.colormap", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_retval);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":627
 * 
 *     @property
 *     def kwds(self):             # <<<<<<<<<<<<<<
 *         return self.tags(ns='rio_creation_kwds')
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_66kwds(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_66kwds(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("kwds (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_65kwds(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_65kwds(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("kwds", 0);

  /* "rasterio/_base.pyx":628
 *     @property
 *     def kwds(self):
 *         return self.tags(ns='rio_creation_kwds')             # <<<<<<<<<<<<<<
 * 
 *     # Overviews.
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ns, __pyx_n_s_rio_creation_kwds) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":627
 * 
 *     @property
 *     def kwds(self):             # <<<<<<<<<<<<<<
 *         return self.tags(ns='rio_creation_kwds')
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.kwds", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":631
 * 
 *     # Overviews.
 *     def overviews(self, bidx):             # <<<<<<<<<<<<<<
 *         cdef void *hovband = NULL
 *         cdef void *hband = self.band(bidx)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_68overviews(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_68overviews(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("overviews (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_67overviews(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_bidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_67overviews(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  void *__pyx_v_hovband;
  void *__pyx_v_hband;
  int __pyx_v_num_overviews;
  PyObject *__pyx_v_factors = NULL;
  int __pyx_v_i;
  int __pyx_v_xsize;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  double __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_t_6;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("overviews", 0);

  /* "rasterio/_base.pyx":632
 *     # Overviews.
 *     def overviews(self, bidx):
 *         cdef void *hovband = NULL             # <<<<<<<<<<<<<<
 *         cdef void *hband = self.band(bidx)
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)
 */
  __pyx_v_hovband = NULL;

  /* "rasterio/_base.pyx":633
 *     def overviews(self, bidx):
 *         cdef void *hovband = NULL
 *         cdef void *hband = self.band(bidx)             # <<<<<<<<<<<<<<
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)
 *         factors = []
 */
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_hband = ((struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader *)__pyx_v_self->__pyx_vtab)->band(__pyx_v_self, __pyx_t_1);

  /* "rasterio/_base.pyx":634
 *         cdef void *hovband = NULL
 *         cdef void *hband = self.band(bidx)
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)             # <<<<<<<<<<<<<<
 *         factors = []
 *         for i in range(num_overviews):
 */
  __pyx_v_num_overviews = GDALGetOverviewCount(__pyx_v_hband);

  /* "rasterio/_base.pyx":635
 *         cdef void *hband = self.band(bidx)
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)
 *         factors = []             # <<<<<<<<<<<<<<
 *         for i in range(num_overviews):
 *             hovband = _gdal.GDALGetOverview(hband, i)
 */
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_factors = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":636
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)
 *         factors = []
 *         for i in range(num_overviews):             # <<<<<<<<<<<<<<
 *             hovband = _gdal.GDALGetOverview(hband, i)
 *             # Compute the overview factor only from the xsize (width).
 */
  __pyx_t_1 = __pyx_v_num_overviews;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_1; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;

    /* "rasterio/_base.pyx":637
 *         factors = []
 *         for i in range(num_overviews):
 *             hovband = _gdal.GDALGetOverview(hband, i)             # <<<<<<<<<<<<<<
 *             # Compute the overview factor only from the xsize (width).
 *             xsize = _gdal.GDALGetRasterBandXSize(hovband)
 */
    __pyx_v_hovband = GDALGetOverview(__pyx_v_hband, __pyx_v_i);

    /* "rasterio/_base.pyx":639
 *             hovband = _gdal.GDALGetOverview(hband, i)
 *             # Compute the overview factor only from the xsize (width).
 *             xsize = _gdal.GDALGetRasterBandXSize(hovband)             # <<<<<<<<<<<<<<
 *             factors.append(int(round(float(self.width)/float(xsize))))
 *         return factors
 */
    __pyx_v_xsize = GDALGetRasterBandXSize(__pyx_v_hovband);

    /* "rasterio/_base.pyx":640
 *             # Compute the overview factor only from the xsize (width).
 *             xsize = _gdal.GDALGetRasterBandXSize(hovband)
 *             factors.append(int(round(float(self.width)/float(xsize))))             # <<<<<<<<<<<<<<
 *         return factors
 * 
 */
    __pyx_t_4 = __Pyx_PyObject_AsDouble(__pyx_v_self->width); if (unlikely(__pyx_t_4 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (unlikely(((double)__pyx_v_xsize) == 0)) {
      PyErr_SetString(PyExc_ZeroDivisionError, "float division");
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_2 = PyFloat_FromDouble((__pyx_t_4 / ((double)__pyx_v_xsize))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2);
    __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_round, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = PyNumber_Int(__pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_6 = __Pyx_PyList_Append(__pyx_v_factors, __pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }

  /* "rasterio/_base.pyx":641
 *             xsize = _gdal.GDALGetRasterBandXSize(hovband)
 *             factors.append(int(round(float(self.width)/float(xsize))))
 *         return factors             # <<<<<<<<<<<<<<
 * 
 *     def checksum(self, bidx, window=None):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_factors);
  __pyx_r = __pyx_v_factors;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":631
 * 
 *     # Overviews.
 *     def overviews(self, bidx):             # <<<<<<<<<<<<<<
 *         cdef void *hovband = NULL
 *         cdef void *hband = self.band(bidx)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.overviews", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_factors);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":643
 *         return factors
 * 
 *     def checksum(self, bidx, window=None):             # <<<<<<<<<<<<<<
 *         """Compute an integer checksum for the stored band
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_70checksum(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_69checksum[] = "Compute an integer checksum for the stored band\n\n        Parameters\n        ----------\n        bidx : int\n            The band's index (1-indexed).\n        window: tuple, optional\n            A window of the band. Default is the entire extent of the band.\n\n        Returns\n        -------\n        An int.\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_70checksum(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_bidx = 0;
  PyObject *__pyx_v_window = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("checksum (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_bidx,&__pyx_n_s_window,0};
    PyObject* values[2] = {0,0};
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bidx)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_window);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "checksum") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_bidx = values[0];
    __pyx_v_window = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("checksum", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.checksum", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_69checksum(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_bidx, __pyx_v_window);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_69checksum(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx, PyObject *__pyx_v_window) {
  void *__pyx_v_hband;
  int __pyx_v_xoff;
  int __pyx_v_yoff;
  int __pyx_v_width;
  int __pyx_v_height;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("checksum", 0);
  __Pyx_INCREF(__pyx_v_window);

  /* "rasterio/_base.pyx":657
 *         An int.
 *         """
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":659
 *         cdef void *hband = NULL
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":660
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__46, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":659
 *         cdef void *hband = NULL
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  }

  /* "rasterio/_base.pyx":661
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *         if hband == NULL:
 *             raise ValueError("NULL band")
 */
  __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_3);

  /* "rasterio/_base.pyx":662
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         if not window:
 */
  __pyx_t_1 = ((__pyx_v_hband == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":663
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         if not window:
 *             xoff = yoff = 0
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__47, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":662
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         if not window:
 */
  }

  /* "rasterio/_base.pyx":664
 *         if hband == NULL:
 *             raise ValueError("NULL band")
 *         if not window:             # <<<<<<<<<<<<<<
 *             xoff = yoff = 0
 *             width, height = self.width, self.height
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_window); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = ((!__pyx_t_1) != 0);
  if (__pyx_t_4) {

    /* "rasterio/_base.pyx":665
 *             raise ValueError("NULL band")
 *         if not window:
 *             xoff = yoff = 0             # <<<<<<<<<<<<<<
 *             width, height = self.width, self.height
 *         else:
 */
    __pyx_v_xoff = 0;
    __pyx_v_yoff = 0;

    /* "rasterio/_base.pyx":666
 *         if not window:
 *             xoff = yoff = 0
 *             width, height = self.width, self.height             # <<<<<<<<<<<<<<
 *         else:
 *             window = eval_window(window, self.height, self.width)
 */
    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_self->width); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 666; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_self->height); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 666; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_width = __pyx_t_3;
    __pyx_v_height = __pyx_t_5;

    /* "rasterio/_base.pyx":664
 *         if hband == NULL:
 *             raise ValueError("NULL band")
 *         if not window:             # <<<<<<<<<<<<<<
 *             xoff = yoff = 0
 *             width, height = self.width, self.height
 */
    goto __pyx_L5;
  }

  /* "rasterio/_base.pyx":668
 *             width, height = self.width, self.height
 *         else:
 *             window = eval_window(window, self.height, self.width)             # <<<<<<<<<<<<<<
 *             window = crop_window(window, self.height, self.width)
 *             xoff = window[1][0]
 */
  /*else*/ {
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_self->height); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_self->width); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_2 = __pyx_f_8rasterio_5_base_eval_window(__pyx_v_window, __pyx_t_5, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF_SET(__pyx_v_window, __pyx_t_2);
    __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":669
 *         else:
 *             window = eval_window(window, self.height, self.width)
 *             window = crop_window(window, self.height, self.width)             # <<<<<<<<<<<<<<
 *             xoff = window[1][0]
 *             width = window[1][1] - xoff
 */
    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_self->height); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_self->width); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_2 = __pyx_f_8rasterio_5_base_crop_window(__pyx_v_window, __pyx_t_3, __pyx_t_5, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF_SET(__pyx_v_window, __pyx_t_2);
    __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":670
 *             window = eval_window(window, self.height, self.width)
 *             window = crop_window(window, self.height, self.width)
 *             xoff = window[1][0]             # <<<<<<<<<<<<<<
 *             width = window[1][1] - xoff
 *             yoff = window[0][0]
 */
    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_window, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_xoff = __pyx_t_5;

    /* "rasterio/_base.pyx":671
 *             window = crop_window(window, self.height, self.width)
 *             xoff = window[1][0]
 *             width = window[1][1] - xoff             # <<<<<<<<<<<<<<
 *             yoff = window[0][0]
 *             height = window[0][1] - yoff
 */
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_window, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_6, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_xoff); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = PyNumber_Subtract(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_7); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_v_width = __pyx_t_5;

    /* "rasterio/_base.pyx":672
 *             xoff = window[1][0]
 *             width = window[1][1] - xoff
 *             yoff = window[0][0]             # <<<<<<<<<<<<<<
 *             height = window[0][1] - yoff
 *         return _gdal.GDALChecksumImage(hband, xoff, yoff, width, height)
 */
    __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_window, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_7, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_yoff = __pyx_t_5;

    /* "rasterio/_base.pyx":673
 *             width = window[1][1] - xoff
 *             yoff = window[0][0]
 *             height = window[0][1] - yoff             # <<<<<<<<<<<<<<
 *         return _gdal.GDALChecksumImage(hband, xoff, yoff, width, height)
 * 
 */
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_window, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_6, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_yoff); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_2 = PyNumber_Subtract(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_height = __pyx_t_5;
  }
  __pyx_L5:;

  /* "rasterio/_base.pyx":674
 *             yoff = window[0][0]
 *             height = window[0][1] - yoff
 *         return _gdal.GDALChecksumImage(hband, xoff, yoff, width, height)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_From_int(GDALChecksumImage(__pyx_v_hband, __pyx_v_xoff, __pyx_v_yoff, __pyx_v_width, __pyx_v_height)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":643
 *         return factors
 * 
 *     def checksum(self, bidx, window=None):             # <<<<<<<<<<<<<<
 *         """Compute an integer checksum for the stored band
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.checksum", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_window);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":8
 *     cdef void *_hds
 * 
 *     cdef readonly object name             # <<<<<<<<<<<<<<
 *     cdef readonly object mode
 *     cdef readonly object width, height
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4name_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4name___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4name___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->name);
  __pyx_r = __pyx_v_self->name;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":9
 * 
 *     cdef readonly object name
 *     cdef readonly object mode             # <<<<<<<<<<<<<<
 *     cdef readonly object width, height
 *     cdef readonly object shape
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4mode_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4mode_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4mode___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4mode___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->mode);
  __pyx_r = __pyx_v_self->mode;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":10
 *     cdef readonly object name
 *     cdef readonly object mode
 *     cdef readonly object width, height             # <<<<<<<<<<<<<<
 *     cdef readonly object shape
 *     cdef public object driver
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5width_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5width_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5width___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5width___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->width);
  __pyx_r = __pyx_v_self->width;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6height_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6height_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6height___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6height___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->height);
  __pyx_r = __pyx_v_self->height;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":11
 *     cdef readonly object mode
 *     cdef readonly object width, height
 *     cdef readonly object shape             # <<<<<<<<<<<<<<
 *     cdef public object driver
 *     cdef public object _count
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5shape_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5shape___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5shape___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->shape);
  __pyx_r = __pyx_v_self->shape;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":12
 *     cdef readonly object width, height
 *     cdef readonly object shape
 *     cdef public object driver             # <<<<<<<<<<<<<<
 *     cdef public object _count
 *     cdef public object _dtypes
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6driver_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6driver_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6driver___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6driver___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->driver);
  __pyx_r = __pyx_v_self->driver;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->driver);
  __Pyx_DECREF(__pyx_v_self->driver);
  __pyx_v_self->driver = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->driver);
  __Pyx_DECREF(__pyx_v_self->driver);
  __pyx_v_self->driver = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":13
 *     cdef readonly object shape
 *     cdef public object driver
 *     cdef public object _count             # <<<<<<<<<<<<<<
 *     cdef public object _dtypes
 *     cdef public object _closed
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6_count_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6_count_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6_count___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6_count___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_count);
  __pyx_r = __pyx_v_self->_count;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_count);
  __Pyx_DECREF(__pyx_v_self->_count);
  __pyx_v_self->_count = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_count);
  __Pyx_DECREF(__pyx_v_self->_count);
  __pyx_v_self->_count = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":14
 *     cdef public object driver
 *     cdef public object _count
 *     cdef public object _dtypes             # <<<<<<<<<<<<<<
 *     cdef public object _closed
 *     cdef public object _crs
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_dtypes);
  __pyx_r = __pyx_v_self->_dtypes;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_dtypes);
  __Pyx_DECREF(__pyx_v_self->_dtypes);
  __pyx_v_self->_dtypes = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_dtypes);
  __Pyx_DECREF(__pyx_v_self->_dtypes);
  __pyx_v_self->_dtypes = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":15
 *     cdef public object _count
 *     cdef public object _dtypes
 *     cdef public object _closed             # <<<<<<<<<<<<<<
 *     cdef public object _crs
 *     cdef public object _crs_wkt
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7_closed___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_closed);
  __pyx_r = __pyx_v_self->_closed;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":16
 *     cdef public object _dtypes
 *     cdef public object _closed
 *     cdef public object _crs             # <<<<<<<<<<<<<<
 *     cdef public object _crs_wkt
 *     cdef public object _transform
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4_crs___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_crs);
  __pyx_r = __pyx_v_self->_crs;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_crs);
  __Pyx_DECREF(__pyx_v_self->_crs);
  __pyx_v_self->_crs = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_crs);
  __Pyx_DECREF(__pyx_v_self->_crs);
  __pyx_v_self->_crs = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":17
 *     cdef public object _closed
 *     cdef public object _crs
 *     cdef public object _crs_wkt             # <<<<<<<<<<<<<<
 *     cdef public object _transform
 *     cdef public object _block_shapes
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_crs_wkt);
  __pyx_r = __pyx_v_self->_crs_wkt;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_crs_wkt);
  __Pyx_DECREF(__pyx_v_self->_crs_wkt);
  __pyx_v_self->_crs_wkt = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_crs_wkt);
  __Pyx_DECREF(__pyx_v_self->_crs_wkt);
  __pyx_v_self->_crs_wkt = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":18
 *     cdef public object _crs
 *     cdef public object _crs_wkt
 *     cdef public object _transform             # <<<<<<<<<<<<<<
 *     cdef public object _block_shapes
 *     cdef public object _nodatavals
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10_transform___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_transform);
  __pyx_r = __pyx_v_self->_transform;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_transform);
  __Pyx_DECREF(__pyx_v_self->_transform);
  __pyx_v_self->_transform = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_transform);
  __Pyx_DECREF(__pyx_v_self->_transform);
  __pyx_v_self->_transform = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":19
 *     cdef public object _crs_wkt
 *     cdef public object _transform
 *     cdef public object _block_shapes             # <<<<<<<<<<<<<<
 *     cdef public object _nodatavals
 *     cdef public object _read
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_block_shapes);
  __pyx_r = __pyx_v_self->_block_shapes;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_block_shapes);
  __Pyx_DECREF(__pyx_v_self->_block_shapes);
  __pyx_v_self->_block_shapes = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_block_shapes);
  __Pyx_DECREF(__pyx_v_self->_block_shapes);
  __pyx_v_self->_block_shapes = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":20
 *     cdef public object _transform
 *     cdef public object _block_shapes
 *     cdef public object _nodatavals             # <<<<<<<<<<<<<<
 *     cdef public object _read
 *     cdef object env
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_nodatavals);
  __pyx_r = __pyx_v_self->_nodatavals;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_nodatavals);
  __Pyx_DECREF(__pyx_v_self->_nodatavals);
  __pyx_v_self->_nodatavals = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_nodatavals);
  __Pyx_DECREF(__pyx_v_self->_nodatavals);
  __pyx_v_self->_nodatavals = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":21
 *     cdef public object _block_shapes
 *     cdef public object _nodatavals
 *     cdef public object _read             # <<<<<<<<<<<<<<
 *     cdef object env
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5_read_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5_read_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5_read___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5_read___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_read);
  __pyx_r = __pyx_v_self->_read;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_read);
  __Pyx_DECREF(__pyx_v_self->_read);
  __pyx_v_self->_read = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_read);
  __Pyx_DECREF(__pyx_v_self->_read);
  __pyx_v_self->_read = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":681
 * # ((row_start, row_stop), (col_start, col_stop))
 * 
 * cpdef crop_window(object window, int height, int width):             # <<<<<<<<<<<<<<
 *     """Returns a window cropped to fall within height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 */

static PyObject *__pyx_pw_8rasterio_5_base_1crop_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_f_8rasterio_5_base_crop_window(PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width, CYTHON_UNUSED int __pyx_skip_dispatch) {
  int __pyx_v_r_start;
  int __pyx_v_r_stop;
  int __pyx_v_c_start;
  int __pyx_v_c_stop;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *(*__pyx_t_4)(PyObject *);
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  int __pyx_t_8;
  long __pyx_t_9;
  long __pyx_t_10;
  int __pyx_t_11;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("crop_window", 0);

  /* "rasterio/_base.pyx":684
 *     """Returns a window cropped to fall within height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 *     (r_start, r_stop), (c_start, c_stop) = window             # <<<<<<<<<<<<<<
 *     return (
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),
 */
  if ((likely(PyTuple_CheckExact(__pyx_v_window))) || (PyList_CheckExact(__pyx_v_window))) {
    PyObject* sequence = __pyx_v_window;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    #endif
  } else {
    Py_ssize_t index = -1;
    __pyx_t_3 = PyObject_GetIter(__pyx_v_window); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_2 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_3), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    index = 1; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L6_unpacking_done:;
  }
  __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_r_start = __pyx_t_7;
  __pyx_v_r_stop = __pyx_t_8;
  if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
    PyObject* sequence = __pyx_t_2;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L8_unpacking_done;
    __pyx_L7_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L8_unpacking_done:;
  }
  __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_c_start = __pyx_t_8;
  __pyx_v_c_stop = __pyx_t_7;

  /* "rasterio/_base.pyx":685
 *     cdef int r_start, r_stop, c_start, c_stop
 *     (r_start, r_stop), (c_start, c_stop) = window
 *     return (             # <<<<<<<<<<<<<<
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),
 *         (min(max(c_start, 0), width), max(0, min(c_stop, width)))
 */
  __Pyx_XDECREF(__pyx_r);

  /* "rasterio/_base.pyx":686
 *     (r_start, r_stop), (c_start, c_stop) = window
 *     return (
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),             # <<<<<<<<<<<<<<
 *         (min(max(c_start, 0), width), max(0, min(c_stop, width)))
 *     )
 */
  __pyx_t_7 = __pyx_v_height;
  __pyx_t_9 = 0;
  __pyx_t_8 = __pyx_v_r_start;
  if (((__pyx_t_9 > __pyx_t_8) != 0)) {
    __pyx_t_10 = __pyx_t_9;
  } else {
    __pyx_t_10 = __pyx_t_8;
  }
  __pyx_t_9 = __pyx_t_10;
  if (((__pyx_t_7 < __pyx_t_9) != 0)) {
    __pyx_t_10 = __pyx_t_7;
  } else {
    __pyx_t_10 = __pyx_t_9;
  }
  __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = __pyx_v_height;
  __pyx_t_8 = __pyx_v_r_stop;
  if (((__pyx_t_7 < __pyx_t_8) != 0)) {
    __pyx_t_11 = __pyx_t_7;
  } else {
    __pyx_t_11 = __pyx_t_8;
  }
  __pyx_t_7 = __pyx_t_11;
  __pyx_t_10 = 0;
  if (((__pyx_t_7 > __pyx_t_10) != 0)) {
    __pyx_t_9 = __pyx_t_7;
  } else {
    __pyx_t_9 = __pyx_t_10;
  }
  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":687
 *     return (
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),
 *         (min(max(c_start, 0), width), max(0, min(c_stop, width)))             # <<<<<<<<<<<<<<
 *     )
 * 
 */
  __pyx_t_7 = __pyx_v_width;
  __pyx_t_9 = 0;
  __pyx_t_11 = __pyx_v_c_start;
  if (((__pyx_t_9 > __pyx_t_11) != 0)) {
    __pyx_t_10 = __pyx_t_9;
  } else {
    __pyx_t_10 = __pyx_t_11;
  }
  __pyx_t_9 = __pyx_t_10;
  if (((__pyx_t_7 < __pyx_t_9) != 0)) {
    __pyx_t_10 = __pyx_t_7;
  } else {
    __pyx_t_10 = __pyx_t_9;
  }
  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 687; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __pyx_v_width;
  __pyx_t_11 = __pyx_v_c_stop;
  if (((__pyx_t_7 < __pyx_t_11) != 0)) {
    __pyx_t_8 = __pyx_t_7;
  } else {
    __pyx_t_8 = __pyx_t_11;
  }
  __pyx_t_7 = __pyx_t_8;
  __pyx_t_10 = 0;
  if (((__pyx_t_7 > __pyx_t_10) != 0)) {
    __pyx_t_9 = __pyx_t_7;
  } else {
    __pyx_t_9 = __pyx_t_10;
  }
  __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_t_9); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 687; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 687; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":686
 *     (r_start, r_stop), (c_start, c_stop) = window
 *     return (
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),             # <<<<<<<<<<<<<<
 *         (min(max(c_start, 0), width), max(0, min(c_stop, width)))
 *     )
 */
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
  __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":681
 * # ((row_start, row_stop), (col_start, col_stop))
 * 
 * cpdef crop_window(object window, int height, int width):             # <<<<<<<<<<<<<<
 *     """Returns a window cropped to fall within height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.crop_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_1crop_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_crop_window[] = "Returns a window cropped to fall within height and width.";
static PyObject *__pyx_pw_8rasterio_5_base_1crop_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_window = 0;
  int __pyx_v_height;
  int __pyx_v_width;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("crop_window (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_window,&__pyx_n_s_height,&__pyx_n_s_width,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_window)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_height)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("crop_window", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_width)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("crop_window", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "crop_window") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_window = values[0];
    __pyx_v_height = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_height == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    __pyx_v_width = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_width == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("crop_window", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.crop_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_crop_window(__pyx_self, __pyx_v_window, __pyx_v_height, __pyx_v_width);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_crop_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("crop_window", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_8rasterio_5_base_crop_window(__pyx_v_window, __pyx_v_height, __pyx_v_width, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.crop_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":691
 * 
 * 
 * cpdef eval_window(object window, int height, int width):             # <<<<<<<<<<<<<<
 *     """Evaluates a window tuple that might contain negative values
 *     in the context of a raster height and width."""
 */

static PyObject *__pyx_pw_8rasterio_5_base_3eval_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_f_8rasterio_5_base_eval_window(PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width, CYTHON_UNUSED int __pyx_skip_dispatch) {
  int __pyx_v_r_start;
  int __pyx_v_r_stop;
  int __pyx_v_c_start;
  int __pyx_v_c_stop;
  PyObject *__pyx_v_r = NULL;
  PyObject *__pyx_v_c = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  Py_ssize_t __pyx_t_8;
  int __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  int __pyx_t_11;
  int __pyx_t_12;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("eval_window", 0);

  /* "rasterio/_base.pyx":695
 *     in the context of a raster height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 *     try:             # <<<<<<<<<<<<<<
 *         r, c = window
 *         assert len(r) == 2
 */
  {
    __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3);
    __Pyx_XGOTREF(__pyx_t_1);
    __Pyx_XGOTREF(__pyx_t_2);
    __Pyx_XGOTREF(__pyx_t_3);
    /*try:*/ {

      /* "rasterio/_base.pyx":696
 *     cdef int r_start, r_stop, c_start, c_stop
 *     try:
 *         r, c = window             # <<<<<<<<<<<<<<
 *         assert len(r) == 2
 *         assert len(c) == 2
 */
      if ((likely(PyTuple_CheckExact(__pyx_v_window))) || (PyList_CheckExact(__pyx_v_window))) {
        PyObject* sequence = __pyx_v_window;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 2)) {
          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 696; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_5);
        #else
        __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 696; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 696; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_5);
        #endif
      } else {
        Py_ssize_t index = -1;
        __pyx_t_6 = PyObject_GetIter(__pyx_v_window); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 696; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
        index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L11_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_4);
        index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L11_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_5);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 696; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __pyx_t_7 = NULL;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        goto __pyx_L12_unpacking_done;
        __pyx_L11_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_7 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 696; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __pyx_L12_unpacking_done:;
      }
      __pyx_v_r = __pyx_t_4;
      __pyx_t_4 = 0;
      __pyx_v_c = __pyx_t_5;
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":697
 *     try:
 *         r, c = window
 *         assert len(r) == 2             # <<<<<<<<<<<<<<
 *         assert len(c) == 2
 *     except (ValueError, TypeError, AssertionError):
 */
      #ifndef CYTHON_WITHOUT_ASSERTIONS
      if (unlikely(!Py_OptimizeFlag)) {
        __pyx_t_8 = PyObject_Length(__pyx_v_r); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 697; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        if (unlikely(!((__pyx_t_8 == 2) != 0))) {
          PyErr_SetNone(PyExc_AssertionError);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 697; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      #endif

      /* "rasterio/_base.pyx":698
 *         r, c = window
 *         assert len(r) == 2
 *         assert len(c) == 2             # <<<<<<<<<<<<<<
 *     except (ValueError, TypeError, AssertionError):
 *         raise ValueError("invalid window structure; expecting "
 */
      #ifndef CYTHON_WITHOUT_ASSERTIONS
      if (unlikely(!Py_OptimizeFlag)) {
        __pyx_t_8 = PyObject_Length(__pyx_v_c); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 698; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        if (unlikely(!((__pyx_t_8 == 2) != 0))) {
          PyErr_SetNone(PyExc_AssertionError);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 698; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      #endif

      /* "rasterio/_base.pyx":695
 *     in the context of a raster height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 *     try:             # <<<<<<<<<<<<<<
 *         r, c = window
 *         assert len(r) == 2
 */
    }
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L10_try_end;
    __pyx_L3_error:;
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":699
 *         assert len(r) == 2
 *         assert len(c) == 2
 *     except (ValueError, TypeError, AssertionError):             # <<<<<<<<<<<<<<
 *         raise ValueError("invalid window structure; expecting "
 *                          "((row_start, row_stop), (col_start, col_stop))")
 */
    __pyx_t_9 = PyErr_ExceptionMatches(__pyx_builtin_ValueError) || PyErr_ExceptionMatches(__pyx_builtin_TypeError) || PyErr_ExceptionMatches(__pyx_builtin_AssertionError);
    if (__pyx_t_9) {
      __Pyx_AddTraceback("rasterio._base.eval_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 699; __pyx_clineno = __LINE__; goto __pyx_L5_except_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_t_6);

      /* "rasterio/_base.pyx":700
 *         assert len(c) == 2
 *     except (ValueError, TypeError, AssertionError):
 *         raise ValueError("invalid window structure; expecting "             # <<<<<<<<<<<<<<
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0
 */
      __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__48, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 700; __pyx_clineno = __LINE__; goto __pyx_L5_except_error;}
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_Raise(__pyx_t_10, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 700; __pyx_clineno = __LINE__; goto __pyx_L5_except_error;}
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;

    /* "rasterio/_base.pyx":695
 *     in the context of a raster height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 *     try:             # <<<<<<<<<<<<<<
 *         r, c = window
 *         assert len(r) == 2
 */
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L1_error;
    __pyx_L10_try_end:;
  }

  /* "rasterio/_base.pyx":702
 *         raise ValueError("invalid window structure; expecting "
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0             # <<<<<<<<<<<<<<
 *     if r_start < 0:
 *         if height < 0:
 */
  __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_r, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 702; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 702; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_11) {
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  } else {
    __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 702; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_9 = __pyx_t_12;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L15_bool_binop_done;
  }
  __pyx_t_9 = 0;
  __pyx_L15_bool_binop_done:;
  __pyx_v_r_start = __pyx_t_9;

  /* "rasterio/_base.pyx":703
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0
 *     if r_start < 0:             # <<<<<<<<<<<<<<
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 */
  __pyx_t_11 = ((__pyx_v_r_start < 0) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":704
 *     r_start = r[0] or 0
 *     if r_start < 0:
 *         if height < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid height: %d" % height)
 *         r_start += height
 */
    __pyx_t_11 = ((__pyx_v_height < 0) != 0);
    if (__pyx_t_11) {

      /* "rasterio/_base.pyx":705
 *     if r_start < 0:
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)             # <<<<<<<<<<<<<<
 *         r_start += height
 *     r_stop = r[1] or height
 */
      __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_height); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_invalid_height_d, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
      __pyx_t_4 = 0;
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_Raise(__pyx_t_4, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":704
 *     r_start = r[0] or 0
 *     if r_start < 0:
 *         if height < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid height: %d" % height)
 *         r_start += height
 */
    }

    /* "rasterio/_base.pyx":706
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 *         r_start += height             # <<<<<<<<<<<<<<
 *     r_stop = r[1] or height
 *     if r_stop < 0:
 */
    __pyx_v_r_start = (__pyx_v_r_start + __pyx_v_height);

    /* "rasterio/_base.pyx":703
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0
 *     if r_start < 0:             # <<<<<<<<<<<<<<
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 */
  }

  /* "rasterio/_base.pyx":707
 *             raise ValueError("invalid height: %d" % height)
 *         r_start += height
 *     r_stop = r[1] or height             # <<<<<<<<<<<<<<
 *     if r_stop < 0:
 *         if height < 0:
 */
  __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_r, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 707; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_11) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_9 = __pyx_t_12;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L19_bool_binop_done;
  }
  __pyx_t_9 = __pyx_v_height;
  __pyx_L19_bool_binop_done:;
  __pyx_v_r_stop = __pyx_t_9;

  /* "rasterio/_base.pyx":708
 *         r_start += height
 *     r_stop = r[1] or height
 *     if r_stop < 0:             # <<<<<<<<<<<<<<
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 */
  __pyx_t_11 = ((__pyx_v_r_stop < 0) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":709
 *     r_stop = r[1] or height
 *     if r_stop < 0:
 *         if height < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height
 */
    __pyx_t_11 = ((__pyx_v_height < 0) != 0);
    if (__pyx_t_11) {

      /* "rasterio/_base.pyx":710
 *     if r_stop < 0:
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)             # <<<<<<<<<<<<<<
 *         r_stop += height
 *     if not r_stop >= r_start:
 */
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_height); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_invalid_height_d, __pyx_t_4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_Raise(__pyx_t_6, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":709
 *     r_stop = r[1] or height
 *     if r_stop < 0:
 *         if height < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height
 */
    }

    /* "rasterio/_base.pyx":711
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height             # <<<<<<<<<<<<<<
 *     if not r_stop >= r_start:
 *         raise ValueError(
 */
    __pyx_v_r_stop = (__pyx_v_r_stop + __pyx_v_height);

    /* "rasterio/_base.pyx":708
 *         r_start += height
 *     r_stop = r[1] or height
 *     if r_stop < 0:             # <<<<<<<<<<<<<<
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 */
  }

  /* "rasterio/_base.pyx":712
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height
 *     if not r_stop >= r_start:             # <<<<<<<<<<<<<<
 *         raise ValueError(
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 */
  __pyx_t_11 = ((!((__pyx_v_r_stop >= __pyx_v_r_start) != 0)) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":714
 *     if not r_stop >= r_start:
 *         raise ValueError(
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))             # <<<<<<<<<<<<<<
 *     c_start = c[0] or 0
 *     if c_start < 0:
 */
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_r_start); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_r_stop); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4);
    __pyx_t_6 = 0;
    __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_invalid_window_row_range_d_d, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":713
 *         r_stop += height
 *     if not r_stop >= r_start:
 *         raise ValueError(             # <<<<<<<<<<<<<<
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 *     c_start = c[0] or 0
 */
    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":712
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height
 *     if not r_stop >= r_start:             # <<<<<<<<<<<<<<
 *         raise ValueError(
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 */
  }

  /* "rasterio/_base.pyx":715
 *         raise ValueError(
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 *     c_start = c[0] or 0             # <<<<<<<<<<<<<<
 *     if c_start < 0:
 *         if width < 0:
 */
  __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_c, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 715; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_11) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_9 = __pyx_t_12;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L24_bool_binop_done;
  }
  __pyx_t_9 = 0;
  __pyx_L24_bool_binop_done:;
  __pyx_v_c_start = __pyx_t_9;

  /* "rasterio/_base.pyx":716
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 *     c_start = c[0] or 0
 *     if c_start < 0:             # <<<<<<<<<<<<<<
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 */
  __pyx_t_11 = ((__pyx_v_c_start < 0) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":717
 *     c_start = c[0] or 0
 *     if c_start < 0:
 *         if width < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid width: %d" % width)
 *         c_start += width
 */
    __pyx_t_11 = ((__pyx_v_width < 0) != 0);
    if (__pyx_t_11) {

      /* "rasterio/_base.pyx":718
 *     if c_start < 0:
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)             # <<<<<<<<<<<<<<
 *         c_start += width
 *     c_stop = c[1] or width
 */
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_width); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_invalid_width_d, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
      __pyx_t_5 = 0;
      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_Raise(__pyx_t_5, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":717
 *     c_start = c[0] or 0
 *     if c_start < 0:
 *         if width < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid width: %d" % width)
 *         c_start += width
 */
    }

    /* "rasterio/_base.pyx":719
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 *         c_start += width             # <<<<<<<<<<<<<<
 *     c_stop = c[1] or width
 *     if c_stop < 0:
 */
    __pyx_v_c_start = (__pyx_v_c_start + __pyx_v_width);

    /* "rasterio/_base.pyx":716
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 *     c_start = c[0] or 0
 *     if c_start < 0:             # <<<<<<<<<<<<<<
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 */
  }

  /* "rasterio/_base.pyx":720
 *             raise ValueError("invalid width: %d" % width)
 *         c_start += width
 *     c_stop = c[1] or width             # <<<<<<<<<<<<<<
 *     if c_stop < 0:
 *         if width < 0:
 */
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_c, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 720; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 720; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_11) {
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 720; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_9 = __pyx_t_12;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    goto __pyx_L28_bool_binop_done;
  }
  __pyx_t_9 = __pyx_v_width;
  __pyx_L28_bool_binop_done:;
  __pyx_v_c_stop = __pyx_t_9;

  /* "rasterio/_base.pyx":721
 *         c_start += width
 *     c_stop = c[1] or width
 *     if c_stop < 0:             # <<<<<<<<<<<<<<
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 */
  __pyx_t_11 = ((__pyx_v_c_stop < 0) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":722
 *     c_stop = c[1] or width
 *     if c_stop < 0:
 *         if width < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width
 */
    __pyx_t_11 = ((__pyx_v_width < 0) != 0);
    if (__pyx_t_11) {

      /* "rasterio/_base.pyx":723
 *     if c_stop < 0:
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)             # <<<<<<<<<<<<<<
 *         c_stop += width
 *     if not c_stop >= c_start:
 */
      __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_width); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_invalid_width_d, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
      __pyx_t_4 = 0;
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_Raise(__pyx_t_4, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":722
 *     c_stop = c[1] or width
 *     if c_stop < 0:
 *         if width < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width
 */
    }

    /* "rasterio/_base.pyx":724
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width             # <<<<<<<<<<<<<<
 *     if not c_stop >= c_start:
 *         raise ValueError(
 */
    __pyx_v_c_stop = (__pyx_v_c_stop + __pyx_v_width);

    /* "rasterio/_base.pyx":721
 *         c_start += width
 *     c_stop = c[1] or width
 *     if c_stop < 0:             # <<<<<<<<<<<<<<
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 */
  }

  /* "rasterio/_base.pyx":725
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width
 *     if not c_stop >= c_start:             # <<<<<<<<<<<<<<
 *         raise ValueError(
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))
 */
  __pyx_t_11 = ((!((__pyx_v_c_stop >= __pyx_v_c_start) != 0)) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":727
 *     if not c_stop >= c_start:
 *         raise ValueError(
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))             # <<<<<<<<<<<<<<
 *     return (r_start, r_stop), (c_start, c_stop)
 * 
 */
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_c_start); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 727; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_c_stop); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 727; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 727; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
    __pyx_t_4 = 0;
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_invalid_window_col_range_d_d, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 727; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

    /* "rasterio/_base.pyx":726
 *         c_stop += width
 *     if not c_stop >= c_start:
 *         raise ValueError(             # <<<<<<<<<<<<<<
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))
 *     return (r_start, r_stop), (c_start, c_stop)
 */
    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 726; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 726; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 726; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "rasterio/_base.pyx":725
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width
 *     if not c_stop >= c_start:             # <<<<<<<<<<<<<<
 *         raise ValueError(
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))
 */
  }

  /* "rasterio/_base.pyx":728
 *         raise ValueError(
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))
 *     return (r_start, r_stop), (c_start, c_stop)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_r_start); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_r_stop); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_6);
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_c_start); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_c_stop); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_5);
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_10);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_10);
  __pyx_t_4 = 0;
  __pyx_t_10 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":691
 * 
 * 
 * cpdef eval_window(object window, int height, int width):             # <<<<<<<<<<<<<<
 *     """Evaluates a window tuple that might contain negative values
 *     in the context of a raster height and width."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("rasterio._base.eval_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_r);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_3eval_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_2eval_window[] = "Evaluates a window tuple that might contain negative values\n    in the context of a raster height and width.";
static PyObject *__pyx_pw_8rasterio_5_base_3eval_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_window = 0;
  int __pyx_v_height;
  int __pyx_v_width;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("eval_window (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_window,&__pyx_n_s_height,&__pyx_n_s_width,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_window)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_height)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("eval_window", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_width)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("eval_window", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "eval_window") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_window = values[0];
    __pyx_v_height = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_height == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    __pyx_v_width = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_width == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("eval_window", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.eval_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_2eval_window(__pyx_self, __pyx_v_window, __pyx_v_height, __pyx_v_width);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_2eval_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("eval_window", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_8rasterio_5_base_eval_window(__pyx_v_window, __pyx_v_height, __pyx_v_width, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.eval_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":731
 * 
 * 
 * def get_index(x, y, affine, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns the (row, col) index of the pixel containing (x, y) given a
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_5get_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_4get_index[] = "\n    Returns the (row, col) index of the pixel containing (x, y) given a\n    coordinate reference system.\n\n    Parameters\n    ----------\n    x : float\n        x value in coordinate reference system\n    y : float\n        y value in coordinate reference system\n    affine : tuple\n        Coefficients mapping pixel coordinates to coordinate reference system.\n    op : function\n        Function to convert fractional pixels to whole numbers (floor, ceiling,\n        round)\n    precision : int\n        Decimal places of precision in indexing, as in `round()`.\n\n    Returns\n    -------\n    row : int\n        row index\n    col : int\n        col index\n    ";
static PyMethodDef __pyx_mdef_8rasterio_5_base_5get_index = {"get_index", (PyCFunction)__pyx_pw_8rasterio_5_base_5get_index, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_4get_index};
static PyObject *__pyx_pw_8rasterio_5_base_5get_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_x = 0;
  PyObject *__pyx_v_y = 0;
  PyObject *__pyx_v_affine = 0;
  PyObject *__pyx_v_op = 0;
  PyObject *__pyx_v_precision = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_index (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_affine,&__pyx_n_s_op,&__pyx_n_s_precision,0};
    PyObject* values[5] = {0,0,0,0,0};
    values[3] = __pyx_k__49;
    values[4] = ((PyObject *)__pyx_int_6);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_index", 0, 3, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_affine)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_index", 0, 3, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_op);
          if (value) { values[3] = value; kw_args--; }
        }
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_index") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_x = values[0];
    __pyx_v_y = values[1];
    __pyx_v_affine = values[2];
    __pyx_v_op = values[3];
    __pyx_v_precision = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_index", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.get_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_4get_index(__pyx_self, __pyx_v_x, __pyx_v_y, __pyx_v_affine, __pyx_v_op, __pyx_v_precision);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_4get_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_affine, PyObject *__pyx_v_op, PyObject *__pyx_v_precision) {
  PyObject *__pyx_v_eps = NULL;
  PyObject *__pyx_v_row = NULL;
  PyObject *__pyx_v_col = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("get_index", 0);

  /* "rasterio/_base.pyx":760
 *     # and sign determined by the op function: positive for floor, negative
 *     # for ceil.
 *     eps = 10.0**-precision * (1.0 - 2.0*op(0.1))             # <<<<<<<<<<<<<<
 *     row = int(op((y - eps - affine[5]) / affine[4]))
 *     col = int(op((x + eps - affine[2]) / affine[0]))
 */
  __pyx_t_1 = PyNumber_Negative(__pyx_v_precision); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Power(__pyx_float_10_0, __pyx_t_1, Py_None); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_v_op, __pyx_tuple__50, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyNumber_Multiply(__pyx_float_2_0, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyFloat_SubtractCObj(__pyx_float_1_0, __pyx_t_3, 1.0, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_eps = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":761
 *     # for ceil.
 *     eps = 10.0**-precision * (1.0 - 2.0*op(0.1))
 *     row = int(op((y - eps - affine[5]) / affine[4]))             # <<<<<<<<<<<<<<
 *     col = int(op((x + eps - affine[2]) / affine[0]))
 *     return row, col
 */
  __pyx_t_1 = PyNumber_Subtract(__pyx_v_y, __pyx_v_eps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_affine, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = PyNumber_Subtract(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_affine, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyNumber_Divide(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_INCREF(__pyx_v_op);
  __pyx_t_2 = __pyx_v_op; __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_4) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_GOTREF(__pyx_t_3);
  } else {
    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_row = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":762
 *     eps = 10.0**-precision * (1.0 - 2.0*op(0.1))
 *     row = int(op((y - eps - affine[5]) / affine[4]))
 *     col = int(op((x + eps - affine[2]) / affine[0]))             # <<<<<<<<<<<<<<
 *     return row, col
 * 
 */
  __pyx_t_3 = PyNumber_Add(__pyx_v_x, __pyx_v_eps); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_affine, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_1 = PyNumber_Subtract(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_affine, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_INCREF(__pyx_v_op);
  __pyx_t_5 = __pyx_v_op; __pyx_t_1 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (!__pyx_t_1) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_2);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __pyx_t_1 = NULL;
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Int(__pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_col = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":763
 *     row = int(op((y - eps - affine[5]) / affine[4]))
 *     col = int(op((x + eps - affine[2]) / affine[0]))
 *     return row, col             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_INCREF(__pyx_v_row);
  __Pyx_GIVEREF(__pyx_v_row);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_row);
  __Pyx_INCREF(__pyx_v_col);
  __Pyx_GIVEREF(__pyx_v_col);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_col);
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":731
 * 
 * 
 * def get_index(x, y, affine, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns the (row, col) index of the pixel containing (x, y) given a
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.get_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_eps);
  __Pyx_XDECREF(__pyx_v_row);
  __Pyx_XDECREF(__pyx_v_col);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":766
 * 
 * 
 * def get_window(left, bottom, right, top, affine, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns a window tuple given coordinate bounds and the coordinate reference
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_7get_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_6get_window[] = "\n    Returns a window tuple given coordinate bounds and the coordinate reference\n    system.\n\n    Parameters\n    ----------\n    left : float\n        Left edge of window\n    bottom : float\n        Bottom edge of window\n    right : float\n        Right edge of window\n    top : float\n        top edge of window\n    affine : tuple\n        Coefficients mapping pixel coordinates to coordinate reference system.\n    precision : int\n        Decimal places of precision in indexing, as in `round()`.\n    ";
static PyMethodDef __pyx_mdef_8rasterio_5_base_7get_window = {"get_window", (PyCFunction)__pyx_pw_8rasterio_5_base_7get_window, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_6get_window};
static PyObject *__pyx_pw_8rasterio_5_base_7get_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_left = 0;
  PyObject *__pyx_v_bottom = 0;
  PyObject *__pyx_v_right = 0;
  PyObject *__pyx_v_top = 0;
  PyObject *__pyx_v_affine = 0;
  PyObject *__pyx_v_precision = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_window (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_left,&__pyx_n_s_bottom,&__pyx_n_s_right,&__pyx_n_s_top,&__pyx_n_s_affine,&__pyx_n_s_precision,0};
    PyObject* values[6] = {0,0,0,0,0,0};
    values[5] = ((PyObject *)__pyx_int_6);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_left)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bottom)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_right)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_top)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  4:
        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_affine)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  5:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision);
          if (value) { values[5] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_window") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_left = values[0];
    __pyx_v_bottom = values[1];
    __pyx_v_right = values[2];
    __pyx_v_top = values[3];
    __pyx_v_affine = values[4];
    __pyx_v_precision = values[5];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.get_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_6get_window(__pyx_self, __pyx_v_left, __pyx_v_bottom, __pyx_v_right, __pyx_v_top, __pyx_v_affine, __pyx_v_precision);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_6get_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_left, PyObject *__pyx_v_bottom, PyObject *__pyx_v_right, PyObject *__pyx_v_top, PyObject *__pyx_v_affine, PyObject *__pyx_v_precision) {
  PyObject *__pyx_v_window_start = NULL;
  PyObject *__pyx_v_window_stop = NULL;
  PyObject *__pyx_v_window = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("get_window", 0);

  /* "rasterio/_base.pyx":786
 *         Decimal places of precision in indexing, as in `round()`.
 *     """
 *     window_start = get_index(             # <<<<<<<<<<<<<<
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);

  /* "rasterio/_base.pyx":787
 *     """
 *     window_start = get_index(
 *         left, top, affine, op=math.floor, precision=precision)             # <<<<<<<<<<<<<<
 *     window_stop = get_index(
 *         right, bottom, affine, op=math.ceil, precision=precision)
 */
  __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_left);
  __Pyx_GIVEREF(__pyx_v_left);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_left);
  __Pyx_INCREF(__pyx_v_top);
  __Pyx_GIVEREF(__pyx_v_top);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_top);
  __Pyx_INCREF(__pyx_v_affine);
  __Pyx_GIVEREF(__pyx_v_affine);
  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_affine);
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_floor); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_op, __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_precision, __pyx_v_precision) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":786
 *         Decimal places of precision in indexing, as in `round()`.
 *     """
 *     window_start = get_index(             # <<<<<<<<<<<<<<
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(
 */
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_window_start = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":788
 *     window_start = get_index(
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(             # <<<<<<<<<<<<<<
 *         right, bottom, affine, op=math.ceil, precision=precision)
 *     window = tuple(zip(window_start, window_stop))
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_index); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);

  /* "rasterio/_base.pyx":789
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(
 *         right, bottom, affine, op=math.ceil, precision=precision)             # <<<<<<<<<<<<<<
 *     window = tuple(zip(window_start, window_stop))
 *     return window
 */
  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_right);
  __Pyx_GIVEREF(__pyx_v_right);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_right);
  __Pyx_INCREF(__pyx_v_bottom);
  __Pyx_GIVEREF(__pyx_v_bottom);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_bottom);
  __Pyx_INCREF(__pyx_v_affine);
  __Pyx_GIVEREF(__pyx_v_affine);
  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_affine);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ceil); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_op, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_precision, __pyx_v_precision) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":788
 *     window_start = get_index(
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(             # <<<<<<<<<<<<<<
 *         right, bottom, affine, op=math.ceil, precision=precision)
 *     window = tuple(zip(window_start, window_stop))
 */
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_window_stop = __pyx_t_4;
  __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":790
 *     window_stop = get_index(
 *         right, bottom, affine, op=math.ceil, precision=precision)
 *     window = tuple(zip(window_start, window_stop))             # <<<<<<<<<<<<<<
 *     return window
 * 
 */
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_v_window_start);
  __Pyx_GIVEREF(__pyx_v_window_start);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_window_start);
  __Pyx_INCREF(__pyx_v_window_stop);
  __Pyx_GIVEREF(__pyx_v_window_stop);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_window_stop);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PySequence_Tuple(__pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_window = ((PyObject*)__pyx_t_4);
  __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":791
 *         right, bottom, affine, op=math.ceil, precision=precision)
 *     window = tuple(zip(window_start, window_stop))
 *     return window             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_window);
  __pyx_r = __pyx_v_window;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":766
 * 
 * 
 * def get_window(left, bottom, right, top, affine, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns a window tuple given coordinate bounds and the coordinate reference
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.get_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_window_start);
  __Pyx_XDECREF(__pyx_v_window_stop);
  __Pyx_XDECREF(__pyx_v_window);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":794
 * 
 * 
 * def window_shape(window, height=-1, width=-1):             # <<<<<<<<<<<<<<
 *     """Returns shape of a window.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_9window_shape(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_8window_shape[] = "Returns shape of a window.\n\n    height and width arguments are optional if there are no negative\n    values in the window.\n    ";
static PyMethodDef __pyx_mdef_8rasterio_5_base_9window_shape = {"window_shape", (PyCFunction)__pyx_pw_8rasterio_5_base_9window_shape, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_8window_shape};
static PyObject *__pyx_pw_8rasterio_5_base_9window_shape(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_window = 0;
  PyObject *__pyx_v_height = 0;
  PyObject *__pyx_v_width = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window_shape (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_window,&__pyx_n_s_height,&__pyx_n_s_width,0};
    PyObject* values[3] = {0,0,0};
    values[1] = ((PyObject *)__pyx_int_neg_1);
    values[2] = ((PyObject *)__pyx_int_neg_1);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_window)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_height);
          if (value) { values[1] = value; kw_args--; }
        }
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_width);
          if (value) { values[2] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "window_shape") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_window = values[0];
    __pyx_v_height = values[1];
    __pyx_v_width = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("window_shape", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.window_shape", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_8window_shape(__pyx_self, __pyx_v_window, __pyx_v_height, __pyx_v_width);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_8window_shape(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, PyObject *__pyx_v_height, PyObject *__pyx_v_width) {
  PyObject *__pyx_v_a = NULL;
  PyObject *__pyx_v_b = NULL;
  PyObject *__pyx_v_c = NULL;
  PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("window_shape", 0);

  /* "rasterio/_base.pyx":800
 *     values in the window.
 *     """
 *     (a, b), (c, d) = eval_window(window, height, width)             # <<<<<<<<<<<<<<
 *     return b-a, d-c
 * 
 */
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_height); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_v_width); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = __pyx_f_8rasterio_5_base_eval_window(__pyx_v_window, __pyx_t_1, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
    PyObject* sequence = __pyx_t_3;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_4);
    index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
    PyObject* sequence = __pyx_t_4;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_8);
    #else
    __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    #endif
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_9)->tp_iternext;
    index = 0; __pyx_t_6 = __pyx_t_7(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_6);
    index = 1; __pyx_t_8 = __pyx_t_7(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_8);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_9), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L6_unpacking_done:;
  }
  __pyx_v_a = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_b = __pyx_t_8;
  __pyx_t_8 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
    PyObject* sequence = __pyx_t_5;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_6);
    #else
    __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    #endif
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_9)->tp_iternext;
    index = 0; __pyx_t_8 = __pyx_t_7(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_8);
    index = 1; __pyx_t_6 = __pyx_t_7(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_6);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_9), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    goto __pyx_L8_unpacking_done;
    __pyx_L7_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L8_unpacking_done:;
  }
  __pyx_v_c = __pyx_t_8;
  __pyx_t_8 = 0;
  __pyx_v_d = __pyx_t_6;
  __pyx_t_6 = 0;

  /* "rasterio/_base.pyx":801
 *     """
 *     (a, b), (c, d) = eval_window(window, height, width)
 *     return b-a, d-c             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PyNumber_Subtract(__pyx_v_b, __pyx_v_a); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = PyNumber_Subtract(__pyx_v_d, __pyx_v_c); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5);
  __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":794
 * 
 * 
 * def window_shape(window, height=-1, width=-1):             # <<<<<<<<<<<<<<
 *     """Returns shape of a window.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("rasterio._base.window_shape", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_b);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":804
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_11window_index(PyObject *__pyx_self, PyObject *__pyx_v_window); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_11window_index = {"window_index", (PyCFunction)__pyx_pw_8rasterio_5_base_11window_index, METH_O, 0};
static PyObject *__pyx_pw_8rasterio_5_base_11window_index(PyObject *__pyx_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window_index (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_10window_index(__pyx_self, ((PyObject *)__pyx_v_window));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_8rasterio_5_base_12window_index_2generator1(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "rasterio/_base.pyx":805
 * 
 * def window_index(window):
 *     return tuple(slice(*w) for w in window)             # <<<<<<<<<<<<<<
 * 
 * 
 */

static PyObject *__pyx_pf_8rasterio_5_base_12window_index_genexpr(PyObject *__pyx_self) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("genexpr", 0);
  __pyx_cur_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_2_genexpr(__pyx_ptype_8rasterio_5_base___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *) __pyx_self;
  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_8rasterio_5_base_12window_index_2generator1, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_window_index_locals_genexpr); if (unlikely(!gen)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("rasterio._base.window_index.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_8rasterio_5_base_12window_index_2generator1(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  Py_ssize_t __pyx_t_2;
  PyObject *(*__pyx_t_3)(PyObject *);
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    case 1: goto __pyx_L6_resume_from_yield;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_window)) { __Pyx_RaiseClosureNameError("window"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
  if (likely(PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_window)) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_window)) {
    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_window; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
    __pyx_t_3 = NULL;
  } else {
    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_window); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  for (;;) {
    if (likely(!__pyx_t_3)) {
      if (likely(PyList_CheckExact(__pyx_t_1))) {
        if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #else
        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        #endif
      } else {
        if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #else
        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        #endif
      }
    } else {
      __pyx_t_4 = __pyx_t_3(__pyx_t_1);
      if (unlikely(!__pyx_t_4)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_4);
    }
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_w);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_w, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = PySequence_Tuple(__pyx_cur_scope->__pyx_v_w); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)(&PySlice_Type)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    __Pyx_XGIVEREF(__pyx_t_1);
    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
    __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
    __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
    __Pyx_XGIVEREF(__pyx_r);
    __Pyx_RefNannyFinishContext();
    /* return from generator, yielding value */
    __pyx_generator->resume_label = 1;
    return __pyx_r;
    __pyx_L6_resume_from_yield:;
    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
    __pyx_cur_scope->__pyx_t_0 = 0;
    __Pyx_XGOTREF(__pyx_t_1);
    __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
    __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* function exit code */
  PyErr_SetNone(PyExc_StopIteration);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":804
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */

static PyObject *__pyx_pf_8rasterio_5_base_10window_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("window_index", 0);
  __pyx_cur_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *)__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_1_window_index(__pyx_ptype_8rasterio_5_base___pyx_scope_struct_1_window_index, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_window = __pyx_v_window;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_window);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_window);

  /* "rasterio/_base.pyx":805
 * 
 * def window_index(window):
 *     return tuple(slice(*w) for w in window)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_pf_8rasterio_5_base_12window_index_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PySequence_Tuple(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":804
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.window_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":808
 * 
 * 
 * def tastes_like_gdal(t):             # <<<<<<<<<<<<<<
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13tastes_like_gdal(PyObject *__pyx_self, PyObject *__pyx_v_t); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_13tastes_like_gdal = {"tastes_like_gdal", (PyCFunction)__pyx_pw_8rasterio_5_base_13tastes_like_gdal, METH_O, 0};
static PyObject *__pyx_pw_8rasterio_5_base_13tastes_like_gdal(PyObject *__pyx_self, PyObject *__pyx_v_t) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tastes_like_gdal (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_12tastes_like_gdal(__pyx_self, ((PyObject *)__pyx_v_t));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_12tastes_like_gdal(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_t) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("tastes_like_gdal", 0);

  /* "rasterio/_base.pyx":809
 * 
 * def tastes_like_gdal(t):
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_t, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_t, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_PyObject_IsTrue(__pyx_t_4)) {
    __Pyx_DECREF(__pyx_t_4);
    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_float_0_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_5) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_1 = __pyx_t_4;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_t, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyObject_RichCompare(__pyx_t_4, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_5) {
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_3);
    __pyx_t_1 = __pyx_t_3;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_t, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_INCREF(__pyx_t_4);
  __pyx_t_1 = __pyx_t_4;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_L3_bool_binop_done:;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":808
 * 
 * 
 * def tastes_like_gdal(t):             # <<<<<<<<<<<<<<
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.tastes_like_gdal", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":812
 * 
 * 
 * cdef void *_osr_from_crs(object crs):             # <<<<<<<<<<<<<<
 *     cdef char *proj_c = NULL
 *     cdef void *osr = _gdal.OSRNewSpatialReference(NULL)
 */

static void *__pyx_f_8rasterio_5_base__osr_from_crs(PyObject *__pyx_v_crs) {
  char *__pyx_v_proj_c;
  void *__pyx_v_osr;
  PyObject *__pyx_v_params = NULL;
  PyObject *__pyx_v_init = NULL;
  PyObject *__pyx_v_auth = NULL;
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_v_k = NULL;
  PyObject *__pyx_v_v = NULL;
  PyObject *__pyx_v_proj = NULL;
  PyObject *__pyx_v_proj_b = NULL;
  void *__pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  int __pyx_t_8;
  Py_ssize_t __pyx_t_9;
  PyObject *(*__pyx_t_10)(PyObject *);
  PyObject *__pyx_t_11 = NULL;
  int __pyx_t_12;
  int __pyx_t_13;
  char *__pyx_t_14;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_osr_from_crs", 0);

  /* "rasterio/_base.pyx":813
 * 
 * cdef void *_osr_from_crs(object crs):
 *     cdef char *proj_c = NULL             # <<<<<<<<<<<<<<
 *     cdef void *osr = _gdal.OSRNewSpatialReference(NULL)
 *     params = []
 */
  __pyx_v_proj_c = NULL;

  /* "rasterio/_base.pyx":814
 * cdef void *_osr_from_crs(object crs):
 *     cdef char *proj_c = NULL
 *     cdef void *osr = _gdal.OSRNewSpatialReference(NULL)             # <<<<<<<<<<<<<<
 *     params = []
 *     # Normally, we expect a CRS dict.
 */
  __pyx_v_osr = OSRNewSpatialReference(NULL);

  /* "rasterio/_base.pyx":815
 *     cdef char *proj_c = NULL
 *     cdef void *osr = _gdal.OSRNewSpatialReference(NULL)
 *     params = []             # <<<<<<<<<<<<<<
 *     # Normally, we expect a CRS dict.
 *     if isinstance(crs, dict):
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_params = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":817
 *     params = []
 *     # Normally, we expect a CRS dict.
 *     if isinstance(crs, dict):             # <<<<<<<<<<<<<<
 *         # EPSG is a special case.
 *         init = crs.get('init')
 */
  __pyx_t_2 = PyDict_Check(__pyx_v_crs); 
  __pyx_t_3 = (__pyx_t_2 != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":819
 *     if isinstance(crs, dict):
 *         # EPSG is a special case.
 *         init = crs.get('init')             # <<<<<<<<<<<<<<
 *         if init:
 *             auth, val = init.split(':')
 */
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_crs, __pyx_n_s_get); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__51, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_init = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":820
 *         # EPSG is a special case.
 *         init = crs.get('init')
 *         if init:             # <<<<<<<<<<<<<<
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':
 */
    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_init); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_3) {

      /* "rasterio/_base.pyx":821
 *         init = crs.get('init')
 *         if init:
 *             auth, val = init.split(':')             # <<<<<<<<<<<<<<
 *             if auth.upper() == 'EPSG':
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 */
      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_init, __pyx_n_s_split); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__53, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
        PyObject* sequence = __pyx_t_1;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 2)) {
          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_5);
        #else
        __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_5);
        #endif
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      } else {
        Py_ssize_t index = -1;
        __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
        index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L5_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_4);
        index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_5);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_7 = NULL;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        goto __pyx_L6_unpacking_done;
        __pyx_L5_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_7 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_L6_unpacking_done:;
      }
      __pyx_v_auth = __pyx_t_4;
      __pyx_t_4 = 0;
      __pyx_v_val = __pyx_t_5;
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":822
 *         if init:
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':             # <<<<<<<<<<<<<<
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 *         else:
 */
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_auth, __pyx_n_s_upper); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_n_s_EPSG, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (__pyx_t_3) {

        /* "rasterio/_base.pyx":823
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':
 *                 _gdal.OSRImportFromEPSG(osr, int(val))             # <<<<<<<<<<<<<<
 *         else:
 *             crs['wktext'] = True
 */
        __pyx_t_1 = PyNumber_Int(__pyx_v_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        OSRImportFromEPSG(__pyx_v_osr, __pyx_t_8);

        /* "rasterio/_base.pyx":822
 *         if init:
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':             # <<<<<<<<<<<<<<
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 *         else:
 */
      }

      /* "rasterio/_base.pyx":820
 *         # EPSG is a special case.
 *         init = crs.get('init')
 *         if init:             # <<<<<<<<<<<<<<
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':
 */
      goto __pyx_L4;
    }

    /* "rasterio/_base.pyx":825
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 *         else:
 *             crs['wktext'] = True             # <<<<<<<<<<<<<<
 *             for k, v in crs.items():
 *                 if v is True or (k in ('no_defs', 'wktext') and v):
 */
    /*else*/ {
      if (unlikely(PyObject_SetItem(__pyx_v_crs, __pyx_n_s_wktext, Py_True) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "rasterio/_base.pyx":826
 *         else:
 *             crs['wktext'] = True
 *             for k, v in crs.items():             # <<<<<<<<<<<<<<
 *                 if v is True or (k in ('no_defs', 'wktext') and v):
 *                     params.append("+%s" % k)
 */
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_crs, __pyx_n_s_items); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
        __pyx_t_5 = __pyx_t_1; __Pyx_INCREF(__pyx_t_5); __pyx_t_9 = 0;
        __pyx_t_10 = NULL;
      } else {
        __pyx_t_9 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      for (;;) {
        if (likely(!__pyx_t_10)) {
          if (likely(PyList_CheckExact(__pyx_t_5))) {
            if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_5)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            #else
            __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_1);
            #endif
          } else {
            if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            #else
            __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_1);
            #endif
          }
        } else {
          __pyx_t_1 = __pyx_t_10(__pyx_t_5);
          if (unlikely(!__pyx_t_1)) {
            PyObject* exc_type = PyErr_Occurred();
            if (exc_type) {
              if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
              else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            }
            break;
          }
          __Pyx_GOTREF(__pyx_t_1);
        }
        if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
          PyObject* sequence = __pyx_t_1;
          #if CYTHON_COMPILING_IN_CPYTHON
          Py_ssize_t size = Py_SIZE(sequence);
          #else
          Py_ssize_t size = PySequence_Size(sequence);
          #endif
          if (unlikely(size != 2)) {
            if (size > 2) __Pyx_RaiseTooManyValuesError(2);
            else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
            {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          }
          #if CYTHON_COMPILING_IN_CPYTHON
          if (likely(PyTuple_CheckExact(sequence))) {
            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
            __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
          } else {
            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
            __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
          }
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(__pyx_t_6);
          #else
          __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_4);
          __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_6);
          #endif
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        } else {
          Py_ssize_t index = -1;
          __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_7 = Py_TYPE(__pyx_t_11)->tp_iternext;
          index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_11); if (unlikely(!__pyx_t_4)) goto __pyx_L10_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_4);
          index = 1; __pyx_t_6 = __pyx_t_7(__pyx_t_11); if (unlikely(!__pyx_t_6)) goto __pyx_L10_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_6);
          if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_11), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __pyx_t_7 = NULL;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          goto __pyx_L11_unpacking_done;
          __pyx_L10_unpacking_failed:;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __pyx_t_7 = NULL;
          if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __pyx_L11_unpacking_done:;
        }
        __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_4);
        __pyx_t_4 = 0;
        __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_6);
        __pyx_t_6 = 0;

        /* "rasterio/_base.pyx":827
 *             crs['wktext'] = True
 *             for k, v in crs.items():
 *                 if v is True or (k in ('no_defs', 'wktext') and v):             # <<<<<<<<<<<<<<
 *                     params.append("+%s" % k)
 *                 else:
 */
        __pyx_t_2 = (__pyx_v_v == Py_True);
        __pyx_t_12 = (__pyx_t_2 != 0);
        if (!__pyx_t_12) {
        } else {
          __pyx_t_3 = __pyx_t_12;
          goto __pyx_L13_bool_binop_done;
        }
        __Pyx_INCREF(__pyx_v_k);
        __pyx_t_1 = __pyx_v_k;
        __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_n_s_no_defs, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        if (!__pyx_t_2) {
        } else {
          __pyx_t_12 = __pyx_t_2;
          goto __pyx_L16_bool_binop_done;
        }
        __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_n_s_wktext, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_12 = __pyx_t_2;
        __pyx_L16_bool_binop_done:;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_2 = (__pyx_t_12 != 0);
        if (__pyx_t_2) {
        } else {
          __pyx_t_3 = __pyx_t_2;
          goto __pyx_L13_bool_binop_done;
        }
        __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_v); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_3 = __pyx_t_2;
        __pyx_L13_bool_binop_done:;
        if (__pyx_t_3) {

          /* "rasterio/_base.pyx":828
 *             for k, v in crs.items():
 *                 if v is True or (k in ('no_defs', 'wktext') and v):
 *                     params.append("+%s" % k)             # <<<<<<<<<<<<<<
 *                 else:
 *                     params.append("+%s=%s" % (k, v))
 */
          __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s, __pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_params, __pyx_t_1); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

          /* "rasterio/_base.pyx":827
 *             crs['wktext'] = True
 *             for k, v in crs.items():
 *                 if v is True or (k in ('no_defs', 'wktext') and v):             # <<<<<<<<<<<<<<
 *                     params.append("+%s" % k)
 *                 else:
 */
          goto __pyx_L12;
        }

        /* "rasterio/_base.pyx":830
 *                     params.append("+%s" % k)
 *                 else:
 *                     params.append("+%s=%s" % (k, v))             # <<<<<<<<<<<<<<
 *             proj = " ".join(params)
 *             log.debug("PROJ.4 to be imported: %r", proj)
 */
        /*else*/ {
          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_INCREF(__pyx_v_k);
          __Pyx_GIVEREF(__pyx_v_k);
          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_k);
          __Pyx_INCREF(__pyx_v_v);
          __Pyx_GIVEREF(__pyx_v_v);
          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_v);
          __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_s_s, __pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_6);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_params, __pyx_t_6); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        }
        __pyx_L12:;

        /* "rasterio/_base.pyx":826
 *         else:
 *             crs['wktext'] = True
 *             for k, v in crs.items():             # <<<<<<<<<<<<<<
 *                 if v is True or (k in ('no_defs', 'wktext') and v):
 *                     params.append("+%s" % k)
 */
      }
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":831
 *                 else:
 *                     params.append("+%s=%s" % (k, v))
 *             proj = " ".join(params)             # <<<<<<<<<<<<<<
 *             log.debug("PROJ.4 to be imported: %r", proj)
 *             proj_b = proj.encode('utf-8')
 */
      __pyx_t_5 = __Pyx_PyString_Join(__pyx_kp_s__54, __pyx_v_params); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_v_proj = ((PyObject*)__pyx_t_5);
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":832
 *                     params.append("+%s=%s" % (k, v))
 *             proj = " ".join(params)
 *             log.debug("PROJ.4 to be imported: %r", proj)             # <<<<<<<<<<<<<<
 *             proj_b = proj.encode('utf-8')
 *             proj_c = proj_b
 */
      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = NULL;
      __pyx_t_9 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_1, function);
          __pyx_t_9 = 1;
        }
      }
      __pyx_t_4 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      if (__pyx_t_6) {
        __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_PROJ_4_to_be_imported_r);
      __Pyx_GIVEREF(__pyx_kp_s_PROJ_4_to_be_imported_r);
      PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_9, __pyx_kp_s_PROJ_4_to_be_imported_r);
      __Pyx_INCREF(__pyx_v_proj);
      __Pyx_GIVEREF(__pyx_v_proj);
      PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_9, __pyx_v_proj);
      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":833
 *             proj = " ".join(params)
 *             log.debug("PROJ.4 to be imported: %r", proj)
 *             proj_b = proj.encode('utf-8')             # <<<<<<<<<<<<<<
 *             proj_c = proj_b
 *             _gdal.OSRImportFromProj4(osr, proj_c)
 */
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_proj, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__55, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_v_proj_b = __pyx_t_1;
      __pyx_t_1 = 0;

      /* "rasterio/_base.pyx":834
 *             log.debug("PROJ.4 to be imported: %r", proj)
 *             proj_b = proj.encode('utf-8')
 *             proj_c = proj_b             # <<<<<<<<<<<<<<
 *             _gdal.OSRImportFromProj4(osr, proj_c)
 *     # Fall back for CRS strings like "EPSG:3857."
 */
      __pyx_t_14 = __Pyx_PyObject_AsString(__pyx_v_proj_b); if (unlikely((!__pyx_t_14) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_v_proj_c = __pyx_t_14;

      /* "rasterio/_base.pyx":835
 *             proj_b = proj.encode('utf-8')
 *             proj_c = proj_b
 *             _gdal.OSRImportFromProj4(osr, proj_c)             # <<<<<<<<<<<<<<
 *     # Fall back for CRS strings like "EPSG:3857."
 *     else:
 */
      OSRImportFromProj4(__pyx_v_osr, __pyx_v_proj_c);
    }
    __pyx_L4:;

    /* "rasterio/_base.pyx":817
 *     params = []
 *     # Normally, we expect a CRS dict.
 *     if isinstance(crs, dict):             # <<<<<<<<<<<<<<
 *         # EPSG is a special case.
 *         init = crs.get('init')
 */
    goto __pyx_L3;
  }

  /* "rasterio/_base.pyx":838
 *     # Fall back for CRS strings like "EPSG:3857."
 *     else:
 *         proj_b = crs.encode('utf-8')             # <<<<<<<<<<<<<<
 *         proj_c = proj_b
 *         _gdal.OSRSetFromUserInput(osr, proj_c)
 */
  /*else*/ {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_crs, __pyx_n_s_encode); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__56, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_proj_b = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":839
 *     else:
 *         proj_b = crs.encode('utf-8')
 *         proj_c = proj_b             # <<<<<<<<<<<<<<
 *         _gdal.OSRSetFromUserInput(osr, proj_c)
 *     return osr
 */
    __pyx_t_14 = __Pyx_PyObject_AsString(__pyx_v_proj_b); if (unlikely((!__pyx_t_14) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_proj_c = __pyx_t_14;

    /* "rasterio/_base.pyx":840
 *         proj_b = crs.encode('utf-8')
 *         proj_c = proj_b
 *         _gdal.OSRSetFromUserInput(osr, proj_c)             # <<<<<<<<<<<<<<
 *     return osr
 * 
 */
    OSRSetFromUserInput(__pyx_v_osr, __pyx_v_proj_c);
  }
  __pyx_L3:;

  /* "rasterio/_base.pyx":841
 *         proj_c = proj_b
 *         _gdal.OSRSetFromUserInput(osr, proj_c)
 *     return osr             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = __pyx_v_osr;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":812
 * 
 * 
 * cdef void *_osr_from_crs(object crs):             # <<<<<<<<<<<<<<
 *     cdef char *proj_c = NULL
 *     cdef void *osr = _gdal.OSRNewSpatialReference(NULL)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_WriteUnraisable("rasterio._base._osr_from_crs", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_params);
  __Pyx_XDECREF(__pyx_v_init);
  __Pyx_XDECREF(__pyx_v_auth);
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XDECREF(__pyx_v_k);
  __Pyx_XDECREF(__pyx_v_v);
  __Pyx_XDECREF(__pyx_v_proj);
  __Pyx_XDECREF(__pyx_v_proj_b);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":844
 * 
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):             # <<<<<<<<<<<<<<
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_15_transform(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_15_transform = {"_transform", (PyCFunction)__pyx_pw_8rasterio_5_base_15_transform, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_8rasterio_5_base_15_transform(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_src_crs = 0;
  PyObject *__pyx_v_dst_crs = 0;
  PyObject *__pyx_v_xs = 0;
  PyObject *__pyx_v_ys = 0;
  PyObject *__pyx_v_zs = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_transform (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_src_crs,&__pyx_n_s_dst_crs,&__pyx_n_s_xs,&__pyx_n_s_ys,&__pyx_n_s_zs,0};
    PyObject* values[5] = {0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_src_crs)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dst_crs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_xs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ys)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  4:
        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_zs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_transform") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 5) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
    }
    __pyx_v_src_crs = values[0];
    __pyx_v_dst_crs = values[1];
    __pyx_v_xs = values[2];
    __pyx_v_ys = values[3];
    __pyx_v_zs = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base._transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_14_transform(__pyx_self, __pyx_v_src_crs, __pyx_v_dst_crs, __pyx_v_xs, __pyx_v_ys, __pyx_v_zs);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_14_transform(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_src_crs, PyObject *__pyx_v_dst_crs, PyObject *__pyx_v_xs, PyObject *__pyx_v_ys, PyObject *__pyx_v_zs) {
  double *__pyx_v_x;
  double *__pyx_v_y;
  double *__pyx_v_z;
  CYTHON_UNUSED char *__pyx_v_proj_c;
  void *__pyx_v_src;
  void *__pyx_v_dst;
  void *__pyx_v_transform;
  int __pyx_v_i;
  PyObject *__pyx_v_n = NULL;
  CYTHON_UNUSED int __pyx_v_res;
  PyObject *__pyx_v_res_xs = NULL;
  PyObject *__pyx_v_res_ys = NULL;
  PyObject *__pyx_v_res_zs = NULL;
  PyObject *__pyx_v_retval = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  Py_ssize_t __pyx_t_1;
  Py_ssize_t __pyx_t_2;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  size_t __pyx_t_8;
  long __pyx_t_9;
  int __pyx_t_10;
  double __pyx_t_11;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_transform", 0);

  /* "rasterio/_base.pyx":845
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):
 *     cdef double *x = NULL             # <<<<<<<<<<<<<<
 *     cdef double *y = NULL
 *     cdef double *z = NULL
 */
  __pyx_v_x = NULL;

  /* "rasterio/_base.pyx":846
 * def _transform(src_crs, dst_crs, xs, ys, zs):
 *     cdef double *x = NULL
 *     cdef double *y = NULL             # <<<<<<<<<<<<<<
 *     cdef double *z = NULL
 *     cdef char *proj_c = NULL
 */
  __pyx_v_y = NULL;

  /* "rasterio/_base.pyx":847
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 *     cdef double *z = NULL             # <<<<<<<<<<<<<<
 *     cdef char *proj_c = NULL
 *     cdef void *src = NULL
 */
  __pyx_v_z = NULL;

  /* "rasterio/_base.pyx":848
 *     cdef double *y = NULL
 *     cdef double *z = NULL
 *     cdef char *proj_c = NULL             # <<<<<<<<<<<<<<
 *     cdef void *src = NULL
 *     cdef void *dst = NULL
 */
  __pyx_v_proj_c = NULL;

  /* "rasterio/_base.pyx":849
 *     cdef double *z = NULL
 *     cdef char *proj_c = NULL
 *     cdef void *src = NULL             # <<<<<<<<<<<<<<
 *     cdef void *dst = NULL
 *     cdef void *transform = NULL
 */
  __pyx_v_src = NULL;

  /* "rasterio/_base.pyx":850
 *     cdef char *proj_c = NULL
 *     cdef void *src = NULL
 *     cdef void *dst = NULL             # <<<<<<<<<<<<<<
 *     cdef void *transform = NULL
 *     cdef int i
 */
  __pyx_v_dst = NULL;

  /* "rasterio/_base.pyx":851
 *     cdef void *src = NULL
 *     cdef void *dst = NULL
 *     cdef void *transform = NULL             # <<<<<<<<<<<<<<
 *     cdef int i
 * 
 */
  __pyx_v_transform = NULL;

  /* "rasterio/_base.pyx":854
 *     cdef int i
 * 
 *     assert len(xs) == len(ys)             # <<<<<<<<<<<<<<
 *     assert zs is None or len(xs) == len(zs)
 * 
 */
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_1 = PyObject_Length(__pyx_v_xs); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_2 = PyObject_Length(__pyx_v_ys); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (unlikely(!((__pyx_t_1 == __pyx_t_2) != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
  }
  #endif

  /* "rasterio/_base.pyx":855
 * 
 *     assert len(xs) == len(ys)
 *     assert zs is None or len(xs) == len(zs)             # <<<<<<<<<<<<<<
 * 
 *     src = _osr_from_crs(src_crs)
 */
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_4 = (__pyx_v_zs == Py_None);
    __pyx_t_5 = (__pyx_t_4 != 0);
    if (!__pyx_t_5) {
    } else {
      __pyx_t_3 = __pyx_t_5;
      goto __pyx_L3_bool_binop_done;
    }
    __pyx_t_2 = PyObject_Length(__pyx_v_xs); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_1 = PyObject_Length(__pyx_v_zs); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_5 = ((__pyx_t_2 == __pyx_t_1) != 0);
    __pyx_t_3 = __pyx_t_5;
    __pyx_L3_bool_binop_done:;
    if (unlikely(!__pyx_t_3)) {
      PyErr_SetNone(PyExc_AssertionError);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
  }
  #endif

  /* "rasterio/_base.pyx":857
 *     assert zs is None or len(xs) == len(zs)
 * 
 *     src = _osr_from_crs(src_crs)             # <<<<<<<<<<<<<<
 *     dst = _osr_from_crs(dst_crs)
 * 
 */
  __pyx_v_src = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_src_crs);

  /* "rasterio/_base.pyx":858
 * 
 *     src = _osr_from_crs(src_crs)
 *     dst = _osr_from_crs(dst_crs)             # <<<<<<<<<<<<<<
 * 
 *     n = len(xs)
 */
  __pyx_v_dst = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_dst_crs);

  /* "rasterio/_base.pyx":860
 *     dst = _osr_from_crs(dst_crs)
 * 
 *     n = len(xs)             # <<<<<<<<<<<<<<
 *     x = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))
 */
  __pyx_t_1 = PyObject_Length(__pyx_v_xs); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_v_n = __pyx_t_6;
  __pyx_t_6 = 0;

  /* "rasterio/_base.pyx":861
 * 
 *     n = len(xs)
 *     x = <double *>_gdal.CPLMalloc(n*sizeof(double))             # <<<<<<<<<<<<<<
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     for i in range(n):
 */
  __pyx_t_6 = __Pyx_PyInt_FromSize_t((sizeof(double))); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = PyNumber_Multiply(__pyx_v_n, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_8 = __Pyx_PyInt_As_size_t(__pyx_t_7); if (unlikely((__pyx_t_8 == (size_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_x = ((double *)CPLMalloc(__pyx_t_8));

  /* "rasterio/_base.pyx":862
 *     n = len(xs)
 *     x = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))             # <<<<<<<<<<<<<<
 *     for i in range(n):
 *         x[i] = xs[i]
 */
  __pyx_t_7 = __Pyx_PyInt_FromSize_t((sizeof(double))); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = PyNumber_Multiply(__pyx_v_n, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_8 = __Pyx_PyInt_As_size_t(__pyx_t_6); if (unlikely((__pyx_t_8 == (size_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_y = ((double *)CPLMalloc(__pyx_t_8));

  /* "rasterio/_base.pyx":863
 *     x = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     for i in range(n):             # <<<<<<<<<<<<<<
 *         x[i] = xs[i]
 *         y[i] = ys[i]
 */
  __pyx_t_9 = __Pyx_PyInt_As_long(__pyx_v_n); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_i = __pyx_t_10;

    /* "rasterio/_base.pyx":864
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     for i in range(n):
 *         x[i] = xs[i]             # <<<<<<<<<<<<<<
 *         y[i] = ys[i]
 * 
 */
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_xs, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_11 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_11 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    (__pyx_v_x[__pyx_v_i]) = __pyx_t_11;

    /* "rasterio/_base.pyx":865
 *     for i in range(n):
 *         x[i] = xs[i]
 *         y[i] = ys[i]             # <<<<<<<<<<<<<<
 * 
 *     if zs is not None:
 */
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_ys, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_11 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_11 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    (__pyx_v_y[__pyx_v_i]) = __pyx_t_11;
  }

  /* "rasterio/_base.pyx":867
 *         y[i] = ys[i]
 * 
 *     if zs is not None:             # <<<<<<<<<<<<<<
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *         for i in range(n):
 */
  __pyx_t_3 = (__pyx_v_zs != Py_None);
  __pyx_t_5 = (__pyx_t_3 != 0);
  if (__pyx_t_5) {

    /* "rasterio/_base.pyx":868
 * 
 *     if zs is not None:
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))             # <<<<<<<<<<<<<<
 *         for i in range(n):
 *             z[i] = zs[i]
 */
    __pyx_t_6 = __Pyx_PyInt_FromSize_t((sizeof(double))); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = PyNumber_Multiply(__pyx_v_n, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = __Pyx_PyInt_As_size_t(__pyx_t_7); if (unlikely((__pyx_t_8 == (size_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_v_z = ((double *)CPLMalloc(__pyx_t_8));

    /* "rasterio/_base.pyx":869
 *     if zs is not None:
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *         for i in range(n):             # <<<<<<<<<<<<<<
 *             z[i] = zs[i]
 * 
 */
    __pyx_t_9 = __Pyx_PyInt_As_long(__pyx_v_n); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
      __pyx_v_i = __pyx_t_10;

      /* "rasterio/_base.pyx":870
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *         for i in range(n):
 *             z[i] = zs[i]             # <<<<<<<<<<<<<<
 * 
 *     transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 */
      __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_zs, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_11 = __pyx_PyFloat_AsDouble(__pyx_t_7); if (unlikely((__pyx_t_11 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      (__pyx_v_z[__pyx_v_i]) = __pyx_t_11;
    }

    /* "rasterio/_base.pyx":867
 *         y[i] = ys[i]
 * 
 *     if zs is not None:             # <<<<<<<<<<<<<<
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *         for i in range(n):
 */
  }

  /* "rasterio/_base.pyx":872
 *             z[i] = zs[i]
 * 
 *     transform = _gdal.OCTNewCoordinateTransformation(src, dst)             # <<<<<<<<<<<<<<
 *     res = _gdal.OCTTransform(transform, n, x, y, z)
 *     #if res:
 */
  __pyx_v_transform = OCTNewCoordinateTransformation(__pyx_v_src, __pyx_v_dst);

  /* "rasterio/_base.pyx":873
 * 
 *     transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 *     res = _gdal.OCTTransform(transform, n, x, y, z)             # <<<<<<<<<<<<<<
 *     #if res:
 *     #    raise ValueError("Failed coordinate transformation")
 */
  __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_v_n); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_res = OCTTransform(__pyx_v_transform, __pyx_t_10, __pyx_v_x, __pyx_v_y, __pyx_v_z);

  /* "rasterio/_base.pyx":877
 *     #    raise ValueError("Failed coordinate transformation")
 * 
 *     res_xs = [0]*n             # <<<<<<<<<<<<<<
 *     res_ys = [0]*n
 * 
 */
  __pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_INCREF(__pyx_int_0);
  __Pyx_GIVEREF(__pyx_int_0);
  PyList_SET_ITEM(__pyx_t_7, 0, __pyx_int_0);
  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_7, __pyx_v_n); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_temp);
    __Pyx_DECREF(__pyx_t_7);
    __pyx_t_7 = __pyx_temp;
  }
  __pyx_v_res_xs = ((PyObject*)__pyx_t_7);
  __pyx_t_7 = 0;

  /* "rasterio/_base.pyx":878
 * 
 *     res_xs = [0]*n
 *     res_ys = [0]*n             # <<<<<<<<<<<<<<
 * 
 *     for i in range(n):
 */
  __pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_INCREF(__pyx_int_0);
  __Pyx_GIVEREF(__pyx_int_0);
  PyList_SET_ITEM(__pyx_t_7, 0, __pyx_int_0);
  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_7, __pyx_v_n); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_temp);
    __Pyx_DECREF(__pyx_t_7);
    __pyx_t_7 = __pyx_temp;
  }
  __pyx_v_res_ys = ((PyObject*)__pyx_t_7);
  __pyx_t_7 = 0;

  /* "rasterio/_base.pyx":880
 *     res_ys = [0]*n
 * 
 *     for i in range(n):             # <<<<<<<<<<<<<<
 *         res_xs[i] = x[i]
 *         res_ys[i] = y[i]
 */
  __pyx_t_9 = __Pyx_PyInt_As_long(__pyx_v_n); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_i = __pyx_t_10;

    /* "rasterio/_base.pyx":881
 * 
 *     for i in range(n):
 *         res_xs[i] = x[i]             # <<<<<<<<<<<<<<
 *         res_ys[i] = y[i]
 * 
 */
    __pyx_t_7 = PyFloat_FromDouble((__pyx_v_x[__pyx_v_i])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    if (unlikely(__Pyx_SetItemInt(__pyx_v_res_xs, __pyx_v_i, __pyx_t_7, int, 1, __Pyx_PyInt_From_int, 1, 1, 0) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;

    /* "rasterio/_base.pyx":882
 *     for i in range(n):
 *         res_xs[i] = x[i]
 *         res_ys[i] = y[i]             # <<<<<<<<<<<<<<
 * 
 *     if zs is not None:
 */
    __pyx_t_7 = PyFloat_FromDouble((__pyx_v_y[__pyx_v_i])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    if (unlikely(__Pyx_SetItemInt(__pyx_v_res_ys, __pyx_v_i, __pyx_t_7, int, 1, __Pyx_PyInt_From_int, 1, 1, 0) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  }

  /* "rasterio/_base.pyx":884
 *         res_ys[i] = y[i]
 * 
 *     if zs is not None:             # <<<<<<<<<<<<<<
 *         res_zs = [0]*n
 *         for i in range(n):
 */
  __pyx_t_5 = (__pyx_v_zs != Py_None);
  __pyx_t_3 = (__pyx_t_5 != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":885
 * 
 *     if zs is not None:
 *         res_zs = [0]*n             # <<<<<<<<<<<<<<
 *         for i in range(n):
 *             res_zs[i] = z[i]
 */
    __pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_int_0);
    __Pyx_GIVEREF(__pyx_int_0);
    PyList_SET_ITEM(__pyx_t_7, 0, __pyx_int_0);
    { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_7, __pyx_v_n); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_temp);
      __Pyx_DECREF(__pyx_t_7);
      __pyx_t_7 = __pyx_temp;
    }
    __pyx_v_res_zs = ((PyObject*)__pyx_t_7);
    __pyx_t_7 = 0;

    /* "rasterio/_base.pyx":886
 *     if zs is not None:
 *         res_zs = [0]*n
 *         for i in range(n):             # <<<<<<<<<<<<<<
 *             res_zs[i] = z[i]
 *         _gdal.CPLFree(z)
 */
    __pyx_t_9 = __Pyx_PyInt_As_long(__pyx_v_n); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
      __pyx_v_i = __pyx_t_10;

      /* "rasterio/_base.pyx":887
 *         res_zs = [0]*n
 *         for i in range(n):
 *             res_zs[i] = z[i]             # <<<<<<<<<<<<<<
 *         _gdal.CPLFree(z)
 * 
 */
      __pyx_t_7 = PyFloat_FromDouble((__pyx_v_z[__pyx_v_i])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      if (unlikely(__Pyx_SetItemInt(__pyx_v_res_zs, __pyx_v_i, __pyx_t_7, int, 1, __Pyx_PyInt_From_int, 1, 1, 0) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }

    /* "rasterio/_base.pyx":888
 *         for i in range(n):
 *             res_zs[i] = z[i]
 *         _gdal.CPLFree(z)             # <<<<<<<<<<<<<<
 * 
 *         retval = (res_xs, res_ys, res_zs)
 */
    CPLFree(__pyx_v_z);

    /* "rasterio/_base.pyx":890
 *         _gdal.CPLFree(z)
 * 
 *         retval = (res_xs, res_ys, res_zs)             # <<<<<<<<<<<<<<
 *     else:
 *         retval = (res_xs, res_ys)
 */
    __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_v_res_xs);
    __Pyx_GIVEREF(__pyx_v_res_xs);
    PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_res_xs);
    __Pyx_INCREF(__pyx_v_res_ys);
    __Pyx_GIVEREF(__pyx_v_res_ys);
    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_res_ys);
    __Pyx_INCREF(__pyx_v_res_zs);
    __Pyx_GIVEREF(__pyx_v_res_zs);
    PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_v_res_zs);
    __pyx_v_retval = ((PyObject*)__pyx_t_7);
    __pyx_t_7 = 0;

    /* "rasterio/_base.pyx":884
 *         res_ys[i] = y[i]
 * 
 *     if zs is not None:             # <<<<<<<<<<<<<<
 *         res_zs = [0]*n
 *         for i in range(n):
 */
    goto __pyx_L12;
  }

  /* "rasterio/_base.pyx":892
 *         retval = (res_xs, res_ys, res_zs)
 *     else:
 *         retval = (res_xs, res_ys)             # <<<<<<<<<<<<<<
 * 
 *     _gdal.CPLFree(x)
 */
  /*else*/ {
    __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_v_res_xs);
    __Pyx_GIVEREF(__pyx_v_res_xs);
    PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_res_xs);
    __Pyx_INCREF(__pyx_v_res_ys);
    __Pyx_GIVEREF(__pyx_v_res_ys);
    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_res_ys);
    __pyx_v_retval = ((PyObject*)__pyx_t_7);
    __pyx_t_7 = 0;
  }
  __pyx_L12:;

  /* "rasterio/_base.pyx":894
 *         retval = (res_xs, res_ys)
 * 
 *     _gdal.CPLFree(x)             # <<<<<<<<<<<<<<
 *     _gdal.CPLFree(y)
 *     _gdal.OCTDestroyCoordinateTransformation(transform)
 */
  CPLFree(__pyx_v_x);

  /* "rasterio/_base.pyx":895
 * 
 *     _gdal.CPLFree(x)
 *     _gdal.CPLFree(y)             # <<<<<<<<<<<<<<
 *     _gdal.OCTDestroyCoordinateTransformation(transform)
 *     _gdal.OSRDestroySpatialReference(src)
 */
  CPLFree(__pyx_v_y);

  /* "rasterio/_base.pyx":896
 *     _gdal.CPLFree(x)
 *     _gdal.CPLFree(y)
 *     _gdal.OCTDestroyCoordinateTransformation(transform)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(src)
 *     _gdal.OSRDestroySpatialReference(dst)
 */
  OCTDestroyCoordinateTransformation(__pyx_v_transform);

  /* "rasterio/_base.pyx":897
 *     _gdal.CPLFree(y)
 *     _gdal.OCTDestroyCoordinateTransformation(transform)
 *     _gdal.OSRDestroySpatialReference(src)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(dst)
 *     return retval
 */
  OSRDestroySpatialReference(__pyx_v_src);

  /* "rasterio/_base.pyx":898
 *     _gdal.OCTDestroyCoordinateTransformation(transform)
 *     _gdal.OSRDestroySpatialReference(src)
 *     _gdal.OSRDestroySpatialReference(dst)             # <<<<<<<<<<<<<<
 *     return retval
 * 
 */
  OSRDestroySpatialReference(__pyx_v_dst);

  /* "rasterio/_base.pyx":899
 *     _gdal.OSRDestroySpatialReference(src)
 *     _gdal.OSRDestroySpatialReference(dst)
 *     return retval             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_retval);
  __pyx_r = __pyx_v_retval;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":844
 * 
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):             # <<<<<<<<<<<<<<
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("rasterio._base._transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_res_xs);
  __Pyx_XDECREF(__pyx_v_res_ys);
  __Pyx_XDECREF(__pyx_v_res_zs);
  __Pyx_XDECREF(__pyx_v_retval);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":902
 * 
 * 
 * def is_geographic_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_17is_geographic_crs(PyObject *__pyx_self, PyObject *__pyx_v_crs); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_17is_geographic_crs = {"is_geographic_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_17is_geographic_crs, METH_O, 0};
static PyObject *__pyx_pw_8rasterio_5_base_17is_geographic_crs(PyObject *__pyx_self, PyObject *__pyx_v_crs) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_geographic_crs (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_16is_geographic_crs(__pyx_self, ((PyObject *)__pyx_v_crs));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_16is_geographic_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs) {
  void *__pyx_v_osr_crs;
  int __pyx_v_retval;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("is_geographic_crs", 0);

  /* "rasterio/_base.pyx":903
 * 
 * def is_geographic_crs(crs):
 *     cdef void *osr_crs = _osr_from_crs(crs)             # <<<<<<<<<<<<<<
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 */
  __pyx_v_osr_crs = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_crs);

  /* "rasterio/_base.pyx":904
 * def is_geographic_crs(crs):
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 * 
 */
  __pyx_v_retval = OSRIsGeographic(__pyx_v_osr_crs);

  /* "rasterio/_base.pyx":905
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)             # <<<<<<<<<<<<<<
 * 
 *     return retval == 1
 */
  OSRDestroySpatialReference(__pyx_v_osr_crs);

  /* "rasterio/_base.pyx":907
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 * 
 *     return retval == 1             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_retval == 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":902
 * 
 * 
 * def is_geographic_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.is_geographic_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":910
 * 
 * 
 * def is_projected_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_19is_projected_crs(PyObject *__pyx_self, PyObject *__pyx_v_crs); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_19is_projected_crs = {"is_projected_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_19is_projected_crs, METH_O, 0};
static PyObject *__pyx_pw_8rasterio_5_base_19is_projected_crs(PyObject *__pyx_self, PyObject *__pyx_v_crs) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_projected_crs (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_18is_projected_crs(__pyx_self, ((PyObject *)__pyx_v_crs));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_18is_projected_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs) {
  void *__pyx_v_osr_crs;
  int __pyx_v_retval;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("is_projected_crs", 0);

  /* "rasterio/_base.pyx":911
 * 
 * def is_projected_crs(crs):
 *     cdef void *osr_crs = _osr_from_crs(crs)             # <<<<<<<<<<<<<<
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 */
  __pyx_v_osr_crs = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_crs);

  /* "rasterio/_base.pyx":912
 * def is_projected_crs(crs):
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 * 
 */
  __pyx_v_retval = OSRIsProjected(__pyx_v_osr_crs);

  /* "rasterio/_base.pyx":913
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)             # <<<<<<<<<<<<<<
 * 
 *     return retval == 1
 */
  OSRDestroySpatialReference(__pyx_v_osr_crs);

  /* "rasterio/_base.pyx":915
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 * 
 *     return retval == 1             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_retval == 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":910
 * 
 * 
 * def is_projected_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.is_projected_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":918
 * 
 * 
 * def is_same_crs(crs1, crs2):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_21is_same_crs(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_21is_same_crs = {"is_same_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_21is_same_crs, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_8rasterio_5_base_21is_same_crs(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_crs1 = 0;
  PyObject *__pyx_v_crs2 = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_same_crs (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_crs1,&__pyx_n_s_crs2,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_crs1)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_crs2)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("is_same_crs", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "is_same_crs") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_crs1 = values[0];
    __pyx_v_crs2 = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("is_same_crs", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.is_same_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_20is_same_crs(__pyx_self, __pyx_v_crs1, __pyx_v_crs2);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_20is_same_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs1, PyObject *__pyx_v_crs2) {
  void *__pyx_v_osr_crs1;
  void *__pyx_v_osr_crs2;
  int __pyx_v_retval;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("is_same_crs", 0);

  /* "rasterio/_base.pyx":919
 * 
 * def is_same_crs(crs1, crs2):
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)
 */
  __pyx_v_osr_crs1 = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_crs1);

  /* "rasterio/_base.pyx":920
 * def is_same_crs(crs1, crs2):
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)             # <<<<<<<<<<<<<<
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)
 *     _gdal.OSRDestroySpatialReference(osr_crs1)
 */
  __pyx_v_osr_crs2 = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_crs2);

  /* "rasterio/_base.pyx":921
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(osr_crs1)
 *     _gdal.OSRDestroySpatialReference(osr_crs2)
 */
  __pyx_v_retval = OSRIsSame(__pyx_v_osr_crs1, __pyx_v_osr_crs2);

  /* "rasterio/_base.pyx":922
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)
 *     _gdal.OSRDestroySpatialReference(osr_crs1)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(osr_crs2)
 * 
 */
  OSRDestroySpatialReference(__pyx_v_osr_crs1);

  /* "rasterio/_base.pyx":923
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)
 *     _gdal.OSRDestroySpatialReference(osr_crs1)
 *     _gdal.OSRDestroySpatialReference(osr_crs2)             # <<<<<<<<<<<<<<
 * 
 *     return retval == 1
 */
  OSRDestroySpatialReference(__pyx_v_osr_crs2);

  /* "rasterio/_base.pyx":925
 *     _gdal.OSRDestroySpatialReference(osr_crs2)
 * 
 *     return retval == 1             # <<<<<<<<<<<<<<
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_retval == 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":918
 * 
 * 
 * def is_same_crs(crs1, crs2):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.is_same_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader __pyx_vtable_8rasterio_5_base_DatasetReader;

static PyObject *__pyx_tp_new_8rasterio_5_base_DatasetReader(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  struct __pyx_obj_8rasterio_5_base_DatasetReader *p;
  PyObject *o;
  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
    o = (*t->tp_alloc)(t, 0);
  } else {
    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
  }
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_8rasterio_5_base_DatasetReader *)o);
  p->__pyx_vtab = __pyx_vtabptr_8rasterio_5_base_DatasetReader;
  p->name = Py_None; Py_INCREF(Py_None);
  p->mode = Py_None; Py_INCREF(Py_None);
  p->width = Py_None; Py_INCREF(Py_None);
  p->height = Py_None; Py_INCREF(Py_None);
  p->shape = Py_None; Py_INCREF(Py_None);
  p->driver = Py_None; Py_INCREF(Py_None);
  p->_count = Py_None; Py_INCREF(Py_None);
  p->_dtypes = Py_None; Py_INCREF(Py_None);
  p->_closed = Py_None; Py_INCREF(Py_None);
  p->_crs = Py_None; Py_INCREF(Py_None);
  p->_crs_wkt = Py_None; Py_INCREF(Py_None);
  p->_transform = Py_None; Py_INCREF(Py_None);
  p->_block_shapes = Py_None; Py_INCREF(Py_None);
  p->_nodatavals = Py_None; Py_INCREF(Py_None);
  p->_read = Py_None; Py_INCREF(Py_None);
  p->env = Py_None; Py_INCREF(Py_None);
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base_DatasetReader(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base_DatasetReader *p = (struct __pyx_obj_8rasterio_5_base_DatasetReader *)o;
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  PyObject_GC_UnTrack(o);
  {
    PyObject *etype, *eval, *etb;
    PyErr_Fetch(&etype, &eval, &etb);
    ++Py_REFCNT(o);
    __pyx_pw_8rasterio_5_base_13DatasetReader_21__dealloc__(o);
    --Py_REFCNT(o);
    PyErr_Restore(etype, eval, etb);
  }
  Py_CLEAR(p->name);
  Py_CLEAR(p->mode);
  Py_CLEAR(p->width);
  Py_CLEAR(p->height);
  Py_CLEAR(p->shape);
  Py_CLEAR(p->driver);
  Py_CLEAR(p->_count);
  Py_CLEAR(p->_dtypes);
  Py_CLEAR(p->_closed);
  Py_CLEAR(p->_crs);
  Py_CLEAR(p->_crs_wkt);
  Py_CLEAR(p->_transform);
  Py_CLEAR(p->_block_shapes);
  Py_CLEAR(p->_nodatavals);
  Py_CLEAR(p->_read);
  Py_CLEAR(p->env);
  (*Py_TYPE(o)->tp_free)(o);
}

static int __pyx_tp_traverse_8rasterio_5_base_DatasetReader(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base_DatasetReader *p = (struct __pyx_obj_8rasterio_5_base_DatasetReader *)o;
  if (p->name) {
    e = (*v)(p->name, a); if (e) return e;
  }
  if (p->mode) {
    e = (*v)(p->mode, a); if (e) return e;
  }
  if (p->width) {
    e = (*v)(p->width, a); if (e) return e;
  }
  if (p->height) {
    e = (*v)(p->height, a); if (e) return e;
  }
  if (p->shape) {
    e = (*v)(p->shape, a); if (e) return e;
  }
  if (p->driver) {
    e = (*v)(p->driver, a); if (e) return e;
  }
  if (p->_count) {
    e = (*v)(p->_count, a); if (e) return e;
  }
  if (p->_dtypes) {
    e = (*v)(p->_dtypes, a); if (e) return e;
  }
  if (p->_closed) {
    e = (*v)(p->_closed, a); if (e) return e;
  }
  if (p->_crs) {
    e = (*v)(p->_crs, a); if (e) return e;
  }
  if (p->_crs_wkt) {
    e = (*v)(p->_crs_wkt, a); if (e) return e;
  }
  if (p->_transform) {
    e = (*v)(p->_transform, a); if (e) return e;
  }
  if (p->_block_shapes) {
    e = (*v)(p->_block_shapes, a); if (e) return e;
  }
  if (p->_nodatavals) {
    e = (*v)(p->_nodatavals, a); if (e) return e;
  }
  if (p->_read) {
    e = (*v)(p->_read, a); if (e) return e;
  }
  if (p->env) {
    e = (*v)(p->env, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base_DatasetReader(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base_DatasetReader *p = (struct __pyx_obj_8rasterio_5_base_DatasetReader *)o;
  tmp = ((PyObject*)p->name);
  p->name = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->mode);
  p->mode = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->width);
  p->width = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->height);
  p->height = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->shape);
  p->shape = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->driver);
  p->driver = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_count);
  p->_count = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_dtypes);
  p->_dtypes = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_closed);
  p->_closed = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_crs);
  p->_crs = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_crs_wkt);
  p->_crs_wkt = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_transform);
  p->_transform = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_block_shapes);
  p->_block_shapes = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_nodatavals);
  p->_nodatavals = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_read);
  p->_read = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->env);
  p->env = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_nodatavals(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_10nodatavals_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_nodata(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6nodata_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_bounds(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6bounds_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_res(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_3res_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_profile(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7profile_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_crs(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_3crs_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_crs_wkt(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7crs_wkt_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_transform(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_9transform_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_affine(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6affine_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_name(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_4name_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_mode(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_4mode_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_width(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_5width_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_height(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6height_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_shape(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_5shape_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_driver(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader_driver(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__count(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__count(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__dtypes(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__dtypes(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__closed(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__closed(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__crs(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__crs(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__crs_wkt(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__crs_wkt(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__transform(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__transform(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__block_shapes(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__block_shapes(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__nodatavals(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__nodatavals(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__read(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__read(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_5__del__(o);
  }
}

static PyMethodDef __pyx_methods_8rasterio_5_base_DatasetReader[] = {
  {"start", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_5start, METH_NOARGS, 0},
  {"read_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_7read_crs, METH_NOARGS, 0},
  {"read_crs_wkt", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_9read_crs_wkt, METH_NOARGS, 0},
  {"read_transform", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_11read_transform, METH_NOARGS, 0},
  {"stop", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_13stop, METH_NOARGS, 0},
  {"close", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_15close, METH_NOARGS, 0},
  {"__enter__", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_17__enter__, METH_NOARGS, 0},
  {"__exit__", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_19__exit__, METH_VARARGS|METH_KEYWORDS, 0},
  {"closed", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_23closed, METH_NOARGS, 0},
  {"count", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_25count, METH_NOARGS, 0},
  {"indexes", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_27indexes, METH_NOARGS, 0},
  {"dtypes", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_29dtypes, METH_NOARGS, __pyx_doc_8rasterio_5_base_13DatasetReader_28dtypes},
  {"block_shapes", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_31block_shapes, METH_NOARGS, __pyx_doc_8rasterio_5_base_13DatasetReader_30block_shapes},
  {"get_nodatavals", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_33get_nodatavals, METH_NOARGS, 0},
  {"block_windows", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_35block_windows, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_34block_windows},
  {"ul", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_38ul, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_37ul},
  {"index", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_40index, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_39index},
  {"window", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_42window, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_41window},
  {"window_transform", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_44window_transform, METH_O, __pyx_doc_8rasterio_5_base_13DatasetReader_43window_transform},
  {"window_bounds", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_46window_bounds, METH_O, __pyx_doc_8rasterio_5_base_13DatasetReader_45window_bounds},
  {"meta", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_48meta, METH_NOARGS, __pyx_doc_8rasterio_5_base_13DatasetReader_47meta},
  {"compression", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_50compression, METH_NOARGS, 0},
  {"interleaving", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_52interleaving, METH_NOARGS, 0},
  {"lnglat", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_54lnglat, METH_NOARGS, 0},
  {"get_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_56get_crs, METH_NOARGS, 0},
  {"get_transform", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_58get_transform, METH_NOARGS, __pyx_doc_8rasterio_5_base_13DatasetReader_57get_transform},
  {"tags", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_60tags, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_59tags},
  {"colorinterp", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_62colorinterp, METH_O, __pyx_doc_8rasterio_5_base_13DatasetReader_61colorinterp},
  {"colormap", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_64colormap, METH_O, __pyx_doc_8rasterio_5_base_13DatasetReader_63colormap},
  {"kwds", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_66kwds, METH_NOARGS, 0},
  {"overviews", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_68overviews, METH_O, 0},
  {"checksum", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_70checksum, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_69checksum},
  {0, 0, 0, 0}
};

static struct PyGetSetDef __pyx_getsets_8rasterio_5_base_DatasetReader[] = {
  {(char *)"nodatavals", __pyx_getprop_8rasterio_5_base_13DatasetReader_nodatavals, 0, __pyx_k_Nodata_values_for_each_band, 0},
  {(char *)"nodata", __pyx_getprop_8rasterio_5_base_13DatasetReader_nodata, 0, __pyx_k_The_dataset_s_single_nodata_valu, 0},
  {(char *)"bounds", __pyx_getprop_8rasterio_5_base_13DatasetReader_bounds, 0, __pyx_k_Returns_the_lower_left_and_upper, 0},
  {(char *)"res", __pyx_getprop_8rasterio_5_base_13DatasetReader_res, 0, __pyx_k_Returns_the_width_height_of_pixe, 0},
  {(char *)"profile", __pyx_getprop_8rasterio_5_base_13DatasetReader_profile, 0, __pyx_k_Basic_metadata_and_creation_opti, 0},
  {(char *)"crs", __pyx_getprop_8rasterio_5_base_13DatasetReader_crs, 0, __pyx_k_A_mapping_of_PROJ_4_coordinate_r, 0},
  {(char *)"crs_wkt", __pyx_getprop_8rasterio_5_base_13DatasetReader_crs_wkt, 0, __pyx_k_An_OGC_WKT_string_representation, 0},
  {(char *)"transform", __pyx_getprop_8rasterio_5_base_13DatasetReader_transform, 0, __pyx_k_Coefficients_of_the_affine_trans, 0},
  {(char *)"affine", __pyx_getprop_8rasterio_5_base_13DatasetReader_affine, 0, __pyx_k_An_instance_of_affine_Affine_Thi, 0},
  {(char *)"name", __pyx_getprop_8rasterio_5_base_13DatasetReader_name, 0, 0, 0},
  {(char *)"mode", __pyx_getprop_8rasterio_5_base_13DatasetReader_mode, 0, 0, 0},
  {(char *)"width", __pyx_getprop_8rasterio_5_base_13DatasetReader_width, 0, 0, 0},
  {(char *)"height", __pyx_getprop_8rasterio_5_base_13DatasetReader_height, 0, 0, 0},
  {(char *)"shape", __pyx_getprop_8rasterio_5_base_13DatasetReader_shape, 0, 0, 0},
  {(char *)"driver", __pyx_getprop_8rasterio_5_base_13DatasetReader_driver, __pyx_setprop_8rasterio_5_base_13DatasetReader_driver, 0, 0},
  {(char *)"_count", __pyx_getprop_8rasterio_5_base_13DatasetReader__count, __pyx_setprop_8rasterio_5_base_13DatasetReader__count, 0, 0},
  {(char *)"_dtypes", __pyx_getprop_8rasterio_5_base_13DatasetReader__dtypes, __pyx_setprop_8rasterio_5_base_13DatasetReader__dtypes, 0, 0},
  {(char *)"_closed", __pyx_getprop_8rasterio_5_base_13DatasetReader__closed, __pyx_setprop_8rasterio_5_base_13DatasetReader__closed, 0, 0},
  {(char *)"_crs", __pyx_getprop_8rasterio_5_base_13DatasetReader__crs, __pyx_setprop_8rasterio_5_base_13DatasetReader__crs, 0, 0},
  {(char *)"_crs_wkt", __pyx_getprop_8rasterio_5_base_13DatasetReader__crs_wkt, __pyx_setprop_8rasterio_5_base_13DatasetReader__crs_wkt, 0, 0},
  {(char *)"_transform", __pyx_getprop_8rasterio_5_base_13DatasetReader__transform, __pyx_setprop_8rasterio_5_base_13DatasetReader__transform, 0, 0},
  {(char *)"_block_shapes", __pyx_getprop_8rasterio_5_base_13DatasetReader__block_shapes, __pyx_setprop_8rasterio_5_base_13DatasetReader__block_shapes, 0, 0},
  {(char *)"_nodatavals", __pyx_getprop_8rasterio_5_base_13DatasetReader__nodatavals, __pyx_setprop_8rasterio_5_base_13DatasetReader__nodatavals, 0, 0},
  {(char *)"_read", __pyx_getprop_8rasterio_5_base_13DatasetReader__read, __pyx_setprop_8rasterio_5_base_13DatasetReader__read, 0, 0},
  {0, 0, 0, 0, 0}
};

static PyTypeObject __pyx_type_8rasterio_5_base_DatasetReader = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.DatasetReader", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base_DatasetReader), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base_DatasetReader, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  __pyx_pw_8rasterio_5_base_13DatasetReader_3__repr__, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base_DatasetReader, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base_DatasetReader, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_8rasterio_5_base_DatasetReader, /*tp_methods*/
  0, /*tp_members*/
  __pyx_getsets_8rasterio_5_base_DatasetReader, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pw_8rasterio_5_base_13DatasetReader_1__init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base_DatasetReader, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *__pyx_freelist_8rasterio_5_base___pyx_scope_struct__block_windows[8];
static int __pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows = 0;

static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct__block_windows(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows)))) {
    o = (PyObject*)__pyx_freelist_8rasterio_5_base___pyx_scope_struct__block_windows[--__pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows];
    memset(o, 0, sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct__block_windows(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_bidx);
  Py_CLEAR(p->__pyx_v_block_shapes);
  Py_CLEAR(p->__pyx_v_col);
  Py_CLEAR(p->__pyx_v_d);
  Py_CLEAR(p->__pyx_v_h);
  Py_CLEAR(p->__pyx_v_height);
  Py_CLEAR(p->__pyx_v_m);
  Py_CLEAR(p->__pyx_v_ncols);
  Py_CLEAR(p->__pyx_v_nrows);
  Py_CLEAR(p->__pyx_v_row);
  Py_CLEAR(p->__pyx_v_self);
  Py_CLEAR(p->__pyx_v_w);
  Py_CLEAR(p->__pyx_v_width);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows)))) {
    __pyx_freelist_8rasterio_5_base___pyx_scope_struct__block_windows[__pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows++] = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct__block_windows(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)o;
  if (p->__pyx_v_bidx) {
    e = (*v)(p->__pyx_v_bidx, a); if (e) return e;
  }
  if (p->__pyx_v_block_shapes) {
    e = (*v)(p->__pyx_v_block_shapes, a); if (e) return e;
  }
  if (p->__pyx_v_col) {
    e = (*v)(p->__pyx_v_col, a); if (e) return e;
  }
  if (p->__pyx_v_d) {
    e = (*v)(p->__pyx_v_d, a); if (e) return e;
  }
  if (p->__pyx_v_h) {
    e = (*v)(p->__pyx_v_h, a); if (e) return e;
  }
  if (p->__pyx_v_height) {
    e = (*v)(p->__pyx_v_height, a); if (e) return e;
  }
  if (p->__pyx_v_m) {
    e = (*v)(p->__pyx_v_m, a); if (e) return e;
  }
  if (p->__pyx_v_ncols) {
    e = (*v)(p->__pyx_v_ncols, a); if (e) return e;
  }
  if (p->__pyx_v_nrows) {
    e = (*v)(p->__pyx_v_nrows, a); if (e) return e;
  }
  if (p->__pyx_v_row) {
    e = (*v)(p->__pyx_v_row, a); if (e) return e;
  }
  if (p->__pyx_v_self) {
    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
  }
  if (p->__pyx_v_w) {
    e = (*v)(p->__pyx_v_w, a); if (e) return e;
  }
  if (p->__pyx_v_width) {
    e = (*v)(p->__pyx_v_width, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct__block_windows(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)o;
  tmp = ((PyObject*)p->__pyx_v_bidx);
  p->__pyx_v_bidx = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_block_shapes);
  p->__pyx_v_block_shapes = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_col);
  p->__pyx_v_col = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_d);
  p->__pyx_v_d = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_h);
  p->__pyx_v_h = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_height);
  p->__pyx_v_height = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_m);
  p->__pyx_v_m = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_ncols);
  p->__pyx_v_ncols = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_nrows);
  p->__pyx_v_nrows = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_row);
  p->__pyx_v_row = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_self);
  p->__pyx_v_self = ((struct __pyx_obj_8rasterio_5_base_DatasetReader *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_w);
  p->__pyx_v_w = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_width);
  p->__pyx_v_width = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_8rasterio_5_base___pyx_scope_struct__block_windows = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.__pyx_scope_struct__block_windows", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct__block_windows, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct__block_windows, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct__block_windows, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base___pyx_scope_struct__block_windows, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *__pyx_freelist_8rasterio_5_base___pyx_scope_struct_1_window_index[8];
static int __pyx_freecount_8rasterio_5_base___pyx_scope_struct_1_window_index = 0;

static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_1_window_index(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_1_window_index > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index)))) {
    o = (PyObject*)__pyx_freelist_8rasterio_5_base___pyx_scope_struct_1_window_index[--__pyx_freecount_8rasterio_5_base___pyx_scope_struct_1_window_index];
    memset(o, 0, sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_1_window_index(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_window);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_1_window_index < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index)))) {
    __pyx_freelist_8rasterio_5_base___pyx_scope_struct_1_window_index[__pyx_freecount_8rasterio_5_base___pyx_scope_struct_1_window_index++] = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_1_window_index(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *)o;
  if (p->__pyx_v_window) {
    e = (*v)(p->__pyx_v_window, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_1_window_index(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *)o;
  tmp = ((PyObject*)p->__pyx_v_window);
  p->__pyx_v_window = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_8rasterio_5_base___pyx_scope_struct_1_window_index = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.__pyx_scope_struct_1_window_index", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_1_window_index, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_1_window_index, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_1_window_index, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base___pyx_scope_struct_1_window_index, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *__pyx_freelist_8rasterio_5_base___pyx_scope_struct_2_genexpr[8];
static int __pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr = 0;

static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr)))) {
    o = (PyObject*)__pyx_freelist_8rasterio_5_base___pyx_scope_struct_2_genexpr[--__pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr];
    memset(o, 0, sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_outer_scope);
  Py_CLEAR(p->__pyx_v_w);
  Py_CLEAR(p->__pyx_t_0);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr)))) {
    __pyx_freelist_8rasterio_5_base___pyx_scope_struct_2_genexpr[__pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr++] = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)o;
  if (p->__pyx_outer_scope) {
    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
  }
  if (p->__pyx_v_w) {
    e = (*v)(p->__pyx_v_w, a); if (e) return e;
  }
  if (p->__pyx_t_0) {
    e = (*v)(p->__pyx_t_0, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)o;
  tmp = ((PyObject*)p->__pyx_outer_scope);
  p->__pyx_outer_scope = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1_window_index *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_w);
  p->__pyx_v_w = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_t_0);
  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_8rasterio_5_base___pyx_scope_struct_2_genexpr = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.__pyx_scope_struct_2_genexpr", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_2_genexpr, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_2_genexpr, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_2_genexpr, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base___pyx_scope_struct_2_genexpr, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static PyMethodDef __pyx_methods[] = {
  {"crop_window", (PyCFunction)__pyx_pw_8rasterio_5_base_1crop_window, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_crop_window},
  {"eval_window", (PyCFunction)__pyx_pw_8rasterio_5_base_3eval_window, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_2eval_window},
  {0, 0, 0, 0}
};

#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef __pyx_moduledef = {
  #if PY_VERSION_HEX < 0x03020000
    { PyObject_HEAD_INIT(NULL) NULL, 0, NULL },
  #else
    PyModuleDef_HEAD_INIT,
  #endif
    "_base",
    0, /* m_doc */
    -1, /* m_size */
    __pyx_methods /* m_methods */,
    NULL, /* m_reload */
    NULL, /* m_traverse */
    NULL, /* m_clear */
    NULL /* m_free */
};
#endif

static __Pyx_StringTabEntry __pyx_string_tab[] = {
  {&__pyx_kp_s_A_band_index_must_be_provided_wh, __pyx_k_A_band_index_must_be_provided_wh, sizeof(__pyx_k_A_band_index_must_be_provided_wh), 0, 0, 1, 0},
  {&__pyx_n_s_Affine, __pyx_k_Affine, sizeof(__pyx_k_Affine), 0, 0, 1, 1},
  {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1},
  {&__pyx_n_s_BoundingBox, __pyx_k_BoundingBox, sizeof(__pyx_k_BoundingBox), 0, 0, 1, 1},
  {&__pyx_n_s_COMPRESSION, __pyx_k_COMPRESSION, sizeof(__pyx_k_COMPRESSION), 0, 0, 1, 1},
  {&__pyx_kp_s_Can_t_read_closed_raster_file, __pyx_k_Can_t_read_closed_raster_file, sizeof(__pyx_k_Can_t_read_closed_raster_file), 0, 0, 1, 0},
  {&__pyx_n_s_ColorInterp, __pyx_k_ColorInterp, sizeof(__pyx_k_ColorInterp), 0, 0, 1, 1},
  {&__pyx_kp_s_Color_d_d_d_d, __pyx_k_Color_d_d_d_d, sizeof(__pyx_k_Color_d_d_d_d), 0, 0, 1, 0},
  {&__pyx_n_s_Compression, __pyx_k_Compression, sizeof(__pyx_k_Compression), 0, 0, 1, 1},
  {&__pyx_n_s_DatasetReader_block_windows, __pyx_k_DatasetReader_block_windows, sizeof(__pyx_k_DatasetReader_block_windows), 0, 0, 1, 1},
  {&__pyx_n_s_EPSG, __pyx_k_EPSG, sizeof(__pyx_k_EPSG), 0, 0, 1, 1},
  {&__pyx_kp_s_Failed_to_auto_identify_EPSG_d, __pyx_k_Failed_to_auto_identify_EPSG_d, sizeof(__pyx_k_Failed_to_auto_identify_EPSG_d), 0, 0, 1, 0},
  {&__pyx_n_s_FutureWarning, __pyx_k_FutureWarning, sizeof(__pyx_k_FutureWarning), 0, 0, 1, 1},
  {&__pyx_n_s_GDALEnv, __pyx_k_GDALEnv, sizeof(__pyx_k_GDALEnv), 0, 0, 1, 1},
  {&__pyx_kp_s_GDAL_dataset_has_no_projection, __pyx_k_GDAL_dataset_has_no_projection, sizeof(__pyx_k_GDAL_dataset_has_no_projection), 0, 0, 1, 0},
  {&__pyx_kp_s_Got_coordinate_system, __pyx_k_Got_coordinate_system, sizeof(__pyx_k_Got_coordinate_system), 0, 0, 1, 0},
  {&__pyx_n_s_Handler, __pyx_k_Handler, sizeof(__pyx_k_Handler), 0, 0, 1, 1},
  {&__pyx_n_s_IMAGE_STRUCTURE, __pyx_k_IMAGE_STRUCTURE, sizeof(__pyx_k_IMAGE_STRUCTURE), 0, 0, 1, 1},
  {&__pyx_n_s_INTERLEAVE, __pyx_k_INTERLEAVE, sizeof(__pyx_k_INTERLEAVE), 0, 0, 1, 1},
  {&__pyx_n_s_Interleaving, __pyx_k_Interleaving, sizeof(__pyx_k_Interleaving), 0, 0, 1, 1},
  {&__pyx_kp_s_Invalid_band_index, __pyx_k_Invalid_band_index, sizeof(__pyx_k_Invalid_band_index), 0, 0, 1, 0},
  {&__pyx_kp_s_NULL_band, __pyx_k_NULL_band, sizeof(__pyx_k_NULL_band), 0, 0, 1, 0},
  {&__pyx_kp_s_NULL_color_at_d_skipping, __pyx_k_NULL_color_at_d_skipping, sizeof(__pyx_k_NULL_color_at_d_skipping), 0, 0, 1, 0},
  {&__pyx_kp_s_NULL_color_table, __pyx_k_NULL_color_table, sizeof(__pyx_k_NULL_color_table), 0, 0, 1, 0},
  {&__pyx_kp_s_Nodata_success_d, __pyx_k_Nodata_success_d, sizeof(__pyx_k_Nodata_success_d), 0, 0, 1, 0},
  {&__pyx_kp_s_Nodata_value_f, __pyx_k_Nodata_value_f, sizeof(__pyx_k_Nodata_value_f), 0, 0, 1, 0},
  {&__pyx_n_s_NullHandler, __pyx_k_NullHandler, sizeof(__pyx_k_NullHandler), 0, 0, 1, 1},
  {&__pyx_n_s_NullHandler_emit, __pyx_k_NullHandler_emit, sizeof(__pyx_k_NullHandler_emit), 0, 0, 1, 1},
  {&__pyx_kp_s_Null_band, __pyx_k_Null_band, sizeof(__pyx_k_Null_band), 0, 0, 1, 0},
  {&__pyx_kp_s_Null_dataset, __pyx_k_Null_dataset, sizeof(__pyx_k_Null_dataset), 0, 0, 1, 0},
  {&__pyx_kp_s_Null_projection, __pyx_k_Null_projection, sizeof(__pyx_k_Null_projection), 0, 0, 1, 0},
  {&__pyx_kp_s_PROJ_4_to_be_imported_r, __pyx_k_PROJ_4_to_be_imported_r, sizeof(__pyx_k_PROJ_4_to_be_imported_r), 0, 0, 1, 0},
  {&__pyx_kp_s_Params_s, __pyx_k_Params_s, sizeof(__pyx_k_Params_s), 0, 0, 1, 0},
  {&__pyx_kp_s_The_value_of_this_property_will, __pyx_k_The_value_of_this_property_will, sizeof(__pyx_k_The_value_of_this_property_will), 0, 0, 1, 0},
  {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1},
  {&__pyx_kp_s_Unexpected_NULL_spatial_referenc, __pyx_k_Unexpected_NULL_spatial_referenc, sizeof(__pyx_k_Unexpected_NULL_spatial_referenc), 0, 0, 1, 0},
  {&__pyx_kp_s_Unexpected_Null_spatial_referenc, __pyx_k_Unexpected_Null_spatial_referenc, sizeof(__pyx_k_Unexpected_Null_spatial_referenc), 0, 0, 1, 0},
  {&__pyx_kp_s_Unexpected_proj_parameter_s, __pyx_k_Unexpected_proj_parameter_s, sizeof(__pyx_k_Unexpected_proj_parameter_s), 0, 0, 1, 0},
  {&__pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_k_Users_seang_code_frs_wheel_buil, sizeof(__pyx_k_Users_seang_code_frs_wheel_buil), 0, 0, 1, 0},
  {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
  {&__pyx_kp_s__13, __pyx_k__13, sizeof(__pyx_k__13), 0, 0, 1, 0},
  {&__pyx_kp_s__15, __pyx_k__15, sizeof(__pyx_k__15), 0, 0, 1, 0},
  {&__pyx_kp_s__52, __pyx_k__52, sizeof(__pyx_k__52), 0, 0, 1, 0},
  {&__pyx_kp_s__54, __pyx_k__54, sizeof(__pyx_k__54), 0, 0, 1, 0},
  {&__pyx_n_s_a, __pyx_k_a, sizeof(__pyx_k_a), 0, 0, 1, 1},
  {&__pyx_n_s_addHandler, __pyx_k_addHandler, sizeof(__pyx_k_addHandler), 0, 0, 1, 1},
  {&__pyx_n_s_affine, __pyx_k_affine, sizeof(__pyx_k_affine), 0, 0, 1, 1},
  {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1},
  {&__pyx_n_s_append, __pyx_k_append, sizeof(__pyx_k_append), 0, 0, 1, 1},
  {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1},
  {&__pyx_n_s_b, __pyx_k_b, sizeof(__pyx_k_b), 0, 0, 1, 1},
  {&__pyx_n_s_basicConfig, __pyx_k_basicConfig, sizeof(__pyx_k_basicConfig), 0, 0, 1, 1},
  {&__pyx_n_s_bidx, __pyx_k_bidx, sizeof(__pyx_k_bidx), 0, 0, 1, 1},
  {&__pyx_n_s_block_shapes, __pyx_k_block_shapes, sizeof(__pyx_k_block_shapes), 0, 0, 1, 1},
  {&__pyx_n_s_block_windows, __pyx_k_block_windows, sizeof(__pyx_k_block_windows), 0, 0, 1, 1},
  {&__pyx_n_s_blockxsize, __pyx_k_blockxsize, sizeof(__pyx_k_blockxsize), 0, 0, 1, 1},
  {&__pyx_n_s_blockysize, __pyx_k_blockysize, sizeof(__pyx_k_blockysize), 0, 0, 1, 1},
  {&__pyx_n_s_bottom, __pyx_k_bottom, sizeof(__pyx_k_bottom), 0, 0, 1, 1},
  {&__pyx_n_s_boundless, __pyx_k_boundless, sizeof(__pyx_k_boundless), 0, 0, 1, 1},
  {&__pyx_n_s_bounds, __pyx_k_bounds, sizeof(__pyx_k_bounds), 0, 0, 1, 1},
  {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1},
  {&__pyx_kp_s_can_t_read_closed_raster_file, __pyx_k_can_t_read_closed_raster_file, sizeof(__pyx_k_can_t_read_closed_raster_file), 0, 0, 1, 0},
  {&__pyx_n_s_ceil, __pyx_k_ceil, sizeof(__pyx_k_ceil), 0, 0, 1, 1},
  {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1},
  {&__pyx_n_s_closed, __pyx_k_closed, sizeof(__pyx_k_closed), 0, 0, 1, 1},
  {&__pyx_n_s_col, __pyx_k_col, sizeof(__pyx_k_col), 0, 0, 1, 1},
  {&__pyx_n_s_compress, __pyx_k_compress, sizeof(__pyx_k_compress), 0, 0, 1, 1},
  {&__pyx_n_s_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 0, 1, 1},
  {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1},
  {&__pyx_n_s_cpl_errs, __pyx_k_cpl_errs, sizeof(__pyx_k_cpl_errs), 0, 0, 1, 1},
  {&__pyx_n_s_crs, __pyx_k_crs, sizeof(__pyx_k_crs), 0, 0, 1, 1},
  {&__pyx_n_s_crs1, __pyx_k_crs1, sizeof(__pyx_k_crs1), 0, 0, 1, 1},
  {&__pyx_n_s_crs2, __pyx_k_crs2, sizeof(__pyx_k_crs2), 0, 0, 1, 1},
  {&__pyx_n_s_d, __pyx_k_d, sizeof(__pyx_k_d), 0, 0, 1, 1},
  {&__pyx_n_s_debug, __pyx_k_debug, sizeof(__pyx_k_debug), 0, 0, 1, 1},
  {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1},
  {&__pyx_n_s_driver, __pyx_k_driver, sizeof(__pyx_k_driver), 0, 0, 1, 1},
  {&__pyx_n_s_driver_count, __pyx_k_driver_count, sizeof(__pyx_k_driver_count), 0, 0, 1, 1},
  {&__pyx_n_s_dst, __pyx_k_dst, sizeof(__pyx_k_dst), 0, 0, 1, 1},
  {&__pyx_n_s_dst_crs, __pyx_k_dst_crs, sizeof(__pyx_k_dst_crs), 0, 0, 1, 1},
  {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1},
  {&__pyx_n_s_dtype_fwd, __pyx_k_dtype_fwd, sizeof(__pyx_k_dtype_fwd), 0, 0, 1, 1},
  {&__pyx_n_s_dtype_ranges, __pyx_k_dtype_ranges, sizeof(__pyx_k_dtype_ranges), 0, 0, 1, 1},
  {&__pyx_n_s_dtypes, __pyx_k_dtypes, sizeof(__pyx_k_dtypes), 0, 0, 1, 1},
  {&__pyx_n_s_emit, __pyx_k_emit, sizeof(__pyx_k_emit), 0, 0, 1, 1},
  {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1},
  {&__pyx_n_s_enter, __pyx_k_enter, sizeof(__pyx_k_enter), 0, 0, 1, 1},
  {&__pyx_n_s_eps, __pyx_k_eps, sizeof(__pyx_k_eps), 0, 0, 1, 1},
  {&__pyx_kp_s_epsg, __pyx_k_epsg, sizeof(__pyx_k_epsg), 0, 0, 1, 0},
  {&__pyx_kp_s_epsg_4326, __pyx_k_epsg_4326, sizeof(__pyx_k_epsg_4326), 0, 0, 1, 0},
  {&__pyx_n_s_exit, __pyx_k_exit, sizeof(__pyx_k_exit), 0, 0, 1, 1},
  {&__pyx_n_s_floor, __pyx_k_floor, sizeof(__pyx_k_floor), 0, 0, 1, 1},
  {&__pyx_n_s_from_gdal, __pyx_k_from_gdal, sizeof(__pyx_k_from_gdal), 0, 0, 1, 1},
  {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1},
  {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1},
  {&__pyx_n_s_getLogger, __pyx_k_getLogger, sizeof(__pyx_k_getLogger), 0, 0, 1, 1},
  {&__pyx_n_s_get_crs, __pyx_k_get_crs, sizeof(__pyx_k_get_crs), 0, 0, 1, 1},
  {&__pyx_n_s_get_index, __pyx_k_get_index, sizeof(__pyx_k_get_index), 0, 0, 1, 1},
  {&__pyx_n_s_get_nodatavals, __pyx_k_get_nodatavals, sizeof(__pyx_k_get_nodatavals), 0, 0, 1, 1},
  {&__pyx_n_s_get_transform, __pyx_k_get_transform, sizeof(__pyx_k_get_transform), 0, 0, 1, 1},
  {&__pyx_n_s_get_window, __pyx_k_get_window, sizeof(__pyx_k_get_window), 0, 0, 1, 1},
  {&__pyx_n_s_height, __pyx_k_height, sizeof(__pyx_k_height), 0, 0, 1, 1},
  {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1},
  {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
  {&__pyx_n_s_indexes, __pyx_k_indexes, sizeof(__pyx_k_indexes), 0, 0, 1, 1},
  {&__pyx_n_s_info, __pyx_k_info, sizeof(__pyx_k_info), 0, 0, 1, 1},
  {&__pyx_n_s_init, __pyx_k_init, sizeof(__pyx_k_init), 0, 0, 1, 1},
  {&__pyx_n_s_interleave, __pyx_k_interleave, sizeof(__pyx_k_interleave), 0, 0, 1, 1},
  {&__pyx_n_s_interleaving, __pyx_k_interleaving, sizeof(__pyx_k_interleaving), 0, 0, 1, 1},
  {&__pyx_kp_s_invalid_height_d, __pyx_k_invalid_height_d, sizeof(__pyx_k_invalid_height_d), 0, 0, 1, 0},
  {&__pyx_kp_s_invalid_width_d, __pyx_k_invalid_width_d, sizeof(__pyx_k_invalid_width_d), 0, 0, 1, 0},
  {&__pyx_kp_s_invalid_window_col_range_d_d, __pyx_k_invalid_window_col_range_d_d, sizeof(__pyx_k_invalid_window_col_range_d_d), 0, 0, 1, 0},
  {&__pyx_kp_s_invalid_window_row_range_d_d, __pyx_k_invalid_window_row_range_d_d, sizeof(__pyx_k_invalid_window_row_range_d_d), 0, 0, 1, 0},
  {&__pyx_kp_s_invalid_window_structure_expecti, __pyx_k_invalid_window_structure_expecti, sizeof(__pyx_k_invalid_window_structure_expecti), 0, 0, 1, 0},
  {&__pyx_n_s_is_geographic_crs, __pyx_k_is_geographic_crs, sizeof(__pyx_k_is_geographic_crs), 0, 0, 1, 1},
  {&__pyx_n_s_is_projected_crs, __pyx_k_is_projected_crs, sizeof(__pyx_k_is_projected_crs), 0, 0, 1, 1},
  {&__pyx_n_s_is_same_crs, __pyx_k_is_same_crs, sizeof(__pyx_k_is_same_crs), 0, 0, 1, 1},
  {&__pyx_n_s_items, __pyx_k_items, sizeof(__pyx_k_items), 0, 0, 1, 1},
  {&__pyx_n_s_join, __pyx_k_join, sizeof(__pyx_k_join), 0, 0, 1, 1},
  {&__pyx_n_s_kwds, __pyx_k_kwds, sizeof(__pyx_k_kwds), 0, 0, 1, 1},
  {&__pyx_n_s_left, __pyx_k_left, sizeof(__pyx_k_left), 0, 0, 1, 1},
  {&__pyx_n_s_log, __pyx_k_log, sizeof(__pyx_k_log), 0, 0, 1, 1},
  {&__pyx_n_s_logging, __pyx_k_logging, sizeof(__pyx_k_logging), 0, 0, 1, 1},
  {&__pyx_n_s_lstrip, __pyx_k_lstrip, sizeof(__pyx_k_lstrip), 0, 0, 1, 1},
  {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
  {&__pyx_n_s_math, __pyx_k_math, sizeof(__pyx_k_math), 0, 0, 1, 1},
  {&__pyx_n_s_meta, __pyx_k_meta, sizeof(__pyx_k_meta), 0, 0, 1, 1},
  {&__pyx_n_s_metaclass, __pyx_k_metaclass, sizeof(__pyx_k_metaclass), 0, 0, 1, 1},
  {&__pyx_n_s_module, __pyx_k_module, sizeof(__pyx_k_module), 0, 0, 1, 1},
  {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1},
  {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1},
  {&__pyx_n_s_no_defs, __pyx_k_no_defs, sizeof(__pyx_k_no_defs), 0, 0, 1, 1},
  {&__pyx_n_s_nodata, __pyx_k_nodata, sizeof(__pyx_k_nodata), 0, 0, 1, 1},
  {&__pyx_n_s_nodatavals, __pyx_k_nodatavals, sizeof(__pyx_k_nodatavals), 0, 0, 1, 1},
  {&__pyx_n_s_ns, __pyx_k_ns, sizeof(__pyx_k_ns), 0, 0, 1, 1},
  {&__pyx_n_s_op, __pyx_k_op, sizeof(__pyx_k_op), 0, 0, 1, 1},
  {&__pyx_n_s_open, __pyx_k_open, sizeof(__pyx_k_open), 0, 0, 1, 1},
  {&__pyx_n_s_osr_crs, __pyx_k_osr_crs, sizeof(__pyx_k_osr_crs), 0, 0, 1, 1},
  {&__pyx_n_s_osr_crs1, __pyx_k_osr_crs1, sizeof(__pyx_k_osr_crs1), 0, 0, 1, 1},
  {&__pyx_n_s_osr_crs2, __pyx_k_osr_crs2, sizeof(__pyx_k_osr_crs2), 0, 0, 1, 1},
  {&__pyx_n_s_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 0, 1, 1},
  {&__pyx_n_s_pop, __pyx_k_pop, sizeof(__pyx_k_pop), 0, 0, 1, 1},
  {&__pyx_n_s_precision, __pyx_k_precision, sizeof(__pyx_k_precision), 0, 0, 1, 1},
  {&__pyx_n_s_prepare, __pyx_k_prepare, sizeof(__pyx_k_prepare), 0, 0, 1, 1},
  {&__pyx_n_s_proj_c, __pyx_k_proj_c, sizeof(__pyx_k_proj_c), 0, 0, 1, 1},
  {&__pyx_n_s_property, __pyx_k_property, sizeof(__pyx_k_property), 0, 0, 1, 1},
  {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1},
  {&__pyx_n_s_qualname, __pyx_k_qualname, sizeof(__pyx_k_qualname), 0, 0, 1, 1},
  {&__pyx_n_s_r, __pyx_k_r, sizeof(__pyx_k_r), 0, 0, 1, 1},
  {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio, __pyx_k_rasterio, sizeof(__pyx_k_rasterio), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio__base, __pyx_k_rasterio__base, sizeof(__pyx_k_rasterio__base), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio__drivers, __pyx_k_rasterio__drivers, sizeof(__pyx_k_rasterio__drivers), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio__err, __pyx_k_rasterio__err, sizeof(__pyx_k_rasterio__err), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_coords, __pyx_k_rasterio_coords, sizeof(__pyx_k_rasterio_coords), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_enums, __pyx_k_rasterio_enums, sizeof(__pyx_k_rasterio_enums), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_transform, __pyx_k_rasterio_transform, sizeof(__pyx_k_rasterio_transform), 0, 0, 1, 1},
  {&__pyx_n_s_read_crs, __pyx_k_read_crs, sizeof(__pyx_k_read_crs), 0, 0, 1, 1},
  {&__pyx_n_s_read_crs_wkt, __pyx_k_read_crs_wkt, sizeof(__pyx_k_read_crs_wkt), 0, 0, 1, 1},
  {&__pyx_n_s_read_transform, __pyx_k_read_transform, sizeof(__pyx_k_read_transform), 0, 0, 1, 1},
  {&__pyx_n_s_record, __pyx_k_record, sizeof(__pyx_k_record), 0, 0, 1, 1},
  {&__pyx_n_s_res, __pyx_k_res, sizeof(__pyx_k_res), 0, 0, 1, 1},
  {&__pyx_n_s_res_xs, __pyx_k_res_xs, sizeof(__pyx_k_res_xs), 0, 0, 1, 1},
  {&__pyx_n_s_res_ys, __pyx_k_res_ys, sizeof(__pyx_k_res_ys), 0, 0, 1, 1},
  {&__pyx_n_s_res_zs, __pyx_k_res_zs, sizeof(__pyx_k_res_zs), 0, 0, 1, 1},
  {&__pyx_n_s_retval, __pyx_k_retval, sizeof(__pyx_k_retval), 0, 0, 1, 1},
  {&__pyx_n_s_right, __pyx_k_right, sizeof(__pyx_k_right), 0, 0, 1, 1},
  {&__pyx_n_s_rio_creation_kwds, __pyx_k_rio_creation_kwds, sizeof(__pyx_k_rio_creation_kwds), 0, 0, 1, 1},
  {&__pyx_n_s_round, __pyx_k_round, sizeof(__pyx_k_round), 0, 0, 1, 1},
  {&__pyx_n_s_row, __pyx_k_row, sizeof(__pyx_k_row), 0, 0, 1, 1},
  {&__pyx_kp_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 0},
  {&__pyx_kp_s_s_RasterReader_name_s_mode_s, __pyx_k_s_RasterReader_name_s_mode_s, sizeof(__pyx_k_s_RasterReader_name_s_mode_s), 0, 0, 1, 0},
  {&__pyx_kp_s_s_s, __pyx_k_s_s, sizeof(__pyx_k_s_s), 0, 0, 1, 0},
  {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1},
  {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1},
  {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1},
  {&__pyx_n_s_sqrt, __pyx_k_sqrt, sizeof(__pyx_k_sqrt), 0, 0, 1, 1},
  {&__pyx_n_s_src, __pyx_k_src, sizeof(__pyx_k_src), 0, 0, 1, 1},
  {&__pyx_n_s_src_crs, __pyx_k_src_crs, sizeof(__pyx_k_src_crs), 0, 0, 1, 1},
  {&__pyx_n_s_stacklevel, __pyx_k_stacklevel, sizeof(__pyx_k_stacklevel), 0, 0, 1, 1},
  {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1},
  {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1},
  {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1},
  {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1},
  {&__pyx_n_s_t, __pyx_k_t, sizeof(__pyx_k_t), 0, 0, 1, 1},
  {&__pyx_n_s_tags, __pyx_k_tags, sizeof(__pyx_k_tags), 0, 0, 1, 1},
  {&__pyx_n_s_tastes_like_gdal, __pyx_k_tastes_like_gdal, sizeof(__pyx_k_tastes_like_gdal), 0, 0, 1, 1},
  {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
  {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1},
  {&__pyx_n_s_tiled, __pyx_k_tiled, sizeof(__pyx_k_tiled), 0, 0, 1, 1},
  {&__pyx_n_s_to_gdal, __pyx_k_to_gdal, sizeof(__pyx_k_to_gdal), 0, 0, 1, 1},
  {&__pyx_n_s_top, __pyx_k_top, sizeof(__pyx_k_top), 0, 0, 1, 1},
  {&__pyx_n_s_traceback, __pyx_k_traceback, sizeof(__pyx_k_traceback), 0, 0, 1, 1},
  {&__pyx_n_s_transform, __pyx_k_transform, sizeof(__pyx_k_transform), 0, 0, 1, 1},
  {&__pyx_n_s_transform_2, __pyx_k_transform_2, sizeof(__pyx_k_transform_2), 0, 0, 1, 1},
  {&__pyx_n_s_translation, __pyx_k_translation, sizeof(__pyx_k_translation), 0, 0, 1, 1},
  {&__pyx_n_s_type, __pyx_k_type, sizeof(__pyx_k_type), 0, 0, 1, 1},
  {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1},
  {&__pyx_n_s_upper, __pyx_k_upper, sizeof(__pyx_k_upper), 0, 0, 1, 1},
  {&__pyx_kp_s_utf_8, __pyx_k_utf_8, sizeof(__pyx_k_utf_8), 0, 0, 1, 0},
  {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1},
  {&__pyx_n_s_warn, __pyx_k_warn, sizeof(__pyx_k_warn), 0, 0, 1, 1},
  {&__pyx_n_s_warnings, __pyx_k_warnings, sizeof(__pyx_k_warnings), 0, 0, 1, 1},
  {&__pyx_n_s_warnoptions, __pyx_k_warnoptions, sizeof(__pyx_k_warnoptions), 0, 0, 1, 1},
  {&__pyx_n_s_width, __pyx_k_width, sizeof(__pyx_k_width), 0, 0, 1, 1},
  {&__pyx_n_s_window, __pyx_k_window, sizeof(__pyx_k_window), 0, 0, 1, 1},
  {&__pyx_n_s_window_index, __pyx_k_window_index, sizeof(__pyx_k_window_index), 0, 0, 1, 1},
  {&__pyx_n_s_window_index_locals_genexpr, __pyx_k_window_index_locals_genexpr, sizeof(__pyx_k_window_index_locals_genexpr), 0, 0, 1, 1},
  {&__pyx_n_s_window_shape, __pyx_k_window_shape, sizeof(__pyx_k_window_shape), 0, 0, 1, 1},
  {&__pyx_n_s_window_start, __pyx_k_window_start, sizeof(__pyx_k_window_start), 0, 0, 1, 1},
  {&__pyx_n_s_window_stop, __pyx_k_window_stop, sizeof(__pyx_k_window_stop), 0, 0, 1, 1},
  {&__pyx_n_s_wktext, __pyx_k_wktext, sizeof(__pyx_k_wktext), 0, 0, 1, 1},
  {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1},
  {&__pyx_n_s_xs, __pyx_k_xs, sizeof(__pyx_k_xs), 0, 0, 1, 1},
  {&__pyx_n_s_y, __pyx_k_y, sizeof(__pyx_k_y), 0, 0, 1, 1},
  {&__pyx_n_s_ys, __pyx_k_ys, sizeof(__pyx_k_ys), 0, 0, 1, 1},
  {&__pyx_n_s_z, __pyx_k_z, sizeof(__pyx_k_z), 0, 0, 1, 1},
  {&__pyx_n_s_zip, __pyx_k_zip, sizeof(__pyx_k_zip), 0, 0, 1, 1},
  {&__pyx_n_s_zs, __pyx_k_zs, sizeof(__pyx_k_zs), 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0}
};
static int __Pyx_InitCachedBuiltins(void) {
  __pyx_builtin_property = __Pyx_GetBuiltinName(__pyx_n_s_property); if (!__pyx_builtin_property) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_FutureWarning = __Pyx_GetBuiltinName(__pyx_n_s_FutureWarning); if (!__pyx_builtin_FutureWarning) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_round = __Pyx_GetBuiltinName(__pyx_n_s_round); if (!__pyx_builtin_round) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_zip = __Pyx_GetBuiltinName(__pyx_n_s_zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  return 0;
  __pyx_L1_error:;
  return -1;
}

static int __Pyx_InitCachedConstants(void) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);

  /* "rasterio/_base.pyx":59
 *         if driver_count() == 0 and not self.env:
 *             # create a local manager and enter
 *             self.env = GDALEnv(True)             # <<<<<<<<<<<<<<
 *         else:
 *             # create a local manager and enter
 */
  __pyx_tuple_ = PyTuple_Pack(1, Py_True); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);

  /* "rasterio/_base.pyx":62
 *         else:
 *             # create a local manager and enter
 *             self.env = GDALEnv(False)             # <<<<<<<<<<<<<<
 *         self.env.start()
 * 
 */
  __pyx_tuple__2 = PyTuple_Pack(1, Py_False); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__2);
  __Pyx_GIVEREF(__pyx_tuple__2);

  /* "rasterio/_base.pyx":65
 *         self.env.start()
 * 
 *         name_b = self.name.encode('utf-8')             # <<<<<<<<<<<<<<
 *         cdef const char *fname = name_b
 *         with cpl_errs:
 */
  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_utf_8); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);

  /* "rasterio/_base.pyx":67
 *         name_b = self.name.encode('utf-8')
 *         cdef const char *fname = name_b
 *         with cpl_errs:             # <<<<<<<<<<<<<<
 *             self._hds = _gdal.GDALOpen(fname, 0)
 *         if self._hds == NULL:
 */
  __pyx_tuple__4 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);

  /* "rasterio/_base.pyx":70
 *             self._hds = _gdal.GDALOpen(fname, 0)
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 * 
 *         cdef void *drv
 */
  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_Null_dataset); if (unlikely(!__pyx_tuple__5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);

  /* "rasterio/_base.pyx":94
 *     cdef void *band(self, int bidx):
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 */
  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_Null_dataset); if (unlikely(!__pyx_tuple__6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);

  /* "rasterio/_base.pyx":97
 *         cdef void *hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 *             raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *         return hband
 * 
 */
  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_Null_band); if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);

  /* "rasterio/_base.pyx":106
 *         cdef void *osr = NULL
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 */
  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_Null_dataset); if (unlikely(!__pyx_tuple__8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);

  /* "rasterio/_base.pyx":110
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 */
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_Unexpected_NULL_spatial_referenc); if (unlikely(!__pyx_tuple__9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);

  /* "rasterio/_base.pyx":115
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *             log.debug("Got coordinate system")
 * 
 */
  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_Unexpected_NULL_spatial_referenc); if (unlikely(!__pyx_tuple__10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__10);
  __Pyx_GIVEREF(__pyx_tuple__10);

  /* "rasterio/_base.pyx":116
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")
 *             log.debug("Got coordinate system")             # <<<<<<<<<<<<<<
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 */
  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_Got_coordinate_system); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);

  /* "rasterio/_base.pyx":135
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 *                 if proj_c == NULL:
 *                     raise ValueError("Unexpected Null spatial reference")             # <<<<<<<<<<<<<<
 *                 proj_b = proj_c
 *                 log.debug("Params: %s", proj_b)
 */
  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_Unexpected_Null_spatial_referenc); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__12);
  __Pyx_GIVEREF(__pyx_tuple__12);

  /* "rasterio/_base.pyx":141
 *                 value = value.strip()
 *                 for param in value.split():
 *                     kv = param.split("=")             # <<<<<<<<<<<<<<
 *                     if len(kv) == 2:
 *                         k, v = kv
 */
  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s__13); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__14);
  __Pyx_GIVEREF(__pyx_tuple__14);

  /* "rasterio/_base.pyx":156
 *                         raise ValueError(
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")             # <<<<<<<<<<<<<<
 *                     crs[k] = v
 * 
 */
  __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s__15); if (unlikely(!__pyx_tuple__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__16);
  __Pyx_GIVEREF(__pyx_tuple__16);

  /* "rasterio/_base.pyx":162
 *             _gdal.OSRDestroySpatialReference(osr)
 *         else:
 *             log.debug("GDAL dataset has no projection.")             # <<<<<<<<<<<<<<
 *         return crs
 * 
 */
  __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_GDAL_dataset_has_no_projection); if (unlikely(!__pyx_tuple__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__17);
  __Pyx_GIVEREF(__pyx_tuple__17);

  /* "rasterio/_base.pyx":171
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 */
  __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_Null_dataset); if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__18);
  __Pyx_GIVEREF(__pyx_tuple__18);

  /* "rasterio/_base.pyx":174
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 */
  __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_Unexpected_NULL_spatial_referenc); if (unlikely(!__pyx_tuple__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__19);
  __Pyx_GIVEREF(__pyx_tuple__19);

  /* "rasterio/_base.pyx":178
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")             # <<<<<<<<<<<<<<
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 */
  __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_Got_coordinate_system); if (unlikely(!__pyx_tuple__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__20);
  __Pyx_GIVEREF(__pyx_tuple__20);

  /* "rasterio/_base.pyx":185
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:
 *                     raise ValueError("Null projection")             # <<<<<<<<<<<<<<
 *                 proj_b = proj_c
 *                 crs_wkt = proj_b.decode('utf-8')
 */
  __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_Null_projection); if (unlikely(!__pyx_tuple__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__21);
  __Pyx_GIVEREF(__pyx_tuple__21);

  /* "rasterio/_base.pyx":191
 *                 _gdal.OSRDestroySpatialReference(osr)
 *         else:
 *             log.debug("GDAL dataset has no projection.")             # <<<<<<<<<<<<<<
 *             crs_wkt = None
 *         return crs_wkt
 */
  __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_GDAL_dataset_has_no_projection); if (unlikely(!__pyx_tuple__22)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);

  /* "rasterio/_base.pyx":197
 *     def read_transform(self):
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         cdef double gt[6]
 *         _gdal.GDALGetGeoTransform(self._hds, gt)
 */
  __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_Null_dataset); if (unlikely(!__pyx_tuple__23)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__23);
  __Pyx_GIVEREF(__pyx_tuple__23);

  /* "rasterio/_base.pyx":235
 *         if not self._count:
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")             # <<<<<<<<<<<<<<
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 *         return self._count
 */
  __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_Can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__24)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);

  /* "rasterio/_base.pyx":249
 *         if not self._dtypes:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
  __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__25)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);

  /* "rasterio/_base.pyx":267
 *         if self._block_shapes is None:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             self._block_shapes = []
 *             for i in range(self._count):
 */
  __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);

  /* "rasterio/_base.pyx":272
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 *                     raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 *                 self._block_shapes.append((ysize, xsize))
 */
  __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_s_Null_band); if (unlikely(!__pyx_tuple__27)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__27);
  __Pyx_GIVEREF(__pyx_tuple__27);

  /* "rasterio/_base.pyx":284
 *         if not self._nodatavals:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
  __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__28)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__28);
  __Pyx_GIVEREF(__pyx_tuple__28);

  /* "rasterio/_base.pyx":288
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 *                     raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)
 */
  __pyx_tuple__29 = PyTuple_Pack(1, __pyx_kp_s_Null_band); if (unlikely(!__pyx_tuple__29)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__29);
  __Pyx_GIVEREF(__pyx_tuple__29);

  /* "rasterio/_base.pyx":342
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:
 *                 raise ValueError(             # <<<<<<<<<<<<<<
 *                     "A band index must be provided when band block shapes"
 *                     "are inhomogeneous")
 */
  __pyx_tuple__30 = PyTuple_Pack(1, __pyx_kp_s_A_band_index_must_be_provided_wh); if (unlikely(!__pyx_tuple__30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__30);
  __Pyx_GIVEREF(__pyx_tuple__30);

  /* "rasterio/_base.pyx":437
 *     @property
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')             # <<<<<<<<<<<<<<
 *         if val:
 *             return Compression(val)
 */
  __pyx_tuple__32 = PyTuple_Pack(1, __pyx_n_s_COMPRESSION); if (unlikely(!__pyx_tuple__32)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__32);
  __Pyx_GIVEREF(__pyx_tuple__32);

  /* "rasterio/_base.pyx":445
 *     @property
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')             # <<<<<<<<<<<<<<
 *         if val:
 *             return Interleaving(val)
 */
  __pyx_tuple__33 = PyTuple_Pack(1, __pyx_n_s_INTERLEAVE); if (unlikely(!__pyx_tuple__33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__33);
  __Pyx_GIVEREF(__pyx_tuple__33);

  /* "rasterio/_base.pyx":560
 *         cdef char **papszStrList
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx > 0:
 *             if bidx not in self.indexes:
 */
  __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__34)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__34);
  __Pyx_GIVEREF(__pyx_tuple__34);

  /* "rasterio/_base.pyx":563
 *         if bidx > 0:
 *             if bidx not in self.indexes:
 *                 raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)
 *             if hobj == NULL:
 */
  __pyx_tuple__35 = PyTuple_Pack(1, __pyx_kp_s_Invalid_band_index); if (unlikely(!__pyx_tuple__35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__35);
  __Pyx_GIVEREF(__pyx_tuple__35);

  /* "rasterio/_base.pyx":566
 *             hobj = _gdal.GDALGetRasterBand(self._hds, bidx)
 *             if hobj == NULL:
 *                 raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         else:
 *             hobj = self._hds
 */
  __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s_NULL_band); if (unlikely(!__pyx_tuple__36)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__36);
  __Pyx_GIVEREF(__pyx_tuple__36);

  /* "rasterio/_base.pyx":570
 *             hobj = self._hds
 *         if ns:
 *             domain_b = ns.encode('utf-8')             # <<<<<<<<<<<<<<
 *             domain_c = domain_b
 *         else:
 */
  __pyx_tuple__37 = PyTuple_Pack(1, __pyx_kp_s_utf_8); if (unlikely(!__pyx_tuple__37)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__37);
  __Pyx_GIVEREF(__pyx_tuple__37);

  /* "rasterio/_base.pyx":581
 *             item_b = item_c
 *             item = item_b.decode('utf-8')
 *             key, value = item.split('=', 1)             # <<<<<<<<<<<<<<
 *             retval[key] = value
 *         return retval
 */
  __pyx_tuple__38 = PyTuple_Pack(2, __pyx_kp_s__13, __pyx_int_1); if (unlikely(!__pyx_tuple__38)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__38);
  __Pyx_GIVEREF(__pyx_tuple__38);

  /* "rasterio/_base.pyx":590
 * 
 *         if self._hds == NULL:
 *           raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 */
  __pyx_tuple__39 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__39)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 590; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__39);
  __Pyx_GIVEREF(__pyx_tuple__39);

  /* "rasterio/_base.pyx":592
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 */
  __pyx_tuple__40 = PyTuple_Pack(1, __pyx_kp_s_Invalid_band_index); if (unlikely(!__pyx_tuple__40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__40);
  __Pyx_GIVEREF(__pyx_tuple__40);

  /* "rasterio/_base.pyx":595
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 *         return ColorInterp(value)
 */
  __pyx_tuple__41 = PyTuple_Pack(1, __pyx_kp_s_NULL_band); if (unlikely(!__pyx_tuple__41)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__41);
  __Pyx_GIVEREF(__pyx_tuple__41);

  /* "rasterio/_base.pyx":606
 *         cdef const _gdal.GDALColorEntry * color
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 */
  __pyx_tuple__42 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__42)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__42);
  __Pyx_GIVEREF(__pyx_tuple__42);

  /* "rasterio/_base.pyx":608
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 */
  __pyx_tuple__43 = PyTuple_Pack(1, __pyx_kp_s_Invalid_band_index); if (unlikely(!__pyx_tuple__43)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__43);
  __Pyx_GIVEREF(__pyx_tuple__43);

  /* "rasterio/_base.pyx":611
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:
 */
  __pyx_tuple__44 = PyTuple_Pack(1, __pyx_kp_s_NULL_band); if (unlikely(!__pyx_tuple__44)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__44);
  __Pyx_GIVEREF(__pyx_tuple__44);

  /* "rasterio/_base.pyx":614
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:
 *             raise ValueError("NULL color table")             # <<<<<<<<<<<<<<
 *         retval = {}
 * 
 */
  __pyx_tuple__45 = PyTuple_Pack(1, __pyx_kp_s_NULL_color_table); if (unlikely(!__pyx_tuple__45)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__45);
  __Pyx_GIVEREF(__pyx_tuple__45);

  /* "rasterio/_base.pyx":660
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 */
  __pyx_tuple__46 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__46)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__46);
  __Pyx_GIVEREF(__pyx_tuple__46);

  /* "rasterio/_base.pyx":663
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         if not window:
 *             xoff = yoff = 0
 */
  __pyx_tuple__47 = PyTuple_Pack(1, __pyx_kp_s_NULL_band); if (unlikely(!__pyx_tuple__47)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__47);
  __Pyx_GIVEREF(__pyx_tuple__47);

  /* "rasterio/_base.pyx":700
 *         assert len(c) == 2
 *     except (ValueError, TypeError, AssertionError):
 *         raise ValueError("invalid window structure; expecting "             # <<<<<<<<<<<<<<
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0
 */
  __pyx_tuple__48 = PyTuple_Pack(1, __pyx_kp_s_invalid_window_structure_expecti); if (unlikely(!__pyx_tuple__48)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__48);
  __Pyx_GIVEREF(__pyx_tuple__48);

  /* "rasterio/_base.pyx":760
 *     # and sign determined by the op function: positive for floor, negative
 *     # for ceil.
 *     eps = 10.0**-precision * (1.0 - 2.0*op(0.1))             # <<<<<<<<<<<<<<
 *     row = int(op((y - eps - affine[5]) / affine[4]))
 *     col = int(op((x + eps - affine[2]) / affine[0]))
 */
  __pyx_tuple__50 = PyTuple_Pack(1, __pyx_float_0_1); if (unlikely(!__pyx_tuple__50)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__50);
  __Pyx_GIVEREF(__pyx_tuple__50);

  /* "rasterio/_base.pyx":819
 *     if isinstance(crs, dict):
 *         # EPSG is a special case.
 *         init = crs.get('init')             # <<<<<<<<<<<<<<
 *         if init:
 *             auth, val = init.split(':')
 */
  __pyx_tuple__51 = PyTuple_Pack(1, __pyx_n_s_init); if (unlikely(!__pyx_tuple__51)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__51);
  __Pyx_GIVEREF(__pyx_tuple__51);

  /* "rasterio/_base.pyx":821
 *         init = crs.get('init')
 *         if init:
 *             auth, val = init.split(':')             # <<<<<<<<<<<<<<
 *             if auth.upper() == 'EPSG':
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 */
  __pyx_tuple__53 = PyTuple_Pack(1, __pyx_kp_s__52); if (unlikely(!__pyx_tuple__53)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__53);
  __Pyx_GIVEREF(__pyx_tuple__53);

  /* "rasterio/_base.pyx":833
 *             proj = " ".join(params)
 *             log.debug("PROJ.4 to be imported: %r", proj)
 *             proj_b = proj.encode('utf-8')             # <<<<<<<<<<<<<<
 *             proj_c = proj_b
 *             _gdal.OSRImportFromProj4(osr, proj_c)
 */
  __pyx_tuple__55 = PyTuple_Pack(1, __pyx_kp_s_utf_8); if (unlikely(!__pyx_tuple__55)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__55);
  __Pyx_GIVEREF(__pyx_tuple__55);

  /* "rasterio/_base.pyx":838
 *     # Fall back for CRS strings like "EPSG:3857."
 *     else:
 *         proj_b = crs.encode('utf-8')             # <<<<<<<<<<<<<<
 *         proj_c = proj_b
 *         _gdal.OSRSetFromUserInput(osr, proj_c)
 */
  __pyx_tuple__56 = PyTuple_Pack(1, __pyx_kp_s_utf_8); if (unlikely(!__pyx_tuple__56)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__56);
  __Pyx_GIVEREF(__pyx_tuple__56);

  /* "rasterio/_base.pyx":21
 * 
 * 
 * log = logging.getLogger('rasterio')             # <<<<<<<<<<<<<<
 * if 'all' in sys.warnoptions:
 *     # show messages in console with: python -W all
 */
  __pyx_tuple__57 = PyTuple_Pack(1, __pyx_n_s_rasterio); if (unlikely(!__pyx_tuple__57)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__57);
  __Pyx_GIVEREF(__pyx_tuple__57);

  /* "rasterio/_base.pyx":28
 *     # no handler messages shown
 *     class NullHandler(logging.Handler):
 *         def emit(self, record):             # <<<<<<<<<<<<<<
 *             pass
 *     log.addHandler(NullHandler())
 */
  __pyx_tuple__58 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_record); if (unlikely(!__pyx_tuple__58)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__58);
  __Pyx_GIVEREF(__pyx_tuple__58);
  __pyx_codeobj__59 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__58, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_emit, 28, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__59)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":731
 * 
 * 
 * def get_index(x, y, affine, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns the (row, col) index of the pixel containing (x, y) given a
 */
  __pyx_tuple__60 = PyTuple_Pack(8, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_affine, __pyx_n_s_op, __pyx_n_s_precision, __pyx_n_s_eps, __pyx_n_s_row, __pyx_n_s_col); if (unlikely(!__pyx_tuple__60)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__60);
  __Pyx_GIVEREF(__pyx_tuple__60);
  __pyx_codeobj__61 = (PyObject*)__Pyx_PyCode_New(5, 0, 8, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__60, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_get_index, 731, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__61)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":766
 * 
 * 
 * def get_window(left, bottom, right, top, affine, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns a window tuple given coordinate bounds and the coordinate reference
 */
  __pyx_tuple__62 = PyTuple_Pack(9, __pyx_n_s_left, __pyx_n_s_bottom, __pyx_n_s_right, __pyx_n_s_top, __pyx_n_s_affine, __pyx_n_s_precision, __pyx_n_s_window_start, __pyx_n_s_window_stop, __pyx_n_s_window); if (unlikely(!__pyx_tuple__62)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__62);
  __Pyx_GIVEREF(__pyx_tuple__62);
  __pyx_codeobj__63 = (PyObject*)__Pyx_PyCode_New(6, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__62, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_get_window, 766, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__63)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":794
 * 
 * 
 * def window_shape(window, height=-1, width=-1):             # <<<<<<<<<<<<<<
 *     """Returns shape of a window.
 * 
 */
  __pyx_tuple__64 = PyTuple_Pack(7, __pyx_n_s_window, __pyx_n_s_height, __pyx_n_s_width, __pyx_n_s_a, __pyx_n_s_b, __pyx_n_s_c, __pyx_n_s_d); if (unlikely(!__pyx_tuple__64)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__64);
  __Pyx_GIVEREF(__pyx_tuple__64);
  __pyx_codeobj__65 = (PyObject*)__Pyx_PyCode_New(3, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__64, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_window_shape, 794, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__65)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":804
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */
  __pyx_tuple__66 = PyTuple_Pack(3, __pyx_n_s_window, __pyx_n_s_genexpr, __pyx_n_s_genexpr); if (unlikely(!__pyx_tuple__66)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__66);
  __Pyx_GIVEREF(__pyx_tuple__66);
  __pyx_codeobj__67 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__66, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_window_index, 804, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__67)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":808
 * 
 * 
 * def tastes_like_gdal(t):             # <<<<<<<<<<<<<<
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0
 * 
 */
  __pyx_tuple__68 = PyTuple_Pack(1, __pyx_n_s_t); if (unlikely(!__pyx_tuple__68)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__68);
  __Pyx_GIVEREF(__pyx_tuple__68);
  __pyx_codeobj__69 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__68, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_tastes_like_gdal, 808, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__69)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":844
 * 
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):             # <<<<<<<<<<<<<<
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 */
  __pyx_tuple__70 = PyTuple_Pack(19, __pyx_n_s_src_crs, __pyx_n_s_dst_crs, __pyx_n_s_xs, __pyx_n_s_ys, __pyx_n_s_zs, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_z, __pyx_n_s_proj_c, __pyx_n_s_src, __pyx_n_s_dst, __pyx_n_s_transform, __pyx_n_s_i, __pyx_n_s_n, __pyx_n_s_res, __pyx_n_s_res_xs, __pyx_n_s_res_ys, __pyx_n_s_res_zs, __pyx_n_s_retval); if (unlikely(!__pyx_tuple__70)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__70);
  __Pyx_GIVEREF(__pyx_tuple__70);
  __pyx_codeobj__71 = (PyObject*)__Pyx_PyCode_New(5, 0, 19, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__70, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_transform_2, 844, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__71)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":902
 * 
 * 
 * def is_geographic_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 */
  __pyx_tuple__72 = PyTuple_Pack(3, __pyx_n_s_crs, __pyx_n_s_osr_crs, __pyx_n_s_retval); if (unlikely(!__pyx_tuple__72)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__72);
  __Pyx_GIVEREF(__pyx_tuple__72);
  __pyx_codeobj__73 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__72, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_is_geographic_crs, 902, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__73)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":910
 * 
 * 
 * def is_projected_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 */
  __pyx_tuple__74 = PyTuple_Pack(3, __pyx_n_s_crs, __pyx_n_s_osr_crs, __pyx_n_s_retval); if (unlikely(!__pyx_tuple__74)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__74);
  __Pyx_GIVEREF(__pyx_tuple__74);
  __pyx_codeobj__75 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__74, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_is_projected_crs, 910, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__75)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "rasterio/_base.pyx":918
 * 
 * 
 * def is_same_crs(crs1, crs2):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 */
  __pyx_tuple__76 = PyTuple_Pack(5, __pyx_n_s_crs1, __pyx_n_s_crs2, __pyx_n_s_osr_crs1, __pyx_n_s_osr_crs2, __pyx_n_s_retval); if (unlikely(!__pyx_tuple__76)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__76);
  __Pyx_GIVEREF(__pyx_tuple__76);
  __pyx_codeobj__77 = (PyObject*)__Pyx_PyCode_New(2, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__76, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_seang_code_frs_wheel_buil, __pyx_n_s_is_same_crs, 918, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__77)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_RefNannyFinishContext();
  return 0;
  __pyx_L1_error:;
  __Pyx_RefNannyFinishContext();
  return -1;
}

static int __Pyx_InitGlobals(void) {
  __pyx_umethod_PyList_Type_pop.type = (PyObject*)&PyList_Type;
  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_float_0_0 = PyFloat_FromDouble(0.0); if (unlikely(!__pyx_float_0_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_float_0_1 = PyFloat_FromDouble(0.1); if (unlikely(!__pyx_float_0_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_float_1_0 = PyFloat_FromDouble(1.0); if (unlikely(!__pyx_float_1_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_float_2_0 = PyFloat_FromDouble(2.0); if (unlikely(!__pyx_float_2_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_float_10_0 = PyFloat_FromDouble(10.0); if (unlikely(!__pyx_float_10_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_6 = PyInt_FromLong(6); if (unlikely(!__pyx_int_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  return 0;
  __pyx_L1_error:;
  return -1;
}

#if PY_MAJOR_VERSION < 3
PyMODINIT_FUNC init_base(void); /*proto*/
PyMODINIT_FUNC init_base(void)
#else
PyMODINIT_FUNC PyInit__base(void); /*proto*/
PyMODINIT_FUNC PyInit__base(void)
#endif
{
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannyDeclarations
  #if CYTHON_REFNANNY
  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
  if (!__Pyx_RefNanny) {
      PyErr_Clear();
      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
      if (!__Pyx_RefNanny)
          Py_FatalError("failed to import 'refnanny' module");
  }
  #endif
  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__base(void)", 0);
  if (__Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #ifdef __Pyx_CyFunction_USED
  if (__pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  #ifdef __Pyx_FusedFunction_USED
  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  #ifdef __Pyx_Coroutine_USED
  if (__pyx_Coroutine_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  #ifdef __Pyx_Generator_USED
  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  #ifdef __Pyx_StopAsyncIteration_USED
  if (__pyx_StopAsyncIteration_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  /*--- Library function declarations ---*/
  /*--- Threads initialization code ---*/
  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
  #ifdef WITH_THREAD /* Python build with threading support? */
  PyEval_InitThreads();
  #endif
  #endif
  /*--- Module creation code ---*/
  #if PY_MAJOR_VERSION < 3
  __pyx_m = Py_InitModule4("_base", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
  #else
  __pyx_m = PyModule_Create(&__pyx_moduledef);
  #endif
  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_INCREF(__pyx_d);
  __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #if CYTHON_COMPILING_IN_PYPY
  Py_INCREF(__pyx_b);
  #endif
  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  /*--- Initialize various global constants etc. ---*/
  if (__Pyx_InitGlobals() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
  if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  if (__pyx_module_is_main_rasterio___base) {
    if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  #if PY_MAJOR_VERSION >= 3
  {
    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (!PyDict_GetItemString(modules, "rasterio._base")) {
      if (unlikely(PyDict_SetItemString(modules, "rasterio._base", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
  }
  #endif
  /*--- Builtin init code ---*/
  if (__Pyx_InitCachedBuiltins() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Constants init code ---*/
  if (__Pyx_InitCachedConstants() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Global init code ---*/
  /*--- Variable export code ---*/
  /*--- Function export code ---*/
  if (__Pyx_ExportFunction("_osr_from_crs", (void (*)(void))__pyx_f_8rasterio_5_base__osr_from_crs, "void *(PyObject *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Type init code ---*/
  __pyx_vtabptr_8rasterio_5_base_DatasetReader = &__pyx_vtable_8rasterio_5_base_DatasetReader;
  __pyx_vtable_8rasterio_5_base_DatasetReader.band = (void *(*)(struct __pyx_obj_8rasterio_5_base_DatasetReader *, int))__pyx_f_8rasterio_5_base_13DatasetReader_band;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base_DatasetReader) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_type_8rasterio_5_base_DatasetReader.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_8rasterio_5_base_DatasetReader.tp_dict, __pyx_vtabptr_8rasterio_5_base_DatasetReader) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyObject_SetAttrString(__pyx_m, "DatasetReader", (PyObject *)&__pyx_type_8rasterio_5_base_DatasetReader) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_ptype_8rasterio_5_base_DatasetReader = &__pyx_type_8rasterio_5_base_DatasetReader;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base___pyx_scope_struct__block_windows) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_type_8rasterio_5_base___pyx_scope_struct__block_windows.tp_print = 0;
  __pyx_ptype_8rasterio_5_base___pyx_scope_struct__block_windows = &__pyx_type_8rasterio_5_base___pyx_scope_struct__block_windows;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base___pyx_scope_struct_1_window_index) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_type_8rasterio_5_base___pyx_scope_struct_1_window_index.tp_print = 0;
  __pyx_ptype_8rasterio_5_base___pyx_scope_struct_1_window_index = &__pyx_type_8rasterio_5_base___pyx_scope_struct_1_window_index;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_type_8rasterio_5_base___pyx_scope_struct_2_genexpr.tp_print = 0;
  __pyx_ptype_8rasterio_5_base___pyx_scope_struct_2_genexpr = &__pyx_type_8rasterio_5_base___pyx_scope_struct_2_genexpr;
  /*--- Type import code ---*/
  /*--- Variable import code ---*/
  /*--- Function import code ---*/
  /*--- Execution code ---*/
  #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
  if (__Pyx_patch_abc() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif

  /* "rasterio/_base.pyx":5
 * # cython: boundscheck=False
 * 
 * import logging             # <<<<<<<<<<<<<<
 * import math
 * import sys
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_logging, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_logging, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":6
 * 
 * import logging
 * import math             # <<<<<<<<<<<<<<
 * import sys
 * import warnings
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_math, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_math, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":7
 * import logging
 * import math
 * import sys             # <<<<<<<<<<<<<<
 * import warnings
 * 
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_sys, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":8
 * import math
 * import sys
 * import warnings             # <<<<<<<<<<<<<<
 * 
 * from libc.stdlib cimport malloc, free
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_warnings, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_warnings, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":13
 * 
 * from rasterio cimport _gdal, _ogr
 * from rasterio._drivers import driver_count, GDALEnv             # <<<<<<<<<<<<<<
 * from rasterio._err import cpl_errs
 * from rasterio import dtypes
 */
  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_driver_count);
  __Pyx_GIVEREF(__pyx_n_s_driver_count);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_driver_count);
  __Pyx_INCREF(__pyx_n_s_GDALEnv);
  __Pyx_GIVEREF(__pyx_n_s_GDALEnv);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_GDALEnv);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_rasterio__drivers, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_driver_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_driver_count, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_GDALEnv); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_GDALEnv, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":14
 * from rasterio cimport _gdal, _ogr
 * from rasterio._drivers import driver_count, GDALEnv
 * from rasterio._err import cpl_errs             # <<<<<<<<<<<<<<
 * from rasterio import dtypes
 * from rasterio.coords import BoundingBox
 */
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_cpl_errs);
  __Pyx_GIVEREF(__pyx_n_s_cpl_errs);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_cpl_errs);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_rasterio__err, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_cpl_errs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_cpl_errs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":15
 * from rasterio._drivers import driver_count, GDALEnv
 * from rasterio._err import cpl_errs
 * from rasterio import dtypes             # <<<<<<<<<<<<<<
 * from rasterio.coords import BoundingBox
 * from rasterio.transform import Affine
 */
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_dtypes);
  __Pyx_GIVEREF(__pyx_n_s_dtypes);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_dtypes);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_rasterio, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_dtypes); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dtypes, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":16
 * from rasterio._err import cpl_errs
 * from rasterio import dtypes
 * from rasterio.coords import BoundingBox             # <<<<<<<<<<<<<<
 * from rasterio.transform import Affine
 * from rasterio.enums import ColorInterp, Compression, Interleaving
 */
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_BoundingBox);
  __Pyx_GIVEREF(__pyx_n_s_BoundingBox);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_BoundingBox);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_rasterio_coords, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_BoundingBox); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BoundingBox, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":17
 * from rasterio import dtypes
 * from rasterio.coords import BoundingBox
 * from rasterio.transform import Affine             # <<<<<<<<<<<<<<
 * from rasterio.enums import ColorInterp, Compression, Interleaving
 * 
 */
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_Affine);
  __Pyx_GIVEREF(__pyx_n_s_Affine);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_Affine);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_rasterio_transform, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Affine); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Affine, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":18
 * from rasterio.coords import BoundingBox
 * from rasterio.transform import Affine
 * from rasterio.enums import ColorInterp, Compression, Interleaving             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_ColorInterp);
  __Pyx_GIVEREF(__pyx_n_s_ColorInterp);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_ColorInterp);
  __Pyx_INCREF(__pyx_n_s_Compression);
  __Pyx_GIVEREF(__pyx_n_s_Compression);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_Compression);
  __Pyx_INCREF(__pyx_n_s_Interleaving);
  __Pyx_GIVEREF(__pyx_n_s_Interleaving);
  PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_Interleaving);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_rasterio_enums, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_ColorInterp); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ColorInterp, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Compression); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Compression, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Interleaving); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Interleaving, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":21
 * 
 * 
 * log = logging.getLogger('rasterio')             # <<<<<<<<<<<<<<
 * if 'all' in sys.warnoptions:
 *     # show messages in console with: python -W all
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_logging); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_getLogger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__57, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_log, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":22
 * 
 * log = logging.getLogger('rasterio')
 * if 'all' in sys.warnoptions:             # <<<<<<<<<<<<<<
 *     # show messages in console with: python -W all
 *     logging.basicConfig()
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_sys); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_warnoptions); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_all, __pyx_t_2, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {

    /* "rasterio/_base.pyx":24
 * if 'all' in sys.warnoptions:
 *     # show messages in console with: python -W all
 *     logging.basicConfig()             # <<<<<<<<<<<<<<
 * else:
 *     # no handler messages shown
 */
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_logging); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_basicConfig); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (__pyx_t_1) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    } else {
      __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":22
 * 
 * log = logging.getLogger('rasterio')
 * if 'all' in sys.warnoptions:             # <<<<<<<<<<<<<<
 *     # show messages in console with: python -W all
 *     logging.basicConfig()
 */
    goto __pyx_L2;
  }

  /* "rasterio/_base.pyx":27
 * else:
 *     # no handler messages shown
 *     class NullHandler(logging.Handler):             # <<<<<<<<<<<<<<
 *         def emit(self, record):
 *             pass
 */
  /*else*/ {
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_logging); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Handler); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_1 = __Pyx_Py3MetaclassPrepare(__pyx_t_5, __pyx_t_2, __pyx_n_s_NullHandler, __pyx_n_s_NullHandler, (PyObject *) NULL, __pyx_n_s_rasterio__base, (PyObject *) NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);

    /* "rasterio/_base.pyx":28
 *     # no handler messages shown
 *     class NullHandler(logging.Handler):
 *         def emit(self, record):             # <<<<<<<<<<<<<<
 *             pass
 *     log.addHandler(NullHandler())
 */
    __pyx_t_6 = __Pyx_CyFunction_NewEx(&__pyx_mdef_8rasterio_5_base_11NullHandler_1emit, 0, __pyx_n_s_NullHandler_emit, NULL, __pyx_n_s_rasterio__base, __pyx_d, ((PyObject *)__pyx_codeobj__59)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_emit, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

    /* "rasterio/_base.pyx":27
 * else:
 *     # no handler messages shown
 *     class NullHandler(logging.Handler):             # <<<<<<<<<<<<<<
 *         def emit(self, record):
 *             pass
 */
    __pyx_t_6 = __Pyx_Py3ClassCreate(__pyx_t_5, __pyx_n_s_NullHandler, __pyx_t_2, __pyx_t_1, NULL, 0, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    if (PyDict_SetItem(__pyx_d, __pyx_n_s_NullHandler, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":30
 *         def emit(self, record):
 *             pass
 *     log.addHandler(NullHandler())             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_addHandler); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_NullHandler); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
      }
    }
    if (__pyx_t_7) {
      __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    } else {
      __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
      }
    }
    if (!__pyx_t_6) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_2);
    } else {
      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_5);
      __pyx_t_5 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  }
  __pyx_L2:;

  /* "rasterio/_base.pyx":228
 * 
 *     @property
 *     def closed(self):             # <<<<<<<<<<<<<<
 *         return self._closed
 * 
 */
  __pyx_t_2 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_closed); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);

  /* "rasterio/_base.pyx":227
 *             _gdal.GDALClose(self._hds)
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def closed(self):
 *         return self._closed
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_closed, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":232
 * 
 *     @property
 *     def count(self):             # <<<<<<<<<<<<<<
 *         if not self._count:
 *             if self._hds == NULL:
 */
  __pyx_t_2 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);

  /* "rasterio/_base.pyx":231
 *         return self._closed
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def count(self):
 *         if not self._count:
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_count, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":240
 * 
 *     @property
 *     def indexes(self):             # <<<<<<<<<<<<<<
 *         return list(range(1, self.count+1))
 * 
 */
  __pyx_t_2 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_indexes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);

  /* "rasterio/_base.pyx":239
 *         return self._count
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def indexes(self):
 *         return list(range(1, self.count+1))
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_indexes, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":244
 * 
 *     @property
 *     def dtypes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered list of all band data types."""
 *         cdef void *hband = NULL
 */
  __pyx_t_2 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_dtypes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);

  /* "rasterio/_base.pyx":243
 *         return list(range(1, self.count+1))
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def dtypes(self):
 *         """Returns an ordered list of all band data types."""
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_dtypes, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":257
 * 
 *     @property
 *     def block_shapes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered list of block shapes for all bands.
 * 
 */
  __pyx_t_2 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);

  /* "rasterio/_base.pyx":256
 *         return self._dtypes
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def block_shapes(self):
 *         """Returns an ordered list of block shapes for all bands.
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_block_shapes, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":392
 *         return c+a*col, f+e*row
 * 
 *     def index(self, x, y, op=math.floor):             # <<<<<<<<<<<<<<
 *         """Returns the (row, col) index of the pixel containing (x, y)."""
 *         return get_index(x, y, self.affine)
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_floor); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_k__31 = __pyx_t_1;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":419
 * 
 *     @property
 *     def meta(self):             # <<<<<<<<<<<<<<
 *         """The basic metadata of this dataset."""
 *         m = {
 */
  __pyx_t_1 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_meta); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);

  /* "rasterio/_base.pyx":418
 *         return x_min, y_min, x_max, y_max
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def meta(self):
 *         """The basic metadata of this dataset."""
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_meta, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":436
 * 
 *     @property
 *     def compression(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:
 */
  __pyx_t_1 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_compression); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);

  /* "rasterio/_base.pyx":435
 *         return m
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_compression, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":444
 * 
 *     @property
 *     def interleaving(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:
 */
  __pyx_t_1 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_interleaving); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);

  /* "rasterio/_base.pyx":443
 *             return None
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_interleaving, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":627
 * 
 *     @property
 *     def kwds(self):             # <<<<<<<<<<<<<<
 *         return self.tags(ns='rio_creation_kwds')
 * 
 */
  __pyx_t_1 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader, __pyx_n_s_kwds); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);

  /* "rasterio/_base.pyx":626
 *         return retval
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def kwds(self):
 *         return self.tags(ns='rio_creation_kwds')
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_8rasterio_5_base_DatasetReader->tp_dict, __pyx_n_s_kwds, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  PyType_Modified(__pyx_ptype_8rasterio_5_base_DatasetReader);

  /* "rasterio/_base.pyx":731
 * 
 * 
 * def get_index(x, y, affine, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns the (row, col) index of the pixel containing (x, y) given a
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_floor); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_k__49 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_5get_index, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":766
 * 
 * 
 * def get_window(left, bottom, right, top, affine, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns a window tuple given coordinate bounds and the coordinate reference
 */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_7get_window, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_window, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":794
 * 
 * 
 * def window_shape(window, height=-1, width=-1):             # <<<<<<<<<<<<<<
 *     """Returns shape of a window.
 * 
 */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_9window_shape, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_window_shape, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":804
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_11window_index, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_window_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":808
 * 
 * 
 * def tastes_like_gdal(t):             # <<<<<<<<<<<<<<
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0
 * 
 */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_13tastes_like_gdal, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_tastes_like_gdal, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":844
 * 
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):             # <<<<<<<<<<<<<<
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_15_transform, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_transform_2, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":902
 * 
 * 
 * def is_geographic_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_17is_geographic_crs, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_geographic_crs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":910
 * 
 * 
 * def is_projected_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_19is_projected_crs, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_projected_crs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":918
 * 
 * 
 * def is_same_crs(crs1, crs2):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_21is_same_crs, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_same_crs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":1
 * # The Numpy-free base classes.             # <<<<<<<<<<<<<<
 * 
 * # cython: boundscheck=False
 */
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /*--- Wrapped vars code ---*/

  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  if (__pyx_m) {
    if (__pyx_d) {
      __Pyx_AddTraceback("init rasterio._base", __pyx_clineno, __pyx_lineno, __pyx_filename);
    }
    Py_DECREF(__pyx_m); __pyx_m = 0;
  } else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_ImportError, "init rasterio._base");
  }
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  #if PY_MAJOR_VERSION < 3
  return;
  #else
  return __pyx_m;
  #endif
}

/* --- Runtime support code --- */
#if CYTHON_REFNANNY
static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
    PyObject *m = NULL, *p = NULL;
    void *r = NULL;
    m = PyImport_ImportModule((char *)modname);
    if (!m) goto end;
    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
    if (!p) goto end;
    r = PyLong_AsVoidPtr(p);
end:
    Py_XDECREF(p);
    Py_XDECREF(m);
    return (__Pyx_RefNannyAPIStruct *)r;
}
#endif

static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
    if (unlikely(!result)) {
        PyErr_Format(PyExc_NameError,
#if PY_MAJOR_VERSION >= 3
            "name '%U' is not defined", name);
#else
            "name '%.200s' is not defined", PyString_AS_STRING(name));
#endif
    }
    return result;
}

static void __Pyx_RaiseArgtupleInvalid(
    const char* func_name,
    int exact,
    Py_ssize_t num_min,
    Py_ssize_t num_max,
    Py_ssize_t num_found)
{
    Py_ssize_t num_expected;
    const char *more_or_less;
    if (num_found < num_min) {
        num_expected = num_min;
        more_or_less = "at least";
    } else {
        num_expected = num_max;
        more_or_less = "at most";
    }
    if (exact) {
        more_or_less = "exactly";
    }
    PyErr_Format(PyExc_TypeError,
                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                 func_name, more_or_less, num_expected,
                 (num_expected == 1) ? "" : "s", num_found);
}

static void __Pyx_RaiseDoubleKeywordsError(
    const char* func_name,
    PyObject* kw_name)
{
    PyErr_Format(PyExc_TypeError,
        #if PY_MAJOR_VERSION >= 3
        "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
        #else
        "%s() got multiple values for keyword argument '%s'", func_name,
        PyString_AsString(kw_name));
        #endif
}

static int __Pyx_ParseOptionalKeywords(
    PyObject *kwds,
    PyObject **argnames[],
    PyObject *kwds2,
    PyObject *values[],
    Py_ssize_t num_pos_args,
    const char* function_name)
{
    PyObject *key = 0, *value = 0;
    Py_ssize_t pos = 0;
    PyObject*** name;
    PyObject*** first_kw_arg = argnames + num_pos_args;
    while (PyDict_Next(kwds, &pos, &key, &value)) {
        name = first_kw_arg;
        while (*name && (**name != key)) name++;
        if (*name) {
            values[name-argnames] = value;
            continue;
        }
        name = first_kw_arg;
        #if PY_MAJOR_VERSION < 3
        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
            while (*name) {
                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
                        && _PyString_Eq(**name, key)) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    if ((**argname == key) || (
                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
                             && _PyString_Eq(**argname, key))) {
                        goto arg_passed_twice;
                    }
                    argname++;
                }
            }
        } else
        #endif
        if (likely(PyUnicode_Check(key))) {
            while (*name) {
                int cmp = (**name == key) ? 0 :
                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
                #endif
                    PyUnicode_Compare(**name, key);
                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                if (cmp == 0) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    int cmp = (**argname == key) ? 0 :
                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
                    #endif
                        PyUnicode_Compare(**argname, key);
                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                    if (cmp == 0) goto arg_passed_twice;
                    argname++;
                }
            }
        } else
            goto invalid_keyword_type;
        if (kwds2) {
            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
        } else {
            goto invalid_keyword;
        }
    }
    return 0;
arg_passed_twice:
    __Pyx_RaiseDoubleKeywordsError(function_name, key);
    goto bad;
invalid_keyword_type:
    PyErr_Format(PyExc_TypeError,
        "%.200s() keywords must be strings", function_name);
    goto bad;
invalid_keyword:
    PyErr_Format(PyExc_TypeError,
    #if PY_MAJOR_VERSION < 3
        "%.200s() got an unexpected keyword argument '%.200s'",
        function_name, PyString_AsString(key));
    #else
        "%s() got an unexpected keyword argument '%U'",
        function_name, key);
    #endif
bad:
    return -1;
}

#if CYTHON_USE_PYLONG_INTERNALS
  #include "longintrepr.h"
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) {
    if (op1 == op2) {
        Py_RETURN_TRUE;
    }
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        const long b = intval;
        long a = PyInt_AS_LONG(op1);
        if (a == b) {
            Py_RETURN_TRUE;
        } else {
            Py_RETURN_FALSE;
        }
    }
    #endif
    #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
    if (likely(PyLong_CheckExact(op1))) {
        const long b = intval;
        long a;
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        if (likely(__Pyx_sst_abs(size) <= 1)) {
            a = likely(size) ? digits[0] : 0;
            if (size == -1) a = -a;
        } else {
            switch (size) {
                case -2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    }
                case 2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    }
                case -3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    }
                case 3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    }
                case -4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    }
                case 4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    }
                #if PyLong_SHIFT < 30 && PyLong_SHIFT != 15
                default: return PyLong_Type.tp_richcompare(op1, op2, Py_EQ);
                #else
                default: Py_RETURN_FALSE;
                #endif
            }
        }
            if (a == b) {
                Py_RETURN_TRUE;
            } else {
                Py_RETURN_FALSE;
            }
    }
    #endif
    if (PyFloat_CheckExact(op1)) {
        const long b = intval;
        double a = PyFloat_AS_DOUBLE(op1);
            if ((double)a == (double)b) {
                Py_RETURN_TRUE;
            } else {
                Py_RETURN_FALSE;
            }
    }
    return PyObject_RichCompare(op1, op2, Py_EQ);
}
#endif

static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
    PyObject *result;
#if CYTHON_COMPILING_IN_CPYTHON
    result = PyDict_GetItem(__pyx_d, name);
    if (likely(result)) {
        Py_INCREF(result);
    } else {
#else
    result = PyObject_GetItem(__pyx_d, name);
    if (!result) {
        PyErr_Clear();
#endif
        result = __Pyx_GetBuiltinName(name);
    }
    return result;
}

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
    PyObject *result;
    ternaryfunc call = func->ob_type->tp_call;
    if (unlikely(!call))
        return PyObject_Call(func, arg, kw);
    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
        return NULL;
    result = (*call)(func, arg, kw);
    Py_LeaveRecursiveCall();
    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
        PyErr_SetString(
            PyExc_SystemError,
            "NULL result without error in PyObject_Call");
    }
    return result;
}
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
    PyObject *self, *result;
    PyCFunction cfunc;
    cfunc = PyCFunction_GET_FUNCTION(func);
    self = PyCFunction_GET_SELF(func);
    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
        return NULL;
    result = cfunc(self, arg);
    Py_LeaveRecursiveCall();
    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
        PyErr_SetString(
            PyExc_SystemError,
            "NULL result without error in PyObject_Call");
    }
    return result;
}
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
    PyObject *result;
    PyObject *args = PyTuple_New(1);
    if (unlikely(!args)) return NULL;
    Py_INCREF(arg);
    PyTuple_SET_ITEM(args, 0, arg);
    result = __Pyx_PyObject_Call(func, args, NULL);
    Py_DECREF(args);
    return result;
}
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
#ifdef __Pyx_CyFunction_USED
    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
#else
    if (likely(PyCFunction_Check(func))) {
#endif
        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
            return __Pyx_PyObject_CallMethO(func, arg);
        }
    }
    return __Pyx__PyObject_CallOneArg(func, arg);
}
#else
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
    PyObject* args = PyTuple_Pack(1, arg);
    return (likely(args)) ? __Pyx_PyObject_Call(func, args, NULL) : NULL;
}
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
#ifdef __Pyx_CyFunction_USED
    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
#else
    if (likely(PyCFunction_Check(func))) {
#endif
        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
            return __Pyx_PyObject_CallMethO(func, NULL);
        }
    }
    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
}
#endif

static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyThreadState *tstate = PyThreadState_GET();
    tmp_type = tstate->curexc_type;
    tmp_value = tstate->curexc_value;
    tmp_tb = tstate->curexc_traceback;
    tstate->curexc_type = type;
    tstate->curexc_value = value;
    tstate->curexc_traceback = tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
#else
    PyErr_Restore(type, value, tb);
#endif
}
static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    *type = tstate->curexc_type;
    *value = tstate->curexc_value;
    *tb = tstate->curexc_traceback;
    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
#else
    PyErr_Fetch(type, value, tb);
#endif
}

#if PY_MAJOR_VERSION < 3
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
                        CYTHON_UNUSED PyObject *cause) {
    Py_XINCREF(type);
    if (!value || value == Py_None)
        value = NULL;
    else
        Py_INCREF(value);
    if (!tb || tb == Py_None)
        tb = NULL;
    else {
        Py_INCREF(tb);
        if (!PyTraceBack_Check(tb)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: arg 3 must be a traceback or None");
            goto raise_error;
        }
    }
    if (PyType_Check(type)) {
#if CYTHON_COMPILING_IN_PYPY
        if (!value) {
            Py_INCREF(Py_None);
            value = Py_None;
        }
#endif
        PyErr_NormalizeException(&type, &value, &tb);
    } else {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto raise_error;
        }
        value = type;
        type = (PyObject*) Py_TYPE(type);
        Py_INCREF(type);
        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: exception class must be a subclass of BaseException");
            goto raise_error;
        }
    }
    __Pyx_ErrRestore(type, value, tb);
    return;
raise_error:
    Py_XDECREF(value);
    Py_XDECREF(type);
    Py_XDECREF(tb);
    return;
}
#else
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
    PyObject* owned_instance = NULL;
    if (tb == Py_None) {
        tb = 0;
    } else if (tb && !PyTraceBack_Check(tb)) {
        PyErr_SetString(PyExc_TypeError,
            "raise: arg 3 must be a traceback or None");
        goto bad;
    }
    if (value == Py_None)
        value = 0;
    if (PyExceptionInstance_Check(type)) {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto bad;
        }
        value = type;
        type = (PyObject*) Py_TYPE(value);
    } else if (PyExceptionClass_Check(type)) {
        PyObject *instance_class = NULL;
        if (value && PyExceptionInstance_Check(value)) {
            instance_class = (PyObject*) Py_TYPE(value);
            if (instance_class != type) {
                int is_subclass = PyObject_IsSubclass(instance_class, type);
                if (!is_subclass) {
                    instance_class = NULL;
                } else if (unlikely(is_subclass == -1)) {
                    goto bad;
                } else {
                    type = instance_class;
                }
            }
        }
        if (!instance_class) {
            PyObject *args;
            if (!value)
                args = PyTuple_New(0);
            else if (PyTuple_Check(value)) {
                Py_INCREF(value);
                args = value;
            } else
                args = PyTuple_Pack(1, value);
            if (!args)
                goto bad;
            owned_instance = PyObject_Call(type, args, NULL);
            Py_DECREF(args);
            if (!owned_instance)
                goto bad;
            value = owned_instance;
            if (!PyExceptionInstance_Check(value)) {
                PyErr_Format(PyExc_TypeError,
                             "calling %R should have returned an instance of "
                             "BaseException, not %R",
                             type, Py_TYPE(value));
                goto bad;
            }
        }
    } else {
        PyErr_SetString(PyExc_TypeError,
            "raise: exception class must be a subclass of BaseException");
        goto bad;
    }
#if PY_VERSION_HEX >= 0x03030000
    if (cause) {
#else
    if (cause && cause != Py_None) {
#endif
        PyObject *fixed_cause;
        if (cause == Py_None) {
            fixed_cause = NULL;
        } else if (PyExceptionClass_Check(cause)) {
            fixed_cause = PyObject_CallObject(cause, NULL);
            if (fixed_cause == NULL)
                goto bad;
        } else if (PyExceptionInstance_Check(cause)) {
            fixed_cause = cause;
            Py_INCREF(fixed_cause);
        } else {
            PyErr_SetString(PyExc_TypeError,
                            "exception causes must derive from "
                            "BaseException");
            goto bad;
        }
        PyException_SetCause(value, fixed_cause);
    }
    PyErr_SetObject(type, value);
    if (tb) {
#if CYTHON_COMPILING_IN_PYPY
        PyObject *tmp_type, *tmp_value, *tmp_tb;
        PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
        Py_INCREF(tb);
        PyErr_Restore(tmp_type, tmp_value, tb);
        Py_XDECREF(tmp_tb);
#else
        PyThreadState *tstate = PyThreadState_GET();
        PyObject* tmp_tb = tstate->curexc_traceback;
        if (tb != tmp_tb) {
            Py_INCREF(tb);
            tstate->curexc_traceback = tb;
            Py_XDECREF(tmp_tb);
        }
#endif
    }
bad:
    Py_XDECREF(owned_instance);
    return;
}
#endif

static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
         const char* cstring, Py_ssize_t start, Py_ssize_t stop,
         const char* encoding, const char* errors,
         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
    Py_ssize_t length;
    if (unlikely((start < 0) | (stop < 0))) {
        length = strlen(cstring);
        if (start < 0) {
            start += length;
            if (start < 0)
                start = 0;
        }
        if (stop < 0)
            stop += length;
    }
    length = stop - start;
    if (unlikely(length <= 0))
        return PyUnicode_FromUnicode(NULL, 0);
    cstring += start;
    if (decode_func) {
        return decode_func(cstring, length, errors);
    } else {
        return PyUnicode_Decode(cstring, length, encoding, errors);
    }
}

static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
                                  int full_traceback, CYTHON_UNUSED int nogil) {
    PyObject *old_exc, *old_val, *old_tb;
    PyObject *ctx;
#ifdef WITH_THREAD
    PyGILState_STATE state;
    if (nogil)
        state = PyGILState_Ensure();
#endif
    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
    if (full_traceback) {
        Py_XINCREF(old_exc);
        Py_XINCREF(old_val);
        Py_XINCREF(old_tb);
        __Pyx_ErrRestore(old_exc, old_val, old_tb);
        PyErr_PrintEx(1);
    }
    #if PY_MAJOR_VERSION < 3
    ctx = PyString_FromString(name);
    #else
    ctx = PyUnicode_FromString(name);
    #endif
    __Pyx_ErrRestore(old_exc, old_val, old_tb);
    if (!ctx) {
        PyErr_WriteUnraisable(Py_None);
    } else {
        PyErr_WriteUnraisable(ctx);
        Py_DECREF(ctx);
    }
#ifdef WITH_THREAD
    if (nogil)
        PyGILState_Release(state);
#endif
}

static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
#if CYTHON_COMPILING_IN_PYPY
    return PyObject_RichCompareBool(s1, s2, equals);
#else
    if (s1 == s2) {
        return (equals == Py_EQ);
    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
        const char *ps1, *ps2;
        Py_ssize_t length = PyBytes_GET_SIZE(s1);
        if (length != PyBytes_GET_SIZE(s2))
            return (equals == Py_NE);
        ps1 = PyBytes_AS_STRING(s1);
        ps2 = PyBytes_AS_STRING(s2);
        if (ps1[0] != ps2[0]) {
            return (equals == Py_NE);
        } else if (length == 1) {
            return (equals == Py_EQ);
        } else {
            int result = memcmp(ps1, ps2, (size_t)length);
            return (equals == Py_EQ) ? (result == 0) : (result != 0);
        }
    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
        return (equals == Py_NE);
    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
        return (equals == Py_NE);
    } else {
        int result;
        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
        if (!py_result)
            return -1;
        result = __Pyx_PyObject_IsTrue(py_result);
        Py_DECREF(py_result);
        return result;
    }
#endif
}

static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
#if CYTHON_COMPILING_IN_PYPY
    return PyObject_RichCompareBool(s1, s2, equals);
#else
#if PY_MAJOR_VERSION < 3
    PyObject* owned_ref = NULL;
#endif
    int s1_is_unicode, s2_is_unicode;
    if (s1 == s2) {
        goto return_eq;
    }
    s1_is_unicode = PyUnicode_CheckExact(s1);
    s2_is_unicode = PyUnicode_CheckExact(s2);
#if PY_MAJOR_VERSION < 3
    if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) {
        owned_ref = PyUnicode_FromObject(s2);
        if (unlikely(!owned_ref))
            return -1;
        s2 = owned_ref;
        s2_is_unicode = 1;
    } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) {
        owned_ref = PyUnicode_FromObject(s1);
        if (unlikely(!owned_ref))
            return -1;
        s1 = owned_ref;
        s1_is_unicode = 1;
    } else if (((!s2_is_unicode) & (!s1_is_unicode))) {
        return __Pyx_PyBytes_Equals(s1, s2, equals);
    }
#endif
    if (s1_is_unicode & s2_is_unicode) {
        Py_ssize_t length;
        int kind;
        void *data1, *data2;
        if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0))
            return -1;
        length = __Pyx_PyUnicode_GET_LENGTH(s1);
        if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) {
            goto return_ne;
        }
        kind = __Pyx_PyUnicode_KIND(s1);
        if (kind != __Pyx_PyUnicode_KIND(s2)) {
            goto return_ne;
        }
        data1 = __Pyx_PyUnicode_DATA(s1);
        data2 = __Pyx_PyUnicode_DATA(s2);
        if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) {
            goto return_ne;
        } else if (length == 1) {
            goto return_eq;
        } else {
            int result = memcmp(data1, data2, (size_t)(length * kind));
            #if PY_MAJOR_VERSION < 3
            Py_XDECREF(owned_ref);
            #endif
            return (equals == Py_EQ) ? (result == 0) : (result != 0);
        }
    } else if ((s1 == Py_None) & s2_is_unicode) {
        goto return_ne;
    } else if ((s2 == Py_None) & s1_is_unicode) {
        goto return_ne;
    } else {
        int result;
        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
        if (!py_result)
            return -1;
        result = __Pyx_PyObject_IsTrue(py_result);
        Py_DECREF(py_result);
        return result;
    }
return_eq:
    #if PY_MAJOR_VERSION < 3
    Py_XDECREF(owned_ref);
    #endif
    return (equals == Py_EQ);
return_ne:
    #if PY_MAJOR_VERSION < 3
    Py_XDECREF(owned_ref);
    #endif
    return (equals == Py_NE);
#endif
}

static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
    PyErr_Format(PyExc_ValueError,
                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
}

static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
    PyErr_Format(PyExc_ValueError,
                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack",
                 index, (index == 1) ? "" : "s");
}

static CYTHON_INLINE int __Pyx_IterFinish(void) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    PyObject* exc_type = tstate->curexc_type;
    if (unlikely(exc_type)) {
        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {
            PyObject *exc_value, *exc_tb;
            exc_value = tstate->curexc_value;
            exc_tb = tstate->curexc_traceback;
            tstate->curexc_type = 0;
            tstate->curexc_value = 0;
            tstate->curexc_traceback = 0;
            Py_DECREF(exc_type);
            Py_XDECREF(exc_value);
            Py_XDECREF(exc_tb);
            return 0;
        } else {
            return -1;
        }
    }
    return 0;
#else
    if (unlikely(PyErr_Occurred())) {
        if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {
            PyErr_Clear();
            return 0;
        } else {
            return -1;
        }
    }
    return 0;
#endif
}

static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
    if (unlikely(retval)) {
        Py_DECREF(retval);
        __Pyx_RaiseTooManyValuesError(expected);
        return -1;
    } else {
        return __Pyx_IterFinish();
    }
    return 0;
}

static double __Pyx__PyObject_AsDouble(PyObject* obj) {
    PyObject* float_value;
#if CYTHON_COMPILING_IN_PYPY
    float_value = PyNumber_Float(obj);  if (0) goto bad;
#else
    PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number;
    if (likely(nb) && likely(nb->nb_float)) {
        float_value = nb->nb_float(obj);
        if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) {
            PyErr_Format(PyExc_TypeError,
                "__float__ returned non-float (type %.200s)",
                Py_TYPE(float_value)->tp_name);
            Py_DECREF(float_value);
            goto bad;
        }
    } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
#if PY_MAJOR_VERSION >= 3
        float_value = PyFloat_FromString(obj);
#else
        float_value = PyFloat_FromString(obj, 0);
#endif
    } else {
        PyObject* args = PyTuple_New(1);
        if (unlikely(!args)) goto bad;
        PyTuple_SET_ITEM(args, 0, obj);
        float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0);
        PyTuple_SET_ITEM(args, 0, 0);
        Py_DECREF(args);
    }
#endif
    if (likely(float_value)) {
        double value = PyFloat_AS_DOUBLE(float_value);
        Py_DECREF(float_value);
        return value;
    }
bad:
    return (double)-1;
}

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_RemainderObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) {
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        const long b = intval;
        long x;
        long a = PyInt_AS_LONG(op1);
            x = a % b;
            x += ((x != 0) & ((x ^ b) < 0)) * b;
            return PyInt_FromLong(x);
    }
    #endif
    #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
    if (likely(PyLong_CheckExact(op1))) {
        const long b = intval;
        long a, x;
        const PY_LONG_LONG llb = intval;
        PY_LONG_LONG lla, llx;
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        if (likely(__Pyx_sst_abs(size) <= 1)) {
            a = likely(size) ? digits[0] : 0;
            if (size == -1) a = -a;
        } else {
            switch (size) {
                case -2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case -3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case -4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                default: return PyLong_Type.tp_as_number->nb_remainder(op1, op2);
            }
        }
                x = a % b;
                x += ((x != 0) & ((x ^ b) < 0)) * b;
            return PyLong_FromLong(x);
        long_long:
                llx = lla % llb;
                llx += ((llx != 0) & ((llx ^ llb) < 0)) * llb;
            return PyLong_FromLongLong(llx);
    }
    #endif
    return (inplace ? PyNumber_InPlaceRemainder : PyNumber_Remainder)(op1, op2);
}
#endif

static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    *type = tstate->exc_type;
    *value = tstate->exc_value;
    *tb = tstate->exc_traceback;
    Py_XINCREF(*type);
    Py_XINCREF(*value);
    Py_XINCREF(*tb);
#else
    PyErr_GetExcInfo(type, value, tb);
#endif
}
static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyThreadState *tstate = PyThreadState_GET();
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = type;
    tstate->exc_value = value;
    tstate->exc_traceback = tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
#else
    PyErr_SetExcInfo(type, value, tb);
#endif
}

static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
    PyObject *r;
    if (!j) return NULL;
    r = PyObject_GetItem(o, j);
    Py_DECREF(j);
    return r;
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
                                                              CYTHON_NCP_UNUSED int wraparound,
                                                              CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o);
    if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
        PyObject *r = PyList_GET_ITEM(o, i);
        Py_INCREF(r);
        return r;
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
#else
    return PySequence_GetItem(o, i);
#endif
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
                                                              CYTHON_NCP_UNUSED int wraparound,
                                                              CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o);
    if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
        PyObject *r = PyTuple_GET_ITEM(o, i);
        Py_INCREF(r);
        return r;
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
#else
    return PySequence_GetItem(o, i);
#endif
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list,
                                                     CYTHON_NCP_UNUSED int wraparound,
                                                     CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (is_list || PyList_CheckExact(o)) {
        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
        if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) {
            PyObject *r = PyList_GET_ITEM(o, n);
            Py_INCREF(r);
            return r;
        }
    }
    else if (PyTuple_CheckExact(o)) {
        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
        if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
            PyObject *r = PyTuple_GET_ITEM(o, n);
            Py_INCREF(r);
            return r;
        }
    } else {
        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
        if (likely(m && m->sq_item)) {
            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
                Py_ssize_t l = m->sq_length(o);
                if (likely(l >= 0)) {
                    i += l;
                } else {
                    if (PyErr_ExceptionMatches(PyExc_OverflowError))
                        PyErr_Clear();
                    else
                        return NULL;
                }
            }
            return m->sq_item(o, i);
        }
    }
#else
    if (is_list || PySequence_Check(o)) {
        return PySequence_GetItem(o, i);
    }
#endif
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
}

static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) {
    PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname);
}

static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
    int r;
    if (!j) return -1;
    r = PyObject_SetItem(o, j, v);
    Py_DECREF(j);
    return r;
}
static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list,
                                               CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (is_list || PyList_CheckExact(o)) {
        Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o));
        if ((!boundscheck) || likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
            PyObject* old = PyList_GET_ITEM(o, n);
            Py_INCREF(v);
            PyList_SET_ITEM(o, n, v);
            Py_DECREF(old);
            return 1;
        }
    } else {
        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
        if (likely(m && m->sq_ass_item)) {
            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
                Py_ssize_t l = m->sq_length(o);
                if (likely(l >= 0)) {
                    i += l;
                } else {
                    if (PyErr_ExceptionMatches(PyExc_OverflowError))
                        PyErr_Clear();
                    else
                        return -1;
                }
            }
            return m->sq_ass_item(o, i, v);
        }
    }
#else
#if CYTHON_COMPILING_IN_PYPY
    if (is_list || (PySequence_Check(o) && !PyDict_Check(o))) {
#else
    if (is_list || PySequence_Check(o)) {
#endif
        return PySequence_SetItem(o, i, v);
    }
#endif
    return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v);
}

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) {
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        const long b = intval;
        long x;
        long a = PyInt_AS_LONG(op1);
            x = (long)((unsigned long)a + b);
            if (likely((x^a) >= 0 || (x^b) >= 0))
                return PyInt_FromLong(x);
            return PyLong_Type.tp_as_number->nb_add(op1, op2);
    }
    #endif
    #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
    if (likely(PyLong_CheckExact(op1))) {
        const long b = intval;
        long a, x;
        const PY_LONG_LONG llb = intval;
        PY_LONG_LONG lla, llx;
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        if (likely(__Pyx_sst_abs(size) <= 1)) {
            a = likely(size) ? digits[0] : 0;
            if (size == -1) a = -a;
        } else {
            switch (size) {
                case -2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case -3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case -4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                default: return PyLong_Type.tp_as_number->nb_add(op1, op2);
            }
        }
                x = a + b;
            return PyLong_FromLong(x);
        long_long:
                llx = lla + llb;
            return PyLong_FromLongLong(llx);
    }
    #endif
    if (PyFloat_CheckExact(op1)) {
        const long b = intval;
        double a = PyFloat_AS_DOUBLE(op1);
            double result;
            PyFPE_START_PROTECT("add", return NULL)
            result = ((double)a) + (double)b;
            PyFPE_END_PROTECT(result)
            return PyFloat_FromDouble(result);
    }
    return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2);
}
#endif

static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
    PyObject *method, *result = NULL;
    method = __Pyx_PyObject_GetAttrStr(obj, method_name);
    if (unlikely(!method)) goto bad;
#if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyMethod_Check(method))) {
        PyObject *self = PyMethod_GET_SELF(method);
        if (likely(self)) {
            PyObject *args;
            PyObject *function = PyMethod_GET_FUNCTION(method);
            args = PyTuple_New(2);
            if (unlikely(!args)) goto bad;
            Py_INCREF(self);
            PyTuple_SET_ITEM(args, 0, self);
            Py_INCREF(arg);
            PyTuple_SET_ITEM(args, 1, arg);
            Py_INCREF(function);
            Py_DECREF(method); method = NULL;
            result = __Pyx_PyObject_Call(function, args, NULL);
            Py_DECREF(args);
            Py_DECREF(function);
            return result;
        }
    }
#endif
    result = __Pyx_PyObject_CallOneArg(method, arg);
bad:
    Py_XDECREF(method);
    return result;
}

static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
    if (likely(PyList_CheckExact(L))) {
        if (unlikely(__Pyx_PyList_Append(L, x) < 0)) return -1;
    } else {
        PyObject* retval = __Pyx_PyObject_CallMethod1(L, __pyx_n_s_append, x);
        if (unlikely(!retval))
            return -1;
        Py_DECREF(retval);
    }
    return 0;
}

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) {
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        const long b = intval;
        long x;
        long a = PyInt_AS_LONG(op1);
            x = (long)((unsigned long)a - b);
            if (likely((x^a) >= 0 || (x^~b) >= 0))
                return PyInt_FromLong(x);
            return PyLong_Type.tp_as_number->nb_subtract(op1, op2);
    }
    #endif
    #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
    if (likely(PyLong_CheckExact(op1))) {
        const long b = intval;
        long a, x;
        const PY_LONG_LONG llb = intval;
        PY_LONG_LONG lla, llx;
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        if (likely(__Pyx_sst_abs(size) <= 1)) {
            a = likely(size) ? digits[0] : 0;
            if (size == -1) a = -a;
        } else {
            switch (size) {
                case -2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case -3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case -4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                case 4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        goto long_long;
                    }
                default: return PyLong_Type.tp_as_number->nb_subtract(op1, op2);
            }
        }
                x = a - b;
            return PyLong_FromLong(x);
        long_long:
                llx = lla - llb;
            return PyLong_FromLongLong(llx);
    }
    #endif
    if (PyFloat_CheckExact(op1)) {
        const long b = intval;
        double a = PyFloat_AS_DOUBLE(op1);
            double result;
            PyFPE_START_PROTECT("subtract", return NULL)
            result = ((double)a) - (double)b;
            PyFPE_END_PROTECT(result)
            return PyFloat_FromDouble(result);
    }
    return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2);
}
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyFloat_DivideObjC(PyObject *op1, PyObject *op2, double floatval, CYTHON_UNUSED int inplace) {
    const double b = floatval;
    double a, result;
    if (likely(PyFloat_CheckExact(op1))) {
        a = PyFloat_AS_DOUBLE(op1);
    } else
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        a = (double) PyInt_AS_LONG(op1);
    } else
    #endif
    if (likely(PyLong_CheckExact(op1))) {
        #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        switch (size) {
            case  0: a = 0.0; break;
            case -1: a = -(double) digits[0]; break;
            case  1: a = (double) digits[0]; break;
            case -2:
            case 2:
                if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (1 * PyLong_SHIFT < 53))) {
                    a = (double) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53) || (a < (double) (1L<<53))) {
                        if (size == -2)
                            a = -a;
                        break;
                    }
                }
            case -3:
            case 3:
                if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53))) {
                    a = (double) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53) || (a < (double) (1L<<53))) {
                        if (size == -3)
                            a = -a;
                        break;
                    }
                }
            case -4:
            case 4:
                if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53))) {
                    a = (double) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (4 * PyLong_SHIFT < 53) || (a < (double) (1L<<53))) {
                        if (size == -4)
                            a = -a;
                        break;
                    }
                }
            default:
        #else
        {
        #endif
            a = PyLong_AsDouble(op1);
            if (unlikely(a == -1.0 && PyErr_Occurred())) return NULL;
        }
    } else {
        return (inplace ? __Pyx_PyNumber_InPlaceDivide(op1, op2) : __Pyx_PyNumber_Divide(op1, op2));
    }
        PyFPE_START_PROTECT("divide", return NULL)
        result = a / b;
        PyFPE_END_PROTECT(result)
        return PyFloat_FromDouble(result);
}
#endif

static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) {
    PyObject *method, *result = NULL;
    method = __Pyx_PyObject_GetAttrStr(obj, method_name);
    if (unlikely(!method)) goto bad;
#if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyMethod_Check(method))) {
        PyObject *self = PyMethod_GET_SELF(method);
        if (likely(self)) {
            PyObject *function = PyMethod_GET_FUNCTION(method);
            result = __Pyx_PyObject_CallOneArg(function, self);
            Py_DECREF(method);
            return result;
        }
    }
#endif
    result = __Pyx_PyObject_CallNoArg(method);
    Py_DECREF(method);
bad:
    return result;
}

static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) {
    PyObject *method;
    method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name);
    if (unlikely(!method))
        return -1;
    target->method = method;
#if CYTHON_COMPILING_IN_CPYTHON
    #if PY_MAJOR_VERSION >= 3
    if (likely(PyObject_TypeCheck(method, &PyMethodDescr_Type)))
    #endif
    {
        PyMethodDescrObject *descr = (PyMethodDescrObject*) method;
        target->func = descr->d_method->ml_meth;
        target->flag = descr->d_method->ml_flags & (METH_VARARGS | METH_KEYWORDS | METH_O | METH_NOARGS);
    }
#endif
    return 0;
}

static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) {
    PyObject *args, *result = NULL;
    if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL;
#if CYTHON_COMPILING_IN_CPYTHON
    args = PyTuple_New(1);
    if (unlikely(!args)) goto bad;
    Py_INCREF(self);
    PyTuple_SET_ITEM(args, 0, self);
#else
    args = PyTuple_Pack(1, self);
    if (unlikely(!args)) goto bad;
#endif
    result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
    Py_DECREF(args);
bad:
    return result;
}

static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (Py_TYPE(L) == &PySet_Type) {
        return PySet_Pop(L);
    }
#endif
    return __Pyx_PyObject_CallMethod0(L, __pyx_n_s_pop);
}
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L) {
    if (likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
        Py_SIZE(L) -= 1;
        return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
    }
    return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyList_Type_pop, L);
}
#endif

static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
    PyObject *local_type, *local_value, *local_tb;
#if CYTHON_COMPILING_IN_CPYTHON
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyThreadState *tstate = PyThreadState_GET();
    local_type = tstate->curexc_type;
    local_value = tstate->curexc_value;
    local_tb = tstate->curexc_traceback;
    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
#else
    PyErr_Fetch(&local_type, &local_value, &local_tb);
#endif
    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
#if CYTHON_COMPILING_IN_CPYTHON
    if (unlikely(tstate->curexc_type))
#else
    if (unlikely(PyErr_Occurred()))
#endif
        goto bad;
    #if PY_MAJOR_VERSION >= 3
    if (local_tb) {
        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
            goto bad;
    }
    #endif
    Py_XINCREF(local_tb);
    Py_XINCREF(local_type);
    Py_XINCREF(local_value);
    *type = local_type;
    *value = local_value;
    *tb = local_tb;
#if CYTHON_COMPILING_IN_CPYTHON
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = local_type;
    tstate->exc_value = local_value;
    tstate->exc_traceback = local_tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
#else
    PyErr_SetExcInfo(local_type, local_value, local_tb);
#endif
    return 0;
bad:
    *type = 0;
    *value = 0;
    *tb = 0;
    Py_XDECREF(local_type);
    Py_XDECREF(local_value);
    Py_XDECREF(local_tb);
    return -1;
}

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyFloat_SubtractCObj(PyObject *op1, PyObject *op2, double floatval, CYTHON_UNUSED int inplace) {
    const double a = floatval;
    double b, result;
    if (likely(PyFloat_CheckExact(op2))) {
        b = PyFloat_AS_DOUBLE(op2);
    } else
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op2))) {
        b = (double) PyInt_AS_LONG(op2);
    } else
    #endif
    if (likely(PyLong_CheckExact(op2))) {
        #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
        const digit* digits = ((PyLongObject*)op2)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op2);
        switch (size) {
            case  0: b = 0.0; break;
            case -1: b = -(double) digits[0]; break;
            case  1: b = (double) digits[0]; break;
            case -2:
            case 2:
                if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (1 * PyLong_SHIFT < 53))) {
                    b = (double) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53) || (b < (double) (1L<<53))) {
                        if (size == -2)
                            b = -b;
                        break;
                    }
                }
            case -3:
            case 3:
                if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53))) {
                    b = (double) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53) || (b < (double) (1L<<53))) {
                        if (size == -3)
                            b = -b;
                        break;
                    }
                }
            case -4:
            case 4:
                if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53))) {
                    b = (double) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (4 * PyLong_SHIFT < 53) || (b < (double) (1L<<53))) {
                        if (size == -4)
                            b = -b;
                        break;
                    }
                }
            default:
        #else
        {
        #endif
            b = PyLong_AsDouble(op2);
            if (unlikely(b == -1.0 && PyErr_Occurred())) return NULL;
        }
    } else {
        return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2);
    }
        PyFPE_START_PROTECT("subtract", return NULL)
        result = a - b;
        PyFPE_END_PROTECT(result)
        return PyFloat_FromDouble(result);
}
#endif

static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
    PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
}

#if !CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* values) {
    return PyObject_CallMethodObjArgs(sep, __pyx_n_s_join, values, NULL);
}
#endif

static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
#if PY_VERSION_HEX >= 0x02070000
    PyObject *ob = PyCapsule_New(vtable, 0, 0);
#else
    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
#endif
    if (!ob)
        goto bad;
    if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0)
        goto bad;
    Py_DECREF(ob);
    return 0;
bad:
    Py_XDECREF(ob);
    return -1;
}

static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
    PyObject *empty_list = 0;
    PyObject *module = 0;
    PyObject *global_dict = 0;
    PyObject *empty_dict = 0;
    PyObject *list;
    #if PY_VERSION_HEX < 0x03030000
    PyObject *py_import;
    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
    if (!py_import)
        goto bad;
    #endif
    if (from_list)
        list = from_list;
    else {
        empty_list = PyList_New(0);
        if (!empty_list)
            goto bad;
        list = empty_list;
    }
    global_dict = PyModule_GetDict(__pyx_m);
    if (!global_dict)
        goto bad;
    empty_dict = PyDict_New();
    if (!empty_dict)
        goto bad;
    {
        #if PY_MAJOR_VERSION >= 3
        if (level == -1) {
            if (strchr(__Pyx_MODULE_NAME, '.')) {
                #if PY_VERSION_HEX < 0x03030000
                PyObject *py_level = PyInt_FromLong(1);
                if (!py_level)
                    goto bad;
                module = PyObject_CallFunctionObjArgs(py_import,
                    name, global_dict, empty_dict, list, py_level, NULL);
                Py_DECREF(py_level);
                #else
                module = PyImport_ImportModuleLevelObject(
                    name, global_dict, empty_dict, list, 1);
                #endif
                if (!module) {
                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
                        goto bad;
                    PyErr_Clear();
                }
            }
            level = 0;
        }
        #endif
        if (!module) {
            #if PY_VERSION_HEX < 0x03030000
            PyObject *py_level = PyInt_FromLong(level);
            if (!py_level)
                goto bad;
            module = PyObject_CallFunctionObjArgs(py_import,
                name, global_dict, empty_dict, list, py_level, NULL);
            Py_DECREF(py_level);
            #else
            module = PyImport_ImportModuleLevelObject(
                name, global_dict, empty_dict, list, level);
            #endif
        }
    }
bad:
    #if PY_VERSION_HEX < 0x03030000
    Py_XDECREF(py_import);
    #endif
    Py_XDECREF(empty_list);
    Py_XDECREF(empty_dict);
    return module;
}

static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
    PyObject* value = __Pyx_PyObject_GetAttrStr(module, name);
    if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) {
        PyErr_Format(PyExc_ImportError,
        #if PY_MAJOR_VERSION < 3
            "cannot import name %.230s", PyString_AS_STRING(name));
        #else
            "cannot import name %S", name);
        #endif
    }
    return value;
}

static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases) {
    Py_ssize_t i, nbases = PyTuple_GET_SIZE(bases);
    for (i=0; i < nbases; i++) {
        PyTypeObject *tmptype;
        PyObject *tmp = PyTuple_GET_ITEM(bases, i);
        tmptype = Py_TYPE(tmp);
#if PY_MAJOR_VERSION < 3
        if (tmptype == &PyClass_Type)
            continue;
#endif
        if (!metaclass) {
            metaclass = tmptype;
            continue;
        }
        if (PyType_IsSubtype(metaclass, tmptype))
            continue;
        if (PyType_IsSubtype(tmptype, metaclass)) {
            metaclass = tmptype;
            continue;
        }
        PyErr_SetString(PyExc_TypeError,
                        "metaclass conflict: "
                        "the metaclass of a derived class "
                        "must be a (non-strict) subclass "
                        "of the metaclasses of all its bases");
        return NULL;
    }
    if (!metaclass) {
#if PY_MAJOR_VERSION < 3
        metaclass = &PyClass_Type;
#else
        metaclass = &PyType_Type;
#endif
    }
    Py_INCREF((PyObject*) metaclass);
    return (PyObject*) metaclass;
}

static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
    PyObject* fake_module;
    PyTypeObject* cached_type = NULL;
    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI);
    if (!fake_module) return NULL;
    Py_INCREF(fake_module);
    cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
    if (cached_type) {
        if (!PyType_Check((PyObject*)cached_type)) {
            PyErr_Format(PyExc_TypeError,
                "Shared Cython type %.200s is not a type object",
                type->tp_name);
            goto bad;
        }
        if (cached_type->tp_basicsize != type->tp_basicsize) {
            PyErr_Format(PyExc_TypeError,
                "Shared Cython type %.200s has the wrong size, try recompiling",
                type->tp_name);
            goto bad;
        }
    } else {
        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
        PyErr_Clear();
        if (PyType_Ready(type) < 0) goto bad;
        if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0)
            goto bad;
        Py_INCREF(type);
        cached_type = type;
    }
done:
    Py_DECREF(fake_module);
    return cached_type;
bad:
    Py_XDECREF(cached_type);
    cached_type = NULL;
    goto done;
}

static PyObject *
__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
{
    if (unlikely(op->func_doc == NULL)) {
        if (op->func.m_ml->ml_doc) {
#if PY_MAJOR_VERSION >= 3
            op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc);
#else
            op->func_doc = PyString_FromString(op->func.m_ml->ml_doc);
#endif
            if (unlikely(op->func_doc == NULL))
                return NULL;
        } else {
            Py_INCREF(Py_None);
            return Py_None;
        }
    }
    Py_INCREF(op->func_doc);
    return op->func_doc;
}
static int
__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp = op->func_doc;
    if (value == NULL) {
        value = Py_None;
    }
    Py_INCREF(value);
    op->func_doc = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op)
{
    if (unlikely(op->func_name == NULL)) {
#if PY_MAJOR_VERSION >= 3
        op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name);
#else
        op->func_name = PyString_InternFromString(op->func.m_ml->ml_name);
#endif
        if (unlikely(op->func_name == NULL))
            return NULL;
    }
    Py_INCREF(op->func_name);
    return op->func_name;
}
static int
__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__name__ must be set to a string object");
        return -1;
    }
    tmp = op->func_name;
    Py_INCREF(value);
    op->func_name = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op)
{
    Py_INCREF(op->func_qualname);
    return op->func_qualname;
}
static int
__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__qualname__ must be set to a string object");
        return -1;
    }
    tmp = op->func_qualname;
    Py_INCREF(value);
    op->func_qualname = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure)
{
    PyObject *self;
    self = m->func_closure;
    if (self == NULL)
        self = Py_None;
    Py_INCREF(self);
    return self;
}
static PyObject *
__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op)
{
    if (unlikely(op->func_dict == NULL)) {
        op->func_dict = PyDict_New();
        if (unlikely(op->func_dict == NULL))
            return NULL;
    }
    Py_INCREF(op->func_dict);
    return op->func_dict;
}
static int
__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
    if (unlikely(value == NULL)) {
        PyErr_SetString(PyExc_TypeError,
               "function's dictionary may not be deleted");
        return -1;
    }
    if (unlikely(!PyDict_Check(value))) {
        PyErr_SetString(PyExc_TypeError,
               "setting function's dictionary to a non-dict");
        return -1;
    }
    tmp = op->func_dict;
    Py_INCREF(value);
    op->func_dict = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op)
{
    Py_INCREF(op->func_globals);
    return op->func_globals;
}
static PyObject *
__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op)
{
    Py_INCREF(Py_None);
    return Py_None;
}
static PyObject *
__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op)
{
    PyObject* result = (op->func_code) ? op->func_code : Py_None;
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) {
    int result = 0;
    PyObject *res = op->defaults_getter((PyObject *) op);
    if (unlikely(!res))
        return -1;
    #if CYTHON_COMPILING_IN_CPYTHON
    op->defaults_tuple = PyTuple_GET_ITEM(res, 0);
    Py_INCREF(op->defaults_tuple);
    op->defaults_kwdict = PyTuple_GET_ITEM(res, 1);
    Py_INCREF(op->defaults_kwdict);
    #else
    op->defaults_tuple = PySequence_ITEM(res, 0);
    if (unlikely(!op->defaults_tuple)) result = -1;
    else {
        op->defaults_kwdict = PySequence_ITEM(res, 1);
        if (unlikely(!op->defaults_kwdict)) result = -1;
    }
    #endif
    Py_DECREF(res);
    return result;
}
static int
__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value) {
        value = Py_None;
    } else if (value != Py_None && !PyTuple_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__defaults__ must be set to a tuple object");
        return -1;
    }
    Py_INCREF(value);
    tmp = op->defaults_tuple;
    op->defaults_tuple = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op) {
    PyObject* result = op->defaults_tuple;
    if (unlikely(!result)) {
        if (op->defaults_getter) {
            if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL;
            result = op->defaults_tuple;
        } else {
            result = Py_None;
        }
    }
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value) {
        value = Py_None;
    } else if (value != Py_None && !PyDict_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__kwdefaults__ must be set to a dict object");
        return -1;
    }
    Py_INCREF(value);
    tmp = op->defaults_kwdict;
    op->defaults_kwdict = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op) {
    PyObject* result = op->defaults_kwdict;
    if (unlikely(!result)) {
        if (op->defaults_getter) {
            if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL;
            result = op->defaults_kwdict;
        } else {
            result = Py_None;
        }
    }
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value || value == Py_None) {
        value = NULL;
    } else if (!PyDict_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__annotations__ must be set to a dict object");
        return -1;
    }
    Py_XINCREF(value);
    tmp = op->func_annotations;
    op->func_annotations = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op) {
    PyObject* result = op->func_annotations;
    if (unlikely(!result)) {
        result = PyDict_New();
        if (unlikely(!result)) return NULL;
        op->func_annotations = result;
    }
    Py_INCREF(result);
    return result;
}
static PyGetSetDef __pyx_CyFunction_getsets[] = {
    {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
    {(char *) "__doc__",  (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
    {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
    {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
    {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0},
    {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0},
    {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
    {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
    {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
    {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
    {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
    {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
    {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
    {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
    {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0},
    {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0},
    {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0},
    {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0},
    {0, 0, 0, 0, 0}
};
static PyMemberDef __pyx_CyFunction_members[] = {
    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0},
    {0, 0, 0,  0, 0}
};
static PyObject *
__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args)
{
#if PY_MAJOR_VERSION >= 3
    return PyUnicode_FromString(m->func.m_ml->ml_name);
#else
    return PyString_FromString(m->func.m_ml->ml_name);
#endif
}
static PyMethodDef __pyx_CyFunction_methods[] = {
    {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0},
    {0, 0, 0, 0}
};
#if PY_VERSION_HEX < 0x030500A0
#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist)
#else
#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func.m_weakreflist)
#endif
static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags, PyObject* qualname,
                                      PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) {
    __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type);
    if (op == NULL)
        return NULL;
    op->flags = flags;
    __Pyx_CyFunction_weakreflist(op) = NULL;
    op->func.m_ml = ml;
    op->func.m_self = (PyObject *) op;
    Py_XINCREF(closure);
    op->func_closure = closure;
    Py_XINCREF(module);
    op->func.m_module = module;
    op->func_dict = NULL;
    op->func_name = NULL;
    Py_INCREF(qualname);
    op->func_qualname = qualname;
    op->func_doc = NULL;
    op->func_classobj = NULL;
    op->func_globals = globals;
    Py_INCREF(op->func_globals);
    Py_XINCREF(code);
    op->func_code = code;
    op->defaults_pyobjects = 0;
    op->defaults = NULL;
    op->defaults_tuple = NULL;
    op->defaults_kwdict = NULL;
    op->defaults_getter = NULL;
    op->func_annotations = NULL;
    PyObject_GC_Track(op);
    return (PyObject *) op;
}
static int
__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
{
    Py_CLEAR(m->func_closure);
    Py_CLEAR(m->func.m_module);
    Py_CLEAR(m->func_dict);
    Py_CLEAR(m->func_name);
    Py_CLEAR(m->func_qualname);
    Py_CLEAR(m->func_doc);
    Py_CLEAR(m->func_globals);
    Py_CLEAR(m->func_code);
    Py_CLEAR(m->func_classobj);
    Py_CLEAR(m->defaults_tuple);
    Py_CLEAR(m->defaults_kwdict);
    Py_CLEAR(m->func_annotations);
    if (m->defaults) {
        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
        int i;
        for (i = 0; i < m->defaults_pyobjects; i++)
            Py_XDECREF(pydefaults[i]);
        PyMem_Free(m->defaults);
        m->defaults = NULL;
    }
    return 0;
}
static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
{
    PyObject_GC_UnTrack(m);
    if (__Pyx_CyFunction_weakreflist(m) != NULL)
        PyObject_ClearWeakRefs((PyObject *) m);
    __Pyx_CyFunction_clear(m);
    PyObject_GC_Del(m);
}
static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
{
    Py_VISIT(m->func_closure);
    Py_VISIT(m->func.m_module);
    Py_VISIT(m->func_dict);
    Py_VISIT(m->func_name);
    Py_VISIT(m->func_qualname);
    Py_VISIT(m->func_doc);
    Py_VISIT(m->func_globals);
    Py_VISIT(m->func_code);
    Py_VISIT(m->func_classobj);
    Py_VISIT(m->defaults_tuple);
    Py_VISIT(m->defaults_kwdict);
    if (m->defaults) {
        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
        int i;
        for (i = 0; i < m->defaults_pyobjects; i++)
            Py_VISIT(pydefaults[i]);
    }
    return 0;
}
static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
{
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
        Py_INCREF(func);
        return func;
    }
    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
        if (type == NULL)
            type = (PyObject *)(Py_TYPE(obj));
        return __Pyx_PyMethod_New(func, type, (PyObject *)(Py_TYPE(type)));
    }
    if (obj == Py_None)
        obj = NULL;
    return __Pyx_PyMethod_New(func, obj, type);
}
static PyObject*
__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
{
#if PY_MAJOR_VERSION >= 3
    return PyUnicode_FromFormat("<cyfunction %U at %p>",
                                op->func_qualname, (void *)op);
#else
    return PyString_FromFormat("<cyfunction %s at %p>",
                               PyString_AsString(op->func_qualname), (void *)op);
#endif
}
#if CYTHON_COMPILING_IN_PYPY
static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
    PyCFunctionObject* f = (PyCFunctionObject*)func;
    PyCFunction meth = f->m_ml->ml_meth;
    PyObject *self = f->m_self;
    Py_ssize_t size;
    switch (f->m_ml->ml_flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) {
    case METH_VARARGS:
        if (likely(kw == NULL || PyDict_Size(kw) == 0))
            return (*meth)(self, arg);
        break;
    case METH_VARARGS | METH_KEYWORDS:
        return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
    case METH_NOARGS:
        if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
            size = PyTuple_GET_SIZE(arg);
            if (likely(size == 0))
                return (*meth)(self, NULL);
            PyErr_Format(PyExc_TypeError,
                "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)",
                f->m_ml->ml_name, size);
            return NULL;
        }
        break;
    case METH_O:
        if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
            size = PyTuple_GET_SIZE(arg);
            if (likely(size == 1)) {
                PyObject *result, *arg0 = PySequence_ITEM(arg, 0);
                if (unlikely(!arg0)) return NULL;
                result = (*meth)(self, arg0);
                Py_DECREF(arg0);
                return result;
            }
            PyErr_Format(PyExc_TypeError,
                "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)",
                f->m_ml->ml_name, size);
            return NULL;
        }
        break;
    default:
        PyErr_SetString(PyExc_SystemError, "Bad call flags in "
                        "__Pyx_CyFunction_Call. METH_OLDARGS is no "
                        "longer supported!");
        return NULL;
    }
    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
                 f->m_ml->ml_name);
    return NULL;
}
#else
static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
	return PyCFunction_Call(func, arg, kw);
}
#endif
static PyTypeObject __pyx_CyFunctionType_type = {
    PyVarObject_HEAD_INIT(0, 0)
    "cython_function_or_method",
    sizeof(__pyx_CyFunctionObject),
    0,
    (destructor) __Pyx_CyFunction_dealloc,
    0,
    0,
    0,
#if PY_MAJOR_VERSION < 3
    0,
#else
    0,
#endif
    (reprfunc) __Pyx_CyFunction_repr,
    0,
    0,
    0,
    0,
    __Pyx_CyFunction_Call,
    0,
    0,
    0,
    0,
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
    0,
    (traverseproc) __Pyx_CyFunction_traverse,
    (inquiry) __Pyx_CyFunction_clear,
    0,
#if PY_VERSION_HEX < 0x030500A0
    offsetof(__pyx_CyFunctionObject, func_weakreflist),
#else
    offsetof(PyCFunctionObject, m_weakreflist),
#endif
    0,
    0,
    __pyx_CyFunction_methods,
    __pyx_CyFunction_members,
    __pyx_CyFunction_getsets,
    0,
    0,
    __Pyx_CyFunction_descr_get,
    0,
    offsetof(__pyx_CyFunctionObject, func_dict),
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
#if PY_VERSION_HEX >= 0x030400a1
    0,
#endif
};
static int __pyx_CyFunction_init(void) {
#if !CYTHON_COMPILING_IN_PYPY
    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
#endif
    __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type);
    if (__pyx_CyFunctionType == NULL) {
        return -1;
    }
    return 0;
}
static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults = PyMem_Malloc(size);
    if (!m->defaults)
        return PyErr_NoMemory();
    memset(m->defaults, 0, size);
    m->defaults_pyobjects = pyobjects;
    return m->defaults;
}
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults_tuple = tuple;
    Py_INCREF(tuple);
}
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults_kwdict = dict;
    Py_INCREF(dict);
}
static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->func_annotations = dict;
    Py_INCREF(dict);
}

static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name,
                                           PyObject *qualname, PyObject *mkw, PyObject *modname, PyObject *doc) {
    PyObject *ns;
    if (metaclass) {
        PyObject *prep = __Pyx_PyObject_GetAttrStr(metaclass, __pyx_n_s_prepare);
        if (prep) {
            PyObject *pargs = PyTuple_Pack(2, name, bases);
            if (unlikely(!pargs)) {
                Py_DECREF(prep);
                return NULL;
            }
            ns = PyObject_Call(prep, pargs, mkw);
            Py_DECREF(prep);
            Py_DECREF(pargs);
        } else {
            if (unlikely(!PyErr_ExceptionMatches(PyExc_AttributeError)))
                return NULL;
            PyErr_Clear();
            ns = PyDict_New();
        }
    } else {
        ns = PyDict_New();
    }
    if (unlikely(!ns))
        return NULL;
    if (unlikely(PyObject_SetItem(ns, __pyx_n_s_module, modname) < 0)) goto bad;
    if (unlikely(PyObject_SetItem(ns, __pyx_n_s_qualname, qualname) < 0)) goto bad;
    if (unlikely(doc && PyObject_SetItem(ns, __pyx_n_s_doc, doc) < 0)) goto bad;
    return ns;
bad:
    Py_DECREF(ns);
    return NULL;
}
static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases,
                                      PyObject *dict, PyObject *mkw,
                                      int calculate_metaclass, int allow_py2_metaclass) {
    PyObject *result, *margs;
    PyObject *owned_metaclass = NULL;
    if (allow_py2_metaclass) {
        owned_metaclass = PyObject_GetItem(dict, __pyx_n_s_metaclass);
        if (owned_metaclass) {
            metaclass = owned_metaclass;
        } else if (likely(PyErr_ExceptionMatches(PyExc_KeyError))) {
            PyErr_Clear();
        } else {
            return NULL;
        }
    }
    if (calculate_metaclass && (!metaclass || PyType_Check(metaclass))) {
        metaclass = __Pyx_CalculateMetaclass((PyTypeObject*) metaclass, bases);
        Py_XDECREF(owned_metaclass);
        if (unlikely(!metaclass))
            return NULL;
        owned_metaclass = metaclass;
    }
    margs = PyTuple_Pack(3, name, bases, dict);
    if (unlikely(!margs)) {
        result = NULL;
    } else {
        result = PyObject_Call(metaclass, margs, mkw);
        Py_DECREF(margs);
    }
    Py_XDECREF(owned_metaclass);
    return result;
}

static PyObject *__Pyx_GetNameInClass(PyObject *nmspace, PyObject *name) {
    PyObject *result;
    result = __Pyx_PyObject_GetAttrStr(nmspace, name);
    if (!result)
        result = __Pyx_GetModuleGlobalName(name);
    return result;
}

static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
    int start = 0, mid = 0, end = count - 1;
    if (end >= 0 && code_line > entries[end].code_line) {
        return count;
    }
    while (start < end) {
        mid = start + (end - start) / 2;
        if (code_line < entries[mid].code_line) {
            end = mid;
        } else if (code_line > entries[mid].code_line) {
             start = mid + 1;
        } else {
            return mid;
        }
    }
    if (code_line <= entries[mid].code_line) {
        return mid;
    } else {
        return mid + 1;
    }
}
static PyCodeObject *__pyx_find_code_object(int code_line) {
    PyCodeObject* code_object;
    int pos;
    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
        return NULL;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
        return NULL;
    }
    code_object = __pyx_code_cache.entries[pos].code_object;
    Py_INCREF(code_object);
    return code_object;
}
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
    int pos, i;
    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
    if (unlikely(!code_line)) {
        return;
    }
    if (unlikely(!entries)) {
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
        if (likely(entries)) {
            __pyx_code_cache.entries = entries;
            __pyx_code_cache.max_count = 64;
            __pyx_code_cache.count = 1;
            entries[0].code_line = code_line;
            entries[0].code_object = code_object;
            Py_INCREF(code_object);
        }
        return;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
        PyCodeObject* tmp = entries[pos].code_object;
        entries[pos].code_object = code_object;
        Py_DECREF(tmp);
        return;
    }
    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
        int new_max = __pyx_code_cache.max_count + 64;
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
            __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry));
        if (unlikely(!entries)) {
            return;
        }
        __pyx_code_cache.entries = entries;
        __pyx_code_cache.max_count = new_max;
    }
    for (i=__pyx_code_cache.count; i>pos; i--) {
        entries[i] = entries[i-1];
    }
    entries[pos].code_line = code_line;
    entries[pos].code_object = code_object;
    __pyx_code_cache.count++;
    Py_INCREF(code_object);
}

#include "compile.h"
#include "frameobject.h"
#include "traceback.h"
static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
            const char *funcname, int c_line,
            int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyObject *py_srcfile = 0;
    PyObject *py_funcname = 0;
    #if PY_MAJOR_VERSION < 3
    py_srcfile = PyString_FromString(filename);
    #else
    py_srcfile = PyUnicode_FromString(filename);
    #endif
    if (!py_srcfile) goto bad;
    if (c_line) {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #else
        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #endif
    }
    else {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromString(funcname);
        #else
        py_funcname = PyUnicode_FromString(funcname);
        #endif
    }
    if (!py_funcname) goto bad;
    py_code = __Pyx_PyCode_New(
        0,
        0,
        0,
        0,
        0,
        __pyx_empty_bytes, /*PyObject *code,*/
        __pyx_empty_tuple, /*PyObject *consts,*/
        __pyx_empty_tuple, /*PyObject *names,*/
        __pyx_empty_tuple, /*PyObject *varnames,*/
        __pyx_empty_tuple, /*PyObject *freevars,*/
        __pyx_empty_tuple, /*PyObject *cellvars,*/
        py_srcfile,   /*PyObject *filename,*/
        py_funcname,  /*PyObject *name,*/
        py_line,
        __pyx_empty_bytes  /*PyObject *lnotab*/
    );
    Py_DECREF(py_srcfile);
    Py_DECREF(py_funcname);
    return py_code;
bad:
    Py_XDECREF(py_srcfile);
    Py_XDECREF(py_funcname);
    return NULL;
}
static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyFrameObject *py_frame = 0;
    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
    if (!py_code) {
        py_code = __Pyx_CreateCodeObjectForTraceback(
            funcname, c_line, py_line, filename);
        if (!py_code) goto bad;
        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
    }
    py_frame = PyFrame_New(
        PyThreadState_GET(), /*PyThreadState *tstate,*/
        py_code,             /*PyCodeObject *code,*/
        __pyx_d,      /*PyObject *globals,*/
        0                    /*PyObject *locals*/
    );
    if (!py_frame) goto bad;
    py_frame->f_lineno = py_line;
    PyTraceBack_Here(py_frame);
bad:
    Py_XDECREF(py_code);
    Py_XDECREF(py_frame);
}

#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\
    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\
    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\
    {\
        func_type value = func_value;\
        if (sizeof(target_type) < sizeof(func_type)) {\
            if (unlikely(value != (func_type) (target_type) value)) {\
                func_type zero = 0;\
                if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\
                    return (target_type) -1;\
                if (is_unsigned && unlikely(value < zero))\
                    goto raise_neg_overflow;\
                else\
                    goto raise_overflow;\
            }\
        }\
        return (target_type) value;\
    }

static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
    const int neg_one = (int) -1, const_zero = (int) 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(int) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (int) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (int) 0;
                case  1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0])
                case 2:
                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) {
                            return (int) (((((int)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) {
                            return (int) (((((((int)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) {
                            return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
            }
#endif
#if CYTHON_COMPILING_IN_CPYTHON
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
#else
            {
                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
                if (unlikely(result < 0))
                    return (int) -1;
                if (unlikely(result == 1))
                    goto raise_neg_overflow;
            }
#endif
            if (sizeof(int) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (int) 0;
                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) digits[0])
                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +digits[0])
                case -2:
                    if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                            return (int) -(((((int)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 2:
                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                            return (int) (((((int)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case -3:
                    if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                            return (int) -(((((((int)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                            return (int) (((((((int)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case -4:
                    if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
                            return (int) -(((((((((int)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
                            return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
            }
#endif
            if (sizeof(int) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x))
            } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            int val;
            PyObject *v = __Pyx_PyNumber_Int(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (int) -1;
        }
    } else {
        int val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (int) -1;
        val = __Pyx_PyInt_As_int(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to int");
    return (int) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to int");
    return (int) -1;
}

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
    const int neg_one = (int) -1, const_zero = (int) 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(int) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(int) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
        }
    } else {
        if (sizeof(int) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
            return PyLong_FromLongLong((PY_LONG_LONG) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(int),
                                     little, !is_unsigned);
    }
}

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
    const long neg_one = (long) -1, const_zero = (long) 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(long) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
        }
    } else {
        if (sizeof(long) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
            return PyLong_FromLongLong((PY_LONG_LONG) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(long),
                                     little, !is_unsigned);
    }
}

static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
    const long neg_one = (long) -1, const_zero = (long) 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(long) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (long) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (long) 0;
                case  1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0])
                case 2:
                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) {
                            return (long) (((((long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) {
                            return (long) (((((((long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) {
                            return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
            }
#endif
#if CYTHON_COMPILING_IN_CPYTHON
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
#else
            {
                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
                if (unlikely(result < 0))
                    return (long) -1;
                if (unlikely(result == 1))
                    goto raise_neg_overflow;
            }
#endif
            if (sizeof(long) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (long) 0;
                case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) digits[0])
                case  1: __PYX_VERIFY_RETURN_INT(long,  digit, +digits[0])
                case -2:
                    if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                            return (long) -(((((long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 2:
                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                            return (long) (((((long)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case -3:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                            return (long) -(((((((long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                            return (long) (((((((long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case -4:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                            return (long) -(((((((((long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                            return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
            }
#endif
            if (sizeof(long) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x))
            } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            long val;
            PyObject *v = __Pyx_PyNumber_Int(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (long) -1;
        }
    } else {
        long val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (long) -1;
        val = __Pyx_PyInt_As_long(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to long");
    return (long) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to long");
    return (long) -1;
}

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_short(short value) {
    const short neg_one = (short) -1, const_zero = (short) 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(short) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(short) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(short) <= sizeof(unsigned PY_LONG_LONG)) {
            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
        }
    } else {
        if (sizeof(short) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(short) <= sizeof(PY_LONG_LONG)) {
            return PyLong_FromLongLong((PY_LONG_LONG) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(short),
                                     little, !is_unsigned);
    }
}

static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) {
    const size_t neg_one = (size_t) -1, const_zero = (size_t) 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(size_t) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (size_t) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (size_t) 0;
                case  1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0])
                case 2:
                    if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) {
                            return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) {
                            return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) {
                            return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
            }
#endif
#if CYTHON_COMPILING_IN_CPYTHON
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
#else
            {
                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
                if (unlikely(result < 0))
                    return (size_t) -1;
                if (unlikely(result == 1))
                    goto raise_neg_overflow;
            }
#endif
            if (sizeof(size_t) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (size_t) 0;
                case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, -(sdigit) digits[0])
                case  1: __PYX_VERIFY_RETURN_INT(size_t,  digit, +digits[0])
                case -2:
                    if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) {
                            return (size_t) -(((((size_t)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 2:
                    if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) {
                            return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case -3:
                    if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) {
                            return (size_t) -(((((((size_t)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) {
                            return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case -4:
                    if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) {
                            return (size_t) -(((((((((size_t)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) {
                            return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
                        }
                    }
                    break;
            }
#endif
            if (sizeof(size_t) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x))
            } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            size_t val;
            PyObject *v = __Pyx_PyNumber_Int(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (size_t) -1;
        }
    } else {
        size_t val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (size_t) -1;
        val = __Pyx_PyInt_As_size_t(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to size_t");
    return (size_t) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to size_t");
    return (size_t) -1;
}

static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = *type;
    tstate->exc_value = *value;
    tstate->exc_traceback = *tb;
#else
    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
    PyErr_SetExcInfo(*type, *value, *tb);
#endif
    *type = tmp_type;
    *value = tmp_value;
    *tb = tmp_tb;
}

#include <structmember.h>
#include <frameobject.h>
static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value);
static PyObject *__Pyx_Coroutine_Close(PyObject *self);
static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args);
#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
#if 1 || PY_VERSION_HEX < 0x030300B0
static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
    PyObject *et, *ev, *tb;
    PyObject *value = NULL;
    __Pyx_ErrFetch(&et, &ev, &tb);
    if (!et) {
        Py_XDECREF(tb);
        Py_XDECREF(ev);
        Py_INCREF(Py_None);
        *pvalue = Py_None;
        return 0;
    }
    if (likely(et == PyExc_StopIteration)) {
#if PY_VERSION_HEX >= 0x030300A0
        if (ev && Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) {
            value = ((PyStopIterationObject *)ev)->value;
            Py_INCREF(value);
            Py_DECREF(ev);
            Py_XDECREF(tb);
            Py_DECREF(et);
            *pvalue = value;
            return 0;
        }
#endif
        if (!ev || !PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) {
            if (!ev) {
                Py_INCREF(Py_None);
                ev = Py_None;
            } else if (PyTuple_Check(ev)) {
                if (PyTuple_GET_SIZE(ev) >= 1) {
                    PyObject *value;
#if CYTHON_COMPILING_IN_CPYTHON
                    value = PySequence_ITEM(ev, 0);
#else
                    value = PyTuple_GET_ITEM(ev, 0);
                    Py_INCREF(value);
#endif
                    Py_DECREF(ev);
                    ev = value;
                } else {
                    Py_INCREF(Py_None);
                    Py_DECREF(ev);
                    ev = Py_None;
                }
            }
            Py_XDECREF(tb);
            Py_DECREF(et);
            *pvalue = ev;
            return 0;
        }
    } else if (!PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) {
        __Pyx_ErrRestore(et, ev, tb);
        return -1;
    }
    PyErr_NormalizeException(&et, &ev, &tb);
    if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) {
        __Pyx_ErrRestore(et, ev, tb);
        return -1;
    }
    Py_XDECREF(tb);
    Py_DECREF(et);
#if PY_VERSION_HEX >= 0x030300A0
    value = ((PyStopIterationObject *)ev)->value;
    Py_INCREF(value);
    Py_DECREF(ev);
#else
    {
        PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args);
        Py_DECREF(ev);
        if (likely(args)) {
            value = PySequence_GetItem(args, 0);
            Py_DECREF(args);
        }
        if (unlikely(!value)) {
            __Pyx_ErrRestore(NULL, NULL, NULL);
            Py_INCREF(Py_None);
            value = Py_None;
        }
    }
#endif
    *pvalue = value;
    return 0;
}
#endif
static CYTHON_INLINE
void __Pyx_Coroutine_ExceptionClear(__pyx_CoroutineObject *self) {
    PyObject *exc_type = self->exc_type;
    PyObject *exc_value = self->exc_value;
    PyObject *exc_traceback = self->exc_traceback;
    self->exc_type = NULL;
    self->exc_value = NULL;
    self->exc_traceback = NULL;
    Py_XDECREF(exc_type);
    Py_XDECREF(exc_value);
    Py_XDECREF(exc_traceback);
}
static CYTHON_INLINE
int __Pyx_Coroutine_CheckRunning(__pyx_CoroutineObject *gen) {
    if (unlikely(gen->is_running)) {
        PyErr_SetString(PyExc_ValueError,
                        "generator already executing");
        return 1;
    }
    return 0;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value) {
    PyObject *retval;
    assert(!self->is_running);
    if (unlikely(self->resume_label == 0)) {
        if (unlikely(value && value != Py_None)) {
            PyErr_SetString(PyExc_TypeError,
                            "can't send non-None value to a "
                            "just-started generator");
            return NULL;
        }
    }
    if (unlikely(self->resume_label == -1)) {
        PyErr_SetNone(PyExc_StopIteration);
        return NULL;
    }
    if (value) {
#if CYTHON_COMPILING_IN_PYPY
#else
        if (self->exc_traceback) {
            PyThreadState *tstate = PyThreadState_GET();
            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
            PyFrameObject *f = tb->tb_frame;
            Py_XINCREF(tstate->frame);
            assert(f->f_back == NULL);
            f->f_back = tstate->frame;
        }
#endif
        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
                            &self->exc_traceback);
    } else {
        __Pyx_Coroutine_ExceptionClear(self);
    }
    self->is_running = 1;
    retval = self->body((PyObject *) self, value);
    self->is_running = 0;
    if (retval) {
        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
                            &self->exc_traceback);
#if CYTHON_COMPILING_IN_PYPY
#else
        if (self->exc_traceback) {
            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
            PyFrameObject *f = tb->tb_frame;
            Py_CLEAR(f->f_back);
        }
#endif
    } else {
        __Pyx_Coroutine_ExceptionClear(self);
    }
    return retval;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_MethodReturn(PyObject *retval) {
    if (unlikely(!retval && !PyErr_Occurred())) {
        PyErr_SetNone(PyExc_StopIteration);
    }
    return retval;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) {
    PyObject *ret;
    PyObject *val = NULL;
    __Pyx_Coroutine_Undelegate(gen);
    __Pyx_PyGen_FetchStopIterationValue(&val);
    ret = __Pyx_Coroutine_SendEx(gen, val);
    Py_XDECREF(val);
    return ret;
}
static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) {
    PyObject *retval;
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
    PyObject *yf = gen->yieldfrom;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        gen->is_running = 1;
        #ifdef __Pyx_Generator_USED
        if (__Pyx_Generator_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Send(yf, value);
        } else
        #endif
        #ifdef __Pyx_Coroutine_USED
        if (__Pyx_Coroutine_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Send(yf, value);
        } else
        #endif
        {
            if (value == Py_None)
                ret = PyIter_Next(yf);
            else
                ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value);
        }
        gen->is_running = 0;
        if (likely(ret)) {
            return ret;
        }
        retval = __Pyx_Coroutine_FinishDelegation(gen);
    } else {
        retval = __Pyx_Coroutine_SendEx(gen, value);
    }
    return __Pyx_Coroutine_MethodReturn(retval);
}
static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) {
    PyObject *retval = NULL;
    int err = 0;
    #ifdef __Pyx_Generator_USED
    if (__Pyx_Generator_CheckExact(yf)) {
        retval = __Pyx_Coroutine_Close(yf);
        if (!retval)
            return -1;
    } else
    #endif
    #ifdef __Pyx_Coroutine_USED
    if (__Pyx_Coroutine_CheckExact(yf)) {
        retval = __Pyx_Coroutine_Close(yf);
        if (!retval)
            return -1;
    } else
    #endif
    {
        PyObject *meth;
        gen->is_running = 1;
        meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_close);
        if (unlikely(!meth)) {
            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
                PyErr_WriteUnraisable(yf);
            }
            PyErr_Clear();
        } else {
            retval = PyObject_CallFunction(meth, NULL);
            Py_DECREF(meth);
            if (!retval)
                err = -1;
        }
        gen->is_running = 0;
    }
    Py_XDECREF(retval);
    return err;
}
static PyObject *__Pyx_Generator_Next(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
    PyObject *yf = gen->yieldfrom;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        gen->is_running = 1;
        ret = Py_TYPE(yf)->tp_iternext(yf);
        gen->is_running = 0;
        if (likely(ret)) {
            return ret;
        }
        return __Pyx_Coroutine_FinishDelegation(gen);
    }
    return __Pyx_Coroutine_SendEx(gen, Py_None);
}
static PyObject *__Pyx_Coroutine_Close(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject *retval, *raised_exception;
    PyObject *yf = gen->yieldfrom;
    int err = 0;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        Py_INCREF(yf);
        err = __Pyx_Coroutine_CloseIter(gen, yf);
        __Pyx_Coroutine_Undelegate(gen);
        Py_DECREF(yf);
    }
    if (err == 0)
        PyErr_SetNone(PyExc_GeneratorExit);
    retval = __Pyx_Coroutine_SendEx(gen, NULL);
    if (retval) {
        Py_DECREF(retval);
        PyErr_SetString(PyExc_RuntimeError,
                        "generator ignored GeneratorExit");
        return NULL;
    }
    raised_exception = PyErr_Occurred();
    if (!raised_exception
        || raised_exception == PyExc_StopIteration
        || raised_exception == PyExc_GeneratorExit
        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
    {
        if (raised_exception) PyErr_Clear();
        Py_INCREF(Py_None);
        return Py_None;
    }
    return NULL;
}
static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject *typ;
    PyObject *tb = NULL;
    PyObject *val = NULL;
    PyObject *yf = gen->yieldfrom;
    if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
        return NULL;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        Py_INCREF(yf);
        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
            int err = __Pyx_Coroutine_CloseIter(gen, yf);
            Py_DECREF(yf);
            __Pyx_Coroutine_Undelegate(gen);
            if (err < 0)
                return __Pyx_Coroutine_MethodReturn(__Pyx_Coroutine_SendEx(gen, NULL));
            goto throw_here;
        }
        gen->is_running = 1;
        #ifdef __Pyx_Generator_USED
        if (__Pyx_Generator_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Throw(yf, args);
        } else
        #endif
        #ifdef __Pyx_Coroutine_USED
        if (__Pyx_Coroutine_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Throw(yf, args);
        } else
        #endif
        {
            PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_throw);
            if (unlikely(!meth)) {
                Py_DECREF(yf);
                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
                    gen->is_running = 0;
                    return NULL;
                }
                PyErr_Clear();
                __Pyx_Coroutine_Undelegate(gen);
                gen->is_running = 0;
                goto throw_here;
            }
            ret = PyObject_CallObject(meth, args);
            Py_DECREF(meth);
        }
        gen->is_running = 0;
        Py_DECREF(yf);
        if (!ret) {
            ret = __Pyx_Coroutine_FinishDelegation(gen);
        }
        return __Pyx_Coroutine_MethodReturn(ret);
    }
throw_here:
    __Pyx_Raise(typ, val, tb, NULL);
    return __Pyx_Coroutine_MethodReturn(__Pyx_Coroutine_SendEx(gen, NULL));
}
static int __Pyx_Coroutine_traverse(PyObject *self, visitproc visit, void *arg) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    Py_VISIT(gen->closure);
    Py_VISIT(gen->classobj);
    Py_VISIT(gen->yieldfrom);
    Py_VISIT(gen->exc_type);
    Py_VISIT(gen->exc_value);
    Py_VISIT(gen->exc_traceback);
    return 0;
}
static int __Pyx_Coroutine_clear(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    Py_CLEAR(gen->closure);
    Py_CLEAR(gen->classobj);
    Py_CLEAR(gen->yieldfrom);
    Py_CLEAR(gen->exc_type);
    Py_CLEAR(gen->exc_value);
    Py_CLEAR(gen->exc_traceback);
    Py_CLEAR(gen->gi_name);
    Py_CLEAR(gen->gi_qualname);
    return 0;
}
static void __Pyx_Coroutine_dealloc(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject_GC_UnTrack(gen);
    if (gen->gi_weakreflist != NULL)
        PyObject_ClearWeakRefs(self);
    if (gen->resume_label > 0) {
        PyObject_GC_Track(self);
#if PY_VERSION_HEX >= 0x030400a1
        if (PyObject_CallFinalizerFromDealloc(self))
#else
        Py_TYPE(gen)->tp_del(self);
        if (self->ob_refcnt > 0)
#endif
        {
            return;
        }
        PyObject_GC_UnTrack(self);
    }
    __Pyx_Coroutine_clear(self);
    PyObject_GC_Del(gen);
}
static void __Pyx_Coroutine_del(PyObject *self) {
    PyObject *res;
    PyObject *error_type, *error_value, *error_traceback;
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    if (gen->resume_label <= 0)
        return ;
#if PY_VERSION_HEX < 0x030400a1
    assert(self->ob_refcnt == 0);
    self->ob_refcnt = 1;
#endif
    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
    res = __Pyx_Coroutine_Close(self);
    if (res == NULL)
        PyErr_WriteUnraisable(self);
    else
        Py_DECREF(res);
    __Pyx_ErrRestore(error_type, error_value, error_traceback);
#if PY_VERSION_HEX < 0x030400a1
    assert(self->ob_refcnt > 0);
    if (--self->ob_refcnt == 0) {
        return;
    }
    {
        Py_ssize_t refcnt = self->ob_refcnt;
        _Py_NewReference(self);
        self->ob_refcnt = refcnt;
    }
#if CYTHON_COMPILING_IN_CPYTHON
    assert(PyType_IS_GC(self->ob_type) &&
           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
    _Py_DEC_REFTOTAL;
#endif
#ifdef COUNT_ALLOCS
    --Py_TYPE(self)->tp_frees;
    --Py_TYPE(self)->tp_allocs;
#endif
#endif
}
static PyObject *
__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self)
{
    Py_INCREF(self->gi_name);
    return self->gi_name;
}
static int
__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__name__ must be set to a string object");
        return -1;
    }
    tmp = self->gi_name;
    Py_INCREF(value);
    self->gi_name = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self)
{
    Py_INCREF(self->gi_qualname);
    return self->gi_qualname;
}
static int
__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__qualname__ must be set to a string object");
        return -1;
    }
    tmp = self->gi_qualname;
    Py_INCREF(value);
    self->gi_qualname = value;
    Py_XDECREF(tmp);
    return 0;
}
static __pyx_CoroutineObject *__Pyx__Coroutine_New(PyTypeObject* type, __pyx_coroutine_body_t body,
                                                   PyObject *closure, PyObject *name, PyObject *qualname) {
    __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type);
    if (gen == NULL)
        return NULL;
    gen->body = body;
    gen->closure = closure;
    Py_XINCREF(closure);
    gen->is_running = 0;
    gen->resume_label = 0;
    gen->classobj = NULL;
    gen->yieldfrom = NULL;
    gen->exc_type = NULL;
    gen->exc_value = NULL;
    gen->exc_traceback = NULL;
    gen->gi_weakreflist = NULL;
    Py_XINCREF(qualname);
    gen->gi_qualname = qualname;
    Py_XINCREF(name);
    gen->gi_name = name;
    PyObject_GC_Track(gen);
    return gen;
}

static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) {
#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
    int result;
    PyObject *globals, *result_obj;
    globals = PyDict_New();  if (unlikely(!globals)) goto ignore;
    result = PyDict_SetItemString(globals, "_cython_coroutine_type",
    #ifdef __Pyx_Coroutine_USED
        (PyObject*)__pyx_CoroutineType);
    #else
        Py_None);
    #endif
    if (unlikely(result < 0)) goto ignore;
    result = PyDict_SetItemString(globals, "_cython_generator_type",
    #ifdef __Pyx_Generator_USED
        (PyObject*)__pyx_GeneratorType);
    #else
        Py_None);
    #endif
    if (unlikely(result < 0)) goto ignore;
    if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore;
    if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore;
    result_obj = PyRun_String(py_code, Py_file_input, globals, globals);
    if (unlikely(!result_obj)) goto ignore;
    Py_DECREF(result_obj);
    Py_DECREF(globals);
    return module;
ignore:
    Py_XDECREF(globals);
    PyErr_WriteUnraisable(module);
    if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) {
        Py_DECREF(module);
        module = NULL;
    }
#else
    py_code++;
#endif
    return module;
}

static int __Pyx_patch_abc(void) {
#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
    static int abc_patched = 0;
    if (!abc_patched) {
        PyObject *module;
        module = PyImport_ImportModule((PY_VERSION_HEX >= 0x03030000) ? "collections.abc" : "collections");
        if (!module) {
            PyErr_WriteUnraisable(NULL);
            if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning,
                    ((PY_VERSION_HEX >= 0x03030000) ?
                        "Cython module failed to register with collections.abc module" :
                        "Cython module failed to register with collections module"), 1) < 0)) {
                return -1;
            }
        } else {
            module = __Pyx_Coroutine_patch_module(
                module, ""
"if _cython_generator_type is not None:\n"
"    try: Generator = _module.Generator\n"
"    except AttributeError: pass\n"
"    else: Generator.register(_cython_generator_type)\n"
"if _cython_coroutine_type is not None:\n"
"    try: Coroutine = _module.Coroutine\n"
"    except AttributeError: pass\n"
"    else: Coroutine.register(_cython_coroutine_type)\n"
            );
            abc_patched = 1;
            if (unlikely(!module))
                return -1;
            Py_DECREF(module);
        }
    }
#else
    if (0) __Pyx_Coroutine_patch_module(NULL, NULL);
#endif
    return 0;
}

static PyMethodDef __pyx_Generator_methods[] = {
    {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
     (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")},
    {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
     (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")},
    {"close", (PyCFunction) __Pyx_Coroutine_Close, METH_NOARGS,
     (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")},
    {0, 0, 0, 0}
};
static PyMemberDef __pyx_Generator_memberlist[] = {
    {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
    {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
     (char*) PyDoc_STR("object being iterated by 'yield from', or None")},
    {0, 0, 0, 0, 0}
};
static PyGetSetDef __pyx_Generator_getsets[] = {
    {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
     (char*) PyDoc_STR("name of the generator"), 0},
    {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
     (char*) PyDoc_STR("qualified name of the generator"), 0},
    {0, 0, 0, 0, 0}
};
static PyTypeObject __pyx_GeneratorType_type = {
    PyVarObject_HEAD_INIT(0, 0)
    "generator",
    sizeof(__pyx_CoroutineObject),
    0,
    (destructor) __Pyx_Coroutine_dealloc,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
    0,
    (traverseproc) __Pyx_Coroutine_traverse,
    0,
    0,
    offsetof(__pyx_CoroutineObject, gi_weakreflist),
    0,
    (iternextfunc) __Pyx_Generator_Next,
    __pyx_Generator_methods,
    __pyx_Generator_memberlist,
    __pyx_Generator_getsets,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
#if PY_VERSION_HEX >= 0x030400a1
    0,
#else
    __Pyx_Coroutine_del,
#endif
    0,
#if PY_VERSION_HEX >= 0x030400a1
    __Pyx_Coroutine_del,
#endif
};
static int __pyx_Generator_init(void) {
    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
    __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
    if (unlikely(!__pyx_GeneratorType)) {
        return -1;
    }
    return 0;
}

static int __Pyx_check_binary_version(void) {
    char ctversion[4], rtversion[4];
    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
        char message[200];
        PyOS_snprintf(message, sizeof(message),
                      "compiletime version %s of module '%.100s' "
                      "does not match runtime version %s",
                      ctversion, __Pyx_MODULE_NAME, rtversion);
        return PyErr_WarnEx(NULL, message, 1);
    }
    return 0;
}

static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) {
    PyObject *d = 0;
    PyObject *cobj = 0;
    union {
        void (*fp)(void);
        void *p;
    } tmp;
    d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
    if (!d) {
        PyErr_Clear();
        d = PyDict_New();
        if (!d)
            goto bad;
        Py_INCREF(d);
        if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0)
            goto bad;
    }
    tmp.fp = f;
#if PY_VERSION_HEX >= 0x02070000
    cobj = PyCapsule_New(tmp.p, sig, 0);
#else
    cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0);
#endif
    if (!cobj)
        goto bad;
    if (PyDict_SetItemString(d, name, cobj) < 0)
        goto bad;
    Py_DECREF(cobj);
    Py_DECREF(d);
    return 0;
bad:
    Py_XDECREF(cobj);
    Py_XDECREF(d);
    return -1;
}

static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
    while (t->p) {
        #if PY_MAJOR_VERSION < 3
        if (t->is_unicode) {
            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
        } else if (t->intern) {
            *t->p = PyString_InternFromString(t->s);
        } else {
            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
        }
        #else
        if (t->is_unicode | t->is_str) {
            if (t->intern) {
                *t->p = PyUnicode_InternFromString(t->s);
            } else if (t->encoding) {
                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
            } else {
                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
            }
        } else {
            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
        }
        #endif
        if (!*t->p)
            return -1;
        ++t;
    }
    return 0;
}

static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
    return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
}
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) {
    Py_ssize_t ignore;
    return __Pyx_PyObject_AsStringAndSize(o, &ignore);
}
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
    if (
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
            __Pyx_sys_getdefaultencoding_not_ascii &&
#endif
            PyUnicode_Check(o)) {
#if PY_VERSION_HEX < 0x03030000
        char* defenc_c;
        PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL);
        if (!defenc) return NULL;
        defenc_c = PyBytes_AS_STRING(defenc);
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        {
            char* end = defenc_c + PyBytes_GET_SIZE(defenc);
            char* c;
            for (c = defenc_c; c < end; c++) {
                if ((unsigned char) (*c) >= 128) {
                    PyUnicode_AsASCIIString(o);
                    return NULL;
                }
            }
        }
#endif
        *length = PyBytes_GET_SIZE(defenc);
        return defenc_c;
#else
        if (__Pyx_PyUnicode_READY(o) == -1) return NULL;
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        if (PyUnicode_IS_ASCII(o)) {
            *length = PyUnicode_GET_LENGTH(o);
            return PyUnicode_AsUTF8(o);
        } else {
            PyUnicode_AsASCIIString(o);
            return NULL;
        }
#else
        return PyUnicode_AsUTF8AndSize(o, length);
#endif
#endif
    } else
#endif
#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
    if (PyByteArray_Check(o)) {
        *length = PyByteArray_GET_SIZE(o);
        return PyByteArray_AS_STRING(o);
    } else
#endif
    {
        char* result;
        int r = PyBytes_AsStringAndSize(o, &result, length);
        if (unlikely(r < 0)) {
            return NULL;
        } else {
            return result;
        }
    }
}
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
   int is_true = x == Py_True;
   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
   else return PyObject_IsTrue(x);
}
static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
  PyNumberMethods *m;
  const char *name = NULL;
  PyObject *res = NULL;
#if PY_MAJOR_VERSION < 3
  if (PyInt_Check(x) || PyLong_Check(x))
#else
  if (PyLong_Check(x))
#endif
    return __Pyx_NewRef(x);
  m = Py_TYPE(x)->tp_as_number;
#if PY_MAJOR_VERSION < 3
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Int(x);
  }
  else if (m && m->nb_long) {
    name = "long";
    res = PyNumber_Long(x);
  }
#else
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Long(x);
  }
#endif
  if (res) {
#if PY_MAJOR_VERSION < 3
    if (!PyInt_Check(res) && !PyLong_Check(res)) {
#else
    if (!PyLong_Check(res)) {
#endif
      PyErr_Format(PyExc_TypeError,
                   "__%.4s__ returned non-%.4s (type %.200s)",
                   name, name, Py_TYPE(res)->tp_name);
      Py_DECREF(res);
      return NULL;
    }
  }
  else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_TypeError,
                    "an integer is required");
  }
  return res;
}
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
  Py_ssize_t ival;
  PyObject *x;
#if PY_MAJOR_VERSION < 3
  if (likely(PyInt_CheckExact(b))) {
    if (sizeof(Py_ssize_t) >= sizeof(long))
        return PyInt_AS_LONG(b);
    else
        return PyInt_AsSsize_t(x);
  }
#endif
  if (likely(PyLong_CheckExact(b))) {
    #if CYTHON_USE_PYLONG_INTERNALS
    const digit* digits = ((PyLongObject*)b)->ob_digit;
    const Py_ssize_t size = Py_SIZE(b);
    if (likely(__Pyx_sst_abs(size) <= 1)) {
        ival = likely(size) ? digits[0] : 0;
        if (size == -1) ival = -ival;
        return ival;
    } else {
      switch (size) {
         case 2:
           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | digits[0]));
           }
           break;
         case -2:
           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | digits[0]));
           }
           break;
         case 3:
           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
           }
           break;
         case -3:
           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
           }
           break;
         case 4:
           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
           }
           break;
         case -4:
           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
           }
           break;
      }
    }
    #endif
    return PyLong_AsSsize_t(b);
  }
  x = PyNumber_Index(b);
  if (!x) return -1;
  ival = PyInt_AsSsize_t(x);
  Py_DECREF(x);
  return ival;
}
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
    return PyInt_FromSize_t(ival);
}


#endif /* Py_PYTHON_H */
