code: public ZipFileData addLast(ZipFileData newLastData, int maximumSize) {
          String newLastPath = newLastData.path;
  
          Cell dupCell = cells.get(newLastPath);
          if ( dupCell != null ) {
              throw new IllegalArgumentException("Path [ " + newLastPath + " ] is already stored");
          }
  
          int size = size();
  
          if ( (maximumSize == -1) || (size < maximumSize) ) {
              @SuppressWarnings("unused")
              ZipFileData oldLastData = addLast(newLastData);
              return null;
          }
  
          Cell oldFirstCell = anchor.next;
          ZipFileData oldFirstData = oldFirstCell.data;
          String oldFirstPath = oldFirstData.path;
  
          if ( oldFirstCell != cells.remove(oldFirstPath) ) {
              throw new IllegalStateException("Bad cell alignment on path [ " + oldFirstPath + " ]");
          }
  
          oldFirstCell.data = newLastData;
          cells.put(newLastPath,  oldFirstCell);
  
          if ( size != 1 ) {
              oldFirstCell.excise();
              oldFirstCell.putBetween(anchor.prev, anchor);
          }
  
          return oldFirstData;
      }
docs: Add data as the last data of the store.  If the addition pushes a cell
  out of the list, answer the data of the cell which was removed.
  
  Throw an exception if the path of the new data is already stored.
  
  @param newLastData The new data to add as the last data of the store.
  @param maximumSize The maximum size of the store.  '-1' to allow the
  store to grow indefinitely.
  
  @return Data which was removed from the store.  Null if the store maximum
  size has not yet been reached.