code: @NotNull
  	public ByteBuf takeExactSize(int exactSize) {
  		assert hasRemainingBytes(exactSize);
  		if (exactSize == 0) return ByteBuf.empty();
  		ByteBuf buf = bufs[first];
  		if (buf.readRemaining() == exactSize) {
  			first = next(first);
  			return buf;
  		} else if (exactSize < buf.readRemaining()) {
  			ByteBuf result = buf.slice(exactSize);
  			buf.moveHead(exactSize);
  			return result;
  		}
  		ByteBuf result = ByteBufPool.allocate(exactSize);
  		drainTo(result.array(), 0, exactSize);
  		result.moveTail(exactSize);
  		return result;
  	}
docs: Creates and returns a ByteBuf which contains all bytes from the
  queue's first ByteBuf if the latter contains {@code exactSize} of bytes.
  Then {@code first} index is increased by 1 or set to the value 0 if it
  has run a full circle of the queue.
  <p>
  Otherwise creates and returns a ByteBuf of {@code exactSize} which
  contains all bytes from queue's first ByteBuf.
  
  @param exactSize the size of returned ByteBuf
  @return ByteBuf with {@code exactSize} bytes