docs: public ExplorationStep next() {
  		if (this.candidates == null) {
  			return null;
  		}
  
  		while (true) {
  			int candidate = this.candidates.next();
  
  			if (candidate < 0) {
  				return null;
  			}
  
  			try {
  				if (this.selectChain == null || this.selectChain.select(candidate, this)) {
  					TransactionsIterable support = this.dataset.getSupport(candidate);
  
  					// System.out.println("extending "+Arrays.toString(this.pattern)+
  					// " with "+
  					// candidate+" ("+this.counters.getReverseRenaming()[candidate]+")");
  
  					Counters candidateCounts = new Counters(this.counters.minSupport, support.iterator(),
  							candidate, this.counters.maxFrequent);
  
  					int greatest = Integer.MIN_VALUE;
  					for (int i = 0; i < candidateCounts.closure.length; i++) {
  						if (candidateCounts.closure[i] > greatest) {
  							greatest = candidateCounts.closure[i];
  						}
  					}
  
  					if (greatest > candidate) {
  						throw new WrongFirstParentException(candidate, greatest);
  					}
  
  					// instanciateDataset may choose to compress renaming - if
  					// not, at least it's set for now.
  					candidateCounts.reuseRenaming(this.counters.reverseRenaming);
  
  					return new ExplorationStep(this, candidate, candidateCounts, support);
  				}
  			} catch (WrongFirstParentException e) {
  				addFailedFPTest(e.extension, e.firstParent);
  			}
  		}
  	}