// Path: src/main/java/de/undercouch/bson4jackson/io/UnsafeByteArrayInputStream.java
// public class UnsafeByteArrayInputStream extends InputStream {
//     /**
//      * The buffer to serve
//      */
//     protected final byte[] _buf;
// 
//     /**
//      * The current position in the buffer
//      */
//     protected int _pos;
// 
//     /**
//      * The index one greater than the last byte to serve
//      */
//     protected int _count;
// 
//     /**
//      * The current marked position
//      */
//     protected int _mark;
// 
//     /**
//      * Creates a new stream that serves the whole given array
//      * @param buf the array to serve
//      */
//     public UnsafeByteArrayInputStream(byte[] buf) {
//         this(buf, 0, buf.length);
//     }
// 
//     /**
//      * Creates a new stream that serves part of the given array
//      * @param buf the array to serve
//      * @param off the index of the first byte to serve
//      * @param len the number of bytes to serve
//      */
//     public UnsafeByteArrayInputStream(byte[] buf, int off, int len) {
//         _buf = buf;
//         _pos = off;
//         _count = Math.min(off + len, buf.length);
//         _mark = off;
//     }
// 
//     @Override
//     public int read() {
//         return _pos >= _count ? -1 : (_buf[_pos++] & 0xFF);
//     }
// 
//     @Override
//     public int read(byte[] b, int off, int len) {
//         if (_pos >= _count) {
//             return -1;
//         }
// 
//         int avail = _count - _pos;
//         int cnt = Math.min(len, avail);
//         System.arraycopy(_buf, _pos, b, off, cnt);
//         _pos += cnt;
//         return cnt;
//     }
// 
//     @Override
//     public long skip(long n) {
//         if (n <= 0) {
//             return 0;
//         }
// 
//         int avail = _count - _pos;
//         if (avail <= 0) {
//             return 0;
//         }
//         if (avail < n) {
//             n = avail;
//         }
//         _pos += n;
//         return n;
//     }
// 
//     @Override
//     public int available() {
//         return _count - _pos;
//     }
// 
//     @Override
//     public boolean markSupported() {
//         return true;
//     }
// 
//     @Override
//     public void mark(int readlimit) {
//         _mark = _pos;
//     }
// 
//     @Override
//     public void reset() {
//         _pos = _mark;
//     }
// 
//     @Override
//     public void close() {
//         // nothing to do here
//     }
// }


import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.core.io.IOContext;
import de.undercouch.bson4jackson.io.UnsafeByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.net.URL;

    /**
     * @deprecated Removed in Jackson 2.4
     */
    @Deprecated
    @SuppressWarnings("javadoc")
    protected BsonParser _createJsonParser(byte[] data, int offset, int len, IOContext ctxt) {
        return _createParser(data, offset, len, ctxt);
    }

    /**
     * @deprecated Removed in Jackson 2.4
     */
    @Deprecated
    @SuppressWarnings("javadoc")
    protected BsonParser _createJsonParser(InputStream in, IOContext ctxt) {
        return _createParser(in, ctxt);
    }

    /**
     * @deprecated Removed in Jackson 2.4
     */
    @Deprecated
    @SuppressWarnings("javadoc")
    protected BsonParser _createJsonParser(Reader r, IOContext ctxt) {
        return _createParser(r, ctxt);
    }

    @Override
    protected BsonParser _createParser(byte[] data, int offset, int len, IOContext ctxt) {
// Path: src/main/java/de/undercouch/bson4jackson/io/UnsafeByteArrayInputStream.java
// public class UnsafeByteArrayInputStream extends InputStream {
//     /**
//      * The buffer to serve
//      */
//     protected final byte[] _buf;
// 
//     /**
//      * The current position in the buffer
//      */
//     protected int _pos;
// 
//     /**
//      * The index one greater than the last byte to serve
//      */
//     protected int _count;
// 
//     /**
//      * The current marked position
//      */
//     protected int _mark;
// 
//     /**
//      * Creates a new stream that serves the whole given array
//      * @param buf the array to serve
//      */
//     public UnsafeByteArrayInputStream(byte[] buf) {
//         this(buf, 0, buf.length);
//     }
// 
//     /**
//      * Creates a new stream that serves part of the given array
//      * @param buf the array to serve
//      * @param off the index of the first byte to serve
//      * @param len the number of bytes to serve
//      */
//     public UnsafeByteArrayInputStream(byte[] buf, int off, int len) {
//         _buf = buf;
//         _pos = off;
//         _count = Math.min(off + len, buf.length);
//         _mark = off;
//     }
// 
//     @Override
//     public int read() {
//         return _pos >= _count ? -1 : (_buf[_pos++] & 0xFF);
//     }
// 
//     @Override
//     public int read(byte[] b, int off, int len) {
//         if (_pos >= _count) {
//             return -1;
//         }
// 
//         int avail = _count - _pos;
//         int cnt = Math.min(len, avail);
//         System.arraycopy(_buf, _pos, b, off, cnt);
//         _pos += cnt;
//         return cnt;
//     }
// 
//     @Override
//     public long skip(long n) {
//         if (n <= 0) {
//             return 0;
//         }
// 
//         int avail = _count - _pos;
//         if (avail <= 0) {
//             return 0;
//         }
//         if (avail < n) {
//             n = avail;
//         }
//         _pos += n;
//         return n;
//     }
// 
//     @Override
//     public int available() {
//         return _count - _pos;
//     }
// 
//     @Override
//     public boolean markSupported() {
//         return true;
//     }
// 
//     @Override
//     public void mark(int readlimit) {
//         _mark = _pos;
//     }
// 
//     @Override
//     public void reset() {
//         _pos = _mark;
//     }
// 
//     @Override
//     public void close() {
//         // nothing to do here
//     }
// }


// Path: src/main/java/de/undercouch/bson4jackson/BsonFactory.java
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.core.io.IOContext;
import de.undercouch.bson4jackson.io.UnsafeByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.net.URL;


    /**
     * @deprecated Removed in Jackson 2.4
     */
    @Deprecated
    @SuppressWarnings("javadoc")
    protected BsonParser _createJsonParser(byte[] data, int offset, int len, IOContext ctxt) {
        return _createParser(data, offset, len, ctxt);
    }

    /**
     * @deprecated Removed in Jackson 2.4
     */
    @Deprecated
    @SuppressWarnings("javadoc")
    protected BsonParser _createJsonParser(InputStream in, IOContext ctxt) {
        return _createParser(in, ctxt);
    }

    /**
     * @deprecated Removed in Jackson 2.4
     */
    @Deprecated
    @SuppressWarnings("javadoc")
    protected BsonParser _createJsonParser(Reader r, IOContext ctxt) {
        return _createParser(r, ctxt);
    }

    @Override
    protected BsonParser _createParser(byte[] data, int offset, int len, IOContext ctxt) {
        return _createParser(new UnsafeByteArrayInputStream(data, offset, len), ctxt);