protected void updateArc()
	{
		// arc was fully matched - save it
		addToPath( arc );
		boolean extended = false;
		if ( arc.to != forbidden )
		{
			ListIterator<Arc> iter = arc.to.outgoingArcs();
			while ( iter.hasNext() )
			{
				Arc a = iter.next();
				if ( a.versions.intersects(versions)
					&&a.to.isPrintedOutgoing(a.versions)
					&&a.versions.nextSetBit(mum.version)!=mum.version
					&&(!a.isParent()||!a.hasChildInVersion(mum.version)) )
				{
					this.arc = a;
					this.first = 0;
					MatchThreadTransposeLeft mttl = 
						new MatchThreadTransposeLeft( this );
					mttl.run();
					extended |= mttl.first > 0;
				}
			}
		}
		if ( !extended )
			mismatch();
	}