////////////////////////////////////////////////////////////////////////////////
//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You under the Apache License, Version 2.0
//  (the "License"); you may not use this file except in compliance with
//  the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package flashx.textLayout.formats
{
	import flashx.textLayout.debug.Debugging
	import flashx.textLayout.debug.assert
	import flashx.textLayout.property.*
	import flashx.textLayout.tlf_internal
	use namespace tlf_internal
	import flashx.textLayout.formats.BackgroundColor
	import flash.text.engine.BreakOpportunity
	import flash.text.engine.DigitCase
	import flash.text.engine.DigitWidth
	import flash.text.engine.TextBaseline
	import flash.text.engine.Kerning
	import flash.text.engine.LigatureLevel
	import flash.text.engine.TextBaseline
	import flashx.textLayout.formats.TLFTypographicCase
	import flashx.textLayout.formats.TextDecoration
	import flash.text.engine.FontWeight
	import flash.text.engine.FontPosture
	import flashx.textLayout.formats.WhiteSpaceCollapse
	import flash.text.engine.RenderingMode
	import flash.text.engine.CFFHinting
	import flash.text.engine.FontLookup
	import flash.text.engine.TextRotation
	import flashx.textLayout.formats.TextAlign
	import flashx.textLayout.formats.TextAlign
	import flashx.textLayout.formats.TextJustify
	import flashx.textLayout.formats.JustificationRule
	import flash.text.engine.JustificationStyle
	import flashx.textLayout.formats.Direction
	import flashx.textLayout.formats.LeadingModel
	import flashx.textLayout.formats.FormatValue
	import flashx.textLayout.formats.FormatValue
	import flashx.textLayout.formats.BaselineOffset
	import flashx.textLayout.formats.VerticalAlign
	import flashx.textLayout.formats.BlockProgression
	import flashx.textLayout.formats.LineBreak
	/**
	 * The TextLayoutFormat class holds all of the text layout properties. These properties affect the format and style of a text flow at the container level, paragraph level, and text level.  Both the ContainerController class and the FlowElement base class have <code>format</code> properties that enable you to assign a TextLayoutFormat instance to them. Assign a TextLayoutFormat object to a container to affect the format of all of the container's content. Assign a TextLayoutFormat object to a FlowElement descendant to specify formatting for that particular element: TextFlow, ParagraphElement, DivElement, SpanElement, InlineGraphicElement, LinkElement, and TCYElement.
	 * In addition to the <code>format</code> property, these classes also define each of the individual TextLayoutFormat properties so that you can override the setting of a particular style property for that element, if you wish. <p>Because you can set a given style at multiple levels, it is possible to have conflicts. For example, the color of the text at the TextFlow level could be set to black while a SpanElement object sets it to blue. The general rule is that the setting at the lowest level on the text flow tree takes precedence. So if the ligature level is set for a TextFlow instance and also set for a DivElement, the DivElement setting takes precedence. </p><p>Cascading styles refers to the process of adopting styles from a higher level in the text flow if a style value is undefined at a lower level. When a style is undefined on an element at the point it is about to be rendered, it either takes its default value or the value cascades or descends from the value on a parent element. For example, if the transparency (<code>textAlpha</code> property) of the text is undefined on a SpanElement object, but is set on the TextFlow, the value of the <code>TextFlow.textAlpha</code> property cascades to the SpanElement object and is applied to the text for that span. The result of the cascade, or the sum of the styles that is applied to the element, is stored in the element's <code>computedFormat</code> property.</p><p>In the same way, you can apply user styles using the <code>userStyles</code> property of the ContainerController and FlowElement classes. This  property allows you to read or write a dictionary of user styles and apply its settings to a container or a text flow element. The user styles dictionary is an object that consists of <em>stylename-value</em> pairs. Styles specified by the <code>userStyles</code> property take precedence over all others.</p><p>Most styles that are undefined inherit the value of their immediate parent during a cascade. A small number of styles, however, do not inherit their parent's value and take on their default values instead.</p><p><strong>Style properties that adopt their default values, if undefined, include:</strong> <code>backgroundAlpha</code>, <code>backgroundColor</code>, <code>columnCount</code>, <code>columnGap</code>, <code>columnWidth</code>, <code>lineBreak</code>, <code>paddingBottom</code>, <code>paddingLeft</code>, <code>paddingRight</code>, <code>paddingTop</code>, <code>verticalAlign</code>.</p>
	 * @includeExample examples\TextLayoutFormatExample.as -noswf
	 * @includeExample examples\TextLayoutFormatExample2.as -noswf
	 * @see flashx.textLayout.elements.FlowElement#format
	 * @see flashx.textLayout.factory.TextFlowTextLineFactory
	 * @playerversion Flash 10
	 * @playerversion AIR 1.5 
	 * @langversion 3.0 
	 */
	public class TextLayoutFormat implements ITextLayoutFormat
	{
		/** @private */
		static private var _colorProperty:UintProperty = new UintProperty("color",0,true,Category.CHARACTER);
		/** @private */
		static private var _backgroundColorProperty:UintWithEnumProperty = new UintWithEnumProperty(
			"backgroundColor",flashx.textLayout.formats.BackgroundColor.TRANSPARENT,false,Category.CHARACTER
			,flashx.textLayout.formats.BackgroundColor.TRANSPARENT
		);
		/** @private */
		static private var _lineThroughProperty:BooleanProperty = new BooleanProperty("lineThrough",false,true,Category.CHARACTER);
		/** @private */
		static private var _textAlphaProperty:NumberProperty = new NumberProperty("textAlpha",1,true,Category.CHARACTER,0,1); 		/** @private */
		static private var _backgroundAlphaProperty:NumberProperty = new NumberProperty("backgroundAlpha",1,false,Category.CHARACTER,0,1); 		/** @private */
		static private var _fontSizeProperty:NumberProperty = new NumberProperty("fontSize",12,true,Category.CHARACTER,1,720); 		/** @private */
		static private var _baselineShiftProperty:NumberOrPercentOrEnumProperty = new NumberOrPercentOrEnumProperty("baselineShift",0.0,true,Category.CHARACTER,-1000,1000,"-1000%","1000%"
			,flashx.textLayout.formats.BaselineShift.SUPERSCRIPT
			,flashx.textLayout.formats.BaselineShift.SUBSCRIPT
		);
		/** @private */
		static private var _trackingLeftProperty:NumberOrPercentProperty = new NumberOrPercentProperty("trackingLeft",0,true,Category.CHARACTER,-1000,1000,"-1000%","1000%")
		/** @private */
		static private var _trackingRightProperty:NumberOrPercentProperty = new NumberOrPercentProperty("trackingRight",0,true,Category.CHARACTER,-1000,1000,"-1000%","1000%")
		/** @private */
		static private var _lineHeightProperty:NumberOrPercentProperty = new NumberOrPercentProperty("lineHeight","120%",true,Category.CHARACTER,-720,720,"-1000%","1000%")
		/** @private */
		static private var _breakOpportunityProperty:EnumStringProperty = new EnumStringProperty(
			"breakOpportunity",flash.text.engine.BreakOpportunity.AUTO,true,Category.CHARACTER
			,flash.text.engine.BreakOpportunity.ALL
			,flash.text.engine.BreakOpportunity.ANY
			,flash.text.engine.BreakOpportunity.AUTO
			,flash.text.engine.BreakOpportunity.NONE
		);
		/** @private */
		static private var _digitCaseProperty:EnumStringProperty = new EnumStringProperty(
			"digitCase",flash.text.engine.DigitCase.DEFAULT,true,Category.CHARACTER
			,flash.text.engine.DigitCase.DEFAULT
			,flash.text.engine.DigitCase.LINING
			,flash.text.engine.DigitCase.OLD_STYLE
		);
		/** @private */
		static private var _digitWidthProperty:EnumStringProperty = new EnumStringProperty(
			"digitWidth",flash.text.engine.DigitWidth.DEFAULT,true,Category.CHARACTER
			,flash.text.engine.DigitWidth.DEFAULT
			,flash.text.engine.DigitWidth.PROPORTIONAL
			,flash.text.engine.DigitWidth.TABULAR
		);
		/** @private */
		static private var _dominantBaselineProperty:EnumStringProperty = new EnumStringProperty(
			"dominantBaseline",flashx.textLayout.formats.FormatValue.AUTO,true,Category.CHARACTER
			,flashx.textLayout.formats.FormatValue.AUTO
			,flash.text.engine.TextBaseline.ROMAN
			,flash.text.engine.TextBaseline.ASCENT
			,flash.text.engine.TextBaseline.DESCENT
			,flash.text.engine.TextBaseline.IDEOGRAPHIC_TOP
			,flash.text.engine.TextBaseline.IDEOGRAPHIC_CENTER
			,flash.text.engine.TextBaseline.IDEOGRAPHIC_BOTTOM
		);
		/** @private */
		static private var _kerningProperty:EnumStringProperty = new EnumStringProperty(
			"kerning",flash.text.engine.Kerning.AUTO,true,Category.CHARACTER
			,flash.text.engine.Kerning.ON
			,flash.text.engine.Kerning.OFF
			,flash.text.engine.Kerning.AUTO
		);
		/** @private */
		static private var _ligatureLevelProperty:EnumStringProperty = new EnumStringProperty(
			"ligatureLevel",flash.text.engine.LigatureLevel.COMMON,true,Category.CHARACTER
			,flash.text.engine.LigatureLevel.MINIMUM
			,flash.text.engine.LigatureLevel.COMMON
			,flash.text.engine.LigatureLevel.UNCOMMON
			,flash.text.engine.LigatureLevel.EXOTIC
		);
		/** @private */
		static private var _alignmentBaselineProperty:EnumStringProperty = new EnumStringProperty(
			"alignmentBaseline",flash.text.engine.TextBaseline.USE_DOMINANT_BASELINE,true,Category.CHARACTER
			,flash.text.engine.TextBaseline.ROMAN
			,flash.text.engine.TextBaseline.ASCENT
			,flash.text.engine.TextBaseline.DESCENT
			,flash.text.engine.TextBaseline.IDEOGRAPHIC_TOP
			,flash.text.engine.TextBaseline.IDEOGRAPHIC_CENTER
			,flash.text.engine.TextBaseline.IDEOGRAPHIC_BOTTOM
			,flash.text.engine.TextBaseline.USE_DOMINANT_BASELINE
		);
		/** @private */
		static private var _localeProperty:StringProperty = new StringProperty("locale","en",true,Category.CHARACTER);
		/** @private */
		static private var _typographicCaseProperty:EnumStringProperty = new EnumStringProperty(
			"typographicCase",flashx.textLayout.formats.TLFTypographicCase.DEFAULT,true,Category.CHARACTER
			,flashx.textLayout.formats.TLFTypographicCase.DEFAULT
			,flashx.textLayout.formats.TLFTypographicCase.CAPS_TO_SMALL_CAPS
			,flashx.textLayout.formats.TLFTypographicCase.UPPERCASE
			,flashx.textLayout.formats.TLFTypographicCase.LOWERCASE
			,flashx.textLayout.formats.TLFTypographicCase.LOWERCASE_TO_SMALL_CAPS
		);
		/** @private */
		static private var _fontFamilyProperty:StringProperty = new StringProperty("fontFamily","Arial",true,Category.CHARACTER);
		/** @private */
		static private var _textDecorationProperty:EnumStringProperty = new EnumStringProperty(
			"textDecoration",flashx.textLayout.formats.TextDecoration.NONE,true,Category.CHARACTER
			,flashx.textLayout.formats.TextDecoration.NONE
			,flashx.textLayout.formats.TextDecoration.UNDERLINE
		);
		/** @private */
		static private var _fontWeightProperty:EnumStringProperty = new EnumStringProperty(
			"fontWeight",flash.text.engine.FontWeight.NORMAL,true,Category.CHARACTER
			,flash.text.engine.FontWeight.NORMAL
			,flash.text.engine.FontWeight.BOLD
		);
		/** @private */
		static private var _fontStyleProperty:EnumStringProperty = new EnumStringProperty(
			"fontStyle",flash.text.engine.FontPosture.NORMAL,true,Category.CHARACTER
			,flash.text.engine.FontPosture.NORMAL
			,flash.text.engine.FontPosture.ITALIC
		);
		/** @private */
		static private var _whiteSpaceCollapseProperty:EnumStringProperty = new EnumStringProperty(
			"whiteSpaceCollapse",flashx.textLayout.formats.WhiteSpaceCollapse.COLLAPSE,true,Category.CHARACTER
			,flashx.textLayout.formats.WhiteSpaceCollapse.PRESERVE
			,flashx.textLayout.formats.WhiteSpaceCollapse.COLLAPSE
		);
		/** @private */
		static private var _renderingModeProperty:EnumStringProperty = new EnumStringProperty(
			"renderingMode",flash.text.engine.RenderingMode.CFF,true,Category.CHARACTER
			,flash.text.engine.RenderingMode.NORMAL
			,flash.text.engine.RenderingMode.CFF
		);
		/** @private */
		static private var _cffHintingProperty:EnumStringProperty = new EnumStringProperty(
			"cffHinting",flash.text.engine.CFFHinting.HORIZONTAL_STEM,true,Category.CHARACTER
			,flash.text.engine.CFFHinting.NONE
			,flash.text.engine.CFFHinting.HORIZONTAL_STEM
		);
		/** @private */
		static private var _fontLookupProperty:EnumStringProperty = new EnumStringProperty(
			"fontLookup",flash.text.engine.FontLookup.DEVICE,true,Category.CHARACTER
			,flash.text.engine.FontLookup.DEVICE
			,flash.text.engine.FontLookup.EMBEDDED_CFF
		);
		/** @private */
		static private var _textRotationProperty:EnumStringProperty = new EnumStringProperty(
			"textRotation",flash.text.engine.TextRotation.AUTO,true,Category.CHARACTER
			,flash.text.engine.TextRotation.ROTATE_0
			,flash.text.engine.TextRotation.ROTATE_180
			,flash.text.engine.TextRotation.ROTATE_270
			,flash.text.engine.TextRotation.ROTATE_90
			,flash.text.engine.TextRotation.AUTO
		);
		/** @private */
		static private var _textIndentProperty:NumberProperty = new NumberProperty("textIndent",0,true,Category.PARAGRAPH,-1000,1000); 		/** @private */
		static private var _paragraphStartIndentProperty:NumberProperty = new NumberProperty("paragraphStartIndent",0,true,Category.PARAGRAPH,0,1000); 		/** @private */
		static private var _paragraphEndIndentProperty:NumberProperty = new NumberProperty("paragraphEndIndent",0,true,Category.PARAGRAPH,0,1000); 		/** @private */
		static private var _paragraphSpaceBeforeProperty:NumberProperty = new NumberProperty("paragraphSpaceBefore",0,true,Category.PARAGRAPH,0,1000); 		/** @private */
		static private var _paragraphSpaceAfterProperty:NumberProperty = new NumberProperty("paragraphSpaceAfter",0,true,Category.PARAGRAPH,0,1000); 		/** @private */
		static private var _textAlignProperty:EnumStringProperty = new EnumStringProperty(
			"textAlign",flashx.textLayout.formats.TextAlign.START,true,Category.PARAGRAPH
			,flashx.textLayout.formats.TextAlign.LEFT
			,flashx.textLayout.formats.TextAlign.RIGHT
			,flashx.textLayout.formats.TextAlign.CENTER
			,flashx.textLayout.formats.TextAlign.JUSTIFY
			,flashx.textLayout.formats.TextAlign.START
			,flashx.textLayout.formats.TextAlign.END
		);
		/** @private */
		static private var _textAlignLastProperty:EnumStringProperty = new EnumStringProperty(
			"textAlignLast",flashx.textLayout.formats.TextAlign.START,true,Category.PARAGRAPH
			,flashx.textLayout.formats.TextAlign.LEFT
			,flashx.textLayout.formats.TextAlign.RIGHT
			,flashx.textLayout.formats.TextAlign.CENTER
			,flashx.textLayout.formats.TextAlign.JUSTIFY
			,flashx.textLayout.formats.TextAlign.START
			,flashx.textLayout.formats.TextAlign.END
		);
		/** @private */
		static private var _textJustifyProperty:EnumStringProperty = new EnumStringProperty(
			"textJustify",flashx.textLayout.formats.TextJustify.INTER_WORD,true,Category.PARAGRAPH
			,flashx.textLayout.formats.TextJustify.INTER_WORD
			,flashx.textLayout.formats.TextJustify.DISTRIBUTE
		);
		/** @private */
		static private var _justificationRuleProperty:EnumStringProperty = new EnumStringProperty(
			"justificationRule",flashx.textLayout.formats.FormatValue.AUTO,true,Category.PARAGRAPH
			,flashx.textLayout.formats.JustificationRule.EAST_ASIAN
			,flashx.textLayout.formats.JustificationRule.SPACE
			,flashx.textLayout.formats.FormatValue.AUTO
		);
		/** @private */
		static private var _justificationStyleProperty:EnumStringProperty = new EnumStringProperty(
			"justificationStyle",flashx.textLayout.formats.FormatValue.AUTO,true,Category.PARAGRAPH
			,flash.text.engine.JustificationStyle.PRIORITIZE_LEAST_ADJUSTMENT
			,flash.text.engine.JustificationStyle.PUSH_IN_KINSOKU
			,flash.text.engine.JustificationStyle.PUSH_OUT_ONLY
			,flashx.textLayout.formats.FormatValue.AUTO
		);
		/** @private */
		static private var _directionProperty:EnumStringProperty = new EnumStringProperty(
			"direction",flashx.textLayout.formats.Direction.LTR,true,Category.PARAGRAPH
			,flashx.textLayout.formats.Direction.LTR
			,flashx.textLayout.formats.Direction.RTL
		);
		/** @private */
		static private var _tabStopsProperty:TabStopsProperty = new TabStopsProperty("tabStops",null,true,Category.PARAGRAPH);
		/** @private */
		static private var _leadingModelProperty:EnumStringProperty = new EnumStringProperty(
			"leadingModel",flashx.textLayout.formats.LeadingModel.AUTO,true,Category.PARAGRAPH
			,flashx.textLayout.formats.LeadingModel.ROMAN_UP
			,flashx.textLayout.formats.LeadingModel.IDEOGRAPHIC_TOP_UP
			,flashx.textLayout.formats.LeadingModel.IDEOGRAPHIC_CENTER_UP
			,flashx.textLayout.formats.LeadingModel.IDEOGRAPHIC_TOP_DOWN
			,flashx.textLayout.formats.LeadingModel.IDEOGRAPHIC_CENTER_DOWN
			,flashx.textLayout.formats.LeadingModel.APPROXIMATE_TEXT_FIELD
			,flashx.textLayout.formats.LeadingModel.ASCENT_DESCENT_UP
			,flashx.textLayout.formats.LeadingModel.AUTO
		);
		/** @private */
		static private var _columnGapProperty:NumberProperty = new NumberProperty("columnGap",20,false,Category.CONTAINER,0,1000); 		/** @private */
		static private var _paddingLeftProperty:NumberProperty = new NumberProperty("paddingLeft",0,false,Category.CONTAINER,0,1000); 		/** @private */
		static private var _paddingTopProperty:NumberProperty = new NumberProperty("paddingTop",0,false,Category.CONTAINER,0,1000); 		/** @private */
		static private var _paddingRightProperty:NumberProperty = new NumberProperty("paddingRight",0,false,Category.CONTAINER,0,1000); 		/** @private */
		static private var _paddingBottomProperty:NumberProperty = new NumberProperty("paddingBottom",0,false,Category.CONTAINER,0,1000); 		/** @private */
		static private var _columnCountProperty:IntWithEnumProperty = new IntWithEnumProperty(
			"columnCount",flashx.textLayout.formats.FormatValue.AUTO,false,Category.CONTAINER,1,50
			,flashx.textLayout.formats.FormatValue.AUTO
		);
		/** @private */
		static private var _columnWidthProperty:NumberWithEnumProperty = new NumberWithEnumProperty(
			"columnWidth",flashx.textLayout.formats.FormatValue.AUTO,false,Category.CONTAINER,0,8000
			,flashx.textLayout.formats.FormatValue.AUTO
		);
		/** @private */
		static private var _firstBaselineOffsetProperty:NumberWithEnumProperty = new NumberWithEnumProperty(
			"firstBaselineOffset",flashx.textLayout.formats.BaselineOffset.AUTO,true,Category.CONTAINER,0,1000
			,flashx.textLayout.formats.BaselineOffset.AUTO
			,flashx.textLayout.formats.BaselineOffset.ASCENT
			,flashx.textLayout.formats.BaselineOffset.LINE_HEIGHT
		);
		/** @private */
		static private var _verticalAlignProperty:EnumStringProperty = new EnumStringProperty(
			"verticalAlign",flashx.textLayout.formats.VerticalAlign.TOP,false,Category.CONTAINER
			,flashx.textLayout.formats.VerticalAlign.TOP
			,flashx.textLayout.formats.VerticalAlign.MIDDLE
			,flashx.textLayout.formats.VerticalAlign.BOTTOM
			,flashx.textLayout.formats.VerticalAlign.JUSTIFY
		);
		/** @private */
		static private var _blockProgressionProperty:EnumStringProperty = new EnumStringProperty(
			"blockProgression",flashx.textLayout.formats.BlockProgression.TB,true,Category.CONTAINER
			,flashx.textLayout.formats.BlockProgression.RL
			,flashx.textLayout.formats.BlockProgression.TB
		);
		/** @private */
		static private var _lineBreakProperty:EnumStringProperty = new EnumStringProperty(
			"lineBreak",flashx.textLayout.formats.LineBreak.TO_FIT,false,Category.CONTAINER
			,flashx.textLayout.formats.LineBreak.EXPLICIT
			,flashx.textLayout.formats.LineBreak.TO_FIT
		);

		/** @private */
		static tlf_internal function get colorProperty():UintProperty
		{ return _colorProperty; }
		/** @private */
		static tlf_internal function get backgroundColorProperty():UintWithEnumProperty
		{ return _backgroundColorProperty; }
		/** @private */
		static tlf_internal function get lineThroughProperty():BooleanProperty
		{ return _lineThroughProperty; }
		/** @private */
		static tlf_internal function get textAlphaProperty():NumberProperty
		{ return _textAlphaProperty; }
		/** @private */
		static tlf_internal function get backgroundAlphaProperty():NumberProperty
		{ return _backgroundAlphaProperty; }
		/** @private */
		static tlf_internal function get fontSizeProperty():NumberProperty
		{ return _fontSizeProperty; }
		/** @private */
		static tlf_internal function get baselineShiftProperty():NumberOrPercentOrEnumProperty
		{ return _baselineShiftProperty; }
		/** @private */
		static tlf_internal function get trackingLeftProperty():NumberOrPercentProperty
		{ return _trackingLeftProperty; }
		/** @private */
		static tlf_internal function get trackingRightProperty():NumberOrPercentProperty
		{ return _trackingRightProperty; }
		/** @private */
		static tlf_internal function get lineHeightProperty():NumberOrPercentProperty
		{ return _lineHeightProperty; }
		/** @private */
		static tlf_internal function get breakOpportunityProperty():EnumStringProperty
		{ return _breakOpportunityProperty; }
		/** @private */
		static tlf_internal function get digitCaseProperty():EnumStringProperty
		{ return _digitCaseProperty; }
		/** @private */
		static tlf_internal function get digitWidthProperty():EnumStringProperty
		{ return _digitWidthProperty; }
		/** @private */
		static tlf_internal function get dominantBaselineProperty():EnumStringProperty
		{ return _dominantBaselineProperty; }
		/** @private */
		static tlf_internal function get kerningProperty():EnumStringProperty
		{ return _kerningProperty; }
		/** @private */
		static tlf_internal function get ligatureLevelProperty():EnumStringProperty
		{ return _ligatureLevelProperty; }
		/** @private */
		static tlf_internal function get alignmentBaselineProperty():EnumStringProperty
		{ return _alignmentBaselineProperty; }
		/** @private */
		static tlf_internal function get localeProperty():StringProperty
		{ return _localeProperty; }
		/** @private */
		static tlf_internal function get typographicCaseProperty():EnumStringProperty
		{ return _typographicCaseProperty; }
		/** @private */
		static tlf_internal function get fontFamilyProperty():StringProperty
		{ return _fontFamilyProperty; }
		/** @private */
		static tlf_internal function get textDecorationProperty():EnumStringProperty
		{ return _textDecorationProperty; }
		/** @private */
		static tlf_internal function get fontWeightProperty():EnumStringProperty
		{ return _fontWeightProperty; }
		/** @private */
		static tlf_internal function get fontStyleProperty():EnumStringProperty
		{ return _fontStyleProperty; }
		/** @private */
		static tlf_internal function get whiteSpaceCollapseProperty():EnumStringProperty
		{ return _whiteSpaceCollapseProperty; }
		/** @private */
		static tlf_internal function get renderingModeProperty():EnumStringProperty
		{ return _renderingModeProperty; }
		/** @private */
		static tlf_internal function get cffHintingProperty():EnumStringProperty
		{ return _cffHintingProperty; }
		/** @private */
		static tlf_internal function get fontLookupProperty():EnumStringProperty
		{ return _fontLookupProperty; }
		/** @private */
		static tlf_internal function get textRotationProperty():EnumStringProperty
		{ return _textRotationProperty; }
		/** @private */
		static tlf_internal function get textIndentProperty():NumberProperty
		{ return _textIndentProperty; }
		/** @private */
		static tlf_internal function get paragraphStartIndentProperty():NumberProperty
		{ return _paragraphStartIndentProperty; }
		/** @private */
		static tlf_internal function get paragraphEndIndentProperty():NumberProperty
		{ return _paragraphEndIndentProperty; }
		/** @private */
		static tlf_internal function get paragraphSpaceBeforeProperty():NumberProperty
		{ return _paragraphSpaceBeforeProperty; }
		/** @private */
		static tlf_internal function get paragraphSpaceAfterProperty():NumberProperty
		{ return _paragraphSpaceAfterProperty; }
		/** @private */
		static tlf_internal function get textAlignProperty():EnumStringProperty
		{ return _textAlignProperty; }
		/** @private */
		static tlf_internal function get textAlignLastProperty():EnumStringProperty
		{ return _textAlignLastProperty; }
		/** @private */
		static tlf_internal function get textJustifyProperty():EnumStringProperty
		{ return _textJustifyProperty; }
		/** @private */
		static tlf_internal function get justificationRuleProperty():EnumStringProperty
		{ return _justificationRuleProperty; }
		/** @private */
		static tlf_internal function get justificationStyleProperty():EnumStringProperty
		{ return _justificationStyleProperty; }
		/** @private */
		static tlf_internal function get directionProperty():EnumStringProperty
		{ return _directionProperty; }
		/** @private */
		static tlf_internal function get tabStopsProperty():TabStopsProperty
		{ return _tabStopsProperty; }
		/** @private */
		static tlf_internal function get leadingModelProperty():EnumStringProperty
		{ return _leadingModelProperty; }
		/** @private */
		static tlf_internal function get columnGapProperty():NumberProperty
		{ return _columnGapProperty; }
		/** @private */
		static tlf_internal function get paddingLeftProperty():NumberProperty
		{ return _paddingLeftProperty; }
		/** @private */
		static tlf_internal function get paddingTopProperty():NumberProperty
		{ return _paddingTopProperty; }
		/** @private */
		static tlf_internal function get paddingRightProperty():NumberProperty
		{ return _paddingRightProperty; }
		/** @private */
		static tlf_internal function get paddingBottomProperty():NumberProperty
		{ return _paddingBottomProperty; }
		/** @private */
		static tlf_internal function get columnCountProperty():IntWithEnumProperty
		{ return _columnCountProperty; }
		/** @private */
		static tlf_internal function get columnWidthProperty():NumberWithEnumProperty
		{ return _columnWidthProperty; }
		/** @private */
		static tlf_internal function get firstBaselineOffsetProperty():NumberWithEnumProperty
		{ return _firstBaselineOffsetProperty; }
		/** @private */
		static tlf_internal function get verticalAlignProperty():EnumStringProperty
		{ return _verticalAlignProperty; }
		/** @private */
		static tlf_internal function get blockProgressionProperty():EnumStringProperty
		{ return _blockProgressionProperty; }
		/** @private */
		static tlf_internal function get lineBreakProperty():EnumStringProperty
		{ return _lineBreakProperty; }

		static private var _description:Object = {
			  color:_colorProperty
			, backgroundColor:_backgroundColorProperty
			, lineThrough:_lineThroughProperty
			, textAlpha:_textAlphaProperty
			, backgroundAlpha:_backgroundAlphaProperty
			, fontSize:_fontSizeProperty
			, baselineShift:_baselineShiftProperty
			, trackingLeft:_trackingLeftProperty
			, trackingRight:_trackingRightProperty
			, lineHeight:_lineHeightProperty
			, breakOpportunity:_breakOpportunityProperty
			, digitCase:_digitCaseProperty
			, digitWidth:_digitWidthProperty
			, dominantBaseline:_dominantBaselineProperty
			, kerning:_kerningProperty
			, ligatureLevel:_ligatureLevelProperty
			, alignmentBaseline:_alignmentBaselineProperty
			, locale:_localeProperty
			, typographicCase:_typographicCaseProperty
			, fontFamily:_fontFamilyProperty
			, textDecoration:_textDecorationProperty
			, fontWeight:_fontWeightProperty
			, fontStyle:_fontStyleProperty
			, whiteSpaceCollapse:_whiteSpaceCollapseProperty
			, renderingMode:_renderingModeProperty
			, cffHinting:_cffHintingProperty
			, fontLookup:_fontLookupProperty
			, textRotation:_textRotationProperty
			, textIndent:_textIndentProperty
			, paragraphStartIndent:_paragraphStartIndentProperty
			, paragraphEndIndent:_paragraphEndIndentProperty
			, paragraphSpaceBefore:_paragraphSpaceBeforeProperty
			, paragraphSpaceAfter:_paragraphSpaceAfterProperty
			, textAlign:_textAlignProperty
			, textAlignLast:_textAlignLastProperty
			, textJustify:_textJustifyProperty
			, justificationRule:_justificationRuleProperty
			, justificationStyle:_justificationStyleProperty
			, direction:_directionProperty
			, tabStops:_tabStopsProperty
			, leadingModel:_leadingModelProperty
			, columnGap:_columnGapProperty
			, paddingLeft:_paddingLeftProperty
			, paddingTop:_paddingTopProperty
			, paddingRight:_paddingRightProperty
			, paddingBottom:_paddingBottomProperty
			, columnCount:_columnCountProperty
			, columnWidth:_columnWidthProperty
			, firstBaselineOffset:_firstBaselineOffsetProperty
			, verticalAlign:_verticalAlignProperty
			, blockProgression:_blockProgressionProperty
			, lineBreak:_lineBreakProperty
		}

		/** Property descriptions accessible by name. @private */
		static tlf_internal function get description():Object
		{ return _description; }

		/** @private */
		static private var _emptyTextLayoutFormat:ITextLayoutFormat;
		/**
		 * Returns an ITextLayoutFormat instance with all properties set to <code>undefined</code>.
		 * @private
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		static tlf_internal function get emptyTextLayoutFormat():ITextLayoutFormat
		{
			if (_emptyTextLayoutFormat == null)
				_emptyTextLayoutFormat = new TextLayoutFormatValueHolder();
			return _emptyTextLayoutFormat;
		}


		private var _color:*;
		private var _backgroundColor:*;
		private var _lineThrough:*;
		private var _textAlpha:*;
		private var _backgroundAlpha:*;
		private var _fontSize:*;
		private var _baselineShift:*;
		private var _trackingLeft:*;
		private var _trackingRight:*;
		private var _lineHeight:*;
		private var _breakOpportunity:*;
		private var _digitCase:*;
		private var _digitWidth:*;
		private var _dominantBaseline:*;
		private var _kerning:*;
		private var _ligatureLevel:*;
		private var _alignmentBaseline:*;
		private var _locale:*;
		private var _typographicCase:*;
		private var _fontFamily:*;
		private var _textDecoration:*;
		private var _fontWeight:*;
		private var _fontStyle:*;
		private var _whiteSpaceCollapse:*;
		private var _renderingMode:*;
		private var _cffHinting:*;
		private var _fontLookup:*;
		private var _textRotation:*;
		private var _textIndent:*;
		private var _paragraphStartIndent:*;
		private var _paragraphEndIndent:*;
		private var _paragraphSpaceBefore:*;
		private var _paragraphSpaceAfter:*;
		private var _textAlign:*;
		private var _textAlignLast:*;
		private var _textJustify:*;
		private var _justificationRule:*;
		private var _justificationStyle:*;
		private var _direction:*;
		private var _tabStops:*;
		private var _leadingModel:*;
		private var _columnGap:*;
		private var _paddingLeft:*;
		private var _paddingTop:*;
		private var _paddingRight:*;
		private var _paddingBottom:*;
		private var _columnCount:*;
		private var _columnWidth:*;
		private var _firstBaselineOffset:*;
		private var _verticalAlign:*;
		private var _blockProgression:*;
		private var _lineBreak:*;

		/**
		 * Color of the text. A hexadecimal number that specifies three 8-bit RGB (red, green, blue) values; for example, 0xFF0000 is red and 0x00FF00 is green. 
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get color():*
		{ return _color; }
		public function set color(newValue:*):void
		{ _color = _colorProperty.setHelper(_color,newValue); }

		/**
		 * Background color of the text (adopts default value if undefined during cascade). Can be either the constant value  <code>BackgroundColor.TRANSPARENT</code>, or a hexadecimal value that specifies the three 8-bit RGB (red, green, blue) values; for example, 0xFF0000 is red and 0x00FF00 is green.
		 * <p>Legal values as a string are flashx.textLayout.formats.BackgroundColor.TRANSPARENT, flashx.textLayout.formats.FormatValue.INHERIT and uints from 0x0 to 0xffffffff.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of TRANSPARENT.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.BackgroundColor
		 */
		public function get backgroundColor():*
		{ return _backgroundColor; }
		public function set backgroundColor(newValue:*):void
		{ _backgroundColor = _backgroundColorProperty.setHelper(_backgroundColor,newValue); }

		/**
		 * If <code>true</code>, applies strikethrough, a line drawn through the middle of the text.
		 * <p>Legal values are true, false and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of false.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get lineThrough():*
		{ return _lineThrough; }
		public function set lineThrough(newValue:*):void
		{ _lineThrough = _lineThroughProperty.setHelper(_lineThrough,newValue); }

		/**
		 * Alpha (transparency) value for the text. A value of 0 is fully transparent, and a value of 1 is fully opaque. Display objects with <code>textAlpha</code> set to 0 are active, even though they are invisible.
		 * <p>Legal values are numbers from 0 to 1 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 1.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get textAlpha():*
		{ return _textAlpha; }
		public function set textAlpha(newValue:*):void
		{ _textAlpha = _textAlphaProperty.setHelper(_textAlpha,newValue); }

		/**
		 * Alpha (transparency) value for the background (adopts default value if undefined during cascade). A value of 0 is fully transparent, and a value of 1 is fully opaque. Display objects with alpha set to 0 are active, even though they are invisible.
		 * <p>Legal values are numbers from 0 to 1 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of 1.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get backgroundAlpha():*
		{ return _backgroundAlpha; }
		public function set backgroundAlpha(newValue:*):void
		{ _backgroundAlpha = _backgroundAlphaProperty.setHelper(_backgroundAlpha,newValue); }

		/**
		 * The size of the text in pixels.
		 * <p>Legal values are numbers from 1 to 720 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 12.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get fontSize():*
		{ return _fontSize; }
		public function set fontSize(newValue:*):void
		{ _fontSize = _fontSizeProperty.setHelper(_fontSize,newValue); }

		/**
		 * Amount to shift the baseline from the <code>dominantBaseline</code> value. Units are in pixels, or a percentage of <code>fontSize</code> (in which case, enter a string value, like 140%).  Positive values shift the line up for horizontal text (right for vertical) and negative values shift it down for horizontal (left for vertical). 
		 * <p>Legal values are flashx.textLayout.formats.BaselineShift.SUPERSCRIPT, flashx.textLayout.formats.BaselineShift.SUBSCRIPT, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Legal values as a number are from -1000 to 1000.</p>
		 * <p>Legal values as a percent are numbers from -1000 to 1000.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.BaselineShift
		 */
		public function get baselineShift():*
		{ return _baselineShift; }
		public function set baselineShift(newValue:*):void
		{ _baselineShift = _baselineShiftProperty.setHelper(_baselineShift,newValue); }

		/**
		 * Number in pixels (or percent of <code>fontSize</code>, like 120%) indicating the amount of tracking (manual kerning) to be applied to the left of each character. If kerning is enabled, the <code>trackingLeft</code> value is added to the values in the kerning table for the font. If kerning is disabled, the <code>trackingLeft</code> value is used as a manual kerning value. Supports both positive and negative values. 
		 * <p>Legal values as a number are from -1000 to 1000.</p>
		 * <p>Legal values as a percent are numbers from -1000% to 1000%.</p>
		 * <p>Legal values include flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get trackingLeft():*
		{ return _trackingLeft; }
		public function set trackingLeft(newValue:*):void
		{ _trackingLeft = _trackingLeftProperty.setHelper(_trackingLeft,newValue); }

		/**
		 * Number in pixels (or percent of <code>fontSize</code>, like 120%) indicating the amount of tracking (manual kerning) to be applied to the right of each character.  If kerning is enabled, the <code>trackingRight</code> value is added to the values in the kerning table for the font. If kerning is disabled, the <code>trackingRight</code> value is used as a manual kerning value. Supports both positive and negative values. 
		 * <p>Legal values as a number are from -1000 to 1000.</p>
		 * <p>Legal values as a percent are numbers from -1000% to 1000%.</p>
		 * <p>Legal values include flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get trackingRight():*
		{ return _trackingRight; }
		public function set trackingRight(newValue:*):void
		{ _trackingRight = _trackingRightProperty.setHelper(_trackingRight,newValue); }

		/**
		 * Leading controls for the text. The distance from the baseline of the previous or the next line (based on <code>LeadingModel</code>) to the baseline of the current line is equal to the maximum amount of the leading applied to any character in the line. This is either a number or a percent.  If specifying a percent, enter a string value, like 140%.<p><img src='../../../images/textLayout_lineHeight1.jpg' alt='lineHeight1' /><img src='../../../images/textLayout_lineHeight2.jpg' alt='lineHeight2' /></p>
		 * <p>Legal values as a number are from -720 to 720.</p>
		 * <p>Legal values as a percent are numbers from -1000% to 1000%.</p>
		 * <p>Legal values include flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 120%.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get lineHeight():*
		{ return _lineHeight; }
		public function set lineHeight(newValue:*):void
		{ _lineHeight = _lineHeightProperty.setHelper(_lineHeight,newValue); }

		/**
		 * Controls where lines are allowed to break when breaking wrapping text into multiple lines. Set to <code>BreakOpportunity.AUTO</code> to break text normally. Set to <code>BreakOpportunity.NONE</code> to <em>not</em> break the text unless the text would overrun the measure and there are no other places to break the line. Set to <code>BreakOpportunity.ANY</code> to allow the line to break anywhere, rather than just between words. Set to <code>BreakOpportunity.ALL</code> to have each typographic cluster put on a separate line (useful for text on a path).
		 * <p>Legal values are flash.text.engine.BreakOpportunity.ALL, flash.text.engine.BreakOpportunity.ANY, flash.text.engine.BreakOpportunity.AUTO, flash.text.engine.BreakOpportunity.NONE, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.BreakOpportunity
		 */
		public function get breakOpportunity():*
		{ return _breakOpportunity; }
		public function set breakOpportunity(newValue:*):void
		{ _breakOpportunity = _breakOpportunityProperty.setHelper(_breakOpportunity,newValue); }

		/**
		 * The type of digit case used for this text. Setting the value to <code>DigitCase.OLD_STYLE</code> approximates lowercase letterforms with varying ascenders and descenders. The figures are proportionally spaced. This style is only available in selected typefaces, most commonly in a supplemental or expert font. The <code>DigitCase.LINING</code> setting has all-cap height and is typically monospaced to line up in charts.<p><img src='../../../images/textLayout_digitcase.gif' alt='digitCase' /></p>
		 * <p>Legal values are flash.text.engine.DigitCase.DEFAULT, flash.text.engine.DigitCase.LINING, flash.text.engine.DigitCase.OLD_STYLE, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of DEFAULT.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.DigitCase
		 */
		public function get digitCase():*
		{ return _digitCase; }
		public function set digitCase(newValue:*):void
		{ _digitCase = _digitCaseProperty.setHelper(_digitCase,newValue); }

		/**
		 * Type of digit width used for this text. This can be <code>DigitWidth.PROPORTIONAL</code>, which looks best for individual numbers, or <code>DigitWidth.TABULAR</code>, which works best for numbers in tables, charts, and vertical rows.<p><img src='../../../images/textLayout_digitwidth.gif' alt='digitWidth' /></p>
		 * <p>Legal values are flash.text.engine.DigitWidth.DEFAULT, flash.text.engine.DigitWidth.PROPORTIONAL, flash.text.engine.DigitWidth.TABULAR, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of DEFAULT.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.DigitWidth
		 */
		public function get digitWidth():*
		{ return _digitWidth; }
		public function set digitWidth(newValue:*):void
		{ _digitWidth = _digitWidthProperty.setHelper(_digitWidth,newValue); }

		/**
		 * Specifies which element baseline snaps to the <code>alignmentBaseline</code> to determine the vertical position of the element on the line. A value of <code>TextBaseline.AUTO</code> selects the dominant baseline based on the <code>locale</code> property of the parent paragraph.  For Japanese and Chinese, the selected baseline value is <code>TextBaseline.IDEOGRAPHIC_CENTER</code>; for all others it is <code>TextBaseline.ROMAN</code>. These baseline choices are determined by the choice of font and the font size.<p><img src='../../../images/textLayout_baselines.jpg' alt='baselines' /></p>
		 * <p>Legal values are flashx.textLayout.formats.FormatValue.AUTO, flash.text.engine.TextBaseline.ROMAN, flash.text.engine.TextBaseline.ASCENT, flash.text.engine.TextBaseline.DESCENT, flash.text.engine.TextBaseline.IDEOGRAPHIC_TOP, flash.text.engine.TextBaseline.IDEOGRAPHIC_CENTER, flash.text.engine.TextBaseline.IDEOGRAPHIC_BOTTOM, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of flashx.textLayout.formats.FormatValue.AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.TextBaseline
		 */
		public function get dominantBaseline():*
		{ return _dominantBaseline; }
		public function set dominantBaseline(newValue:*):void
		{ _dominantBaseline = _dominantBaselineProperty.setHelper(_dominantBaseline,newValue); }

		/**
		 * Kerning adjusts the pixels between certain character pairs to improve readability. Kerning is supported for all fonts with kerning tables.
		 * <p>Legal values are flash.text.engine.Kerning.ON, flash.text.engine.Kerning.OFF, flash.text.engine.Kerning.AUTO, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.Kerning
		 */
		public function get kerning():*
		{ return _kerning; }
		public function set kerning(newValue:*):void
		{ _kerning = _kerningProperty.setHelper(_kerning,newValue); }

		/**
		 * Controls which of the ligatures that are defined in the font may be used in the text. The ligatures that appear for each of these settings is dependent on the font. A ligature occurs where two or more letter-forms are joined as a single glyph. Ligatures usually replace consecutive characters sharing common components, such as the letter pairs 'fi', 'fl', or 'ae'. They are used with both Latin and Non-Latin character sets. The ligatures enabled by the values of the LigatureLevel class - <code>MINIMUM</code>, <code>COMMON</code>, <code>UNCOMMON</code>, and <code>EXOTIC</code> - are additive. Each value enables a new set of ligatures, but also includes those of the previous types.<p><b>Note: </b>When working with Arabic or Syriac fonts, <code>ligatureLevel</code> must be set to MINIMUM or above.</p><p><img src='../../../images/textLayout_ligatures.png' alt='ligatureLevel' /></p>
		 * <p>Legal values are flash.text.engine.LigatureLevel.MINIMUM, flash.text.engine.LigatureLevel.COMMON, flash.text.engine.LigatureLevel.UNCOMMON, flash.text.engine.LigatureLevel.EXOTIC, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of COMMON.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.LigatureLevel
		 */
		public function get ligatureLevel():*
		{ return _ligatureLevel; }
		public function set ligatureLevel(newValue:*):void
		{ _ligatureLevel = _ligatureLevelProperty.setHelper(_ligatureLevel,newValue); }

		/**
		 * Specifies the baseline to which the dominant baseline aligns. For example, if you set <code>dominantBaseline</code> to ASCENT, setting <code>alignmentBaseline</code> to DESCENT aligns the top of the text with the DESCENT baseline, or below the line.  The largest element in the line generally determines the baselines.<p><img src='../../../images/textLayout_baselines.jpg' alt='baselines' /></p>
		 * <p>Legal values are flash.text.engine.TextBaseline.ROMAN, flash.text.engine.TextBaseline.ASCENT, flash.text.engine.TextBaseline.DESCENT, flash.text.engine.TextBaseline.IDEOGRAPHIC_TOP, flash.text.engine.TextBaseline.IDEOGRAPHIC_CENTER, flash.text.engine.TextBaseline.IDEOGRAPHIC_BOTTOM, flash.text.engine.TextBaseline.USE_DOMINANT_BASELINE, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of USE_DOMINANT_BASELINE.</p>
		 * @includeExample examples\TextLayoutFormat_alignmentBaselineExample.as -noswf
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.TextBaseline
		 */
		public function get alignmentBaseline():*
		{ return _alignmentBaseline; }
		public function set alignmentBaseline(newValue:*):void
		{ _alignmentBaseline = _alignmentBaselineProperty.setHelper(_alignmentBaseline,newValue); }

		/**
		 * The locale of the text. Controls case transformations and shaping. Standard locale identifiers as described in Unicode Technical Standard #35 are used. For example en, en_US and en-US are all English, ja is Japanese. 
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of en.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get locale():*
		{ return _locale; }
		public function set locale(newValue:*):void
		{ _locale = _localeProperty.setHelper(_locale,newValue); }

		/**
		 * The type of typographic case used for this text. Here are some examples:<p><img src='../../../images/textLayout_typographiccase.png' alt='typographicCase' /></p>
		 * <p>Legal values are flashx.textLayout.formats.TLFTypographicCase.DEFAULT, flashx.textLayout.formats.TLFTypographicCase.CAPS_TO_SMALL_CAPS, flashx.textLayout.formats.TLFTypographicCase.UPPERCASE, flashx.textLayout.formats.TLFTypographicCase.LOWERCASE, flashx.textLayout.formats.TLFTypographicCase.LOWERCASE_TO_SMALL_CAPS, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of DEFAULT.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.TLFTypographicCase
		 */
		public function get typographicCase():*
		{ return _typographicCase; }
		public function set typographicCase(newValue:*):void
		{ _typographicCase = _typographicCaseProperty.setHelper(_typographicCase,newValue); }

		/**
		 *  The name of the font to use, or a comma-separated list of font names. The Flash runtime renders the element with the first available font in the list. For example Arial, Helvetica, _sans causes the player to search for Arial, then Helvetica if Arial is not found, then _sans if neither is found.
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of Arial.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get fontFamily():*
		{ return _fontFamily; }
		public function set fontFamily(newValue:*):void
		{ _fontFamily = _fontFamilyProperty.setHelper(_fontFamily,newValue); }

		/**
		 * Decoration on text. Use to apply underlining; default is none.
		 * <p>Legal values are flashx.textLayout.formats.TextDecoration.NONE, flashx.textLayout.formats.TextDecoration.UNDERLINE, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of NONE.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.TextDecoration
		 */
		public function get textDecoration():*
		{ return _textDecoration; }
		public function set textDecoration(newValue:*):void
		{ _textDecoration = _textDecorationProperty.setHelper(_textDecoration,newValue); }

		/**
		 * Weight of text. May be <code>FontWeight.NORMAL</code> for use in plain text, or <code>FontWeight.BOLD</code>. Applies only to device fonts (<code>fontLookup</code> property is set to flash.text.engine.FontLookup.DEVICE).
		 * <p>Legal values are flash.text.engine.FontWeight.NORMAL, flash.text.engine.FontWeight.BOLD, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of NORMAL.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.FontWeight
		 */
		public function get fontWeight():*
		{ return _fontWeight; }
		public function set fontWeight(newValue:*):void
		{ _fontWeight = _fontWeightProperty.setHelper(_fontWeight,newValue); }

		/**
		 * Style of text. May be <code>FontPosture.NORMAL</code>, for use in plain text, or <code>FontPosture.ITALIC</code> for italic. This property applies only to device fonts (<code>fontLookup</code> property is set to flash.text.engine.FontLookup.DEVICE).
		 * <p>Legal values are flash.text.engine.FontPosture.NORMAL, flash.text.engine.FontPosture.ITALIC, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of NORMAL.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.FontPosture
		 */
		public function get fontStyle():*
		{ return _fontStyle; }
		public function set fontStyle(newValue:*):void
		{ _fontStyle = _fontStyleProperty.setHelper(_fontStyle,newValue); }

		/**
		 * Collapses or preserves whitespace when importing text into a TextFlow. <code>WhiteSpaceCollapse.PRESERVE</code> retains all whitespace characters. <code>WhiteSpaceCollapse.COLLAPSE</code> removes newlines, tabs, and leading or trailing spaces within a block of imported text. Line break tags (&lt;br/&gt;) and Unicode line separator characters are retained.
		 * <p>Legal values are flashx.textLayout.formats.WhiteSpaceCollapse.PRESERVE, flashx.textLayout.formats.WhiteSpaceCollapse.COLLAPSE, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of COLLAPSE.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.WhiteSpaceCollapse
		 */
		public function get whiteSpaceCollapse():*
		{ return _whiteSpaceCollapse; }
		public function set whiteSpaceCollapse(newValue:*):void
		{ _whiteSpaceCollapse = _whiteSpaceCollapseProperty.setHelper(_whiteSpaceCollapse,newValue); }

		/**
		 * The rendering mode used for this text.  Applies only to embedded fonts (<code>fontLookup</code> property is set to <code>FontLookup.EMBEDDED_CFF</code>).
		 * <p>Legal values are flash.text.engine.RenderingMode.NORMAL, flash.text.engine.RenderingMode.CFF, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of CFF.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.RenderingMode
		 */
		public function get renderingMode():*
		{ return _renderingMode; }
		public function set renderingMode(newValue:*):void
		{ _renderingMode = _renderingModeProperty.setHelper(_renderingMode,newValue); }

		/**
		 * The type of CFF hinting used for this text. CFF hinting determines whether the Flash runtime forces strong horizontal stems to fit to a sub pixel grid or not. This property applies only if the <code>renderingMode</code> property is set to <code>RenderingMode.CFF</code>, and the font is embedded (<code>fontLookup</code> property is set to <code>FontLookup.EMBEDDED_CFF</code>). At small screen sizes, hinting produces a clear, legible text for human readers.
		 * <p>Legal values are flash.text.engine.CFFHinting.NONE, flash.text.engine.CFFHinting.HORIZONTAL_STEM, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of HORIZONTAL_STEM.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.CFFHinting
		 */
		public function get cffHinting():*
		{ return _cffHinting; }
		public function set cffHinting(newValue:*):void
		{ _cffHinting = _cffHintingProperty.setHelper(_cffHinting,newValue); }

		/**
		 * Font lookup to use. Specifying <code>FontLookup.DEVICE</code> uses the fonts installed on the system that is running the SWF file. Device fonts result in a smaller movie size, but text is not always rendered the same across different systems and platforms. Specifying <code>FontLookup.EMBEDDED_CFF</code> uses font outlines embedded in the published SWF file. Embedded fonts increase the size of the SWF file (sometimes dramatically), but text is consistently displayed in the chosen font.
		 * <p>Legal values are flash.text.engine.FontLookup.DEVICE, flash.text.engine.FontLookup.EMBEDDED_CFF, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of DEVICE.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.FontLookup
		 */
		public function get fontLookup():*
		{ return _fontLookup; }
		public function set fontLookup(newValue:*):void
		{ _fontLookup = _fontLookupProperty.setHelper(_fontLookup,newValue); }

		/**
		 * Determines the number of degrees to rotate this text.
		 * <p>Legal values are flash.text.engine.TextRotation.ROTATE_0, flash.text.engine.TextRotation.ROTATE_180, flash.text.engine.TextRotation.ROTATE_270, flash.text.engine.TextRotation.ROTATE_90, flash.text.engine.TextRotation.AUTO, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.TextRotation
		 */
		public function get textRotation():*
		{ return _textRotation; }
		public function set textRotation(newValue:*):void
		{ _textRotation = _textRotationProperty.setHelper(_textRotation,newValue); }

		/**
		 * A Number that specifies, in pixels, the amount to indent the first line of the paragraph.
		 * A negative indent will push the line into the margin, and possibly out of the container.
		 * <p>Legal values are numbers from -1000 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get textIndent():*
		{ return _textIndent; }
		public function set textIndent(newValue:*):void
		{ _textIndent = _textIndentProperty.setHelper(_textIndent,newValue); }

		/**
		 * A Number that specifies, in pixels, the amount to indent the paragraph's start edge. Refers to the left edge in left-to-right text and the right edge in right-to-left text. 
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get paragraphStartIndent():*
		{ return _paragraphStartIndent; }
		public function set paragraphStartIndent(newValue:*):void
		{ _paragraphStartIndent = _paragraphStartIndentProperty.setHelper(_paragraphStartIndent,newValue); }

		/**
		 * A Number that specifies, in pixels, the amount to indent the paragraph's end edge. Refers to the right edge in left-to-right text and the left edge in right-to-left text. 
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get paragraphEndIndent():*
		{ return _paragraphEndIndent; }
		public function set paragraphEndIndent(newValue:*):void
		{ _paragraphEndIndent = _paragraphEndIndentProperty.setHelper(_paragraphEndIndent,newValue); }

		/**
		 * A Number that specifies the amount of space, in pixels, to leave before the paragraph. 
		 * Collapses in tandem with <code>paragraphSpaceAfter</code>.
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get paragraphSpaceBefore():*
		{ return _paragraphSpaceBefore; }
		public function set paragraphSpaceBefore(newValue:*):void
		{ _paragraphSpaceBefore = _paragraphSpaceBeforeProperty.setHelper(_paragraphSpaceBefore,newValue); }

		/**
		 * A Number that specifies the amount of space, in pixels, to leave after the paragraph.
		 * Collapses in tandem with  <code>paragraphSpaceBefore</code>.
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get paragraphSpaceAfter():*
		{ return _paragraphSpaceAfter; }
		public function set paragraphSpaceAfter(newValue:*):void
		{ _paragraphSpaceAfter = _paragraphSpaceAfterProperty.setHelper(_paragraphSpaceAfter,newValue); }

		/**
		 * Alignment of lines in the paragraph relative to the container.
		 * <code>TextAlign.LEFT</code> aligns lines along the left edge of the container. <code>TextAlign.RIGHT</code> aligns on the right edge. <code>TextAlign.CENTER</code> positions the line equidistant from the left and right edges. <code>TextAlign.JUSTIFY</code> spreads the lines out so they fill the space. <code>TextAlign.START</code> is equivalent to setting left in left-to-right text, or right in right-to-left text. <code>TextAlign.END</code> is equivalent to setting right in left-to-right text, or left in right-to-left text.
		 * <p>Legal values are flashx.textLayout.formats.TextAlign.LEFT, flashx.textLayout.formats.TextAlign.RIGHT, flashx.textLayout.formats.TextAlign.CENTER, flashx.textLayout.formats.TextAlign.JUSTIFY, flashx.textLayout.formats.TextAlign.START, flashx.textLayout.formats.TextAlign.END, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of START.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.TextAlign
		 */
		public function get textAlign():*
		{ return _textAlign; }
		public function set textAlign(newValue:*):void
		{ _textAlign = _textAlignProperty.setHelper(_textAlign,newValue); }

		/**
		 * Alignment of the last (or only) line in the paragraph relative to the container in justified text.
		 * If <code>textAlign</code> is set to <code>TextAlign.JUSTIFY</code>, <code>textAlignLast</code> specifies how the last line (or only line, if this is a one line block) is aligned. Values are similar to <code>textAlign</code>.
		 * <p>Legal values are flashx.textLayout.formats.TextAlign.LEFT, flashx.textLayout.formats.TextAlign.RIGHT, flashx.textLayout.formats.TextAlign.CENTER, flashx.textLayout.formats.TextAlign.JUSTIFY, flashx.textLayout.formats.TextAlign.START, flashx.textLayout.formats.TextAlign.END, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of START.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.TextAlign
		 */
		public function get textAlignLast():*
		{ return _textAlignLast; }
		public function set textAlignLast(newValue:*):void
		{ _textAlignLast = _textAlignLastProperty.setHelper(_textAlignLast,newValue); }

		/**
		 * Specifies options for justifying text.
		 * Default value is <code>TextJustify.INTER_WORD</code>, meaning that extra space is added to the space characters. <code>TextJustify.DISTRIBUTE</code> adds extra space to space characters and between individual letters. Used only in conjunction with a <code>justificationRule</code> value of <code>JustificationRule.SPACE</code>.
		 * <p>Legal values are flashx.textLayout.formats.TextJustify.INTER_WORD, flashx.textLayout.formats.TextJustify.DISTRIBUTE, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of INTER_WORD.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.TextJustify
		 */
		public function get textJustify():*
		{ return _textJustify; }
		public function set textJustify(newValue:*):void
		{ _textJustify = _textJustifyProperty.setHelper(_textJustify,newValue); }

		/**
		 * Rule used to justify text in a paragraph.
		 * Default value is <code>FormatValue.AUTO</code>, which justifies text based on the paragraph's <code>locale</code> property. For all languages except Japanese and Chinese, <code>FormatValue.AUTO</code> becomes <code>JustificationRule.SPACE</code>, which adds extra space to the space characters.  For Japanese and Chinese, <code>FormatValue.AUTO</code> becomes <code>JustficationRule.EAST_ASIAN</code>. In part, justification changes the spacing of punctuation. In Roman text the comma and Japanese periods take a full character's width but in East Asian text only half of a character's width. Also, in the East Asian text the spacing between sequential punctuation marks becomes tighter, obeying traditional East Asian typographic conventions. Note, too, in the example below the leading that is applied to the second line of the paragraphs. In the East Asian version, the last two lines push left. In the Roman version, the second and following lines push left.<p><img src='../../../images/textLayout_justificationrule.png' alt='justificationRule' /></p>
		 * <p>Legal values are flashx.textLayout.formats.JustificationRule.EAST_ASIAN, flashx.textLayout.formats.JustificationRule.SPACE, flashx.textLayout.formats.FormatValue.AUTO, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of flashx.textLayout.formats.FormatValue.AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.JustificationRule
		 */
		public function get justificationRule():*
		{ return _justificationRule; }
		public function set justificationRule(newValue:*):void
		{ _justificationRule = _justificationRuleProperty.setHelper(_justificationRule,newValue); }

		/**
		 * The style used for justification of the paragraph. Used only in conjunction with a <code>justificationRule</code> setting of <code>JustificationRule.EAST_ASIAN</code>.
		 * Default value of <code>FormatValue.AUTO</code> is resolved to <code>JustificationStyle.PUSH_IN_KINSOKU</code> for all locales.  The constants defined by the JustificationStyle class specify options for handling kinsoku characters, which are Japanese characters that cannot appear at either the beginning or end of a line. If you want looser text, specify <code>JustificationStyle.PUSH-OUT-ONLY</code>. If you want behavior that is like what you get with the  <code>justificationRule</code> of <code>JustificationRule.SPACE</code>, use <code>JustificationStyle.PRIORITIZE-LEAST-ADJUSTMENT</code>.
		 * <p>Legal values are flash.text.engine.JustificationStyle.PRIORITIZE_LEAST_ADJUSTMENT, flash.text.engine.JustificationStyle.PUSH_IN_KINSOKU, flash.text.engine.JustificationStyle.PUSH_OUT_ONLY, flashx.textLayout.formats.FormatValue.AUTO, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of flashx.textLayout.formats.FormatValue.AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flash.text.engine.JustificationStyle
		 */
		public function get justificationStyle():*
		{ return _justificationStyle; }
		public function set justificationStyle(newValue:*):void
		{ _justificationStyle = _justificationStyleProperty.setHelper(_justificationStyle,newValue); }

		/**
		 * Specifies the default bidirectional embedding level of the text in the text block. 
		 * Left-to-right reading order, as in Latin-style scripts, or right-to-left reading order, as in Arabic or Hebrew. This property also affects column direction when it is applied at the container level. Columns can be either left-to-right or right-to-left, just like text. Below are some examples:<p><img src='../../../images/textLayout_direction.gif' alt='direction' /></p>
		 * <p>Legal values are flashx.textLayout.formats.Direction.LTR, flashx.textLayout.formats.Direction.RTL, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of LTR.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.Direction
		 */
		public function get direction():*
		{ return _direction; }
		public function set direction(newValue:*):void
		{ _direction = _directionProperty.setHelper(_direction,newValue); }

		/**
		 * Specifies the tab stops associated with the paragraph.
		 * Setters can take an array of flashx.textLayout.formats.TabStopFormat, a condensed string representation, undefined, or <code>FormatValue.INHERIT</code>. The condensed string representation is always converted into an array of flashx.textLayout.formats.TabStopFormat. <p>The string-based format is a list of tab stops, where each tab stop is delimited by one or more spaces.</p><p>A tab stop takes the following form: &lt;alignment type&gt;&lt;alignment position&gt;|&lt;alignment token&gt;.</p><p>The alignment type is a single character, and can be S, E, C, or D (or lower-case equivalents). S or s for start, E or e for end, C or c for center, D or d for decimal. The alignment type is optional, and if its not specified will default to S.</p><p>The alignment position is a Number, and is specified according to FXG spec for Numbers (decimal or scientific notation). The alignment position is required.</p><p>The vertical bar is used to separate the alignment position from the alignment token, and should only be present if the alignment token is present.</p><p> The alignment token is optional if the alignment type is D, and should not be present if the alignment type is anything other than D. The alignment token may be any sequence of characters terminated by the space that ends the tab stop (for the last tab stop, the terminating space is optional; end of alignment token is implied). A space may be part of the alignment token if it is escaped with a backslash (\ ). A backslash may be part of the alignment token if it is escaped with another backslash (\\). If the alignment type is D, and the alignment token is not specified, it will take on the default value of null.</p><p>If no tab stops are specified, a tab action defaults to the end of the line.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of null.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get tabStops():*
		{ return _tabStops; }
		public function set tabStops(newValue:*):void
		{ _tabStops = _tabStopsProperty.setHelper(_tabStops,newValue); }

		/**
		 * Specifies the leading model, which is a combination of leading basis and leading direction.
		 * Leading basis is the baseline to which the <code>lineHeight</code> property refers. Leading direction determines whether the <code>lineHeight</code> property refers to the distance of a line's baseline from that of the line before it or the line after it. The default value of <code>FormatValue.AUTO</code> is resolved based on the paragraph's <code>locale</code> property.  For Japanese and Chinese, it is <code>LeadingModel.IDEOGRAPHIC_TOP_DOWN</code> and for all others it is <code>LeadingModel.ROMAN_UP</code>.<p><strong>Leading Basis:</strong></p><p><img src='../../../images/textLayout_LB1.png' alt='leadingBasis1' />    <img src='../../../images/textLayout_LB2.png' alt='leadingBasis2' />    <img src='../../../images/textLayout_LB3.png' alt='leadingBasis3' /></p><p><strong>Leading Direction:</strong></p><p><img src='../../../images/textLayout_LD1.png' alt='leadingDirection1' />    <img src='../../../images/textLayout_LD2.png' alt='leadingDirection2' />    <img src='../../../images/textLayout_LD3.png' alt='leadingDirection3' /></p>
		 * <p>Legal values are flashx.textLayout.formats.LeadingModel.ROMAN_UP, flashx.textLayout.formats.LeadingModel.IDEOGRAPHIC_TOP_UP, flashx.textLayout.formats.LeadingModel.IDEOGRAPHIC_CENTER_UP, flashx.textLayout.formats.LeadingModel.IDEOGRAPHIC_TOP_DOWN, flashx.textLayout.formats.LeadingModel.IDEOGRAPHIC_CENTER_DOWN, flashx.textLayout.formats.LeadingModel.APPROXIMATE_TEXT_FIELD, flashx.textLayout.formats.LeadingModel.ASCENT_DESCENT_UP, flashx.textLayout.formats.LeadingModel.AUTO, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.LeadingModel
		 */
		public function get leadingModel():*
		{ return _leadingModel; }
		public function set leadingModel(newValue:*):void
		{ _leadingModel = _leadingModelProperty.setHelper(_leadingModel,newValue); }

		/**
		 * Specifies the amount of gutter space, in pixels, to leave between the columns (adopts default value if undefined during cascade).
		 * Value is a Number
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of 20.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get columnGap():*
		{ return _columnGap; }
		public function set columnGap(newValue:*):void
		{ _columnGap = _columnGapProperty.setHelper(_columnGap,newValue); }

		/**
		 * Left inset in pixels (adopts default value if undefined during cascade).
		 * Space between the left edge of the container and the text.  Value is a Number.<p> With vertical text, in scrollable containers with multiple columns, the first and following columns will show the padding as blank space at the end of the container, but for the last column, if the text doesn't all fit, you may have to scroll in order to see the padding.</p>
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get paddingLeft():*
		{ return _paddingLeft; }
		public function set paddingLeft(newValue:*):void
		{ _paddingLeft = _paddingLeftProperty.setHelper(_paddingLeft,newValue); }

		/**
		 * Top inset in pixels (adopts default value if undefined during cascade).
		 * Space between the top edge of the container and the text.  Value is a Number.
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get paddingTop():*
		{ return _paddingTop; }
		public function set paddingTop(newValue:*):void
		{ _paddingTop = _paddingTopProperty.setHelper(_paddingTop,newValue); }

		/**
		 * Right inset in pixels (adopts default value if undefined during cascade).
		 * Space between the right edge of the container and the text.  Value is a Number.
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get paddingRight():*
		{ return _paddingRight; }
		public function set paddingRight(newValue:*):void
		{ _paddingRight = _paddingRightProperty.setHelper(_paddingRight,newValue); }

		/**
		 * Botttom inset in pixels (adopts default value if undefined during cascade).
		 * Space between the bottom edge of the container and the text.  Value is a Number. <p> With horizontal text, in scrollable containers with multiple columns, the first and following columns will show the padding as blank space at the bottom of the container, but for the last column, if the text doesn't all fit, you may have to scroll in order to see the padding.</p>
		 * <p>Legal values are numbers from 0 to 1000 and flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of 0.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function get paddingBottom():*
		{ return _paddingBottom; }
		public function set paddingBottom(newValue:*):void
		{ _paddingBottom = _paddingBottomProperty.setHelper(_paddingBottom,newValue); }

		/**
		 * Number of text columns (adopts default value if undefined during cascade).
		 * The column number overrides the  other column settings. Value is an integer, or <code>FormatValue.AUTO</code> if unspecified. If <code>columnCount</code> is not specified,<code>columnWidth</code> is used to create as many columns as can fit in the container.
		 * <p>Legal values as a string are flashx.textLayout.formats.FormatValue.AUTO, flashx.textLayout.formats.FormatValue.INHERIT and from ints from 1 to 50.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.FormatValue
		 */
		public function get columnCount():*
		{ return _columnCount; }
		public function set columnCount(newValue:*):void
		{ _columnCount = _columnCountProperty.setHelper(_columnCount,newValue); }

		/**
		 * Column width in pixels (adopts default value if undefined during cascade).
		 * If you specify the width of the columns, but not the count, TextLayout will create as many columns of that width as possible, given the  container width and <code>columnGap</code> settings. Any remainder space is left after the last column. Value is a Number.
		 * <p>Legal values as a string are flashx.textLayout.formats.FormatValue.AUTO, flashx.textLayout.formats.FormatValue.INHERIT and numbers from 0 to 8000.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.FormatValue
		 */
		public function get columnWidth():*
		{ return _columnWidth; }
		public function set columnWidth(newValue:*):void
		{ _columnWidth = _columnWidthProperty.setHelper(_columnWidth,newValue); }

		/**
		 * Specifies the baseline position of the first line in the container. Which baseline this property refers to depends on the container-level locale.  For Japanese and Chinese, it is <code>TextBaseline.IDEOGRAPHIC_BOTTOM</code>; for all others it is <code>TextBaseline.ROMAN</code>.
		 * The offset from the top inset (or right inset if <code>blockProgression</code> is RL) of the container to the baseline of the first line can be either <code>BaselineOffset.ASCENT</code>, meaning equal to the ascent of the line, <code>BaselineOffset.LINE_HEIGHT</code>, meaning equal to the height of that first line, or any fixed-value number to specify an absolute distance. <code>BaselineOffset.AUTO</code> aligns the ascent of the line with the container top inset.<p><img src='../../../images/textLayout_FBO1.png' alt='firstBaselineOffset1' /><img src='../../../images/textLayout_FBO2.png' alt='firstBaselineOffset2' /><img src='../../../images/textLayout_FBO3.png' alt='firstBaselineOffset3' /><img src='../../../images/textLayout_FBO4.png' alt='firstBaselineOffset4' /></p>
		 * <p>Legal values as a string are flashx.textLayout.formats.BaselineOffset.AUTO, flashx.textLayout.formats.BaselineOffset.ASCENT, flashx.textLayout.formats.BaselineOffset.LINE_HEIGHT, flashx.textLayout.formats.FormatValue.INHERIT and numbers from 0 to 1000.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of AUTO.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.BaselineOffset
		 */
		public function get firstBaselineOffset():*
		{ return _firstBaselineOffset; }
		public function set firstBaselineOffset(newValue:*):void
		{ _firstBaselineOffset = _firstBaselineOffsetProperty.setHelper(_firstBaselineOffset,newValue); }

		/**
		 * Vertical alignment or justification (adopts default value if undefined during cascade).
		 * Determines how TextFlow elements align within the container.
		 * <p>Legal values are flashx.textLayout.formats.VerticalAlign.TOP, flashx.textLayout.formats.VerticalAlign.MIDDLE, flashx.textLayout.formats.VerticalAlign.BOTTOM, flashx.textLayout.formats.VerticalAlign.JUSTIFY, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of TOP.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.VerticalAlign
		 */
		public function get verticalAlign():*
		{ return _verticalAlign; }
		public function set verticalAlign(newValue:*):void
		{ _verticalAlign = _verticalAlignProperty.setHelper(_verticalAlign,newValue); }

		/**
		 * Specifies a vertical or horizontal progression of line placement.
		 * Lines are either placed top-to-bottom (<code>BlockProgression.TB</code>, used for horizontal text) or right-to-left (<code>BlockProgression.RL</code>, used for vertical text).
		 * <p>Legal values are flashx.textLayout.formats.BlockProgression.RL, flashx.textLayout.formats.BlockProgression.TB, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will inherit its value from an ancestor. If no ancestor has set this property, it will have a value of TB.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.BlockProgression
		 */
		public function get blockProgression():*
		{ return _blockProgression; }
		public function set blockProgression(newValue:*):void
		{ _blockProgression = _blockProgressionProperty.setHelper(_blockProgression,newValue); }

		/**
		 * Controls word wrapping within the container (adopts default value if undefined during cascade).
		 * Text in the container may be set to fit the width of the container (<code>LineBreak.TO_FIT</code>), or can be set to break only at explicit return or line feed characters (<code>LineBreak.EXPLICIT</code>).
		 * <p>Legal values are flashx.textLayout.formats.LineBreak.EXPLICIT, flashx.textLayout.formats.LineBreak.TO_FIT, flashx.textLayout.formats.FormatValue.INHERIT.</p>
		 * <p>Default value is undefined indicating not set.</p>
		 * <p>If undefined during the cascade this property will have a value of TO_FIT.</p>
		 * 
		 * @throws RangeError when set value is not within range for this property
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 * @see flashx.textLayout.formats.LineBreak
		 */
		public function get lineBreak():*
		{ return _lineBreak; }
		public function set lineBreak(newValue:*):void
		{ _lineBreak = _lineBreakProperty.setHelper(_lineBreak,newValue); }

		/**
		 * Creates a new TextLayoutFormat object. All settings are empty or, optionally, are initialized from the
		 * supplied <code>initialValues</code> object.
		 * 
		 * @param initialValues optional instance from which to copy initial values.
		 * 
		 * @see #defaultFormat
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function TextLayoutFormat(initialValues:ITextLayoutFormat = null)
		{
			if (initialValues)
				apply(initialValues)
		}

		/**
		 * Copies TextLayoutFormat settings from the <code>values</code> ITextLayoutFormat instance into this TextLayoutFormat object.
		 * If <code>values</code> is <code>null</code>, this TextLayoutFormat object is initialized with undefined values for all properties.
		 * @param values optional instance from which to copy values.
		 * 
		 * @includeExample examples\TextLayoutFormat_copyExample.as -noswf
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function copy(values:ITextLayoutFormat):void
		{
			 if (values == null)
				values = emptyTextLayoutFormat;
			this.color = values.color;
			this.backgroundColor = values.backgroundColor;
			this.lineThrough = values.lineThrough;
			this.textAlpha = values.textAlpha;
			this.backgroundAlpha = values.backgroundAlpha;
			this.fontSize = values.fontSize;
			this.baselineShift = values.baselineShift;
			this.trackingLeft = values.trackingLeft;
			this.trackingRight = values.trackingRight;
			this.lineHeight = values.lineHeight;
			this.breakOpportunity = values.breakOpportunity;
			this.digitCase = values.digitCase;
			this.digitWidth = values.digitWidth;
			this.dominantBaseline = values.dominantBaseline;
			this.kerning = values.kerning;
			this.ligatureLevel = values.ligatureLevel;
			this.alignmentBaseline = values.alignmentBaseline;
			this.locale = values.locale;
			this.typographicCase = values.typographicCase;
			this.fontFamily = values.fontFamily;
			this.textDecoration = values.textDecoration;
			this.fontWeight = values.fontWeight;
			this.fontStyle = values.fontStyle;
			this.whiteSpaceCollapse = values.whiteSpaceCollapse;
			this.renderingMode = values.renderingMode;
			this.cffHinting = values.cffHinting;
			this.fontLookup = values.fontLookup;
			this.textRotation = values.textRotation;
			this.textIndent = values.textIndent;
			this.paragraphStartIndent = values.paragraphStartIndent;
			this.paragraphEndIndent = values.paragraphEndIndent;
			this.paragraphSpaceBefore = values.paragraphSpaceBefore;
			this.paragraphSpaceAfter = values.paragraphSpaceAfter;
			this.textAlign = values.textAlign;
			this.textAlignLast = values.textAlignLast;
			this.textJustify = values.textJustify;
			this.justificationRule = values.justificationRule;
			this.justificationStyle = values.justificationStyle;
			this.direction = values.direction;
			this.tabStops = values.tabStops;
			this.leadingModel = values.leadingModel;
			this.columnGap = values.columnGap;
			this.paddingLeft = values.paddingLeft;
			this.paddingTop = values.paddingTop;
			this.paddingRight = values.paddingRight;
			this.paddingBottom = values.paddingBottom;
			this.columnCount = values.columnCount;
			this.columnWidth = values.columnWidth;
			this.firstBaselineOffset = values.firstBaselineOffset;
			this.verticalAlign = values.verticalAlign;
			this.blockProgression = values.blockProgression;
			this.lineBreak = values.lineBreak;
		}

		/**
		 * Concatenates the values of properties in the <code>incoming</code> ITextLayoutFormat instance
		 * with the values of this TextLayoutFormat object. In this (the receiving) TextLayoutFormat object, properties whose values are <code>FormatValue.INHERIT</code>,
		 * and inheriting properties whose values are <code>undefined</code> will get new values from the <code>incoming</code> object.
		 * Non-inheriting properties whose values are <code>undefined</code> will get their default values.
		 * All other property values will remain unmodified.
		 * 
		 * @param incoming instance from which values are concatenated.
		 * @see flashx.textLayout.formats.FormatValue#INHERIT
		 * 
		 * @includeExample examples\TextLayoutFormat_concatExample.as -noswf
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function concat(incoming:ITextLayoutFormat):void
		{
			var holder:TextLayoutFormatValueHolder = incoming as TextLayoutFormatValueHolder;
			if (holder)
			{
					for (var key:String in holder.coreStyles)
					{
						this[key] = description[key].concatHelper(this[key],holder.coreStyles[key]);
				}
				return;
			}
			this.color = _colorProperty.concatHelper(this.color, incoming.color);
			this.backgroundColor = _backgroundColorProperty.concatHelper(this.backgroundColor, incoming.backgroundColor);
			this.lineThrough = _lineThroughProperty.concatHelper(this.lineThrough, incoming.lineThrough);
			this.textAlpha = _textAlphaProperty.concatHelper(this.textAlpha, incoming.textAlpha);
			this.backgroundAlpha = _backgroundAlphaProperty.concatHelper(this.backgroundAlpha, incoming.backgroundAlpha);
			this.fontSize = _fontSizeProperty.concatHelper(this.fontSize, incoming.fontSize);
			this.baselineShift = _baselineShiftProperty.concatHelper(this.baselineShift, incoming.baselineShift);
			this.trackingLeft = _trackingLeftProperty.concatHelper(this.trackingLeft, incoming.trackingLeft);
			this.trackingRight = _trackingRightProperty.concatHelper(this.trackingRight, incoming.trackingRight);
			this.lineHeight = _lineHeightProperty.concatHelper(this.lineHeight, incoming.lineHeight);
			this.breakOpportunity = _breakOpportunityProperty.concatHelper(this.breakOpportunity, incoming.breakOpportunity);
			this.digitCase = _digitCaseProperty.concatHelper(this.digitCase, incoming.digitCase);
			this.digitWidth = _digitWidthProperty.concatHelper(this.digitWidth, incoming.digitWidth);
			this.dominantBaseline = _dominantBaselineProperty.concatHelper(this.dominantBaseline, incoming.dominantBaseline);
			this.kerning = _kerningProperty.concatHelper(this.kerning, incoming.kerning);
			this.ligatureLevel = _ligatureLevelProperty.concatHelper(this.ligatureLevel, incoming.ligatureLevel);
			this.alignmentBaseline = _alignmentBaselineProperty.concatHelper(this.alignmentBaseline, incoming.alignmentBaseline);
			this.locale = _localeProperty.concatHelper(this.locale, incoming.locale);
			this.typographicCase = _typographicCaseProperty.concatHelper(this.typographicCase, incoming.typographicCase);
			this.fontFamily = _fontFamilyProperty.concatHelper(this.fontFamily, incoming.fontFamily);
			this.textDecoration = _textDecorationProperty.concatHelper(this.textDecoration, incoming.textDecoration);
			this.fontWeight = _fontWeightProperty.concatHelper(this.fontWeight, incoming.fontWeight);
			this.fontStyle = _fontStyleProperty.concatHelper(this.fontStyle, incoming.fontStyle);
			this.whiteSpaceCollapse = _whiteSpaceCollapseProperty.concatHelper(this.whiteSpaceCollapse, incoming.whiteSpaceCollapse);
			this.renderingMode = _renderingModeProperty.concatHelper(this.renderingMode, incoming.renderingMode);
			this.cffHinting = _cffHintingProperty.concatHelper(this.cffHinting, incoming.cffHinting);
			this.fontLookup = _fontLookupProperty.concatHelper(this.fontLookup, incoming.fontLookup);
			this.textRotation = _textRotationProperty.concatHelper(this.textRotation, incoming.textRotation);
			this.textIndent = _textIndentProperty.concatHelper(this.textIndent, incoming.textIndent);
			this.paragraphStartIndent = _paragraphStartIndentProperty.concatHelper(this.paragraphStartIndent, incoming.paragraphStartIndent);
			this.paragraphEndIndent = _paragraphEndIndentProperty.concatHelper(this.paragraphEndIndent, incoming.paragraphEndIndent);
			this.paragraphSpaceBefore = _paragraphSpaceBeforeProperty.concatHelper(this.paragraphSpaceBefore, incoming.paragraphSpaceBefore);
			this.paragraphSpaceAfter = _paragraphSpaceAfterProperty.concatHelper(this.paragraphSpaceAfter, incoming.paragraphSpaceAfter);
			this.textAlign = _textAlignProperty.concatHelper(this.textAlign, incoming.textAlign);
			this.textAlignLast = _textAlignLastProperty.concatHelper(this.textAlignLast, incoming.textAlignLast);
			this.textJustify = _textJustifyProperty.concatHelper(this.textJustify, incoming.textJustify);
			this.justificationRule = _justificationRuleProperty.concatHelper(this.justificationRule, incoming.justificationRule);
			this.justificationStyle = _justificationStyleProperty.concatHelper(this.justificationStyle, incoming.justificationStyle);
			this.direction = _directionProperty.concatHelper(this.direction, incoming.direction);
			this.tabStops = _tabStopsProperty.concatHelper(this.tabStops, incoming.tabStops);
			this.leadingModel = _leadingModelProperty.concatHelper(this.leadingModel, incoming.leadingModel);
			this.columnGap = _columnGapProperty.concatHelper(this.columnGap, incoming.columnGap);
			this.paddingLeft = _paddingLeftProperty.concatHelper(this.paddingLeft, incoming.paddingLeft);
			this.paddingTop = _paddingTopProperty.concatHelper(this.paddingTop, incoming.paddingTop);
			this.paddingRight = _paddingRightProperty.concatHelper(this.paddingRight, incoming.paddingRight);
			this.paddingBottom = _paddingBottomProperty.concatHelper(this.paddingBottom, incoming.paddingBottom);
			this.columnCount = _columnCountProperty.concatHelper(this.columnCount, incoming.columnCount);
			this.columnWidth = _columnWidthProperty.concatHelper(this.columnWidth, incoming.columnWidth);
			this.firstBaselineOffset = _firstBaselineOffsetProperty.concatHelper(this.firstBaselineOffset, incoming.firstBaselineOffset);
			this.verticalAlign = _verticalAlignProperty.concatHelper(this.verticalAlign, incoming.verticalAlign);
			this.blockProgression = _blockProgressionProperty.concatHelper(this.blockProgression, incoming.blockProgression);
			this.lineBreak = _lineBreakProperty.concatHelper(this.lineBreak, incoming.lineBreak);
		}

		/**
		 * Concatenates the values of properties in the <code>incoming</code> ITextLayoutFormat instance
		 * with the values of this TextLayoutFormat object. In this (the receiving) TextLayoutFormat object, properties whose values are <code>FormatValue.INHERIT</code>,
		 * and inheriting properties whose values are <code>undefined</code> will get new values from the <code>incoming</code> object.
		 * All other property values will remain unmodified.
		 * 
		 * @param incoming instance from which values are concatenated.
		 * @see flashx.textLayout.formats.FormatValue#INHERIT
		 * 
		 * @includeExample examples\TextLayoutFormat_concatInheritOnlyExample.as -noswf
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function concatInheritOnly(incoming:ITextLayoutFormat):void
		{
			var holder:TextLayoutFormatValueHolder = incoming as TextLayoutFormatValueHolder;
			if (holder)
			{
					for (var key:String in holder.coreStyles)
					{
						this[key] = description[key].concatInheritOnlyHelper(this[key],holder.coreStyles[key]);
				}
				return;
			}
			this.color = _colorProperty.concatInheritOnlyHelper(this.color, incoming.color);
			this.backgroundColor = _backgroundColorProperty.concatInheritOnlyHelper(this.backgroundColor, incoming.backgroundColor);
			this.lineThrough = _lineThroughProperty.concatInheritOnlyHelper(this.lineThrough, incoming.lineThrough);
			this.textAlpha = _textAlphaProperty.concatInheritOnlyHelper(this.textAlpha, incoming.textAlpha);
			this.backgroundAlpha = _backgroundAlphaProperty.concatInheritOnlyHelper(this.backgroundAlpha, incoming.backgroundAlpha);
			this.fontSize = _fontSizeProperty.concatInheritOnlyHelper(this.fontSize, incoming.fontSize);
			this.baselineShift = _baselineShiftProperty.concatInheritOnlyHelper(this.baselineShift, incoming.baselineShift);
			this.trackingLeft = _trackingLeftProperty.concatInheritOnlyHelper(this.trackingLeft, incoming.trackingLeft);
			this.trackingRight = _trackingRightProperty.concatInheritOnlyHelper(this.trackingRight, incoming.trackingRight);
			this.lineHeight = _lineHeightProperty.concatInheritOnlyHelper(this.lineHeight, incoming.lineHeight);
			this.breakOpportunity = _breakOpportunityProperty.concatInheritOnlyHelper(this.breakOpportunity, incoming.breakOpportunity);
			this.digitCase = _digitCaseProperty.concatInheritOnlyHelper(this.digitCase, incoming.digitCase);
			this.digitWidth = _digitWidthProperty.concatInheritOnlyHelper(this.digitWidth, incoming.digitWidth);
			this.dominantBaseline = _dominantBaselineProperty.concatInheritOnlyHelper(this.dominantBaseline, incoming.dominantBaseline);
			this.kerning = _kerningProperty.concatInheritOnlyHelper(this.kerning, incoming.kerning);
			this.ligatureLevel = _ligatureLevelProperty.concatInheritOnlyHelper(this.ligatureLevel, incoming.ligatureLevel);
			this.alignmentBaseline = _alignmentBaselineProperty.concatInheritOnlyHelper(this.alignmentBaseline, incoming.alignmentBaseline);
			this.locale = _localeProperty.concatInheritOnlyHelper(this.locale, incoming.locale);
			this.typographicCase = _typographicCaseProperty.concatInheritOnlyHelper(this.typographicCase, incoming.typographicCase);
			this.fontFamily = _fontFamilyProperty.concatInheritOnlyHelper(this.fontFamily, incoming.fontFamily);
			this.textDecoration = _textDecorationProperty.concatInheritOnlyHelper(this.textDecoration, incoming.textDecoration);
			this.fontWeight = _fontWeightProperty.concatInheritOnlyHelper(this.fontWeight, incoming.fontWeight);
			this.fontStyle = _fontStyleProperty.concatInheritOnlyHelper(this.fontStyle, incoming.fontStyle);
			this.whiteSpaceCollapse = _whiteSpaceCollapseProperty.concatInheritOnlyHelper(this.whiteSpaceCollapse, incoming.whiteSpaceCollapse);
			this.renderingMode = _renderingModeProperty.concatInheritOnlyHelper(this.renderingMode, incoming.renderingMode);
			this.cffHinting = _cffHintingProperty.concatInheritOnlyHelper(this.cffHinting, incoming.cffHinting);
			this.fontLookup = _fontLookupProperty.concatInheritOnlyHelper(this.fontLookup, incoming.fontLookup);
			this.textRotation = _textRotationProperty.concatInheritOnlyHelper(this.textRotation, incoming.textRotation);
			this.textIndent = _textIndentProperty.concatInheritOnlyHelper(this.textIndent, incoming.textIndent);
			this.paragraphStartIndent = _paragraphStartIndentProperty.concatInheritOnlyHelper(this.paragraphStartIndent, incoming.paragraphStartIndent);
			this.paragraphEndIndent = _paragraphEndIndentProperty.concatInheritOnlyHelper(this.paragraphEndIndent, incoming.paragraphEndIndent);
			this.paragraphSpaceBefore = _paragraphSpaceBeforeProperty.concatInheritOnlyHelper(this.paragraphSpaceBefore, incoming.paragraphSpaceBefore);
			this.paragraphSpaceAfter = _paragraphSpaceAfterProperty.concatInheritOnlyHelper(this.paragraphSpaceAfter, incoming.paragraphSpaceAfter);
			this.textAlign = _textAlignProperty.concatInheritOnlyHelper(this.textAlign, incoming.textAlign);
			this.textAlignLast = _textAlignLastProperty.concatInheritOnlyHelper(this.textAlignLast, incoming.textAlignLast);
			this.textJustify = _textJustifyProperty.concatInheritOnlyHelper(this.textJustify, incoming.textJustify);
			this.justificationRule = _justificationRuleProperty.concatInheritOnlyHelper(this.justificationRule, incoming.justificationRule);
			this.justificationStyle = _justificationStyleProperty.concatInheritOnlyHelper(this.justificationStyle, incoming.justificationStyle);
			this.direction = _directionProperty.concatInheritOnlyHelper(this.direction, incoming.direction);
			this.tabStops = _tabStopsProperty.concatInheritOnlyHelper(this.tabStops, incoming.tabStops);
			this.leadingModel = _leadingModelProperty.concatInheritOnlyHelper(this.leadingModel, incoming.leadingModel);
			this.columnGap = _columnGapProperty.concatInheritOnlyHelper(this.columnGap, incoming.columnGap);
			this.paddingLeft = _paddingLeftProperty.concatInheritOnlyHelper(this.paddingLeft, incoming.paddingLeft);
			this.paddingTop = _paddingTopProperty.concatInheritOnlyHelper(this.paddingTop, incoming.paddingTop);
			this.paddingRight = _paddingRightProperty.concatInheritOnlyHelper(this.paddingRight, incoming.paddingRight);
			this.paddingBottom = _paddingBottomProperty.concatInheritOnlyHelper(this.paddingBottom, incoming.paddingBottom);
			this.columnCount = _columnCountProperty.concatInheritOnlyHelper(this.columnCount, incoming.columnCount);
			this.columnWidth = _columnWidthProperty.concatInheritOnlyHelper(this.columnWidth, incoming.columnWidth);
			this.firstBaselineOffset = _firstBaselineOffsetProperty.concatInheritOnlyHelper(this.firstBaselineOffset, incoming.firstBaselineOffset);
			this.verticalAlign = _verticalAlignProperty.concatInheritOnlyHelper(this.verticalAlign, incoming.verticalAlign);
			this.blockProgression = _blockProgressionProperty.concatInheritOnlyHelper(this.blockProgression, incoming.blockProgression);
			this.lineBreak = _lineBreakProperty.concatInheritOnlyHelper(this.lineBreak, incoming.lineBreak);
		}

		/**
		 * Replaces property values in this TextLayoutFormat object with the values of properties that are set in
		 * the <code>incoming</code> ITextLayoutFormat instance. Properties that are <code>undefined</code> in the <code>incoming</code>
		 * ITextLayoutFormat instance are not changed in this object.
		 * 
		 * @param incoming instance whose property values are applied to this TextLayoutFormat object.
		 * 
		 * @includeExample examples\TextLayoutFormat_applyExample.as -noswf
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function apply(incoming:ITextLayoutFormat):void
		{
			var val:*;

			var holder:TextLayoutFormatValueHolder = incoming as TextLayoutFormatValueHolder;
			if (holder)
			{
					for (var key:String in holder.coreStyles)
					{
						CONFIG::debug { assert(holder.coreStyles[key] !== undefined,"bad value in apply"); }
						this[key] = holder.coreStyles[key];
				}
				return;
			}

			if ((val = incoming.color) !== undefined)
				this.color = val;
			if ((val = incoming.backgroundColor) !== undefined)
				this.backgroundColor = val;
			if ((val = incoming.lineThrough) !== undefined)
				this.lineThrough = val;
			if ((val = incoming.textAlpha) !== undefined)
				this.textAlpha = val;
			if ((val = incoming.backgroundAlpha) !== undefined)
				this.backgroundAlpha = val;
			if ((val = incoming.fontSize) !== undefined)
				this.fontSize = val;
			if ((val = incoming.baselineShift) !== undefined)
				this.baselineShift = val;
			if ((val = incoming.trackingLeft) !== undefined)
				this.trackingLeft = val;
			if ((val = incoming.trackingRight) !== undefined)
				this.trackingRight = val;
			if ((val = incoming.lineHeight) !== undefined)
				this.lineHeight = val;
			if ((val = incoming.breakOpportunity) !== undefined)
				this.breakOpportunity = val;
			if ((val = incoming.digitCase) !== undefined)
				this.digitCase = val;
			if ((val = incoming.digitWidth) !== undefined)
				this.digitWidth = val;
			if ((val = incoming.dominantBaseline) !== undefined)
				this.dominantBaseline = val;
			if ((val = incoming.kerning) !== undefined)
				this.kerning = val;
			if ((val = incoming.ligatureLevel) !== undefined)
				this.ligatureLevel = val;
			if ((val = incoming.alignmentBaseline) !== undefined)
				this.alignmentBaseline = val;
			if ((val = incoming.locale) !== undefined)
				this.locale = val;
			if ((val = incoming.typographicCase) !== undefined)
				this.typographicCase = val;
			if ((val = incoming.fontFamily) !== undefined)
				this.fontFamily = val;
			if ((val = incoming.textDecoration) !== undefined)
				this.textDecoration = val;
			if ((val = incoming.fontWeight) !== undefined)
				this.fontWeight = val;
			if ((val = incoming.fontStyle) !== undefined)
				this.fontStyle = val;
			if ((val = incoming.whiteSpaceCollapse) !== undefined)
				this.whiteSpaceCollapse = val;
			if ((val = incoming.renderingMode) !== undefined)
				this.renderingMode = val;
			if ((val = incoming.cffHinting) !== undefined)
				this.cffHinting = val;
			if ((val = incoming.fontLookup) !== undefined)
				this.fontLookup = val;
			if ((val = incoming.textRotation) !== undefined)
				this.textRotation = val;
			if ((val = incoming.textIndent) !== undefined)
				this.textIndent = val;
			if ((val = incoming.paragraphStartIndent) !== undefined)
				this.paragraphStartIndent = val;
			if ((val = incoming.paragraphEndIndent) !== undefined)
				this.paragraphEndIndent = val;
			if ((val = incoming.paragraphSpaceBefore) !== undefined)
				this.paragraphSpaceBefore = val;
			if ((val = incoming.paragraphSpaceAfter) !== undefined)
				this.paragraphSpaceAfter = val;
			if ((val = incoming.textAlign) !== undefined)
				this.textAlign = val;
			if ((val = incoming.textAlignLast) !== undefined)
				this.textAlignLast = val;
			if ((val = incoming.textJustify) !== undefined)
				this.textJustify = val;
			if ((val = incoming.justificationRule) !== undefined)
				this.justificationRule = val;
			if ((val = incoming.justificationStyle) !== undefined)
				this.justificationStyle = val;
			if ((val = incoming.direction) !== undefined)
				this.direction = val;
			if ((val = incoming.tabStops) !== undefined)
				this.tabStops = val;
			if ((val = incoming.leadingModel) !== undefined)
				this.leadingModel = val;
			if ((val = incoming.columnGap) !== undefined)
				this.columnGap = val;
			if ((val = incoming.paddingLeft) !== undefined)
				this.paddingLeft = val;
			if ((val = incoming.paddingTop) !== undefined)
				this.paddingTop = val;
			if ((val = incoming.paddingRight) !== undefined)
				this.paddingRight = val;
			if ((val = incoming.paddingBottom) !== undefined)
				this.paddingBottom = val;
			if ((val = incoming.columnCount) !== undefined)
				this.columnCount = val;
			if ((val = incoming.columnWidth) !== undefined)
				this.columnWidth = val;
			if ((val = incoming.firstBaselineOffset) !== undefined)
				this.firstBaselineOffset = val;
			if ((val = incoming.verticalAlign) !== undefined)
				this.verticalAlign = val;
			if ((val = incoming.blockProgression) !== undefined)
				this.blockProgression = val;
			if ((val = incoming.lineBreak) !== undefined)
				this.lineBreak = val;
		}

		/**
		 * Compares properties in ITextLayoutFormat instance <code>p1</code> with properties in ITextLayoutFormat instance <code>p2</code>
		 * and returns <code>true</code> if all properties match.
		 * 
		 * @param p1 instance to compare to <code>p2</code>.
		 * @param p2 instance to compare to <code>p1</code>.
		 * 
		 * @return true if all properties match, false otherwise.
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		static public function isEqual(p1:ITextLayoutFormat,p2:ITextLayoutFormat):Boolean
		{
			if (p1 == null)
				p1 = emptyTextLayoutFormat;
			if (p2 == null)
				p2 = emptyTextLayoutFormat;
			if (p1 == p2)
				return true;
			var p1Holder:TextLayoutFormatValueHolder = p1 as TextLayoutFormatValueHolder;
			var p2Holder:TextLayoutFormatValueHolder = p2 as TextLayoutFormatValueHolder;
			if (p1Holder && p2Holder)
				return Property.equalCoreStyles(p1Holder.coreStyles,p2Holder.coreStyles,TextLayoutFormat.description);

			if (!_colorProperty.equalHelper(p1.color, p2.color))
				return false;
			if (!_backgroundColorProperty.equalHelper(p1.backgroundColor, p2.backgroundColor))
				return false;
			if (!_lineThroughProperty.equalHelper(p1.lineThrough, p2.lineThrough))
				return false;
			if (!_textAlphaProperty.equalHelper(p1.textAlpha, p2.textAlpha))
				return false;
			if (!_backgroundAlphaProperty.equalHelper(p1.backgroundAlpha, p2.backgroundAlpha))
				return false;
			if (!_fontSizeProperty.equalHelper(p1.fontSize, p2.fontSize))
				return false;
			if (!_baselineShiftProperty.equalHelper(p1.baselineShift, p2.baselineShift))
				return false;
			if (!_trackingLeftProperty.equalHelper(p1.trackingLeft, p2.trackingLeft))
				return false;
			if (!_trackingRightProperty.equalHelper(p1.trackingRight, p2.trackingRight))
				return false;
			if (!_lineHeightProperty.equalHelper(p1.lineHeight, p2.lineHeight))
				return false;
			if (!_breakOpportunityProperty.equalHelper(p1.breakOpportunity, p2.breakOpportunity))
				return false;
			if (!_digitCaseProperty.equalHelper(p1.digitCase, p2.digitCase))
				return false;
			if (!_digitWidthProperty.equalHelper(p1.digitWidth, p2.digitWidth))
				return false;
			if (!_dominantBaselineProperty.equalHelper(p1.dominantBaseline, p2.dominantBaseline))
				return false;
			if (!_kerningProperty.equalHelper(p1.kerning, p2.kerning))
				return false;
			if (!_ligatureLevelProperty.equalHelper(p1.ligatureLevel, p2.ligatureLevel))
				return false;
			if (!_alignmentBaselineProperty.equalHelper(p1.alignmentBaseline, p2.alignmentBaseline))
				return false;
			if (!_localeProperty.equalHelper(p1.locale, p2.locale))
				return false;
			if (!_typographicCaseProperty.equalHelper(p1.typographicCase, p2.typographicCase))
				return false;
			if (!_fontFamilyProperty.equalHelper(p1.fontFamily, p2.fontFamily))
				return false;
			if (!_textDecorationProperty.equalHelper(p1.textDecoration, p2.textDecoration))
				return false;
			if (!_fontWeightProperty.equalHelper(p1.fontWeight, p2.fontWeight))
				return false;
			if (!_fontStyleProperty.equalHelper(p1.fontStyle, p2.fontStyle))
				return false;
			if (!_whiteSpaceCollapseProperty.equalHelper(p1.whiteSpaceCollapse, p2.whiteSpaceCollapse))
				return false;
			if (!_renderingModeProperty.equalHelper(p1.renderingMode, p2.renderingMode))
				return false;
			if (!_cffHintingProperty.equalHelper(p1.cffHinting, p2.cffHinting))
				return false;
			if (!_fontLookupProperty.equalHelper(p1.fontLookup, p2.fontLookup))
				return false;
			if (!_textRotationProperty.equalHelper(p1.textRotation, p2.textRotation))
				return false;
			if (!_textIndentProperty.equalHelper(p1.textIndent, p2.textIndent))
				return false;
			if (!_paragraphStartIndentProperty.equalHelper(p1.paragraphStartIndent, p2.paragraphStartIndent))
				return false;
			if (!_paragraphEndIndentProperty.equalHelper(p1.paragraphEndIndent, p2.paragraphEndIndent))
				return false;
			if (!_paragraphSpaceBeforeProperty.equalHelper(p1.paragraphSpaceBefore, p2.paragraphSpaceBefore))
				return false;
			if (!_paragraphSpaceAfterProperty.equalHelper(p1.paragraphSpaceAfter, p2.paragraphSpaceAfter))
				return false;
			if (!_textAlignProperty.equalHelper(p1.textAlign, p2.textAlign))
				return false;
			if (!_textAlignLastProperty.equalHelper(p1.textAlignLast, p2.textAlignLast))
				return false;
			if (!_textJustifyProperty.equalHelper(p1.textJustify, p2.textJustify))
				return false;
			if (!_justificationRuleProperty.equalHelper(p1.justificationRule, p2.justificationRule))
				return false;
			if (!_justificationStyleProperty.equalHelper(p1.justificationStyle, p2.justificationStyle))
				return false;
			if (!_directionProperty.equalHelper(p1.direction, p2.direction))
				return false;
			if (!_tabStopsProperty.equalHelper(p1.tabStops, p2.tabStops))
				return false;
			if (!_leadingModelProperty.equalHelper(p1.leadingModel, p2.leadingModel))
				return false;
			if (!_columnGapProperty.equalHelper(p1.columnGap, p2.columnGap))
				return false;
			if (!_paddingLeftProperty.equalHelper(p1.paddingLeft, p2.paddingLeft))
				return false;
			if (!_paddingTopProperty.equalHelper(p1.paddingTop, p2.paddingTop))
				return false;
			if (!_paddingRightProperty.equalHelper(p1.paddingRight, p2.paddingRight))
				return false;
			if (!_paddingBottomProperty.equalHelper(p1.paddingBottom, p2.paddingBottom))
				return false;
			if (!_columnCountProperty.equalHelper(p1.columnCount, p2.columnCount))
				return false;
			if (!_columnWidthProperty.equalHelper(p1.columnWidth, p2.columnWidth))
				return false;
			if (!_firstBaselineOffsetProperty.equalHelper(p1.firstBaselineOffset, p2.firstBaselineOffset))
				return false;
			if (!_verticalAlignProperty.equalHelper(p1.verticalAlign, p2.verticalAlign))
				return false;
			if (!_blockProgressionProperty.equalHelper(p1.blockProgression, p2.blockProgression))
				return false;
			if (!_lineBreakProperty.equalHelper(p1.lineBreak, p2.lineBreak))
				return false;

			return true;
		}

		/**
		 * Sets properties in this TextLayoutFormat object to <code>undefined</code> if they match those in the <code>incoming</code>
		 * ITextLayoutFormat instance.
		 * 
		 * @param incoming instance against which to compare this TextLayoutFormat object's property values.
		 * 
		 * @includeExample examples\TextLayoutFormat_removeMatchingExample.as -noswf
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function removeMatching(incoming:ITextLayoutFormat):void
		{
			if (incoming == null)
				return;

			var holder:TextLayoutFormatValueHolder = incoming as TextLayoutFormatValueHolder;
			if (holder)
			{
					for (var key:String in holder.coreStyles)
					{
						CONFIG::debug { assert(holder.coreStyles[key] !== undefined,"bad value in removeMatching"); }
						if (description[key].equalHelper(this[key],holder.coreStyles[key]))
							this[key] = undefined;
				}
				return;
			}

			if (_colorProperty.equalHelper(this.color, incoming.color))
				this.color = undefined;
			if (_backgroundColorProperty.equalHelper(this.backgroundColor, incoming.backgroundColor))
				this.backgroundColor = undefined;
			if (_lineThroughProperty.equalHelper(this.lineThrough, incoming.lineThrough))
				this.lineThrough = undefined;
			if (_textAlphaProperty.equalHelper(this.textAlpha, incoming.textAlpha))
				this.textAlpha = undefined;
			if (_backgroundAlphaProperty.equalHelper(this.backgroundAlpha, incoming.backgroundAlpha))
				this.backgroundAlpha = undefined;
			if (_fontSizeProperty.equalHelper(this.fontSize, incoming.fontSize))
				this.fontSize = undefined;
			if (_baselineShiftProperty.equalHelper(this.baselineShift, incoming.baselineShift))
				this.baselineShift = undefined;
			if (_trackingLeftProperty.equalHelper(this.trackingLeft, incoming.trackingLeft))
				this.trackingLeft = undefined;
			if (_trackingRightProperty.equalHelper(this.trackingRight, incoming.trackingRight))
				this.trackingRight = undefined;
			if (_lineHeightProperty.equalHelper(this.lineHeight, incoming.lineHeight))
				this.lineHeight = undefined;
			if (_breakOpportunityProperty.equalHelper(this.breakOpportunity, incoming.breakOpportunity))
				this.breakOpportunity = undefined;
			if (_digitCaseProperty.equalHelper(this.digitCase, incoming.digitCase))
				this.digitCase = undefined;
			if (_digitWidthProperty.equalHelper(this.digitWidth, incoming.digitWidth))
				this.digitWidth = undefined;
			if (_dominantBaselineProperty.equalHelper(this.dominantBaseline, incoming.dominantBaseline))
				this.dominantBaseline = undefined;
			if (_kerningProperty.equalHelper(this.kerning, incoming.kerning))
				this.kerning = undefined;
			if (_ligatureLevelProperty.equalHelper(this.ligatureLevel, incoming.ligatureLevel))
				this.ligatureLevel = undefined;
			if (_alignmentBaselineProperty.equalHelper(this.alignmentBaseline, incoming.alignmentBaseline))
				this.alignmentBaseline = undefined;
			if (_localeProperty.equalHelper(this.locale, incoming.locale))
				this.locale = undefined;
			if (_typographicCaseProperty.equalHelper(this.typographicCase, incoming.typographicCase))
				this.typographicCase = undefined;
			if (_fontFamilyProperty.equalHelper(this.fontFamily, incoming.fontFamily))
				this.fontFamily = undefined;
			if (_textDecorationProperty.equalHelper(this.textDecoration, incoming.textDecoration))
				this.textDecoration = undefined;
			if (_fontWeightProperty.equalHelper(this.fontWeight, incoming.fontWeight))
				this.fontWeight = undefined;
			if (_fontStyleProperty.equalHelper(this.fontStyle, incoming.fontStyle))
				this.fontStyle = undefined;
			if (_whiteSpaceCollapseProperty.equalHelper(this.whiteSpaceCollapse, incoming.whiteSpaceCollapse))
				this.whiteSpaceCollapse = undefined;
			if (_renderingModeProperty.equalHelper(this.renderingMode, incoming.renderingMode))
				this.renderingMode = undefined;
			if (_cffHintingProperty.equalHelper(this.cffHinting, incoming.cffHinting))
				this.cffHinting = undefined;
			if (_fontLookupProperty.equalHelper(this.fontLookup, incoming.fontLookup))
				this.fontLookup = undefined;
			if (_textRotationProperty.equalHelper(this.textRotation, incoming.textRotation))
				this.textRotation = undefined;
			if (_textIndentProperty.equalHelper(this.textIndent, incoming.textIndent))
				this.textIndent = undefined;
			if (_paragraphStartIndentProperty.equalHelper(this.paragraphStartIndent, incoming.paragraphStartIndent))
				this.paragraphStartIndent = undefined;
			if (_paragraphEndIndentProperty.equalHelper(this.paragraphEndIndent, incoming.paragraphEndIndent))
				this.paragraphEndIndent = undefined;
			if (_paragraphSpaceBeforeProperty.equalHelper(this.paragraphSpaceBefore, incoming.paragraphSpaceBefore))
				this.paragraphSpaceBefore = undefined;
			if (_paragraphSpaceAfterProperty.equalHelper(this.paragraphSpaceAfter, incoming.paragraphSpaceAfter))
				this.paragraphSpaceAfter = undefined;
			if (_textAlignProperty.equalHelper(this.textAlign, incoming.textAlign))
				this.textAlign = undefined;
			if (_textAlignLastProperty.equalHelper(this.textAlignLast, incoming.textAlignLast))
				this.textAlignLast = undefined;
			if (_textJustifyProperty.equalHelper(this.textJustify, incoming.textJustify))
				this.textJustify = undefined;
			if (_justificationRuleProperty.equalHelper(this.justificationRule, incoming.justificationRule))
				this.justificationRule = undefined;
			if (_justificationStyleProperty.equalHelper(this.justificationStyle, incoming.justificationStyle))
				this.justificationStyle = undefined;
			if (_directionProperty.equalHelper(this.direction, incoming.direction))
				this.direction = undefined;
			if (_tabStopsProperty.equalHelper(this.tabStops, incoming.tabStops))
				this.tabStops = undefined;
			if (_leadingModelProperty.equalHelper(this.leadingModel, incoming.leadingModel))
				this.leadingModel = undefined;
			if (_columnGapProperty.equalHelper(this.columnGap, incoming.columnGap))
				this.columnGap = undefined;
			if (_paddingLeftProperty.equalHelper(this.paddingLeft, incoming.paddingLeft))
				this.paddingLeft = undefined;
			if (_paddingTopProperty.equalHelper(this.paddingTop, incoming.paddingTop))
				this.paddingTop = undefined;
			if (_paddingRightProperty.equalHelper(this.paddingRight, incoming.paddingRight))
				this.paddingRight = undefined;
			if (_paddingBottomProperty.equalHelper(this.paddingBottom, incoming.paddingBottom))
				this.paddingBottom = undefined;
			if (_columnCountProperty.equalHelper(this.columnCount, incoming.columnCount))
				this.columnCount = undefined;
			if (_columnWidthProperty.equalHelper(this.columnWidth, incoming.columnWidth))
				this.columnWidth = undefined;
			if (_firstBaselineOffsetProperty.equalHelper(this.firstBaselineOffset, incoming.firstBaselineOffset))
				this.firstBaselineOffset = undefined;
			if (_verticalAlignProperty.equalHelper(this.verticalAlign, incoming.verticalAlign))
				this.verticalAlign = undefined;
			if (_blockProgressionProperty.equalHelper(this.blockProgression, incoming.blockProgression))
				this.blockProgression = undefined;
			if (_lineBreakProperty.equalHelper(this.lineBreak, incoming.lineBreak))
				this.lineBreak = undefined;
		}

		/**
		 * Sets properties in this TextLayoutFormat object to <code>undefined</code> if they do not match those in the
		 * <code>incoming</code> ITextLayoutFormat instance.
		 * 
		 * @param incoming instance against which to compare this TextLayoutFormat object's property values.
		 * 
		 * @includeExample examples\TextLayoutFormat_removeClashingExample.as -noswf
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		public function removeClashing(incoming:ITextLayoutFormat):void
		{
			if (incoming == null)
				return;

			var holder:TextLayoutFormatValueHolder = incoming as TextLayoutFormatValueHolder;
			if (holder)
			{
					for (var key:String in holder.coreStyles)
					{
						CONFIG::debug { assert(holder.coreStyles[key] !== undefined,"bad value in removeClashing"); }
						if (!description[key].equalHelper(this[key],holder.coreStyles[key]))
							this[key] = undefined;
				}
				return;
			}

			if (!_colorProperty.equalHelper(this.color, incoming.color))
				this.color = undefined;
			if (!_backgroundColorProperty.equalHelper(this.backgroundColor, incoming.backgroundColor))
				this.backgroundColor = undefined;
			if (!_lineThroughProperty.equalHelper(this.lineThrough, incoming.lineThrough))
				this.lineThrough = undefined;
			if (!_textAlphaProperty.equalHelper(this.textAlpha, incoming.textAlpha))
				this.textAlpha = undefined;
			if (!_backgroundAlphaProperty.equalHelper(this.backgroundAlpha, incoming.backgroundAlpha))
				this.backgroundAlpha = undefined;
			if (!_fontSizeProperty.equalHelper(this.fontSize, incoming.fontSize))
				this.fontSize = undefined;
			if (!_baselineShiftProperty.equalHelper(this.baselineShift, incoming.baselineShift))
				this.baselineShift = undefined;
			if (!_trackingLeftProperty.equalHelper(this.trackingLeft, incoming.trackingLeft))
				this.trackingLeft = undefined;
			if (!_trackingRightProperty.equalHelper(this.trackingRight, incoming.trackingRight))
				this.trackingRight = undefined;
			if (!_lineHeightProperty.equalHelper(this.lineHeight, incoming.lineHeight))
				this.lineHeight = undefined;
			if (!_breakOpportunityProperty.equalHelper(this.breakOpportunity, incoming.breakOpportunity))
				this.breakOpportunity = undefined;
			if (!_digitCaseProperty.equalHelper(this.digitCase, incoming.digitCase))
				this.digitCase = undefined;
			if (!_digitWidthProperty.equalHelper(this.digitWidth, incoming.digitWidth))
				this.digitWidth = undefined;
			if (!_dominantBaselineProperty.equalHelper(this.dominantBaseline, incoming.dominantBaseline))
				this.dominantBaseline = undefined;
			if (!_kerningProperty.equalHelper(this.kerning, incoming.kerning))
				this.kerning = undefined;
			if (!_ligatureLevelProperty.equalHelper(this.ligatureLevel, incoming.ligatureLevel))
				this.ligatureLevel = undefined;
			if (!_alignmentBaselineProperty.equalHelper(this.alignmentBaseline, incoming.alignmentBaseline))
				this.alignmentBaseline = undefined;
			if (!_localeProperty.equalHelper(this.locale, incoming.locale))
				this.locale = undefined;
			if (!_typographicCaseProperty.equalHelper(this.typographicCase, incoming.typographicCase))
				this.typographicCase = undefined;
			if (!_fontFamilyProperty.equalHelper(this.fontFamily, incoming.fontFamily))
				this.fontFamily = undefined;
			if (!_textDecorationProperty.equalHelper(this.textDecoration, incoming.textDecoration))
				this.textDecoration = undefined;
			if (!_fontWeightProperty.equalHelper(this.fontWeight, incoming.fontWeight))
				this.fontWeight = undefined;
			if (!_fontStyleProperty.equalHelper(this.fontStyle, incoming.fontStyle))
				this.fontStyle = undefined;
			if (!_whiteSpaceCollapseProperty.equalHelper(this.whiteSpaceCollapse, incoming.whiteSpaceCollapse))
				this.whiteSpaceCollapse = undefined;
			if (!_renderingModeProperty.equalHelper(this.renderingMode, incoming.renderingMode))
				this.renderingMode = undefined;
			if (!_cffHintingProperty.equalHelper(this.cffHinting, incoming.cffHinting))
				this.cffHinting = undefined;
			if (!_fontLookupProperty.equalHelper(this.fontLookup, incoming.fontLookup))
				this.fontLookup = undefined;
			if (!_textRotationProperty.equalHelper(this.textRotation, incoming.textRotation))
				this.textRotation = undefined;
			if (!_textIndentProperty.equalHelper(this.textIndent, incoming.textIndent))
				this.textIndent = undefined;
			if (!_paragraphStartIndentProperty.equalHelper(this.paragraphStartIndent, incoming.paragraphStartIndent))
				this.paragraphStartIndent = undefined;
			if (!_paragraphEndIndentProperty.equalHelper(this.paragraphEndIndent, incoming.paragraphEndIndent))
				this.paragraphEndIndent = undefined;
			if (!_paragraphSpaceBeforeProperty.equalHelper(this.paragraphSpaceBefore, incoming.paragraphSpaceBefore))
				this.paragraphSpaceBefore = undefined;
			if (!_paragraphSpaceAfterProperty.equalHelper(this.paragraphSpaceAfter, incoming.paragraphSpaceAfter))
				this.paragraphSpaceAfter = undefined;
			if (!_textAlignProperty.equalHelper(this.textAlign, incoming.textAlign))
				this.textAlign = undefined;
			if (!_textAlignLastProperty.equalHelper(this.textAlignLast, incoming.textAlignLast))
				this.textAlignLast = undefined;
			if (!_textJustifyProperty.equalHelper(this.textJustify, incoming.textJustify))
				this.textJustify = undefined;
			if (!_justificationRuleProperty.equalHelper(this.justificationRule, incoming.justificationRule))
				this.justificationRule = undefined;
			if (!_justificationStyleProperty.equalHelper(this.justificationStyle, incoming.justificationStyle))
				this.justificationStyle = undefined;
			if (!_directionProperty.equalHelper(this.direction, incoming.direction))
				this.direction = undefined;
			if (!_tabStopsProperty.equalHelper(this.tabStops, incoming.tabStops))
				this.tabStops = undefined;
			if (!_leadingModelProperty.equalHelper(this.leadingModel, incoming.leadingModel))
				this.leadingModel = undefined;
			if (!_columnGapProperty.equalHelper(this.columnGap, incoming.columnGap))
				this.columnGap = undefined;
			if (!_paddingLeftProperty.equalHelper(this.paddingLeft, incoming.paddingLeft))
				this.paddingLeft = undefined;
			if (!_paddingTopProperty.equalHelper(this.paddingTop, incoming.paddingTop))
				this.paddingTop = undefined;
			if (!_paddingRightProperty.equalHelper(this.paddingRight, incoming.paddingRight))
				this.paddingRight = undefined;
			if (!_paddingBottomProperty.equalHelper(this.paddingBottom, incoming.paddingBottom))
				this.paddingBottom = undefined;
			if (!_columnCountProperty.equalHelper(this.columnCount, incoming.columnCount))
				this.columnCount = undefined;
			if (!_columnWidthProperty.equalHelper(this.columnWidth, incoming.columnWidth))
				this.columnWidth = undefined;
			if (!_firstBaselineOffsetProperty.equalHelper(this.firstBaselineOffset, incoming.firstBaselineOffset))
				this.firstBaselineOffset = undefined;
			if (!_verticalAlignProperty.equalHelper(this.verticalAlign, incoming.verticalAlign))
				this.verticalAlign = undefined;
			if (!_blockProgressionProperty.equalHelper(this.blockProgression, incoming.blockProgression))
				this.blockProgression = undefined;
			if (!_lineBreakProperty.equalHelper(this.lineBreak, incoming.lineBreak))
				this.lineBreak = undefined;
		}

		/**
		 * Gets the TextLayoutFormat hash
		 * @param seed seed value for the hash algorithm
		 * @return the TextLayoutFormat hash
		 * @private
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		tlf_internal function hash(seed:uint):uint
		{
			var hash:uint = seed;

			if (_color)
				hash = _colorProperty.hash(_color, hash);
			if (_backgroundColor)
				hash = _backgroundColorProperty.hash(_backgroundColor, hash);
			if (_lineThrough)
				hash = _lineThroughProperty.hash(_lineThrough, hash);
			if (_textAlpha)
				hash = _textAlphaProperty.hash(_textAlpha, hash);
			if (_backgroundAlpha)
				hash = _backgroundAlphaProperty.hash(_backgroundAlpha, hash);
			if (_fontSize)
				hash = _fontSizeProperty.hash(_fontSize, hash);
			if (_baselineShift)
				hash = _baselineShiftProperty.hash(_baselineShift, hash);
			if (_trackingLeft)
				hash = _trackingLeftProperty.hash(_trackingLeft, hash);
			if (_trackingRight)
				hash = _trackingRightProperty.hash(_trackingRight, hash);
			if (_lineHeight)
				hash = _lineHeightProperty.hash(_lineHeight, hash);
			if (_breakOpportunity)
				hash = _breakOpportunityProperty.hash(_breakOpportunity, hash);
			if (_digitCase)
				hash = _digitCaseProperty.hash(_digitCase, hash);
			if (_digitWidth)
				hash = _digitWidthProperty.hash(_digitWidth, hash);
			if (_dominantBaseline)
				hash = _dominantBaselineProperty.hash(_dominantBaseline, hash);
			if (_kerning)
				hash = _kerningProperty.hash(_kerning, hash);
			if (_ligatureLevel)
				hash = _ligatureLevelProperty.hash(_ligatureLevel, hash);
			if (_alignmentBaseline)
				hash = _alignmentBaselineProperty.hash(_alignmentBaseline, hash);
			if (_locale)
				hash = _localeProperty.hash(_locale, hash);
			if (_typographicCase)
				hash = _typographicCaseProperty.hash(_typographicCase, hash);
			if (_fontFamily)
				hash = _fontFamilyProperty.hash(_fontFamily, hash);
			if (_textDecoration)
				hash = _textDecorationProperty.hash(_textDecoration, hash);
			if (_fontWeight)
				hash = _fontWeightProperty.hash(_fontWeight, hash);
			if (_fontStyle)
				hash = _fontStyleProperty.hash(_fontStyle, hash);
			if (_whiteSpaceCollapse)
				hash = _whiteSpaceCollapseProperty.hash(_whiteSpaceCollapse, hash);
			if (_renderingMode)
				hash = _renderingModeProperty.hash(_renderingMode, hash);
			if (_cffHinting)
				hash = _cffHintingProperty.hash(_cffHinting, hash);
			if (_fontLookup)
				hash = _fontLookupProperty.hash(_fontLookup, hash);
			if (_textRotation)
				hash = _textRotationProperty.hash(_textRotation, hash);
			if (_textIndent)
				hash = _textIndentProperty.hash(_textIndent, hash);
			if (_paragraphStartIndent)
				hash = _paragraphStartIndentProperty.hash(_paragraphStartIndent, hash);
			if (_paragraphEndIndent)
				hash = _paragraphEndIndentProperty.hash(_paragraphEndIndent, hash);
			if (_paragraphSpaceBefore)
				hash = _paragraphSpaceBeforeProperty.hash(_paragraphSpaceBefore, hash);
			if (_paragraphSpaceAfter)
				hash = _paragraphSpaceAfterProperty.hash(_paragraphSpaceAfter, hash);
			if (_textAlign)
				hash = _textAlignProperty.hash(_textAlign, hash);
			if (_textAlignLast)
				hash = _textAlignLastProperty.hash(_textAlignLast, hash);
			if (_textJustify)
				hash = _textJustifyProperty.hash(_textJustify, hash);
			if (_justificationRule)
				hash = _justificationRuleProperty.hash(_justificationRule, hash);
			if (_justificationStyle)
				hash = _justificationStyleProperty.hash(_justificationStyle, hash);
			if (_direction)
				hash = _directionProperty.hash(_direction, hash);
			if (_tabStops)
				hash = _tabStopsProperty.hash(_tabStops, hash);
			if (_leadingModel)
				hash = _leadingModelProperty.hash(_leadingModel, hash);
			if (_columnGap)
				hash = _columnGapProperty.hash(_columnGap, hash);
			if (_paddingLeft)
				hash = _paddingLeftProperty.hash(_paddingLeft, hash);
			if (_paddingTop)
				hash = _paddingTopProperty.hash(_paddingTop, hash);
			if (_paddingRight)
				hash = _paddingRightProperty.hash(_paddingRight, hash);
			if (_paddingBottom)
				hash = _paddingBottomProperty.hash(_paddingBottom, hash);
			if (_columnCount)
				hash = _columnCountProperty.hash(_columnCount, hash);
			if (_columnWidth)
				hash = _columnWidthProperty.hash(_columnWidth, hash);
			if (_firstBaselineOffset)
				hash = _firstBaselineOffsetProperty.hash(_firstBaselineOffset, hash);
			if (_verticalAlign)
				hash = _verticalAlignProperty.hash(_verticalAlign, hash);
			if (_blockProgression)
				hash = _blockProgressionProperty.hash(_blockProgression, hash);
			if (_lineBreak)
				hash = _lineBreakProperty.hash(_lineBreak, hash);

			return hash;
		}

		static private var _defaults:TextLayoutFormat;
		/**
		 * Returns a TextLayoutFormat object with default settings.
		 * This function always returns the same object.
		 * 
		 * @return a singleton instance of ITextLayoutFormat that is populated with default values.
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		static public function get defaultFormat():ITextLayoutFormat
		{
			if (_defaults == null)
			{
				_defaults = new TextLayoutFormat();
				Property.defaultsAllHelper(_description,_defaults);
				_defaultFormatHash = _defaults.hash(0);
			}
			return _defaults;
		}
		static private var _defaultFormatHash:uint;
		/** @private */
		static tlf_internal function getDefaultFormatHash():uint
		{
			defaultFormat;
			return _defaultFormatHash;
		}
	}
}
