@Override
 public int read(ByteBuffer dst) throws IOException {
   requireOpen();
   buffer.limit(0);
   wrapped.position(position);
   int read = wrapped.read(dst);
   if (read > 0) {
     position += read;
   }
   return read;
 }
 @Override
 public SeekableSource position(long newPosition) throws IOException {
   requireArg(newPosition >= 0, "Cannot set position to a negative value");
   if (newPosition != this.position) {
     long newBufPosition = newPosition - position + buffer.position();
     if (newBufPosition >= 0 && newBufPosition < buffer.limit()) {
       buffer.position((int) newBufPosition);
     } else {
       buffer.limit(0);
       wrapped.position(newPosition);
     }
     this.position = Math.min(newPosition, size);
   }
   return this;
 }