private void ExecuteInternal() {
		try {
			Reset();
			if(m_CurrentLM == null)
				return;
			long botY = PopScanbeam();
			do {
				InsertLocalMinimaIntoAEL(botY);
				m_HorizJoins.clear();
				ProcessHorizontals();
				long topY = PopScanbeam();
				ProcessIntersections(botY, topY);
				ProcessEdgesAtTopOfScanbeam(topY);
				botY = topY;
			} while(m_Scanbeam != null || m_CurrentLM != null);
			
			// tidy up output polygons and fix orientations where necessary ...
			for(int i = 0; i < m_PolyOuts.size(); i++) {
				OutRec outRec = m_PolyOuts.get(i);
				if(outRec.pts == null)
					continue;
				FixupOutPolygon(outRec);
				if(outRec.pts == null)
					continue;
				if((outRec.isHole ^ m_ReverseOutput) == (Area(outRec, m_UseFullRange) > 0))
					ReversePolyPtLinks(outRec.pts);
			}
			JoinCommonEdges();
			if(m_ForceSimple)
				DoSimplePolygons();
		} finally {
			m_Joins.clear();
			m_HorizJoins.clear();
		}
	}