docs: public Collection<Tuple2<Map<String, List<T>>, Long>> advanceTime(
  			final SharedBufferAccessor<T> sharedBufferAccessor,
  			final NFAState nfaState,
  			final long timestamp) throws Exception {
  
  		final Collection<Tuple2<Map<String, List<T>>, Long>> timeoutResult = new ArrayList<>();
  		final PriorityQueue<ComputationState> newPartialMatches = new PriorityQueue<>(NFAState.COMPUTATION_STATE_COMPARATOR);
  
  		for (ComputationState computationState : nfaState.getPartialMatches()) {
  			if (isStateTimedOut(computationState, timestamp)) {
  
  				if (handleTimeout) {
  					// extract the timed out event pattern
  					Map<String, List<T>> timedOutPattern = sharedBufferAccessor.materializeMatch(extractCurrentMatches(
  						sharedBufferAccessor,
  						computationState));
  					timeoutResult.add(Tuple2.of(timedOutPattern, computationState.getStartTimestamp() + windowTime));
  				}
  
  				sharedBufferAccessor.releaseNode(computationState.getPreviousBufferEntry());
  
  				nfaState.setStateChanged();
  			} else {
  				newPartialMatches.add(computationState);
  			}
  		}
  
  		nfaState.setNewPartialMatches(newPartialMatches);
  
  		sharedBufferAccessor.advanceTime(timestamp);
  
  		return timeoutResult;
  	}