

def default(obj):
    if isinstance(obj, ObjectId):
        return {
            '$oid': str(obj),
        }
    if isinstance(obj, DBRef):
        return _json_convert(obj.as_doc())
    if isinstance(obj, datetime.datetime):
        if (obj.utcoffset() is not None):
            obj = (obj - obj.utcoffset())
        millis = int(((calendar.timegm(obj.timetuple()) * 1000) + (obj.microsecond / 1000)))
        return {
            '$date': millis,
        }
    if isinstance(obj, (RE_TYPE, Regex)):
        flags = ''
        if (obj.flags & re.IGNORECASE):
            flags += 'i'
        if (obj.flags & re.LOCALE):
            flags += 'l'
        if (obj.flags & re.MULTILINE):
            flags += 'm'
        if (obj.flags & re.DOTALL):
            flags += 's'
        if (obj.flags & re.UNICODE):
            flags += 'u'
        if (obj.flags & re.VERBOSE):
            flags += 'x'
        if isinstance(obj.pattern, text_type):
            pattern = obj.pattern
        else:
            pattern = obj.pattern.decode('utf-8')
        return SON([('$regex', pattern), ('$options', flags)])
    if isinstance(obj, MinKey):
        return {
            '$minKey': 1,
        }
    if isinstance(obj, MaxKey):
        return {
            '$maxKey': 1,
        }
    if isinstance(obj, Timestamp):
        return {
            '$timestamp': SON([('t', obj.time), ('i', obj.inc)]),
        }
    if isinstance(obj, Code):
        return SON([('$code', str(obj)), ('$scope', obj.scope)])
    if isinstance(obj, Binary):
        return SON([('$binary', base64.b64encode(obj).decode()), ('$type', ('%02x' % obj.subtype))])
    if (PY3 and isinstance(obj, bytes)):
        return SON([('$binary', base64.b64encode(obj).decode()), ('$type', '00')])
    if isinstance(obj, uuid.UUID):
        return {
            '$uuid': obj.hex,
        }
    raise TypeError(('%r is not JSON serializable' % obj))

dataset/ETHPy150Open mongodb/mongo-python-driver/bson/json_util.py default/original