i,
	public final SeriesRenderingHints getSeriesRenderingHints(			Series seOrthogonal ) throws ChartException,			IllegalArgumentException	{		final EList elCategories = cwoa.getSeriesDefinitions( );		if ( elCategories.size( ) != 1 )		{			throw new ChartException( ChartEnginePlugin.ID,					ChartException.DATA_FORMAT,					"exception.cwoa.single.series.definition", //$NON-NLS-1$					ResourceBundle.getBundle( Messages.ENGINE, rtc.getLocale( ) ) );		}		final SeriesDefinition sd = (SeriesDefinition) elCategories.get( 0 );		final ArrayList al = sd.getRunTimeSeries( );		if ( al.size( ) != 1 )		{			throw new ChartException( ChartEnginePlugin.ID,					ChartException.DATA_FORMAT,					"exception.cwoa.single.runtime.series", //$NON-NLS-1$					ResourceBundle.getBundle( Messages.ENGINE, rtc.getLocale( ) ) );		}		final Series seBase = (Series) al.get( 0 );		final DataSetIterator dsiBaseValues = new DataSetIterator( seBase.getDataSet( ) );		final DataSetIterator dsiOrthogonalValues = new DataSetIterator( seOrthogonal.getDataSet( ) );		DataPointHints[] dpha = null;		if ( dsiBaseValues.size( ) != dsiOrthogonalValues.size( ) ) // DO NOT		// COMPUTE		// DATA		// POINT		// HINTS FOR		// OUT-OF-SYNC		// DATA		{			logger.log( ILogger.INFORMATION,					Messages.getString( "exception.data.outofsync", //$NON-NLS-1$							new Object[]{									new Integer( dsiBaseValues.size( ) ),									new Integer( dsiOrthogonalValues.size( ) )							},							rtc.getULocale( ) ) );		}		else		{			final int iCount = dsiOrthogonalValues.size( );			dpha = new DataPointHints[iCount];			// OPTIMIZED PRE-FETCH FORMAT SPECIFIERS FOR ALL DATA POINTS			final DataPoint dp = seOrthogonal.getDataPoint( );			final EList el = dp.getComponents( );			DataPointComponent dpc;			DataPointComponentType dpct;			FormatSpecifier fsBase = null, fsOrthogonal = null, fsSeries = null, fsPercentile = null;			for ( int i = 0; i < el.size( ); i++ )			{				dpc = (DataPointComponent) el.get( i );				dpct = dpc.getType( );				if ( dpct == DataPointComponentType.BASE_VALUE_LITERAL )				{					fsBase = dpc.getFormatSpecifier( );					if ( fsBase == null ) // BACKUP					{						fsBase = sd.getFormatSpecifier( );					}				}				else if ( dpct == DataPointComponentType.ORTHOGONAL_VALUE_LITERAL )				{					fsOrthogonal = dpc.getFormatSpecifier( );					if ( fsOrthogonal == null							&& seOrthogonal.eContainer( ) instanceof SeriesDefinition )					{						fsOrthogonal = ( (SeriesDefinition) seOrthogonal.eContainer( ) ).getFormatSpecifier( );					}				}				else if ( dpct == DataPointComponentType.SERIES_VALUE_LITERAL )				{					fsSeries = dpc.getFormatSpecifier( );				}				else if ( dpct == DataPointComponentType.PERCENTILE_ORTHOGONAL_VALUE_LITERAL )				{					fsPercentile = dpc.getFormatSpecifier( );				}			}			UserDataSetHints udsh = new UserDataSetHints( seOrthogonal.getDataSets( ) );			udsh.reset( );			double total = 0;			// get total orthogonal value.			for ( int i = 0; i < iCount; i++ )			{				Object v = dsiOrthogonalValues.next( );				if ( v instanceof Number )				{					total += ( (Number) v ).doubleValue( );				}				else if ( v instanceof NumberDataElement )				{					total += ( (NumberDataElement) v ).getValue( );				}			}			dsiOrthogonalValues.reset( );			for ( int i = 0; i < iCount; i++ )			{				Object orthValue = dsiOrthogonalValues.next( );				Object percentileValue = null;				if ( total != 0 )				{					if ( orthValue instanceof Number )					{						percentileValue = new Double( ( (Number) orthValue ).doubleValue( )								/ total );					}					else if ( orthValue instanceof NumberDataElement )					{						percentileValue = new Double( ( (NumberDataElement) orthValue ).getValue( )								/ total );					}				}				dpha[i] = new DataPointHints( dsiBaseValues.next( ),						orthValue,						seOrthogonal.getSeriesIdentifier( ),						percentileValue,						seOrthogonal.getDataPoint( ),						fsBase,						fsOrthogonal,						fsSeries,						fsPercentile,						null,						-1,						rtc );				udsh.next( dpha[i] );			}		}		return new SeriesRenderingHints( this,				dpha,				dsiBaseValues,				dsiOrthogonalValues );	}