/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */

package org.eclipse.osbp.ecview.dsl.services;

import com.google.inject.Singleton;
import com.google.inject.Inject;

import java.util.List;

import org.eclipse.xtext.*;
import org.eclipse.xtext.service.GrammarProvider;
import org.eclipse.xtext.service.AbstractElementFinder.*;

import org.eclipse.xtext.xbase.services.XbaseGrammarAccess;
import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;

@Singleton
public class UIGrammarGrammarAccess extends AbstractGrammarElementFinder {
	
	
	public class UiModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiModel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cPackageKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cPackageNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPackageNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cPackageNameAssignment_1.eContents().get(0);
		private final Assignment cImportsAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cImportsUiImportsParserRuleCall_2_0 = (RuleCall)cImportsAssignment_2.eContents().get(0);
		private final Assignment cRootsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cRootsUiRootElementsParserRuleCall_3_0 = (RuleCall)cRootsAssignment_3.eContents().get(0);
		
		//UiModel:
		//	"package" packageName=QualifiedName imports+=UiImports* roots+=UiRootElements*;
		public ParserRule getRule() { return rule; }

		//"package" packageName=QualifiedName imports+=UiImports* roots+=UiRootElements*
		public Group getGroup() { return cGroup; }

		//"package"
		public Keyword getPackageKeyword_0() { return cPackageKeyword_0; }

		//packageName=QualifiedName
		public Assignment getPackageNameAssignment_1() { return cPackageNameAssignment_1; }

		//QualifiedName
		public RuleCall getPackageNameQualifiedNameParserRuleCall_1_0() { return cPackageNameQualifiedNameParserRuleCall_1_0; }

		//imports+=UiImports*
		public Assignment getImportsAssignment_2() { return cImportsAssignment_2; }

		//UiImports
		public RuleCall getImportsUiImportsParserRuleCall_2_0() { return cImportsUiImportsParserRuleCall_2_0; }

		//roots+=UiRootElements*
		public Assignment getRootsAssignment_3() { return cRootsAssignment_3; }

		//UiRootElements
		public RuleCall getRootsUiRootElementsParserRuleCall_3_0() { return cRootsUiRootElementsParserRuleCall_3_0; }
	}

	public class UiImportsElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiImports");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cImportKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cImportedNamespaceAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_0 = (RuleCall)cImportedNamespaceAssignment_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
		
		//UiImports:
		//	"import" importedNamespace=QualifiedNameWithWildcard ";"?;
		public ParserRule getRule() { return rule; }

		//"import" importedNamespace=QualifiedNameWithWildcard ";"?
		public Group getGroup() { return cGroup; }

		//"import"
		public Keyword getImportKeyword_0() { return cImportKeyword_0; }

		//importedNamespace=QualifiedNameWithWildcard
		public Assignment getImportedNamespaceAssignment_1() { return cImportedNamespaceAssignment_1; }

		//QualifiedNameWithWildcard
		public RuleCall getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_0() { return cImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
	}

	public class UiRootElementsElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRootElements");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiViewParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiViewSetParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiValidatorAliasParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMobileViewParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//UiRootElements:
		//	UiView | UiViewSet | UiValidatorAlias | UiMobileView;
		public ParserRule getRule() { return rule; }

		//UiView | UiViewSet | UiValidatorAlias | UiMobileView
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiView
		public RuleCall getUiViewParserRuleCall_0() { return cUiViewParserRuleCall_0; }

		//UiViewSet
		public RuleCall getUiViewSetParserRuleCall_1() { return cUiViewSetParserRuleCall_1; }

		//UiValidatorAlias
		public RuleCall getUiValidatorAliasParserRuleCall_2() { return cUiValidatorAliasParserRuleCall_2; }

		//UiMobileView
		public RuleCall getUiMobileViewParserRuleCall_3() { return cUiMobileViewParserRuleCall_3; }
	}

	public class UiValidatorAliasElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiValidatorAlias");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cValidatorAliasKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cValidatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cValidatorUiValidatorParserRuleCall_1_0 = (RuleCall)cValidatorAssignment_1.eContents().get(0);
		private final Keyword cAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAliasAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAliasIDTerminalRuleCall_3_0 = (RuleCall)cAliasAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiValidatorAlias:
		//	"validatorAlias" validator=UiValidator "as" alias=ID ";"?;
		public ParserRule getRule() { return rule; }

		//"validatorAlias" validator=UiValidator "as" alias=ID ";"?
		public Group getGroup() { return cGroup; }

		//"validatorAlias"
		public Keyword getValidatorAliasKeyword_0() { return cValidatorAliasKeyword_0; }

		//validator=UiValidator
		public Assignment getValidatorAssignment_1() { return cValidatorAssignment_1; }

		//UiValidator
		public RuleCall getValidatorUiValidatorParserRuleCall_1_0() { return cValidatorUiValidatorParserRuleCall_1_0; }

		//"as"
		public Keyword getAsKeyword_2() { return cAsKeyword_2; }

		//alias=ID
		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }

		//ID
		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }

		//";"?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}

	public class UiValidatorAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiValidatorAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cFieldValidationKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cFieldAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cFieldUiFieldCrossReference_1_0 = (CrossReference)cFieldAssignment_1.eContents().get(0);
		private final RuleCall cFieldUiFieldIDTerminalRuleCall_1_0_1 = (RuleCall)cFieldUiFieldCrossReference_1_0.eContents().get(1);
		private final Keyword cPlusSignEqualsSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cValidatorDefAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final RuleCall cValidatorDefUiValidatorDefParserRuleCall_3_0_0 = (RuleCall)cValidatorDefAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Assignment cValidatorAliasAssignment_3_1_0 = (Assignment)cGroup_3_1.eContents().get(0);
		private final CrossReference cValidatorAliasUiValidatorAliasCrossReference_3_1_0_0 = (CrossReference)cValidatorAliasAssignment_3_1_0.eContents().get(0);
		private final RuleCall cValidatorAliasUiValidatorAliasQualifiedNameParserRuleCall_3_1_0_0_1 = (RuleCall)cValidatorAliasUiValidatorAliasCrossReference_3_1_0_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
		
		//UiValidatorAssignment:
		//	"fieldValidation" field=[UiField] "+=" (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
		//	";"?);
		public ParserRule getRule() { return rule; }

		//"fieldValidation" field=[UiField] "+=" (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
		//";"?)
		public Group getGroup() { return cGroup; }

		//"fieldValidation"
		public Keyword getFieldValidationKeyword_0() { return cFieldValidationKeyword_0; }

		//field=[UiField]
		public Assignment getFieldAssignment_1() { return cFieldAssignment_1; }

		//[UiField]
		public CrossReference getFieldUiFieldCrossReference_1_0() { return cFieldUiFieldCrossReference_1_0; }

		//ID
		public RuleCall getFieldUiFieldIDTerminalRuleCall_1_0_1() { return cFieldUiFieldIDTerminalRuleCall_1_0_1; }

		//"+="
		public Keyword getPlusSignEqualsSignKeyword_2() { return cPlusSignEqualsSignKeyword_2; }

		//validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName] ";"?
		public Alternatives getAlternatives_3() { return cAlternatives_3; }

		//validatorDef=UiValidatorDef
		public Assignment getValidatorDefAssignment_3_0() { return cValidatorDefAssignment_3_0; }

		//UiValidatorDef
		public RuleCall getValidatorDefUiValidatorDefParserRuleCall_3_0_0() { return cValidatorDefUiValidatorDefParserRuleCall_3_0_0; }

		//validatorAlias=[UiValidatorAlias|QualifiedName] ";"?
		public Group getGroup_3_1() { return cGroup_3_1; }

		//validatorAlias=[UiValidatorAlias|QualifiedName]
		public Assignment getValidatorAliasAssignment_3_1_0() { return cValidatorAliasAssignment_3_1_0; }

		//[UiValidatorAlias|QualifiedName]
		public CrossReference getValidatorAliasUiValidatorAliasCrossReference_3_1_0_0() { return cValidatorAliasUiValidatorAliasCrossReference_3_1_0_0; }

		//QualifiedName
		public RuleCall getValidatorAliasUiValidatorAliasQualifiedNameParserRuleCall_3_1_0_0_1() { return cValidatorAliasUiValidatorAliasQualifiedNameParserRuleCall_3_1_0_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_3_1_1() { return cSemicolonKeyword_3_1_1; }
	}

	public class UiValidatorDefElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiValidatorDef");
		private final Assignment cValidatorAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cValidatorUiValidatorParserRuleCall_0 = (RuleCall)cValidatorAssignment.eContents().get(0);
		
		//UiValidatorDef:
		//	validator=UiValidator;
		public ParserRule getRule() { return rule; }

		//validator=UiValidator
		public Assignment getValidatorAssignment() { return cValidatorAssignment; }

		//UiValidator
		public RuleCall getValidatorUiValidatorParserRuleCall_0() { return cValidatorUiValidatorParserRuleCall_0; }
	}

	public class UiViewSetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiViewSet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cViewsetKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cBeanSlotsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cBeanSlotsUiBeanSlotParserRuleCall_3_0 = (RuleCall)cBeanSlotsAssignment_3.eContents().get(0);
		private final Assignment cBindingEndpointAliasAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0 = (RuleCall)cBindingEndpointAliasAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiViewSet:
		//	"viewset" name=ID "{" beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias* "}";
		public ParserRule getRule() { return rule; }

		//"viewset" name=ID "{" beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias* "}"
		public Group getGroup() { return cGroup; }

		//"viewset"
		public Keyword getViewsetKeyword_0() { return cViewsetKeyword_0; }

		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }

		//beanSlots+=UiBeanSlot*
		public Assignment getBeanSlotsAssignment_3() { return cBeanSlotsAssignment_3; }

		//UiBeanSlot
		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_3_0() { return cBeanSlotsUiBeanSlotParserRuleCall_3_0; }

		//bindingEndpointAlias+=UiBindingEndpointAlias*
		public Assignment getBindingEndpointAliasAssignment_4() { return cBindingEndpointAliasAssignment_4; }

		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}

	public class UiBindingEndpointAliasElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBindingEndpointAlias");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDataAliasKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cEndpointAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0 = (RuleCall)cEndpointAssignment_1.eContents().get(0);
		private final Keyword cAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAliasAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAliasIDTerminalRuleCall_3_0 = (RuleCall)cAliasAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiBindingEndpointAlias:
		//	"dataAlias" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?;
		public ParserRule getRule() { return rule; }

		//"dataAlias" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?
		public Group getGroup() { return cGroup; }

		//"dataAlias"
		public Keyword getDataAliasKeyword_0() { return cDataAliasKeyword_0; }

		//endpoint=UiBindingEndpointAssignment
		public Assignment getEndpointAssignment_1() { return cEndpointAssignment_1; }

		//UiBindingEndpointAssignment
		public RuleCall getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0() { return cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0; }

		//"as"
		public Keyword getAsKeyword_2() { return cAsKeyword_2; }

		//alias=ID
		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }

		//ID
		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }

		//";"?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}

	public class UiBeanSlotElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBeanSlot");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDatasourceKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cColonKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cJvmTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_3_0 = (RuleCall)cJvmTypeAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cEventTopicKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cEventTopicAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cEventTopicSTRINGTerminalRuleCall_4_1_0 = (RuleCall)cEventTopicAssignment_4_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiBeanSlot:
		//	"datasource" name=ID ":" jvmType=JvmTypeReference ("eventTopic" eventTopic=STRING)? ";"?;
		public ParserRule getRule() { return rule; }

		//"datasource" name=ID ":" jvmType=JvmTypeReference ("eventTopic" eventTopic=STRING)? ";"?
		public Group getGroup() { return cGroup; }

		//"datasource"
		public Keyword getDatasourceKeyword_0() { return cDatasourceKeyword_0; }

		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }

		//":"
		public Keyword getColonKeyword_2() { return cColonKeyword_2; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_3() { return cJvmTypeAssignment_3; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_0; }

		//("eventTopic" eventTopic=STRING)?
		public Group getGroup_4() { return cGroup_4; }

		//"eventTopic"
		public Keyword getEventTopicKeyword_4_0() { return cEventTopicKeyword_4_0; }

		//eventTopic=STRING
		public Assignment getEventTopicAssignment_4_1() { return cEventTopicAssignment_4_1; }

		//STRING
		public RuleCall getEventTopicSTRINGTerminalRuleCall_4_1_0() { return cEventTopicSTRINGTerminalRuleCall_4_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
	}

	public class UiBindingElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBinding");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cBindKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cListBindingAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Keyword cListBindingListKeyword_1_0 = (Keyword)cListBindingAssignment_1.eContents().get(0);
		private final Assignment cSourceAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cSourceUiBindingEndpointAssignmentParserRuleCall_2_0 = (RuleCall)cSourceAssignment_2.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cTargetToSourceAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final Keyword cTargetToSourceLessThanSignKeyword_3_0_0 = (Keyword)cTargetToSourceAssignment_3_0.eContents().get(0);
		private final Keyword cHyphenMinusHyphenMinusKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
		private final Assignment cSourceToTargetAssignment_3_2 = (Assignment)cGroup_3.eContents().get(2);
		private final Keyword cSourceToTargetGreaterThanSignKeyword_3_2_0 = (Keyword)cSourceToTargetAssignment_3_2.eContents().get(0);
		private final Assignment cTargetAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cTargetUiBindingEndpointAssignmentParserRuleCall_4_0 = (RuleCall)cTargetAssignment_4.eContents().get(0);
		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiBinding:
		//	"bind" listBinding?="list"? source=UiBindingEndpointAssignment (targetToSource?="<"? "--" sourceToTarget?=">"?)
		//	target=UiBindingEndpointAssignment ";"?;
		public ParserRule getRule() { return rule; }

		//"bind" listBinding?="list"? source=UiBindingEndpointAssignment (targetToSource?="<"? "--" sourceToTarget?=">"?)
		//target=UiBindingEndpointAssignment ";"?
		public Group getGroup() { return cGroup; }

		//"bind"
		public Keyword getBindKeyword_0() { return cBindKeyword_0; }

		//listBinding?="list"?
		public Assignment getListBindingAssignment_1() { return cListBindingAssignment_1; }

		//"list"
		public Keyword getListBindingListKeyword_1_0() { return cListBindingListKeyword_1_0; }

		//source=UiBindingEndpointAssignment
		public Assignment getSourceAssignment_2() { return cSourceAssignment_2; }

		//UiBindingEndpointAssignment
		public RuleCall getSourceUiBindingEndpointAssignmentParserRuleCall_2_0() { return cSourceUiBindingEndpointAssignmentParserRuleCall_2_0; }

		//targetToSource?="<"? "--" sourceToTarget?=">"?
		public Group getGroup_3() { return cGroup_3; }

		//targetToSource?="<"?
		public Assignment getTargetToSourceAssignment_3_0() { return cTargetToSourceAssignment_3_0; }

		//"<"
		public Keyword getTargetToSourceLessThanSignKeyword_3_0_0() { return cTargetToSourceLessThanSignKeyword_3_0_0; }

		//"--"
		public Keyword getHyphenMinusHyphenMinusKeyword_3_1() { return cHyphenMinusHyphenMinusKeyword_3_1; }

		//sourceToTarget?=">"?
		public Assignment getSourceToTargetAssignment_3_2() { return cSourceToTargetAssignment_3_2; }

		//">"
		public Keyword getSourceToTargetGreaterThanSignKeyword_3_2_0() { return cSourceToTargetGreaterThanSignKeyword_3_2_0; }

		//target=UiBindingEndpointAssignment
		public Assignment getTargetAssignment_4() { return cTargetAssignment_4; }

		//UiBindingEndpointAssignment
		public RuleCall getTargetUiBindingEndpointAssignmentParserRuleCall_4_0() { return cTargetUiBindingEndpointAssignmentParserRuleCall_4_0; }

		//";"?
		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
	}

	public class UiBindingEndpointAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBindingEndpointAssignment");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final RuleCall cUiTypedBindableDefParserRuleCall_0_0 = (RuleCall)cGroup_0.eContents().get(0);
		private final Action cUiBindingEndpointAssignmentTypedBindableDefAction_0_1 = (Action)cGroup_0.eContents().get(1);
		private final Assignment cPathAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
		private final RuleCall cPathUiPathSegmentParserRuleCall_0_2_0 = (RuleCall)cPathAssignment_0_2.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final RuleCall cUiCommandBindableDefParserRuleCall_1_0 = (RuleCall)cGroup_1.eContents().get(0);
		private final Action cUiBindingEndpointAssignmentTypedBindableDefAction_1_1 = (Action)cGroup_1.eContents().get(1);
		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
		private final Action cUiBindingEndpointAssignmentAction_2_0 = (Action)cGroup_2.eContents().get(0);
		private final Assignment cTypedBindableAliasAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final CrossReference cTypedBindableAliasUiTypedBindableCrossReference_2_1_0 = (CrossReference)cTypedBindableAliasAssignment_2_1.eContents().get(0);
		private final RuleCall cTypedBindableAliasUiTypedBindableIDTerminalRuleCall_2_1_0_1 = (RuleCall)cTypedBindableAliasUiTypedBindableCrossReference_2_1_0.eContents().get(1);
		private final Assignment cPathAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final RuleCall cPathUiPathSegmentParserRuleCall_2_2_0 = (RuleCall)cPathAssignment_2_2.eContents().get(0);
		
		//UiBindingEndpointAssignment returns UiBindingExpression:
		//	UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
		//	{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
		//	typedBindableAlias=[UiTypedBindable] path=UiPathSegment?;
		public ParserRule getRule() { return rule; }

		//UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
		//{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
		//typedBindableAlias=[UiTypedBindable] path=UiPathSegment?
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment?
		public Group getGroup_0() { return cGroup_0; }

		//UiTypedBindableDef
		public RuleCall getUiTypedBindableDefParserRuleCall_0_0() { return cUiTypedBindableDefParserRuleCall_0_0; }

		//{UiBindingEndpointAssignment.typedBindableDef=current}
		public Action getUiBindingEndpointAssignmentTypedBindableDefAction_0_1() { return cUiBindingEndpointAssignmentTypedBindableDefAction_0_1; }

		//path=UiPathSegment?
		public Assignment getPathAssignment_0_2() { return cPathAssignment_0_2; }

		//UiPathSegment
		public RuleCall getPathUiPathSegmentParserRuleCall_0_2_0() { return cPathUiPathSegmentParserRuleCall_0_2_0; }

		//UiCommandBindableDef {UiBindingEndpointAssignment.typedBindableDef=current}
		public Group getGroup_1() { return cGroup_1; }

		//UiCommandBindableDef
		public RuleCall getUiCommandBindableDefParserRuleCall_1_0() { return cUiCommandBindableDefParserRuleCall_1_0; }

		//{UiBindingEndpointAssignment.typedBindableDef=current}
		public Action getUiBindingEndpointAssignmentTypedBindableDefAction_1_1() { return cUiBindingEndpointAssignmentTypedBindableDefAction_1_1; }

		//{UiBindingEndpointAssignment} typedBindableAlias=[UiTypedBindable] path=UiPathSegment?
		public Group getGroup_2() { return cGroup_2; }

		//{UiBindingEndpointAssignment}
		public Action getUiBindingEndpointAssignmentAction_2_0() { return cUiBindingEndpointAssignmentAction_2_0; }

		//typedBindableAlias=[UiTypedBindable]
		public Assignment getTypedBindableAliasAssignment_2_1() { return cTypedBindableAliasAssignment_2_1; }

		//[UiTypedBindable]
		public CrossReference getTypedBindableAliasUiTypedBindableCrossReference_2_1_0() { return cTypedBindableAliasUiTypedBindableCrossReference_2_1_0; }

		//ID
		public RuleCall getTypedBindableAliasUiTypedBindableIDTerminalRuleCall_2_1_0_1() { return cTypedBindableAliasUiTypedBindableIDTerminalRuleCall_2_1_0_1; }

		//path=UiPathSegment?
		public Assignment getPathAssignment_2_2() { return cPathAssignment_2_2; }

		//UiPathSegment
		public RuleCall getPathUiPathSegmentParserRuleCall_2_2_0() { return cPathUiPathSegmentParserRuleCall_2_2_0; }
	}

	public class UiPathSegmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPathSegment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiPathSegmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cFullStopKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cGetterAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cGetterJvmOperationCrossReference_2_0 = (CrossReference)cGetterAssignment_2.eContents().get(0);
		private final RuleCall cGetterJvmOperationIDTerminalRuleCall_2_0_1 = (RuleCall)cGetterJvmOperationCrossReference_2_0.eContents().get(1);
		private final Assignment cPathAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cPathUiPathSegmentParserRuleCall_3_0 = (RuleCall)cPathAssignment_3.eContents().get(0);
		
		//UiPathSegment:
		//	{UiPathSegment} "." getter=[JvmOperation] path=UiPathSegment?;
		public ParserRule getRule() { return rule; }

		//{UiPathSegment} "." getter=[JvmOperation] path=UiPathSegment?
		public Group getGroup() { return cGroup; }

		//{UiPathSegment}
		public Action getUiPathSegmentAction_0() { return cUiPathSegmentAction_0; }

		//"."
		public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }

		//getter=[JvmOperation]
		public Assignment getGetterAssignment_2() { return cGetterAssignment_2; }

		//[JvmOperation]
		public CrossReference getGetterJvmOperationCrossReference_2_0() { return cGetterJvmOperationCrossReference_2_0; }

		//ID
		public RuleCall getGetterJvmOperationIDTerminalRuleCall_2_0_1() { return cGetterJvmOperationIDTerminalRuleCall_2_0_1; }

		//path=UiPathSegment?
		public Assignment getPathAssignment_3() { return cPathAssignment_3; }

		//UiPathSegment
		public RuleCall getPathUiPathSegmentParserRuleCall_3_0() { return cPathUiPathSegmentParserRuleCall_3_0; }
	}

	public class UiNestedPropertyElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiNestedProperty");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiNestedPropertyAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cGetterAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cGetterJvmOperationCrossReference_1_0 = (CrossReference)cGetterAssignment_1.eContents().get(0);
		private final RuleCall cGetterJvmOperationIDTerminalRuleCall_1_0_1 = (RuleCall)cGetterJvmOperationCrossReference_1_0.eContents().get(1);
		private final Assignment cPathAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cPathUiPathSegmentParserRuleCall_2_0 = (RuleCall)cPathAssignment_2.eContents().get(0);
		
		//UiNestedProperty:
		//	{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?;
		public ParserRule getRule() { return rule; }

		//{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?
		public Group getGroup() { return cGroup; }

		//{UiNestedProperty}
		public Action getUiNestedPropertyAction_0() { return cUiNestedPropertyAction_0; }

		//getter=[JvmOperation]
		public Assignment getGetterAssignment_1() { return cGetterAssignment_1; }

		//[JvmOperation]
		public CrossReference getGetterJvmOperationCrossReference_1_0() { return cGetterJvmOperationCrossReference_1_0; }

		//ID
		public RuleCall getGetterJvmOperationIDTerminalRuleCall_1_0_1() { return cGetterJvmOperationIDTerminalRuleCall_1_0_1; }

		//path=UiPathSegment?
		public Assignment getPathAssignment_2() { return cPathAssignment_2; }

		//UiPathSegment
		public RuleCall getPathUiPathSegmentParserRuleCall_2_0() { return cPathUiPathSegmentParserRuleCall_2_0; }
	}

	public class UiTypedBindableDefElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTypedBindableDef");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTypedBindableDefAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cLeftSquareBracketKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cRawBindableAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final CrossReference cRawBindableUiRawBindableCrossReference_1_1_0 = (CrossReference)cRawBindableAssignment_1_1.eContents().get(0);
		private final RuleCall cRawBindableUiRawBindableIDTerminalRuleCall_1_1_0_1 = (RuleCall)cRawBindableUiRawBindableCrossReference_1_1_0.eContents().get(1);
		private final Assignment cRawBindablePathAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0 = (RuleCall)cRawBindablePathAssignment_1_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
		private final Keyword cFullStopKeyword_1_4 = (Keyword)cGroup_1.eContents().get(4);
		private final Assignment cMethodAssignment_1_5 = (Assignment)cGroup_1.eContents().get(5);
		private final CrossReference cMethodUxEndpointDefCrossReference_1_5_0 = (CrossReference)cMethodAssignment_1_5.eContents().get(0);
		private final RuleCall cMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1 = (RuleCall)cMethodUxEndpointDefCrossReference_1_5_0.eContents().get(1);
		
		//UiTypedBindableDef returns UiBindingExpression:
		//	{UiTypedBindableDef} ("[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]" "."
		//	method=[cfg::UxEndpointDef]);
		public ParserRule getRule() { return rule; }

		//{UiTypedBindableDef} ("[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]" "."
		//method=[cfg::UxEndpointDef])
		public Group getGroup() { return cGroup; }

		//{UiTypedBindableDef}
		public Action getUiTypedBindableDefAction_0() { return cUiTypedBindableDefAction_0; }

		//"[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]" "." method=[cfg::UxEndpointDef]
		public Group getGroup_1() { return cGroup_1; }

		//"["
		public Keyword getLeftSquareBracketKeyword_1_0() { return cLeftSquareBracketKeyword_1_0; }

		//rawBindable=[UiRawBindable]
		public Assignment getRawBindableAssignment_1_1() { return cRawBindableAssignment_1_1; }

		//[UiRawBindable]
		public CrossReference getRawBindableUiRawBindableCrossReference_1_1_0() { return cRawBindableUiRawBindableCrossReference_1_1_0; }

		//ID
		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_1_1_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_1_1_0_1; }

		//rawBindablePath=UiRawBindablePathSegment?
		public Assignment getRawBindablePathAssignment_1_2() { return cRawBindablePathAssignment_1_2; }

		//UiRawBindablePathSegment
		public RuleCall getRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0() { return cRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0; }

		//"]"
		public Keyword getRightSquareBracketKeyword_1_3() { return cRightSquareBracketKeyword_1_3; }

		//"."
		public Keyword getFullStopKeyword_1_4() { return cFullStopKeyword_1_4; }

		//method=[cfg::UxEndpointDef]
		public Assignment getMethodAssignment_1_5() { return cMethodAssignment_1_5; }

		//[cfg::UxEndpointDef]
		public CrossReference getMethodUxEndpointDefCrossReference_1_5_0() { return cMethodUxEndpointDefCrossReference_1_5_0; }

		//ID
		public RuleCall getMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1() { return cMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1; }
	}

	public class UiTypedBindableRawTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTypedBindableRawType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTypedBindableRawTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRawBindableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRawBindableUiRawBindableCrossReference_2_0 = (CrossReference)cRawBindableAssignment_2.eContents().get(0);
		private final RuleCall cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1 = (RuleCall)cRawBindableUiRawBindableCrossReference_2_0.eContents().get(1);
		private final Assignment cRawBindablePathAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0 = (RuleCall)cRawBindablePathAssignment_3.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiTypedBindableRawType returns UiBindingExpression:
		//	{UiTypedBindableRawType} "[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]";
		public ParserRule getRule() { return rule; }

		//{UiTypedBindableRawType} "[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]"
		public Group getGroup() { return cGroup; }

		//{UiTypedBindableRawType}
		public Action getUiTypedBindableRawTypeAction_0() { return cUiTypedBindableRawTypeAction_0; }

		//"["
		public Keyword getLeftSquareBracketKeyword_1() { return cLeftSquareBracketKeyword_1; }

		//rawBindable=[UiRawBindable]
		public Assignment getRawBindableAssignment_2() { return cRawBindableAssignment_2; }

		//[UiRawBindable]
		public CrossReference getRawBindableUiRawBindableCrossReference_2_0() { return cRawBindableUiRawBindableCrossReference_2_0; }

		//ID
		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_2_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1; }

		//rawBindablePath=UiRawBindablePathSegment?
		public Assignment getRawBindablePathAssignment_3() { return cRawBindablePathAssignment_3; }

		//UiRawBindablePathSegment
		public RuleCall getRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0() { return cRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0; }

		//"]"
		public Keyword getRightSquareBracketKeyword_4() { return cRightSquareBracketKeyword_4; }
	}

	public class UiTypedBindableRawTypeAliasElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTypedBindableRawTypeAlias");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cUiKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cTypeUiTypedBindableRawTypeParserRuleCall_1_0 = (RuleCall)cTypeAssignment_1.eContents().get(0);
		private final Keyword cAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAliasAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAliasIDTerminalRuleCall_3_0 = (RuleCall)cAliasAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiTypedBindableRawTypeAlias:
		//	"ui" type=UiTypedBindableRawType "as" alias=ID ";"?;
		public ParserRule getRule() { return rule; }

		//"ui" type=UiTypedBindableRawType "as" alias=ID ";"?
		public Group getGroup() { return cGroup; }

		//"ui"
		public Keyword getUiKeyword_0() { return cUiKeyword_0; }

		//type=UiTypedBindableRawType
		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }

		//UiTypedBindableRawType
		public RuleCall getTypeUiTypedBindableRawTypeParserRuleCall_1_0() { return cTypeUiTypedBindableRawTypeParserRuleCall_1_0; }

		//"as"
		public Keyword getAsKeyword_2() { return cAsKeyword_2; }

		//alias=ID
		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }

		//ID
		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }

		//";"?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}

	public class UiRawBindablePathSegmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRawBindablePathSegment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiRawBindablePathSegmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Assignment cToParentAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
		private final Keyword cToParentFullStopFullStopKeyword_1_1_0 = (Keyword)cToParentAssignment_1_1.eContents().get(0);
		private final Assignment cRawBindableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRawBindableUiRawBindableCrossReference_2_0 = (CrossReference)cRawBindableAssignment_2.eContents().get(0);
		private final RuleCall cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1 = (RuleCall)cRawBindableUiRawBindableCrossReference_2_0.eContents().get(1);
		private final Assignment cPathAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cPathUiRawBindablePathSegmentParserRuleCall_3_0 = (RuleCall)cPathAssignment_3.eContents().get(0);
		
		//UiRawBindablePathSegment:
		//	{UiRawBindablePathSegment} ("." | toParent?="..") rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?;
		public ParserRule getRule() { return rule; }

		//{UiRawBindablePathSegment} ("." | toParent?="..") rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?
		public Group getGroup() { return cGroup; }

		//{UiRawBindablePathSegment}
		public Action getUiRawBindablePathSegmentAction_0() { return cUiRawBindablePathSegmentAction_0; }

		//"." | toParent?=".."
		public Alternatives getAlternatives_1() { return cAlternatives_1; }

		//"."
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }

		//toParent?=".."
		public Assignment getToParentAssignment_1_1() { return cToParentAssignment_1_1; }

		//".."
		public Keyword getToParentFullStopFullStopKeyword_1_1_0() { return cToParentFullStopFullStopKeyword_1_1_0; }

		//rawBindable=[UiRawBindable]
		public Assignment getRawBindableAssignment_2() { return cRawBindableAssignment_2; }

		//[UiRawBindable]
		public CrossReference getRawBindableUiRawBindableCrossReference_2_0() { return cRawBindableUiRawBindableCrossReference_2_0; }

		//ID
		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_2_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1; }

		//path=UiRawBindablePathSegment?
		public Assignment getPathAssignment_3() { return cPathAssignment_3; }

		//UiRawBindablePathSegment
		public RuleCall getPathUiRawBindablePathSegmentParserRuleCall_3_0() { return cPathUiRawBindablePathSegmentParserRuleCall_3_0; }
	}

	public class UiCommandBindableDefElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiCommandBindableDef");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiCommandBindableDefAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cCommandAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cCommandUiCommandParserRuleCall_1_0 = (RuleCall)cCommandAssignment_1.eContents().get(0);
		
		//UiCommandBindableDef:
		//	{UiCommandBindableDef} command=UiCommand;
		public ParserRule getRule() { return rule; }

		//{UiCommandBindableDef} command=UiCommand
		public Group getGroup() { return cGroup; }

		//{UiCommandBindableDef}
		public Action getUiCommandBindableDefAction_0() { return cUiCommandBindableDefAction_0; }

		//command=UiCommand
		public Assignment getCommandAssignment_1() { return cCommandAssignment_1; }

		//UiCommand
		public RuleCall getCommandUiCommandParserRuleCall_1_0() { return cCommandUiCommandParserRuleCall_1_0; }
	}

	public class UiCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiCommand");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileNavigationCommandParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiOpenDialogCommandParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiSearchWithDialogCommandParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiAddToTableCommandParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiRemoveFromTableCommandParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiSendEventCommandParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiSetNewInstanceCommandParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		
		//UiCommand:
		//	UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
		//	UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand;
		public ParserRule getRule() { return rule; }

		//UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
		//UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiMobileNavigationCommand
		public RuleCall getUiMobileNavigationCommandParserRuleCall_0() { return cUiMobileNavigationCommandParserRuleCall_0; }

		//UiOpenDialogCommand
		public RuleCall getUiOpenDialogCommandParserRuleCall_1() { return cUiOpenDialogCommandParserRuleCall_1; }

		//UiSearchWithDialogCommand
		public RuleCall getUiSearchWithDialogCommandParserRuleCall_2() { return cUiSearchWithDialogCommandParserRuleCall_2; }

		//UiAddToTableCommand
		public RuleCall getUiAddToTableCommandParserRuleCall_3() { return cUiAddToTableCommandParserRuleCall_3; }

		//UiRemoveFromTableCommand
		public RuleCall getUiRemoveFromTableCommandParserRuleCall_4() { return cUiRemoveFromTableCommandParserRuleCall_4; }

		//UiSendEventCommand
		public RuleCall getUiSendEventCommandParserRuleCall_5() { return cUiSendEventCommandParserRuleCall_5; }

		//UiSetNewInstanceCommand
		public RuleCall getUiSetNewInstanceCommandParserRuleCall_6() { return cUiSetNewInstanceCommandParserRuleCall_6; }
	}

	public class UiMobileNavigationCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileNavigationCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNavigateToKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cTargetPageAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTargetPageUiMobileNavigationPageParserRuleCall_2_0 = (RuleCall)cTargetPageAssignment_2.eContents().get(0);
		
		//UiMobileNavigationCommand:
		//	{UiMobileNavigationCommand} "navigateTo" targetPage=UiMobileNavigationPage;
		public ParserRule getRule() { return rule; }

		//{UiMobileNavigationCommand} "navigateTo" targetPage=UiMobileNavigationPage
		public Group getGroup() { return cGroup; }

		//{UiMobileNavigationCommand}
		public Action getUiMobileNavigationCommandAction_0() { return cUiMobileNavigationCommandAction_0; }

		//"navigateTo"
		public Keyword getNavigateToKeyword_1() { return cNavigateToKeyword_1; }

		//targetPage=UiMobileNavigationPage
		public Assignment getTargetPageAssignment_2() { return cTargetPageAssignment_2; }

		//UiMobileNavigationPage
		public RuleCall getTargetPageUiMobileNavigationPageParserRuleCall_2_0() { return cTargetPageUiMobileNavigationPageParserRuleCall_2_0; }
	}

	public class UiOpenDialogCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiOpenDialogCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiOpenDialogCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cOpenDialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cDialogAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDialogUiDialogParserRuleCall_2_0 = (RuleCall)cDialogAssignment_2.eContents().get(0);
		
		//UiOpenDialogCommand:
		//	{UiOpenDialogCommand} "openDialog" dialog=UiDialog;
		public ParserRule getRule() { return rule; }

		//{UiOpenDialogCommand} "openDialog" dialog=UiDialog
		public Group getGroup() { return cGroup; }

		//{UiOpenDialogCommand}
		public Action getUiOpenDialogCommandAction_0() { return cUiOpenDialogCommandAction_0; }

		//"openDialog"
		public Keyword getOpenDialogKeyword_1() { return cOpenDialogKeyword_1; }

		//dialog=UiDialog
		public Assignment getDialogAssignment_2() { return cDialogAssignment_2; }

		//UiDialog
		public RuleCall getDialogUiDialogParserRuleCall_2_0() { return cDialogUiDialogParserRuleCall_2_0; }
	}

	public class UiSearchWithDialogCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSearchWithDialogCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSearchWithDialogCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchWithKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cDialogAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDialogUiSearchDialogParserRuleCall_2_0 = (RuleCall)cDialogAssignment_2.eContents().get(0);
		
		//UiSearchWithDialogCommand:
		//	{UiSearchWithDialogCommand} "searchWith" dialog=UiSearchDialog;
		public ParserRule getRule() { return rule; }

		//{UiSearchWithDialogCommand} "searchWith" dialog=UiSearchDialog
		public Group getGroup() { return cGroup; }

		//{UiSearchWithDialogCommand}
		public Action getUiSearchWithDialogCommandAction_0() { return cUiSearchWithDialogCommandAction_0; }

		//"searchWith"
		public Keyword getSearchWithKeyword_1() { return cSearchWithKeyword_1; }

		//dialog=UiSearchDialog
		public Assignment getDialogAssignment_2() { return cDialogAssignment_2; }

		//UiSearchDialog
		public RuleCall getDialogUiSearchDialogParserRuleCall_2_0() { return cDialogUiSearchDialogParserRuleCall_2_0; }
	}

	public class UiAddToTableCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiAddToTableCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiAddToTableCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cAddToTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cTableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cTableUiTableCrossReference_2_0 = (CrossReference)cTableAssignment_2.eContents().get(0);
		private final RuleCall cTableUiTableIDTerminalRuleCall_2_0_1 = (RuleCall)cTableUiTableCrossReference_2_0.eContents().get(1);
		
		//UiAddToTableCommand:
		//	{UiAddToTableCommand} "addToTable" table=[UiTable];
		public ParserRule getRule() { return rule; }

		//{UiAddToTableCommand} "addToTable" table=[UiTable]
		public Group getGroup() { return cGroup; }

		//{UiAddToTableCommand}
		public Action getUiAddToTableCommandAction_0() { return cUiAddToTableCommandAction_0; }

		//"addToTable"
		public Keyword getAddToTableKeyword_1() { return cAddToTableKeyword_1; }

		//table=[UiTable]
		public Assignment getTableAssignment_2() { return cTableAssignment_2; }

		//[UiTable]
		public CrossReference getTableUiTableCrossReference_2_0() { return cTableUiTableCrossReference_2_0; }

		//ID
		public RuleCall getTableUiTableIDTerminalRuleCall_2_0_1() { return cTableUiTableIDTerminalRuleCall_2_0_1; }
	}

	public class UiRemoveFromTableCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRemoveFromTableCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiRemoveFromTableCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRemoveFromTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cTableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cTableUiTableCrossReference_2_0 = (CrossReference)cTableAssignment_2.eContents().get(0);
		private final RuleCall cTableUiTableIDTerminalRuleCall_2_0_1 = (RuleCall)cTableUiTableCrossReference_2_0.eContents().get(1);
		
		//UiRemoveFromTableCommand:
		//	{UiRemoveFromTableCommand} "removeFromTable" table=[UiTable];
		public ParserRule getRule() { return rule; }

		//{UiRemoveFromTableCommand} "removeFromTable" table=[UiTable]
		public Group getGroup() { return cGroup; }

		//{UiRemoveFromTableCommand}
		public Action getUiRemoveFromTableCommandAction_0() { return cUiRemoveFromTableCommandAction_0; }

		//"removeFromTable"
		public Keyword getRemoveFromTableKeyword_1() { return cRemoveFromTableKeyword_1; }

		//table=[UiTable]
		public Assignment getTableAssignment_2() { return cTableAssignment_2; }

		//[UiTable]
		public CrossReference getTableUiTableCrossReference_2_0() { return cTableUiTableCrossReference_2_0; }

		//ID
		public RuleCall getTableUiTableIDTerminalRuleCall_2_0_1() { return cTableUiTableIDTerminalRuleCall_2_0_1; }
	}

	public class UiSetNewInstanceCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSetNewInstanceCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSetNewInstanceCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNewInstanceKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cForKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cJvmTypeAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_2_1_0 = (RuleCall)cJvmTypeAssignment_2_1.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cAtKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cTargetAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0 = (RuleCall)cTargetAssignment_3_1.eContents().get(0);
		
		//UiSetNewInstanceCommand:
		//	{UiSetNewInstanceCommand} "newInstance" ("for" jvmType=JvmTypeReference)? ("at" target=UiBindingEndpointAssignment);
		public ParserRule getRule() { return rule; }

		//{UiSetNewInstanceCommand} "newInstance" ("for" jvmType=JvmTypeReference)? ("at" target=UiBindingEndpointAssignment)
		public Group getGroup() { return cGroup; }

		//{UiSetNewInstanceCommand}
		public Action getUiSetNewInstanceCommandAction_0() { return cUiSetNewInstanceCommandAction_0; }

		//"newInstance"
		public Keyword getNewInstanceKeyword_1() { return cNewInstanceKeyword_1; }

		//("for" jvmType=JvmTypeReference)?
		public Group getGroup_2() { return cGroup_2; }

		//"for"
		public Keyword getForKeyword_2_0() { return cForKeyword_2_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_2_1() { return cJvmTypeAssignment_2_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_2_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_2_1_0; }

		//"at" target=UiBindingEndpointAssignment
		public Group getGroup_3() { return cGroup_3; }

		//"at"
		public Keyword getAtKeyword_3_0() { return cAtKeyword_3_0; }

		//target=UiBindingEndpointAssignment
		public Assignment getTargetAssignment_3_1() { return cTargetAssignment_3_1; }

		//UiBindingEndpointAssignment
		public RuleCall getTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0() { return cTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0; }
	}

	public class UiSendEventCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSendEventCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSendEventCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSendEventKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cNoAutoTriggerAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cNoAutoTriggerNoAutoTriggerKeyword_3_0 = (Keyword)cNoAutoTriggerAssignment_3.eContents().get(0);
		private final Assignment cEventTopicAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cEventTopicSTRINGTerminalRuleCall_4_0 = (RuleCall)cEventTopicAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiSendEventCommand:
		//	{UiSendEventCommand} "sendEvent" "(" noAutoTrigger?="noAutoTrigger"? eventTopic=STRING ")";
		public ParserRule getRule() { return rule; }

		//{UiSendEventCommand} "sendEvent" "(" noAutoTrigger?="noAutoTrigger"? eventTopic=STRING ")"
		public Group getGroup() { return cGroup; }

		//{UiSendEventCommand}
		public Action getUiSendEventCommandAction_0() { return cUiSendEventCommandAction_0; }

		//"sendEvent"
		public Keyword getSendEventKeyword_1() { return cSendEventKeyword_1; }

		//"("
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }

		//noAutoTrigger?="noAutoTrigger"?
		public Assignment getNoAutoTriggerAssignment_3() { return cNoAutoTriggerAssignment_3; }

		//"noAutoTrigger"
		public Keyword getNoAutoTriggerNoAutoTriggerKeyword_3_0() { return cNoAutoTriggerNoAutoTriggerKeyword_3_0; }

		//eventTopic=STRING
		public Assignment getEventTopicAssignment_4() { return cEventTopicAssignment_4; }

		//STRING
		public RuleCall getEventTopicSTRINGTerminalRuleCall_4_0() { return cEventTopicSTRINGTerminalRuleCall_4_0; }

		//")"
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
	}

	public class UiViewElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiView");
		private final RuleCall cUiIDEViewParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//UiView:
		//	UiIDEView;
		public ParserRule getRule() { return rule; }

		//UiIDEView
		public RuleCall getUiIDEViewParserRuleCall() { return cUiIDEViewParserRuleCall; }
	}

	public class UiIDEViewElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiIDEView");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cIdeviewKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cSharedStateGroupKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSharedStateGroupAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0 = (RuleCall)cSharedStateGroupAssignment_3_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Keyword cCategoryKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cViewCategoryAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final CrossReference cViewCategoryUxViewCategoryCrossReference_3_1_1_0 = (CrossReference)cViewCategoryAssignment_3_1_1.eContents().get(0);
		private final RuleCall cViewCategoryUxViewCategoryQualifiedNameParserRuleCall_3_1_1_0_1 = (RuleCall)cViewCategoryUxViewCategoryCrossReference_3_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_3_1_2 = (Keyword)cGroup_3_1.eContents().get(2);
		private final Group cGroup_3_2 = (Group)cUnorderedGroup_3.eContents().get(2);
		private final Keyword cRootTypeKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
		private final Assignment cJvmTypeAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0 = (RuleCall)cJvmTypeAssignment_3_2_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_2_2 = (Keyword)cGroup_3_2.eContents().get(2);
		private final Group cGroup_3_3 = (Group)cUnorderedGroup_3.eContents().get(3);
		private final Keyword cExposedActionsKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3_3_1 = (Keyword)cGroup_3_3.eContents().get(1);
		private final Assignment cExposedActionsAssignment_3_3_2 = (Assignment)cGroup_3_3.eContents().get(2);
		private final RuleCall cExposedActionsUiExposedActionParserRuleCall_3_3_2_0 = (RuleCall)cExposedActionsAssignment_3_3_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3_3_3 = (Keyword)cGroup_3_3.eContents().get(3);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cBeanSlotsAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cBeanSlotsUiBeanSlotParserRuleCall_4_0_0 = (RuleCall)cBeanSlotsAssignment_4_0.eContents().get(0);
		private final Assignment cBindingEndpointAliasAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0 = (RuleCall)cBindingEndpointAliasAssignment_4_1.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2 = (Assignment)cAlternatives_4.eContents().get(2);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_0 = (RuleCall)cBindingsAssignment_4_2.eContents().get(0);
		private final Assignment cContentAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentUiEmbeddableParserRuleCall_5_0 = (RuleCall)cContentAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cAlignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cContentAlignmentAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cContentAlignmentUiAlignmentEnumRuleCall_6_1_0 = (RuleCall)cContentAlignmentAssignment_6_1.eContents().get(0);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Assignment cBindingEndpointAliasAssignment_7_0 = (Assignment)cAlternatives_7.eContents().get(0);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0 = (RuleCall)cBindingEndpointAliasAssignment_7_0.eContents().get(0);
		private final Assignment cBindingsAssignment_7_1 = (Assignment)cAlternatives_7.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_7_1_0 = (RuleCall)cBindingsAssignment_7_1.eContents().get(0);
		private final Assignment cValidatorAssignmentsAssignment_7_2 = (Assignment)cAlternatives_7.eContents().get(2);
		private final RuleCall cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0 = (RuleCall)cValidatorAssignmentsAssignment_7_2.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7_3 = (Assignment)cAlternatives_7.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0 = (RuleCall)cProcessorAssignmentsAssignment_7_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiIDEView:
		//	"ideview" name=ID "{" (("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("category"
		//	viewCategory=[cfg::UxViewCategory|QualifiedName] ";"?)? & ("rootType" jvmType=JvmTypeReference ";"?)? &
		//	("exposedActions" "{" exposedActions+=UiExposedAction* "}")?) (beanSlots+=UiBeanSlot |
		//	bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* content=UiEmbeddable ("align"
		//	contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
		//	validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* "}";
		public ParserRule getRule() { return rule; }

		//"ideview" name=ID "{" (("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("category"
		//viewCategory=[cfg::UxViewCategory|QualifiedName] ";"?)? & ("rootType" jvmType=JvmTypeReference ";"?)? &
		//("exposedActions" "{" exposedActions+=UiExposedAction* "}")?) (beanSlots+=UiBeanSlot |
		//bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* content=UiEmbeddable ("align"
		//contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
		//validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* "}"
		public Group getGroup() { return cGroup; }

		//"ideview"
		public Keyword getIdeviewKeyword_0() { return cIdeviewKeyword_0; }

		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }

		//("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("category" viewCategory=[cfg::UxViewCategory|QualifiedName] ";"?)?
		//& ("rootType" jvmType=JvmTypeReference ";"?)? & ("exposedActions" "{" exposedActions+=UiExposedAction* "}")?
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }

		//("sharedStateGroup" sharedStateGroup=STRING ";"?)?
		public Group getGroup_3_0() { return cGroup_3_0; }

		//"sharedStateGroup"
		public Keyword getSharedStateGroupKeyword_3_0_0() { return cSharedStateGroupKeyword_3_0_0; }

		//sharedStateGroup=STRING
		public Assignment getSharedStateGroupAssignment_3_0_1() { return cSharedStateGroupAssignment_3_0_1; }

		//STRING
		public RuleCall getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0() { return cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_3_0_2() { return cSemicolonKeyword_3_0_2; }

		//("category" viewCategory=[cfg::UxViewCategory|QualifiedName] ";"?)?
		public Group getGroup_3_1() { return cGroup_3_1; }

		//"category"
		public Keyword getCategoryKeyword_3_1_0() { return cCategoryKeyword_3_1_0; }

		//viewCategory=[cfg::UxViewCategory|QualifiedName]
		public Assignment getViewCategoryAssignment_3_1_1() { return cViewCategoryAssignment_3_1_1; }

		//[cfg::UxViewCategory|QualifiedName]
		public CrossReference getViewCategoryUxViewCategoryCrossReference_3_1_1_0() { return cViewCategoryUxViewCategoryCrossReference_3_1_1_0; }

		//QualifiedName
		public RuleCall getViewCategoryUxViewCategoryQualifiedNameParserRuleCall_3_1_1_0_1() { return cViewCategoryUxViewCategoryQualifiedNameParserRuleCall_3_1_1_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_3_1_2() { return cSemicolonKeyword_3_1_2; }

		//("rootType" jvmType=JvmTypeReference ";"?)?
		public Group getGroup_3_2() { return cGroup_3_2; }

		//"rootType"
		public Keyword getRootTypeKeyword_3_2_0() { return cRootTypeKeyword_3_2_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_3_2_1() { return cJvmTypeAssignment_3_2_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_3_2_2() { return cSemicolonKeyword_3_2_2; }

		//("exposedActions" "{" exposedActions+=UiExposedAction* "}")?
		public Group getGroup_3_3() { return cGroup_3_3; }

		//"exposedActions"
		public Keyword getExposedActionsKeyword_3_3_0() { return cExposedActionsKeyword_3_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_3_3_1() { return cLeftCurlyBracketKeyword_3_3_1; }

		//exposedActions+=UiExposedAction*
		public Assignment getExposedActionsAssignment_3_3_2() { return cExposedActionsAssignment_3_3_2; }

		//UiExposedAction
		public RuleCall getExposedActionsUiExposedActionParserRuleCall_3_3_2_0() { return cExposedActionsUiExposedActionParserRuleCall_3_3_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_3_3_3() { return cRightCurlyBracketKeyword_3_3_3; }

		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)*
		public Alternatives getAlternatives_4() { return cAlternatives_4; }

		//beanSlots+=UiBeanSlot
		public Assignment getBeanSlotsAssignment_4_0() { return cBeanSlotsAssignment_4_0; }

		//UiBeanSlot
		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_4_0_0() { return cBeanSlotsUiBeanSlotParserRuleCall_4_0_0; }

		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_4_1() { return cBindingEndpointAliasAssignment_4_1; }

		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }

		//content=UiEmbeddable
		public Assignment getContentAssignment_5() { return cContentAssignment_5; }

		//UiEmbeddable
		public RuleCall getContentUiEmbeddableParserRuleCall_5_0() { return cContentUiEmbeddableParserRuleCall_5_0; }

		//("align" contentAlignment=UiAlignment)?
		public Group getGroup_6() { return cGroup_6; }

		//"align"
		public Keyword getAlignKeyword_6_0() { return cAlignKeyword_6_0; }

		//contentAlignment=UiAlignment
		public Assignment getContentAlignmentAssignment_6_1() { return cContentAlignmentAssignment_6_1; }

		//UiAlignment
		public RuleCall getContentAlignmentUiAlignmentEnumRuleCall_6_1_0() { return cContentAlignmentUiAlignmentEnumRuleCall_6_1_0; }

		//(bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
		//processorAssignments+=UiVisibilityProcessorAssignment)*
		public Alternatives getAlternatives_7() { return cAlternatives_7; }

		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_7_0() { return cBindingEndpointAliasAssignment_7_0; }

		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_7_1() { return cBindingsAssignment_7_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_7_1_0() { return cBindingsUiBindingParserRuleCall_7_1_0; }

		//validatorAssignments+=UiValidatorAssignment
		public Assignment getValidatorAssignmentsAssignment_7_2() { return cValidatorAssignmentsAssignment_7_2; }

		//UiValidatorAssignment
		public RuleCall getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0() { return cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment
		public Assignment getProcessorAssignmentsAssignment_7_3() { return cProcessorAssignmentsAssignment_7_3; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiExposedActionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiExposedAction");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameIDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cIconKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cIconNameAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cIconNameSTRINGTerminalRuleCall_1_1_0 = (RuleCall)cIconNameAssignment_1_1.eContents().get(0);
		private final Keyword cIdKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cActionReferenceAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final CrossReference cActionReferenceUxActionCrossReference_3_0_0 = (CrossReference)cActionReferenceAssignment_3_0.eContents().get(0);
		private final RuleCall cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1 = (RuleCall)cActionReferenceUxActionCrossReference_3_0_0.eContents().get(1);
		private final Assignment cActionIDAssignment_3_1 = (Assignment)cAlternatives_3.eContents().get(1);
		private final RuleCall cActionIDSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cActionIDAssignment_3_1.eContents().get(0);
		private final Assignment cCheckDirtyAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final Keyword cCheckDirtyCheckDirtyKeyword_4_0 = (Keyword)cCheckDirtyAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cExternalCommandKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cExternalCommandIdAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cExternalCommandIdSTRINGTerminalRuleCall_5_1_0 = (RuleCall)cExternalCommandIdAssignment_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//UiExposedAction:
		//	name=ID ("icon" iconName=STRING)? "id" (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
		//	checkDirty?="checkDirty"? ("externalCommand" externalCommandId=STRING)? ";"?;
		public ParserRule getRule() { return rule; }

		//name=ID ("icon" iconName=STRING)? "id" (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
		//checkDirty?="checkDirty"? ("externalCommand" externalCommandId=STRING)? ";"?
		public Group getGroup() { return cGroup; }

		//name=ID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_0_0() { return cNameIDTerminalRuleCall_0_0; }

		//("icon" iconName=STRING)?
		public Group getGroup_1() { return cGroup_1; }

		//"icon"
		public Keyword getIconKeyword_1_0() { return cIconKeyword_1_0; }

		//iconName=STRING
		public Assignment getIconNameAssignment_1_1() { return cIconNameAssignment_1_1; }

		//STRING
		public RuleCall getIconNameSTRINGTerminalRuleCall_1_1_0() { return cIconNameSTRINGTerminalRuleCall_1_1_0; }

		//"id"
		public Keyword getIdKeyword_2() { return cIdKeyword_2; }

		//=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING
		public Alternatives getAlternatives_3() { return cAlternatives_3; }

		//=> actionReference=[cfg::UxAction|QualifiedName]
		public Assignment getActionReferenceAssignment_3_0() { return cActionReferenceAssignment_3_0; }

		//[cfg::UxAction|QualifiedName]
		public CrossReference getActionReferenceUxActionCrossReference_3_0_0() { return cActionReferenceUxActionCrossReference_3_0_0; }

		//QualifiedName
		public RuleCall getActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1() { return cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1; }

		//actionID=STRING
		public Assignment getActionIDAssignment_3_1() { return cActionIDAssignment_3_1; }

		//STRING
		public RuleCall getActionIDSTRINGTerminalRuleCall_3_1_0() { return cActionIDSTRINGTerminalRuleCall_3_1_0; }

		//checkDirty?="checkDirty"?
		public Assignment getCheckDirtyAssignment_4() { return cCheckDirtyAssignment_4; }

		//"checkDirty"
		public Keyword getCheckDirtyCheckDirtyKeyword_4_0() { return cCheckDirtyCheckDirtyKeyword_4_0; }

		//("externalCommand" externalCommandId=STRING)?
		public Group getGroup_5() { return cGroup_5; }

		//"externalCommand"
		public Keyword getExternalCommandKeyword_5_0() { return cExternalCommandKeyword_5_0; }

		//externalCommandId=STRING
		public Assignment getExternalCommandIdAssignment_5_1() { return cExternalCommandIdAssignment_5_1; }

		//STRING
		public RuleCall getExternalCommandIdSTRINGTerminalRuleCall_5_1_0() { return cExternalCommandIdSTRINGTerminalRuleCall_5_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
	}

	public class UiMobileNavBarActionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavBarAction");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameIDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cIconKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cIconNameAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cIconNameSTRINGTerminalRuleCall_1_1_0 = (RuleCall)cIconNameAssignment_1_1.eContents().get(0);
		private final Keyword cIdKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cActionReferenceAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final CrossReference cActionReferenceUxActionCrossReference_3_0_0 = (CrossReference)cActionReferenceAssignment_3_0.eContents().get(0);
		private final RuleCall cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1 = (RuleCall)cActionReferenceUxActionCrossReference_3_0_0.eContents().get(1);
		private final Assignment cActionIDAssignment_3_1 = (Assignment)cAlternatives_3.eContents().get(1);
		private final RuleCall cActionIDSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cActionIDAssignment_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiMobileNavBarAction:
		//	name=ID ("icon" iconName=STRING)? "id" (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ";"?;
		public ParserRule getRule() { return rule; }

		//name=ID ("icon" iconName=STRING)? "id" (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ";"?
		public Group getGroup() { return cGroup; }

		//name=ID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_0_0() { return cNameIDTerminalRuleCall_0_0; }

		//("icon" iconName=STRING)?
		public Group getGroup_1() { return cGroup_1; }

		//"icon"
		public Keyword getIconKeyword_1_0() { return cIconKeyword_1_0; }

		//iconName=STRING
		public Assignment getIconNameAssignment_1_1() { return cIconNameAssignment_1_1; }

		//STRING
		public RuleCall getIconNameSTRINGTerminalRuleCall_1_1_0() { return cIconNameSTRINGTerminalRuleCall_1_1_0; }

		//"id"
		public Keyword getIdKeyword_2() { return cIdKeyword_2; }

		//=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING
		public Alternatives getAlternatives_3() { return cAlternatives_3; }

		//=> actionReference=[cfg::UxAction|QualifiedName]
		public Assignment getActionReferenceAssignment_3_0() { return cActionReferenceAssignment_3_0; }

		//[cfg::UxAction|QualifiedName]
		public CrossReference getActionReferenceUxActionCrossReference_3_0_0() { return cActionReferenceUxActionCrossReference_3_0_0; }

		//QualifiedName
		public RuleCall getActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1() { return cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1; }

		//actionID=STRING
		public Assignment getActionIDAssignment_3_1() { return cActionIDAssignment_3_1; }

		//STRING
		public RuleCall getActionIDSTRINGTerminalRuleCall_3_1_0() { return cActionIDSTRINGTerminalRuleCall_3_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}

	public class UiMobileViewElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileView");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cMobileKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cSharedStateGroupKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSharedStateGroupAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0 = (RuleCall)cSharedStateGroupAssignment_3_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Keyword cRootTypeKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cJvmTypeAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0 = (RuleCall)cJvmTypeAssignment_3_1_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_1_2 = (Keyword)cGroup_3_1.eContents().get(2);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cBeanSlotsAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cBeanSlotsUiBeanSlotParserRuleCall_4_0_0 = (RuleCall)cBeanSlotsAssignment_4_0.eContents().get(0);
		private final Assignment cBindingEndpointAliasAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0 = (RuleCall)cBindingEndpointAliasAssignment_4_1.eContents().get(0);
		private final Assignment cContentAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentUiMobileEmbeddableParserRuleCall_5_0 = (RuleCall)cContentAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cAlignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cContentAlignmentAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cContentAlignmentUiAlignmentEnumRuleCall_6_1_0 = (RuleCall)cContentAlignmentAssignment_6_1.eContents().get(0);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Assignment cBindingEndpointAliasAssignment_7_0 = (Assignment)cAlternatives_7.eContents().get(0);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0 = (RuleCall)cBindingEndpointAliasAssignment_7_0.eContents().get(0);
		private final Assignment cBindingsAssignment_7_1 = (Assignment)cAlternatives_7.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_7_1_0 = (RuleCall)cBindingsAssignment_7_1.eContents().get(0);
		private final Assignment cValidatorAssignmentsAssignment_7_2 = (Assignment)cAlternatives_7.eContents().get(2);
		private final RuleCall cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0 = (RuleCall)cValidatorAssignmentsAssignment_7_2.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7_3 = (Assignment)cAlternatives_7.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0 = (RuleCall)cProcessorAssignmentsAssignment_7_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileView:
		//	"mobile" name=ID "{" (("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("rootType" jvmType=JvmTypeReference
		//	";"?)?) (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)* content=UiMobileEmbeddable ("align"
		//	contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
		//	validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* "}";
		public ParserRule getRule() { return rule; }

		//"mobile" name=ID "{" (("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("rootType" jvmType=JvmTypeReference ";"?)?)
		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)* content=UiMobileEmbeddable ("align"
		//contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
		//validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* "}"
		public Group getGroup() { return cGroup; }

		//"mobile"
		public Keyword getMobileKeyword_0() { return cMobileKeyword_0; }

		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }

		//("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("rootType" jvmType=JvmTypeReference ";"?)?
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }

		//("sharedStateGroup" sharedStateGroup=STRING ";"?)?
		public Group getGroup_3_0() { return cGroup_3_0; }

		//"sharedStateGroup"
		public Keyword getSharedStateGroupKeyword_3_0_0() { return cSharedStateGroupKeyword_3_0_0; }

		//sharedStateGroup=STRING
		public Assignment getSharedStateGroupAssignment_3_0_1() { return cSharedStateGroupAssignment_3_0_1; }

		//STRING
		public RuleCall getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0() { return cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_3_0_2() { return cSemicolonKeyword_3_0_2; }

		//("rootType" jvmType=JvmTypeReference ";"?)?
		public Group getGroup_3_1() { return cGroup_3_1; }

		//"rootType"
		public Keyword getRootTypeKeyword_3_1_0() { return cRootTypeKeyword_3_1_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_3_1_1() { return cJvmTypeAssignment_3_1_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_3_1_2() { return cSemicolonKeyword_3_1_2; }

		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)*
		public Alternatives getAlternatives_4() { return cAlternatives_4; }

		//beanSlots+=UiBeanSlot
		public Assignment getBeanSlotsAssignment_4_0() { return cBeanSlotsAssignment_4_0; }

		//UiBeanSlot
		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_4_0_0() { return cBeanSlotsUiBeanSlotParserRuleCall_4_0_0; }

		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_4_1() { return cBindingEndpointAliasAssignment_4_1; }

		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0; }

		//content=UiMobileEmbeddable
		public Assignment getContentAssignment_5() { return cContentAssignment_5; }

		//UiMobileEmbeddable
		public RuleCall getContentUiMobileEmbeddableParserRuleCall_5_0() { return cContentUiMobileEmbeddableParserRuleCall_5_0; }

		//("align" contentAlignment=UiAlignment)?
		public Group getGroup_6() { return cGroup_6; }

		//"align"
		public Keyword getAlignKeyword_6_0() { return cAlignKeyword_6_0; }

		//contentAlignment=UiAlignment
		public Assignment getContentAlignmentAssignment_6_1() { return cContentAlignmentAssignment_6_1; }

		//UiAlignment
		public RuleCall getContentAlignmentUiAlignmentEnumRuleCall_6_1_0() { return cContentAlignmentUiAlignmentEnumRuleCall_6_1_0; }

		//(bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
		//processorAssignments+=UiVisibilityProcessorAssignment)*
		public Alternatives getAlternatives_7() { return cAlternatives_7; }

		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_7_0() { return cBindingEndpointAliasAssignment_7_0; }

		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_7_1() { return cBindingsAssignment_7_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_7_1_0() { return cBindingsUiBindingParserRuleCall_7_1_0; }

		//validatorAssignments+=UiValidatorAssignment
		public Assignment getValidatorAssignmentsAssignment_7_2() { return cValidatorAssignmentsAssignment_7_2; }

		//UiValidatorAssignment
		public RuleCall getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0() { return cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment
		public Assignment getProcessorAssignmentsAssignment_7_3() { return cProcessorAssignmentsAssignment_7_3; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiI18nInfoElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiI18nInfo");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cI18nKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cKeyAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cKeySTRINGTerminalRuleCall_1_0 = (RuleCall)cKeyAssignment_1.eContents().get(0);
		
		//UiI18nInfo:
		//	"i18n" key=STRING;
		public ParserRule getRule() { return rule; }

		//"i18n" key=STRING
		public Group getGroup() { return cGroup; }

		//"i18n"
		public Keyword getI18nKeyword_0() { return cI18nKeyword_0; }

		//key=STRING
		public Assignment getKeyAssignment_1() { return cKeyAssignment_1; }

		//STRING
		public RuleCall getKeySTRINGTerminalRuleCall_1_0() { return cKeySTRINGTerminalRuleCall_1_0; }
	}

	public class UiGridLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiGridLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiGridLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cGridlayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cColumnsKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cColumnsAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cColumnsINTTerminalRuleCall_2_1_0_1_0 = (RuleCall)cColumnsAssignment_2_1_0_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0 = (RuleCall)cI18nInfoAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_2_1_3_0 = (Keyword)cReadonlyAssignment_2_1_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiGridLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiGridLayout:
		//	{UiGridLayout} "gridlayout" ("(" (("columns=" columns=INT)? & i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
		//	readonly?="readonly"?) ")")? name=ID? "{" contents+=UiGridLayoutAssigment* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiGridLayout} "gridlayout" ("(" (("columns=" columns=INT)? & i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
		//readonly?="readonly"?) ")")? name=ID? "{" contents+=UiGridLayoutAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiGridLayout}
		public Action getUiGridLayoutAction_0() { return cUiGridLayoutAction_0; }

		//"gridlayout"
		public Keyword getGridlayoutKeyword_1() { return cGridlayoutKeyword_1; }

		//("(" (("columns=" columns=INT)? & i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//("columns=" columns=INT)? & i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//("columns=" columns=INT)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }

		//"columns="
		public Keyword getColumnsKeyword_2_1_0_0() { return cColumnsKeyword_2_1_0_0; }

		//columns=INT
		public Assignment getColumnsAssignment_2_1_0_1() { return cColumnsAssignment_2_1_0_1; }

		//INT
		public RuleCall getColumnsINTTerminalRuleCall_2_1_0_1_0() { return cColumnsINTTerminalRuleCall_2_1_0_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//contents+=UiGridLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }

		//UiGridLayoutAssigment
		public RuleCall getContentsUiGridLayoutAssigmentParserRuleCall_5_0() { return cContentsUiGridLayoutAssigmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiVisibilityProcessorAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiVisibilityProcessorAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVisibilityProcessorAssignmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cProcessorAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cProcessorUiVisibilityProcessorParserRuleCall_1_0 = (RuleCall)cProcessorAssignment_1.eContents().get(0);
		
		//UiVisibilityProcessorAssignment:
		//	{UiVisibilityProcessorAssignment} processor=UiVisibilityProcessor;
		public ParserRule getRule() { return rule; }

		//{UiVisibilityProcessorAssignment} processor=UiVisibilityProcessor
		public Group getGroup() { return cGroup; }

		//{UiVisibilityProcessorAssignment}
		public Action getUiVisibilityProcessorAssignmentAction_0() { return cUiVisibilityProcessorAssignmentAction_0; }

		//processor=UiVisibilityProcessor
		public Assignment getProcessorAssignment_1() { return cProcessorAssignment_1; }

		//UiVisibilityProcessor
		public RuleCall getProcessorUiVisibilityProcessorParserRuleCall_1_0() { return cProcessorUiVisibilityProcessorParserRuleCall_1_0; }
	}

	public class UiGridLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiGridLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiGridLayoutAssigment:
		//	element=UiEmbeddable ("align" alignment=UiAlignment)?;
		public ParserRule getRule() { return rule; }

		//element=UiEmbeddable ("align" alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }

		//element=UiEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }

		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }

		//("align" alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }

		//"align"
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }

		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }

		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}

	public class UiFormLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiFormLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiFormLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cFormKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_0 = (RuleCall)cStylesAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Assignment cReadonlyAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cReadonlyReadonlyKeyword_2_2_0_0 = (Keyword)cReadonlyAssignment_2_2_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiFormLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiFormLayout:
		//	{UiFormLayout} "form" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")? name=ID? "{"
		//	contents+=UiFormLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiFormLayout} "form" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")? name=ID? "{"
		//contents+=UiFormLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiFormLayout}
		public Action getUiFormLayoutAction_0() { return cUiFormLayoutAction_0; }

		//"form"
		public Keyword getFormKeyword_1() { return cFormKeyword_1; }

		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }

		//"(" i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1() { return cGroup_2_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }

		//readonly?="readonly"? ")"
		public Group getGroup_2_2() { return cGroup_2_2; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//contents+=UiFormLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }

		//UiFormLayoutAssigment
		public RuleCall getContentsUiFormLayoutAssigmentParserRuleCall_5_0() { return cContentsUiFormLayoutAssigmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiFormLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiFormLayoutAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiFormLayoutAssigment:
		//	element=UiEmbeddable;
		public ParserRule getRule() { return rule; }

		//element=UiEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }

		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
	}

	public class UiVerticalLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiVerticalLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVerticalLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cVerticalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_0 = (RuleCall)cStylesAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Assignment cReadonlyAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cReadonlyReadonlyKeyword_2_2_0_0 = (Keyword)cReadonlyAssignment_2_2_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiVerticalLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiVerticalLayout:
		//	{UiVerticalLayout} "verticalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?
		//	")")? name=ID? "{" contents+=UiVerticalLayoutAssigment* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiVerticalLayout} "verticalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
		//name=ID? "{" contents+=UiVerticalLayoutAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiVerticalLayout}
		public Action getUiVerticalLayoutAction_0() { return cUiVerticalLayoutAction_0; }

		//"verticalLayout"
		public Keyword getVerticalLayoutKeyword_1() { return cVerticalLayoutKeyword_1; }

		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }

		//"(" i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1() { return cGroup_2_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }

		//readonly?="readonly"? ")"
		public Group getGroup_2_2() { return cGroup_2_2; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//contents+=UiVerticalLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }

		//UiVerticalLayoutAssigment
		public RuleCall getContentsUiVerticalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiVerticalLayoutAssigmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiVerticalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiVerticalLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiVerticalLayoutAssigment:
		//	element=UiEmbeddable ("align" alignment=UiAlignment)?;
		public ParserRule getRule() { return rule; }

		//element=UiEmbeddable ("align" alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }

		//element=UiEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }

		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }

		//("align" alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }

		//"align"
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }

		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }

		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}

	public class UiMobileVerticalLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileVerticalLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVerticalLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMobileVerticalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_0 = (RuleCall)cStylesAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Assignment cReadonlyAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cReadonlyReadonlyKeyword_2_2_0_0 = (Keyword)cReadonlyAssignment_2_2_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileVerticalLayout returns UiVerticalLayout:
		//	{UiVerticalLayout} "mobileVerticalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
		//	readonly?="readonly"? ")")? name=ID? "{" contents+=UiMobileVerticalLayoutAssigment* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiVerticalLayout} "mobileVerticalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?
		//")")? name=ID? "{" contents+=UiMobileVerticalLayoutAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiVerticalLayout}
		public Action getUiVerticalLayoutAction_0() { return cUiVerticalLayoutAction_0; }

		//"mobileVerticalLayout"
		public Keyword getMobileVerticalLayoutKeyword_1() { return cMobileVerticalLayoutKeyword_1; }

		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }

		//"(" i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1() { return cGroup_2_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }

		//readonly?="readonly"? ")"
		public Group getGroup_2_2() { return cGroup_2_2; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//contents+=UiMobileVerticalLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }

		//UiMobileVerticalLayoutAssigment
		public RuleCall getContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiMobileVerticalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileVerticalLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiMobileVerticalLayoutAssigment returns UiVerticalLayoutAssigment:
		//	element=UiMobileEmbeddable ("align" alignment=UiAlignment)?;
		public ParserRule getRule() { return rule; }

		//element=UiMobileEmbeddable ("align" alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }

		//element=UiMobileEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }

		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }

		//("align" alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }

		//"align"
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }

		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }

		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}

	public class UiMobileNavigationRootElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationRoot");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileNavigationRootAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNavRootKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cContentsAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0 = (RuleCall)cContentsAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiMobileNavigationRoot:
		//	{UiMobileNavigationRoot} "navRoot" name=ID? "{" contents+=UiMobileNavigationRootAssigment "}";
		public ParserRule getRule() { return rule; }

		//{UiMobileNavigationRoot} "navRoot" name=ID? "{" contents+=UiMobileNavigationRootAssigment "}"
		public Group getGroup() { return cGroup; }

		//{UiMobileNavigationRoot}
		public Action getUiMobileNavigationRootAction_0() { return cUiMobileNavigationRootAction_0; }

		//"navRoot"
		public Keyword getNavRootKeyword_1() { return cNavRootKeyword_1; }

		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }

		//contents+=UiMobileNavigationRootAssigment
		public Assignment getContentsAssignment_4() { return cContentsAssignment_4; }

		//UiMobileNavigationRootAssigment
		public RuleCall getContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0() { return cContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}

	public class UiMobileNavigationRootAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationRootAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiMobileNavigationPageParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiMobileNavigationRootAssigment:
		//	element=UiMobileNavigationPage;
		public ParserRule getRule() { return rule; }

		//element=UiMobileNavigationPage
		public Assignment getElementAssignment() { return cElementAssignment; }

		//UiMobileNavigationPage
		public RuleCall getElementUiMobileNavigationPageParserRuleCall_0() { return cElementUiMobileNavigationPageParserRuleCall_0; }
	}

	public class UiHorizontalLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiHorizontalLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiHorizontalLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cHorizontalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1 = (Assignment)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_0 = (Keyword)cReadonlyAssignment_2_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Group cGroup_2_2_0 = (Group)cGroup_2_2.eContents().get(0);
		private final Keyword cStylesKeyword_2_2_0_0 = (Keyword)cGroup_2_2_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_2_0_1 = (Assignment)cGroup_2_2_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_2_0_1_0 = (RuleCall)cStylesAssignment_2_2_0_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiHorizontalLayout:
		//	{UiHorizontalLayout} "horizontalLayout" ("(" i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		//	")")? name=ID? "{" //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//	contents+=UiHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiHorizontalLayout} "horizontalLayout" ("(" i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		//")")? name=ID? "{" //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//contents+=UiHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiHorizontalLayout}
		public Action getUiHorizontalLayoutAction_0() { return cUiHorizontalLayoutAction_0; }

		//"horizontalLayout"
		public Keyword getHorizontalLayoutKeyword_1() { return cHorizontalLayoutKeyword_1; }

		//("(" i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)? ")")?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }

		//"(" i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1() { return cReadonlyAssignment_2_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_0() { return cReadonlyReadonlyKeyword_2_1_0; }

		//("styles" styles=STRING)? ")"
		public Group getGroup_2_2() { return cGroup_2_2; }

		//("styles" styles=STRING)?
		public Group getGroup_2_2_0() { return cGroup_2_2_0; }

		//"styles"
		public Keyword getStylesKeyword_2_2_0_0() { return cStylesKeyword_2_2_0_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_2_0_1() { return cStylesAssignment_2_2_0_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_2_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_2_0_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//contents+=UiHorizontalLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }

		//UiHorizontalLayoutAssigment
		public RuleCall getContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiHorizontalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiHorizontalLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiHorizontalLayoutAssigment:
		//	element=UiEmbeddable ("align" alignment=UiAlignment)?;
		public ParserRule getRule() { return rule; }

		//element=UiEmbeddable ("align" alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }

		//element=UiEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }

		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }

		//("align" alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }

		//"align"
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }

		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }

		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}

	public class UiMobileHorizontalLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileHorizontalLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiHorizontalLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMobileHorizontalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_0 = (RuleCall)cStylesAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Assignment cReadonlyAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cReadonlyReadonlyKeyword_2_2_0_0 = (Keyword)cReadonlyAssignment_2_2_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileHorizontalLayout returns UiHorizontalLayout:
		//	{UiHorizontalLayout} "mobileHorizontalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
		//	readonly?="readonly"? ")")? name=ID? "{" //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//	contents+=UiMobileHorizontalLayoutAssigment* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiHorizontalLayout} "mobileHorizontalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
		//readonly?="readonly"? ")")? name=ID? "{" //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//contents+=UiMobileHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment*
		//"}"
		public Group getGroup() { return cGroup; }

		//{UiHorizontalLayout}
		public Action getUiHorizontalLayoutAction_0() { return cUiHorizontalLayoutAction_0; }

		//"mobileHorizontalLayout"
		public Keyword getMobileHorizontalLayoutKeyword_1() { return cMobileHorizontalLayoutKeyword_1; }

		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }

		//"(" i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1() { return cGroup_2_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }

		//readonly?="readonly"? ")"
		public Group getGroup_2_2() { return cGroup_2_2; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//contents+=UiMobileHorizontalLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }

		//UiMobileHorizontalLayoutAssigment
		public RuleCall getContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiMobileHorizontalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileHorizontalLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiMobileHorizontalLayoutAssigment returns UiHorizontalLayoutAssigment:
		//	element=UiMobileEmbeddable ("align" alignment=UiAlignment)?;
		public ParserRule getRule() { return rule; }

		//element=UiMobileEmbeddable ("align" alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }

		//element=UiMobileEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }

		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }

		//("align" alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }

		//"align"
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }

		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }

		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}

	public class UiMobileHorizontalButtonGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileHorizontalButtonGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiHorizontalButtonGroupAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cHorizontalButtonGroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cReadonlyReadonlyKeyword_2_1_2_0 = (Keyword)cReadonlyAssignment_2_1_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileHorizontalButtonGroup returns UiHorizontalButtonGroup:
		//	{UiHorizontalButtonGroup} "horizontalButtonGroup" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
		//	readonly?="readonly"?) ")")? name=ID? "{" contents+=UiMobileHorizontalButtonGroupAssigment* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiHorizontalButtonGroup} "horizontalButtonGroup" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
		//readonly?="readonly"?) ")")? name=ID? "{" contents+=UiMobileHorizontalButtonGroupAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiHorizontalButtonGroup}
		public Action getUiHorizontalButtonGroupAction_0() { return cUiHorizontalButtonGroupAction_0; }

		//"horizontalButtonGroup"
		public Keyword getHorizontalButtonGroupKeyword_1() { return cHorizontalButtonGroupKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//contents+=UiMobileHorizontalButtonGroupAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }

		//UiMobileHorizontalButtonGroupAssigment
		public RuleCall getContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0() { return cContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiMobileHorizontalButtonGroupAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileHorizontalButtonGroupAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiMobileHorizontalButtonGroupAssigment returns UiHorizontalButtonGroupAssigment:
		//	element=UiMobileEmbeddable;
		public ParserRule getRule() { return rule; }

		//element=UiMobileEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }

		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0() { return cElementUiMobileEmbeddableParserRuleCall_0; }
	}

	public class UiMobileVerticalComponentGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileVerticalComponentGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVerticalComponentGroupAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cVerticalGroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileVerticalComponentGroup returns UiVerticalComponentGroup:
		//	{UiVerticalComponentGroup} "verticalGroup" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles"
		//	styles=STRING)?) ")")? name=ID? "{" contents+=UiMobileVerticalComponentGroupAssigment* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiVerticalComponentGroup} "verticalGroup" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles"
		//styles=STRING)?) ")")? name=ID? "{" contents+=UiMobileVerticalComponentGroupAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiVerticalComponentGroup}
		public Action getUiVerticalComponentGroupAction_0() { return cUiVerticalComponentGroupAction_0; }

		//"verticalGroup"
		public Keyword getVerticalGroupKeyword_1() { return cVerticalGroupKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//contents+=UiMobileVerticalComponentGroupAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }

		//UiMobileVerticalComponentGroupAssigment
		public RuleCall getContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0() { return cContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiMobileVerticalComponentGroupAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileVerticalComponentGroupAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiMobileVerticalComponentGroupAssigment returns UiVerticalComponentGroupAssigment:
		//	element=UiMobileEmbeddable;
		public ParserRule getRule() { return rule; }

		//element=UiMobileEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }

		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0() { return cElementUiMobileEmbeddableParserRuleCall_0; }
	}

	public class UiSearchPanelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSearchPanel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSearchPanelAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchPanelKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cTypeKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cJvmTypeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_6_0 = (RuleCall)cJvmTypeAssignment_6.eContents().get(0);
		private final Keyword cSemicolonKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Assignment cContentsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cContentsUiSearchFieldParserRuleCall_8_0 = (RuleCall)cContentsAssignment_8.eContents().get(0);
		private final Assignment cBindingsAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cBindingsUiBindingParserRuleCall_9_0 = (RuleCall)cBindingsAssignment_9.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_10 = (Assignment)cGroup.eContents().get(10);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0 = (RuleCall)cProcessorAssignmentsAssignment_10.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_11 = (Keyword)cGroup.eContents().get(11);
		
		//UiSearchPanel:
		//	{UiSearchPanel} "searchPanel" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" "type"
		//	jvmType=JvmTypeReference ";"? contents+=UiSearchField* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiSearchPanel} "searchPanel" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" "type"
		//jvmType=JvmTypeReference ";"? contents+=UiSearchField* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiSearchPanel}
		public Action getUiSearchPanelAction_0() { return cUiSearchPanelAction_0; }

		//"searchPanel"
		public Keyword getSearchPanelKeyword_1() { return cSearchPanelKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//"type"
		public Keyword getTypeKeyword_5() { return cTypeKeyword_5; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_6() { return cJvmTypeAssignment_6; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_6_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_6_0; }

		//";"?
		public Keyword getSemicolonKeyword_7() { return cSemicolonKeyword_7; }

		//contents+=UiSearchField*
		public Assignment getContentsAssignment_8() { return cContentsAssignment_8; }

		//UiSearchField
		public RuleCall getContentsUiSearchFieldParserRuleCall_8_0() { return cContentsUiSearchFieldParserRuleCall_8_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_9() { return cBindingsAssignment_9; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_9_0() { return cBindingsUiBindingParserRuleCall_9_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_10() { return cProcessorAssignmentsAssignment_10; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_11() { return cRightCurlyBracketKeyword_11; }
	}

	public class UiMobileSearchPanelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileSearchPanel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileSearchPanelAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMobileSearchPanelKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cTypeKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cJvmTypeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_6_0 = (RuleCall)cJvmTypeAssignment_6.eContents().get(0);
		private final Keyword cSemicolonKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Assignment cContentsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cContentsUiSearchFieldParserRuleCall_8_0 = (RuleCall)cContentsAssignment_8.eContents().get(0);
		private final Assignment cBindingsAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cBindingsUiBindingParserRuleCall_9_0 = (RuleCall)cBindingsAssignment_9.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_10 = (Assignment)cGroup.eContents().get(10);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0 = (RuleCall)cProcessorAssignmentsAssignment_10.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_11 = (Keyword)cGroup.eContents().get(11);
		
		//UiMobileSearchPanel:
		//	{UiMobileSearchPanel} "mobileSearchPanel" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
		//	"type" jvmType=JvmTypeReference ";"? contents+=UiSearchField* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiMobileSearchPanel} "mobileSearchPanel" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
		//"type" jvmType=JvmTypeReference ";"? contents+=UiSearchField* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiMobileSearchPanel}
		public Action getUiMobileSearchPanelAction_0() { return cUiMobileSearchPanelAction_0; }

		//"mobileSearchPanel"
		public Keyword getMobileSearchPanelKeyword_1() { return cMobileSearchPanelKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//"type"
		public Keyword getTypeKeyword_5() { return cTypeKeyword_5; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_6() { return cJvmTypeAssignment_6; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_6_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_6_0; }

		//";"?
		public Keyword getSemicolonKeyword_7() { return cSemicolonKeyword_7; }

		//contents+=UiSearchField*
		public Assignment getContentsAssignment_8() { return cContentsAssignment_8; }

		//UiSearchField
		public RuleCall getContentsUiSearchFieldParserRuleCall_8_0() { return cContentsUiSearchFieldParserRuleCall_8_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_9() { return cBindingsAssignment_9; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_9_0() { return cBindingsUiBindingParserRuleCall_9_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_10() { return cProcessorAssignmentsAssignment_10; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_11() { return cRightCurlyBracketKeyword_11; }
	}

	public class UiMobileTabSheetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileTabSheet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileTabSheetAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMobileTabKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cTabsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cTabsUiMobileTabAssignmentParserRuleCall_5_0 = (RuleCall)cTabsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileTabSheet:
		//	{UiMobileTabSheet} "mobileTab" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
		//	tabs+=UiMobileTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiMobileTabSheet} "mobileTab" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
		//tabs+=UiMobileTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiMobileTabSheet}
		public Action getUiMobileTabSheetAction_0() { return cUiMobileTabSheetAction_0; }

		//"mobileTab"
		public Keyword getMobileTabKeyword_1() { return cMobileTabKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//tabs+=UiMobileTabAssignment*
		public Assignment getTabsAssignment_5() { return cTabsAssignment_5; }

		//UiMobileTabAssignment
		public RuleCall getTabsUiMobileTabAssignmentParserRuleCall_5_0() { return cTabsUiMobileTabAssignmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiMobileTabAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileTabAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTabKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cElementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_2_0 = (RuleCall)cElementAssignment_2.eContents().get(0);
		
		//UiMobileTabAssignment:
		//	"tab" name=ID? element=UiMobileEmbeddable;
		public ParserRule getRule() { return rule; }

		//"tab" name=ID? element=UiMobileEmbeddable
		public Group getGroup() { return cGroup; }

		//"tab"
		public Keyword getTabKeyword_0() { return cTabKeyword_0; }

		//name=ID?
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }

		//element=UiMobileEmbeddable
		public Assignment getElementAssignment_2() { return cElementAssignment_2; }

		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_2_0() { return cElementUiMobileEmbeddableParserRuleCall_2_0; }
	}

	public class UiTabSheetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTabSheet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTabSheetAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTabsheetKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cTabsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cTabsUiTabAssignmentParserRuleCall_5_0 = (RuleCall)cTabsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiTabSheet:
		//	{UiTabSheet} "tabsheet" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
		//	tabs+=UiTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiTabSheet} "tabsheet" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
		//tabs+=UiTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiTabSheet}
		public Action getUiTabSheetAction_0() { return cUiTabSheetAction_0; }

		//"tabsheet"
		public Keyword getTabsheetKeyword_1() { return cTabsheetKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//tabs+=UiTabAssignment*
		public Assignment getTabsAssignment_5() { return cTabsAssignment_5; }

		//UiTabAssignment
		public RuleCall getTabsUiTabAssignmentParserRuleCall_5_0() { return cTabsUiTabAssignmentParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiTabAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTabAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTabKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cElementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementUiEmbeddableParserRuleCall_2_0 = (RuleCall)cElementAssignment_2.eContents().get(0);
		
		//UiTabAssignment:
		//	"tab" name=ID? element=UiEmbeddable;
		public ParserRule getRule() { return rule; }

		//"tab" name=ID? element=UiEmbeddable
		public Group getGroup() { return cGroup; }

		//"tab"
		public Keyword getTabKeyword_0() { return cTabKeyword_0; }

		//name=ID?
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }

		//element=UiEmbeddable
		public Assignment getElementAssignment_2() { return cElementAssignment_2; }

		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_2_0() { return cElementUiEmbeddableParserRuleCall_2_0; }
	}

	public class UiSplitpanelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSplitpanel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cSplitterKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_1_0_1_0 = (RuleCall)cI18nInfoAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cUnorderedGroup_1.eContents().get(1);
		private final Group cGroup_1_1_0 = (Group)cGroup_1_1.eContents().get(0);
		private final Keyword cStylesKeyword_1_1_0_0 = (Keyword)cGroup_1_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_1_1_0_1 = (Assignment)cGroup_1_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_1_1_0_1_0 = (RuleCall)cStylesAssignment_1_1_0_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_1_1 = (Keyword)cGroup_1_1.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final UnorderedGroup cUnorderedGroup_4 = (UnorderedGroup)cGroup.eContents().get(4);
		private final Group cGroup_4_0 = (Group)cUnorderedGroup_4.eContents().get(0);
		private final Keyword cFirstKeyword_4_0_0 = (Keyword)cGroup_4_0.eContents().get(0);
		private final Assignment cFirstContentAssignment_4_0_1 = (Assignment)cGroup_4_0.eContents().get(1);
		private final RuleCall cFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0 = (RuleCall)cFirstContentAssignment_4_0_1.eContents().get(0);
		private final Group cGroup_4_1 = (Group)cUnorderedGroup_4.eContents().get(1);
		private final Keyword cSecondKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
		private final Assignment cSecondContentAssignment_4_1_1 = (Assignment)cGroup_4_1.eContents().get(1);
		private final RuleCall cSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0 = (RuleCall)cSecondContentAssignment_4_1_1.eContents().get(0);
		private final Group cGroup_4_2 = (Group)cUnorderedGroup_4.eContents().get(2);
		private final Keyword cSplitPosKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
		private final Assignment cSplitPositionAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
		private final RuleCall cSplitPositionINTTerminalRuleCall_4_2_1_0 = (RuleCall)cSplitPositionAssignment_4_2_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_4_3 = (Assignment)cUnorderedGroup_4.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_4_3_0 = (Keyword)cReadonlyAssignment_4_3.eContents().get(0);
		private final Assignment cBindingsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cBindingsUiBindingParserRuleCall_5_0 = (RuleCall)cBindingsAssignment_5.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0 = (RuleCall)cProcessorAssignmentsAssignment_6.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//UiSplitpanel:
		//	"splitter" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? ")")? name=ID "{" ("first"
		//	firstContent=UiSplitpanelAssigment & "second" secondContent=UiSplitpanelAssigment & ("splitPos" splitPosition=INT)? &
		//	readonly?="readonly"?) bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//"splitter" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? ")")? name=ID "{" ("first"
		//firstContent=UiSplitpanelAssigment & "second" secondContent=UiSplitpanelAssigment & ("splitPos" splitPosition=INT)? &
		//readonly?="readonly"?) bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//"splitter"
		public Keyword getSplitterKeyword_0() { return cSplitterKeyword_0; }

		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? ")")?
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }

		//"(" i18nInfo=UiI18nInfo?
		public Group getGroup_1_0() { return cGroup_1_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_1_0_0() { return cLeftParenthesisKeyword_1_0_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_1_0_1() { return cI18nInfoAssignment_1_0_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_1_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_1_0_1_0; }

		//("styles" styles=STRING)? ")"
		public Group getGroup_1_1() { return cGroup_1_1; }

		//("styles" styles=STRING)?
		public Group getGroup_1_1_0() { return cGroup_1_1_0; }

		//"styles"
		public Keyword getStylesKeyword_1_1_0_0() { return cStylesKeyword_1_1_0_0; }

		//styles=STRING
		public Assignment getStylesAssignment_1_1_0_1() { return cStylesAssignment_1_1_0_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_1_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_1_1_0_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_1_1_1() { return cRightParenthesisKeyword_1_1_1; }

		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }

		//"first" firstContent=UiSplitpanelAssigment & "second" secondContent=UiSplitpanelAssigment & ("splitPos"
		//splitPosition=INT)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4() { return cUnorderedGroup_4; }

		//"first" firstContent=UiSplitpanelAssigment
		public Group getGroup_4_0() { return cGroup_4_0; }

		//"first"
		public Keyword getFirstKeyword_4_0_0() { return cFirstKeyword_4_0_0; }

		//firstContent=UiSplitpanelAssigment
		public Assignment getFirstContentAssignment_4_0_1() { return cFirstContentAssignment_4_0_1; }

		//UiSplitpanelAssigment
		public RuleCall getFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0() { return cFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0; }

		//"second" secondContent=UiSplitpanelAssigment
		public Group getGroup_4_1() { return cGroup_4_1; }

		//"second"
		public Keyword getSecondKeyword_4_1_0() { return cSecondKeyword_4_1_0; }

		//secondContent=UiSplitpanelAssigment
		public Assignment getSecondContentAssignment_4_1_1() { return cSecondContentAssignment_4_1_1; }

		//UiSplitpanelAssigment
		public RuleCall getSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0() { return cSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0; }

		//("splitPos" splitPosition=INT)?
		public Group getGroup_4_2() { return cGroup_4_2; }

		//"splitPos"
		public Keyword getSplitPosKeyword_4_2_0() { return cSplitPosKeyword_4_2_0; }

		//splitPosition=INT
		public Assignment getSplitPositionAssignment_4_2_1() { return cSplitPositionAssignment_4_2_1; }

		//INT
		public RuleCall getSplitPositionINTTerminalRuleCall_4_2_1_0() { return cSplitPositionINTTerminalRuleCall_4_2_1_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_3() { return cReadonlyAssignment_4_3; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_3_0() { return cReadonlyReadonlyKeyword_4_3_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_5() { return cBindingsAssignment_5; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_5_0() { return cBindingsUiBindingParserRuleCall_5_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_6() { return cProcessorAssignmentsAssignment_6; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}

	public class UiSplitpanelAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSplitpanelAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiSplitpanelAssigment:
		//	element=UiEmbeddable;
		public ParserRule getRule() { return rule; }

		//element=UiEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }

		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
	}

	public class UiPanelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPanel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cPanelKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1_1 = (UnorderedGroup)cGroup_1.eContents().get(1);
		private final Assignment cI18nInfoAssignment_1_1_0 = (Assignment)cUnorderedGroup_1_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_1_1_0_0 = (RuleCall)cI18nInfoAssignment_1_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_1_1_1 = (Assignment)cUnorderedGroup_1_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_1_1_1_0 = (Keyword)cReadonlyAssignment_1_1_1.eContents().get(0);
		private final Group cGroup_1_1_2 = (Group)cUnorderedGroup_1_1.eContents().get(2);
		private final Keyword cStylesKeyword_1_1_2_0 = (Keyword)cGroup_1_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_1_1_2_1 = (Assignment)cGroup_1_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_1_1_2_1_0 = (RuleCall)cStylesAssignment_1_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Keyword cContentKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentUiEmbeddableParserRuleCall_5_0 = (RuleCall)cContentAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiPanel:
		//	"panel" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID "{" "content"
		//	content=UiEmbeddable bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//"panel" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID "{" "content"
		//content=UiEmbeddable bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//"panel"
		public Keyword getPanelKeyword_0() { return cPanelKeyword_0; }

		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_1() { return cGroup_1; }

		//"("
		public Keyword getLeftParenthesisKeyword_1_0() { return cLeftParenthesisKeyword_1_0; }

		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_1_1() { return cUnorderedGroup_1_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_1_1_0() { return cI18nInfoAssignment_1_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_1_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_1_1_0_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_1_1_1() { return cReadonlyAssignment_1_1_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_1_1_1_0() { return cReadonlyReadonlyKeyword_1_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_1_1_2() { return cGroup_1_1_2; }

		//"styles"
		public Keyword getStylesKeyword_1_1_2_0() { return cStylesKeyword_1_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_1_1_2_1() { return cStylesAssignment_1_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_1_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_1_1_2_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_1_2() { return cRightParenthesisKeyword_1_2; }

		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }

		//"content"
		public Keyword getContentKeyword_4() { return cContentKeyword_4; }

		//content=UiEmbeddable
		public Assignment getContentAssignment_5() { return cContentAssignment_5; }

		//UiEmbeddable
		public RuleCall getContentUiEmbeddableParserRuleCall_5_0() { return cContentUiEmbeddableParserRuleCall_5_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}

	public class UiDialogElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDialog");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiDialogAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cTypeKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cJvmTypeAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0 = (RuleCall)cJvmTypeAssignment_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Assignment cContentAssignment_6_0 = (Assignment)cGroup_6.eContents().get(0);
		private final RuleCall cContentUiDialogAssignmentParserRuleCall_6_0_0 = (RuleCall)cContentAssignment_6_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Assignment cBindingsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cBindingsUiBindingParserRuleCall_7_0 = (RuleCall)cBindingsAssignment_7.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0 = (RuleCall)cProcessorAssignmentsAssignment_8.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//UiDialog:
		//	{UiDialog} "dialog" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
		//	jvmType=JvmTypeReference ";"?)? (content=UiDialogAssignment ";"?)? bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiDialog} "dialog" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
		//jvmType=JvmTypeReference ";"?)? (content=UiDialogAssignment ";"?)? bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiDialog}
		public Action getUiDialogAction_0() { return cUiDialogAction_0; }

		//"dialog"
		public Keyword getDialogKeyword_1() { return cDialogKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//("type" jvmType=JvmTypeReference ";"?)?
		public Group getGroup_5() { return cGroup_5; }

		//"type"
		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_5_2() { return cSemicolonKeyword_5_2; }

		//(content=UiDialogAssignment ";"?)?
		public Group getGroup_6() { return cGroup_6; }

		//content=UiDialogAssignment
		public Assignment getContentAssignment_6_0() { return cContentAssignment_6_0; }

		//UiDialogAssignment
		public RuleCall getContentUiDialogAssignmentParserRuleCall_6_0_0() { return cContentUiDialogAssignmentParserRuleCall_6_0_0; }

		//";"?
		public Keyword getSemicolonKeyword_6_1() { return cSemicolonKeyword_6_1; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_7() { return cBindingsAssignment_7; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_7_0() { return cBindingsUiBindingParserRuleCall_7_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_8() { return cProcessorAssignmentsAssignment_8; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
	}

	public class UiDialogAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDialogAssignment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiDialogAssignment:
		//	element=UiEmbeddable;
		public ParserRule getRule() { return rule; }

		//element=UiEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }

		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
	}

	public class UiSearchDialogElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSearchDialog");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSearchDialogAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchdialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cTypeKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cJvmTypeAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0 = (RuleCall)cJvmTypeAssignment_5_1.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cSearchKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Assignment cSearchFieldsAssignment_6_2 = (Assignment)cGroup_6.eContents().get(2);
		private final RuleCall cSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0 = (RuleCall)cSearchFieldsAssignment_6_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6_3 = (Keyword)cGroup_6.eContents().get(3);
		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
		private final Keyword cContentKeyword_7_0 = (Keyword)cGroup_7.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_7_1 = (Keyword)cGroup_7.eContents().get(1);
		private final Assignment cContentAssignment_7_2 = (Assignment)cGroup_7.eContents().get(2);
		private final RuleCall cContentUiDialogAssignmentParserRuleCall_7_2_0 = (RuleCall)cContentAssignment_7_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_3 = (Keyword)cGroup_7.eContents().get(3);
		private final Assignment cBindingsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cBindingsUiBindingParserRuleCall_8_0 = (RuleCall)cBindingsAssignment_8.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0 = (RuleCall)cProcessorAssignmentsAssignment_9.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
		
		//UiSearchDialog:
		//	{UiSearchDialog} "searchdialog" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
		//	jvmType=JvmTypeReference)? ("search" "{" searchFields+=UiDialogSearchFieldAssignment* "}")? ("content" "{"
		//	content=UiDialogAssignment "}")? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiSearchDialog} "searchdialog" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
		//jvmType=JvmTypeReference)? ("search" "{" searchFields+=UiDialogSearchFieldAssignment* "}")? ("content" "{"
		//content=UiDialogAssignment "}")? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
		public Group getGroup() { return cGroup; }

		//{UiSearchDialog}
		public Action getUiSearchDialogAction_0() { return cUiSearchDialogAction_0; }

		//"searchdialog"
		public Keyword getSearchdialogKeyword_1() { return cSearchdialogKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//("type" jvmType=JvmTypeReference)?
		public Group getGroup_5() { return cGroup_5; }

		//"type"
		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }

		//("search" "{" searchFields+=UiDialogSearchFieldAssignment* "}")?
		public Group getGroup_6() { return cGroup_6; }

		//"search"
		public Keyword getSearchKeyword_6_0() { return cSearchKeyword_6_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_6_1() { return cLeftCurlyBracketKeyword_6_1; }

		//searchFields+=UiDialogSearchFieldAssignment*
		public Assignment getSearchFieldsAssignment_6_2() { return cSearchFieldsAssignment_6_2; }

		//UiDialogSearchFieldAssignment
		public RuleCall getSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0() { return cSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_6_3() { return cRightCurlyBracketKeyword_6_3; }

		//("content" "{" content=UiDialogAssignment "}")?
		public Group getGroup_7() { return cGroup_7; }

		//"content"
		public Keyword getContentKeyword_7_0() { return cContentKeyword_7_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_7_1() { return cLeftCurlyBracketKeyword_7_1; }

		//content=UiDialogAssignment
		public Assignment getContentAssignment_7_2() { return cContentAssignment_7_2; }

		//UiDialogAssignment
		public RuleCall getContentUiDialogAssignmentParserRuleCall_7_2_0() { return cContentUiDialogAssignmentParserRuleCall_7_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_7_3() { return cRightCurlyBracketKeyword_7_3; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_8() { return cBindingsAssignment_8; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_8_0() { return cBindingsUiBindingParserRuleCall_8_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_9() { return cProcessorAssignmentsAssignment_9; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
	}

	public class UiDialogSearchFieldAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDialogSearchFieldAssignment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiSearchFieldParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiDialogSearchFieldAssignment:
		//	element=UiSearchField;
		public ParserRule getRule() { return rule; }

		//element=UiSearchField
		public Assignment getElementAssignment() { return cElementAssignment; }

		//UiSearchField
		public RuleCall getElementUiSearchFieldParserRuleCall_0() { return cElementUiSearchFieldParserRuleCall_0; }
	}

	public class UiMobileNavigationPageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationPage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileNavigationPageAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNavPageKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cTypeKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cJvmTypeAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0 = (RuleCall)cJvmTypeAssignment_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cNavbarActionsKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Assignment cBarActionsAssignment_6_2 = (Assignment)cGroup_6.eContents().get(2);
		private final RuleCall cBarActionsUiMobileNavBarActionParserRuleCall_6_2_0 = (RuleCall)cBarActionsAssignment_6_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6_3 = (Keyword)cGroup_6.eContents().get(3);
		private final Assignment cContentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0 = (RuleCall)cContentsAssignment_7.eContents().get(0);
		private final Assignment cBindingsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cBindingsUiBindingParserRuleCall_8_0 = (RuleCall)cBindingsAssignment_8.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0 = (RuleCall)cProcessorAssignmentsAssignment_9.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
		
		//UiMobileNavigationPage:
		//	{UiMobileNavigationPage} "navPage" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
		//	jvmType=JvmTypeReference ";"?)? ("navbarActions" "{" barActions+=UiMobileNavBarAction* "}")?
		//	contents+=UiMobileNavigationPageAssignment* bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
		public ParserRule getRule() { return rule; }

		//{UiMobileNavigationPage} "navPage" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
		//jvmType=JvmTypeReference ";"?)? ("navbarActions" "{" barActions+=UiMobileNavBarAction* "}")?
		//contents+=UiMobileNavigationPageAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment*
		//"}"
		public Group getGroup() { return cGroup; }

		//{UiMobileNavigationPage}
		public Action getUiMobileNavigationPageAction_0() { return cUiMobileNavigationPageAction_0; }

		//"navPage"
		public Keyword getNavPageKeyword_1() { return cNavPageKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }

		//("type" jvmType=JvmTypeReference ";"?)?
		public Group getGroup_5() { return cGroup_5; }

		//"type"
		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_5_2() { return cSemicolonKeyword_5_2; }

		//("navbarActions" "{" barActions+=UiMobileNavBarAction* "}")?
		public Group getGroup_6() { return cGroup_6; }

		//"navbarActions"
		public Keyword getNavbarActionsKeyword_6_0() { return cNavbarActionsKeyword_6_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_6_1() { return cLeftCurlyBracketKeyword_6_1; }

		//barActions+=UiMobileNavBarAction*
		public Assignment getBarActionsAssignment_6_2() { return cBarActionsAssignment_6_2; }

		//UiMobileNavBarAction
		public RuleCall getBarActionsUiMobileNavBarActionParserRuleCall_6_2_0() { return cBarActionsUiMobileNavBarActionParserRuleCall_6_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_6_3() { return cRightCurlyBracketKeyword_6_3; }

		//contents+=UiMobileNavigationPageAssignment*
		public Assignment getContentsAssignment_7() { return cContentsAssignment_7; }

		//UiMobileNavigationPageAssignment
		public RuleCall getContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0() { return cContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_8() { return cBindingsAssignment_8; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_8_0() { return cBindingsUiBindingParserRuleCall_8_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_9() { return cProcessorAssignmentsAssignment_9; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
	}

	public class UiMobileNavigationPageAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationPageAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiMobileNavigationPageAssignment:
		//	element=UiMobileEmbeddable ("align" alignment=UiAlignment)?;
		public ParserRule getRule() { return rule; }

		//element=UiMobileEmbeddable ("align" alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }

		//element=UiMobileEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }

		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }

		//("align" alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }

		//"align"
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }

		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }

		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}

	public class UiPointElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPoint");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cXAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cXINTTerminalRuleCall_0_0 = (RuleCall)cXAssignment_0.eContents().get(0);
		private final Keyword cSolidusKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cYAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cYINTTerminalRuleCall_2_0 = (RuleCall)cYAssignment_2.eContents().get(0);
		
		//UiPoint:
		//	x=INT "/" y=INT;
		public ParserRule getRule() { return rule; }

		//x=INT "/" y=INT
		public Group getGroup() { return cGroup; }

		//x=INT
		public Assignment getXAssignment_0() { return cXAssignment_0; }

		//INT
		public RuleCall getXINTTerminalRuleCall_0_0() { return cXINTTerminalRuleCall_0_0; }

		//"/"
		public Keyword getSolidusKeyword_1() { return cSolidusKeyword_1; }

		//y=INT
		public Assignment getYAssignment_2() { return cYAssignment_2; }

		//INT
		public RuleCall getYINTTerminalRuleCall_2_0() { return cYINTTerminalRuleCall_2_0; }
	}

	public class UiTextFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTextField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTextFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTextfieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cMaxLengthKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cMaxLengthAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cMaxLengthINTTerminalRuleCall_2_1_0_1_0 = (RuleCall)cMaxLengthAssignment_2_1_0_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMinLengthKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cMinLengthAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cMinLengthINTTerminalRuleCall_2_1_1_1_0 = (RuleCall)cMinLengthAssignment_2_1_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cRegexKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cRegexAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cRegexSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cRegexAssignment_2_1_2_1.eContents().get(0);
		private final Group cGroup_2_1_3 = (Group)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cStylesKeyword_2_1_3_0 = (Keyword)cGroup_2_1_3.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_3_1 = (Assignment)cGroup_2_1_3.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_3_1_0 = (RuleCall)cStylesAssignment_2_1_3_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0 = (RuleCall)cI18nInfoAssignment_2_1_4.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_5 = (Assignment)cUnorderedGroup_2_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_2_1_5_0 = (Keyword)cReadonlyAssignment_2_1_5.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiTextField:
		//	{UiTextField} "textfield" ("(" (("maxLength=" maxLength=INT)? & ("minLength=" minLength=INT)? & ("regex="
		//	regex=STRING)? & ("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiTextField} "textfield" ("(" (("maxLength=" maxLength=INT)? & ("minLength=" minLength=INT)? & ("regex=" regex=STRING)?
		//& ("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiTextField}
		public Action getUiTextFieldAction_0() { return cUiTextFieldAction_0; }

		//"textfield"
		public Keyword getTextfieldKeyword_1() { return cTextfieldKeyword_1; }

		//("(" (("maxLength=" maxLength=INT)? & ("minLength=" minLength=INT)? & ("regex=" regex=STRING)? & ("styles"
		//styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//("maxLength=" maxLength=INT)? & ("minLength=" minLength=INT)? & ("regex=" regex=STRING)? & ("styles" styles=STRING)? &
		//i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//("maxLength=" maxLength=INT)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }

		//"maxLength="
		public Keyword getMaxLengthKeyword_2_1_0_0() { return cMaxLengthKeyword_2_1_0_0; }

		//maxLength=INT
		public Assignment getMaxLengthAssignment_2_1_0_1() { return cMaxLengthAssignment_2_1_0_1; }

		//INT
		public RuleCall getMaxLengthINTTerminalRuleCall_2_1_0_1_0() { return cMaxLengthINTTerminalRuleCall_2_1_0_1_0; }

		//("minLength=" minLength=INT)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"minLength="
		public Keyword getMinLengthKeyword_2_1_1_0() { return cMinLengthKeyword_2_1_1_0; }

		//minLength=INT
		public Assignment getMinLengthAssignment_2_1_1_1() { return cMinLengthAssignment_2_1_1_1; }

		//INT
		public RuleCall getMinLengthINTTerminalRuleCall_2_1_1_1_0() { return cMinLengthINTTerminalRuleCall_2_1_1_1_0; }

		//("regex=" regex=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"regex="
		public Keyword getRegexKeyword_2_1_2_0() { return cRegexKeyword_2_1_2_0; }

		//regex=STRING
		public Assignment getRegexAssignment_2_1_2_1() { return cRegexAssignment_2_1_2_1; }

		//STRING
		public RuleCall getRegexSTRINGTerminalRuleCall_2_1_2_1_0() { return cRegexSTRINGTerminalRuleCall_2_1_2_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_3() { return cGroup_2_1_3; }

		//"styles"
		public Keyword getStylesKeyword_2_1_3_0() { return cStylesKeyword_2_1_3_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_3_1() { return cStylesAssignment_2_1_3_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_3_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_3_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_4() { return cI18nInfoAssignment_2_1_4; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_5() { return cReadonlyAssignment_2_1_5; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_5_0() { return cReadonlyReadonlyKeyword_2_1_5_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiPasswordFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPasswordField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiPasswordFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPasswordFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0 = (RuleCall)cI18nInfoAssignment_2_1_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cReadonlyReadonlyKeyword_2_1_2_0 = (Keyword)cReadonlyAssignment_2_1_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiPasswordField:
		//	{UiPasswordField} "passwordField" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?)
		//	")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiPasswordField} "passwordField" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
		//name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*
		//"}")?
		public Group getGroup() { return cGroup; }

		//{UiPasswordField}
		public Action getUiPasswordFieldAction_0() { return cUiPasswordFieldAction_0; }

		//"passwordField"
		public Keyword getPasswordFieldKeyword_1() { return cPasswordFieldKeyword_1; }

		//("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiMaskedTextFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMaskedTextField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMaskedTextFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaskedTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMaskKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cMaskAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cMaskSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cMaskAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0 = (RuleCall)cI18nInfoAssignment_2_1_2.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_2_1_3_0 = (Keyword)cReadonlyAssignment_2_1_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiMaskedTextField:
		//	{UiMaskedTextField} "maskedText" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? &
		//	readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiMaskedTextField} "maskedText" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiMaskedTextField}
		public Action getUiMaskedTextFieldAction_0() { return cUiMaskedTextFieldAction_0; }

		//"maskedText"
		public Keyword getMaskedTextKeyword_1() { return cMaskedTextKeyword_1; }

		//("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }

		//("mask=" mask=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"mask="
		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }

		//mask=STRING
		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }

		//STRING
		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_2() { return cI18nInfoAssignment_2_1_2; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiMaskedNumericFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMaskedNumericField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMaskedNumericFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaskedNumericKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0 = (RuleCall)cI18nInfoAssignment_2_1_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cReadonlyReadonlyKeyword_2_1_2_0 = (Keyword)cReadonlyAssignment_2_1_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiMaskedNumericField:
		//	{UiMaskedNumericField} "maskedNumeric" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?)
		//	")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiMaskedNumericField} "maskedNumeric" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?)
		//")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiMaskedNumericField}
		public Action getUiMaskedNumericFieldAction_0() { return cUiMaskedNumericFieldAction_0; }

		//"maskedNumeric"
		public Keyword getMaskedNumericKeyword_1() { return cMaskedNumericKeyword_1; }

		//("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiMaskedDecimalFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMaskedDecimalField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMaskedDecimalFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaskedDecimalKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMaskKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cMaskAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cMaskSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cMaskAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0 = (RuleCall)cI18nInfoAssignment_2_1_2.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_2_1_3_0 = (Keyword)cReadonlyAssignment_2_1_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiMaskedDecimalField:
		//	{UiMaskedDecimalField} "maskedDecimal" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiMaskedDecimalField} "maskedDecimal" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiMaskedDecimalField}
		public Action getUiMaskedDecimalFieldAction_0() { return cUiMaskedDecimalFieldAction_0; }

		//"maskedDecimal"
		public Keyword getMaskedDecimalKeyword_1() { return cMaskedDecimalKeyword_1; }

		//("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }

		//("mask=" mask=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"mask="
		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }

		//mask=STRING
		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }

		//STRING
		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_2() { return cI18nInfoAssignment_2_1_2; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiPrefixedMaskedTextFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPrefixedMaskedTextField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiPrefixedMaskedTextFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaskedTextWithPrefixKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMaskKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cMaskAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cMaskSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cMaskAssignment_2_1_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cPrefixesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_1_2_1 = (Keyword)cGroup_2_1_2.eContents().get(1);
		private final Assignment cPrefixMasksAssignment_2_1_2_2 = (Assignment)cGroup_2_1_2.eContents().get(2);
		private final RuleCall cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0 = (RuleCall)cPrefixMasksAssignment_2_1_2_2.eContents().get(0);
		private final Group cGroup_2_1_2_3 = (Group)cGroup_2_1_2.eContents().get(3);
		private final Keyword cCommaKeyword_2_1_2_3_0 = (Keyword)cGroup_2_1_2_3.eContents().get(0);
		private final Assignment cPrefixMasksAssignment_2_1_2_3_1 = (Assignment)cGroup_2_1_2_3.eContents().get(1);
		private final RuleCall cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0 = (RuleCall)cPrefixMasksAssignment_2_1_2_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_2_4 = (Keyword)cGroup_2_1_2.eContents().get(4);
		private final Assignment cI18nInfoAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0 = (RuleCall)cI18nInfoAssignment_2_1_3.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final Keyword cReadonlyReadonlyKeyword_2_1_4_0 = (Keyword)cReadonlyAssignment_2_1_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiPrefixedMaskedTextField:
		//	{UiPrefixedMaskedTextField} "maskedTextWithPrefix" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? &
		//	("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry ("," prefixMasks+=UiPrefixToMaskMapEntry)* ")")? &
		//	i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiPrefixedMaskedTextField} "maskedTextWithPrefix" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? &
		//("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry ("," prefixMasks+=UiPrefixToMaskMapEntry)* ")")? &
		//i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiPrefixedMaskedTextField}
		public Action getUiPrefixedMaskedTextFieldAction_0() { return cUiPrefixedMaskedTextFieldAction_0; }

		//"maskedTextWithPrefix"
		public Keyword getMaskedTextWithPrefixKeyword_1() { return cMaskedTextWithPrefixKeyword_1; }

		//("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & ("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry (","
		//prefixMasks+=UiPrefixToMaskMapEntry)* ")")? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//("styles" styles=STRING)? & ("mask=" mask=STRING)? & ("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry (","
		//prefixMasks+=UiPrefixToMaskMapEntry)* ")")? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }

		//("mask=" mask=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"mask="
		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }

		//mask=STRING
		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }

		//STRING
		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }

		//("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry ("," prefixMasks+=UiPrefixToMaskMapEntry)* ")")?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"prefixes="
		public Keyword getPrefixesKeyword_2_1_2_0() { return cPrefixesKeyword_2_1_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_1_2_1() { return cLeftParenthesisKeyword_2_1_2_1; }

		//prefixMasks+=UiPrefixToMaskMapEntry
		public Assignment getPrefixMasksAssignment_2_1_2_2() { return cPrefixMasksAssignment_2_1_2_2; }

		//UiPrefixToMaskMapEntry
		public RuleCall getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0() { return cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0; }

		//("," prefixMasks+=UiPrefixToMaskMapEntry)*
		public Group getGroup_2_1_2_3() { return cGroup_2_1_2_3; }

		//","
		public Keyword getCommaKeyword_2_1_2_3_0() { return cCommaKeyword_2_1_2_3_0; }

		//prefixMasks+=UiPrefixToMaskMapEntry
		public Assignment getPrefixMasksAssignment_2_1_2_3_1() { return cPrefixMasksAssignment_2_1_2_3_1; }

		//UiPrefixToMaskMapEntry
		public RuleCall getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0() { return cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_1_2_4() { return cRightParenthesisKeyword_2_1_2_4; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiPrefixToMaskMapEntryElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPrefixToMaskMapEntry");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiPrefixToMaskMapEntryAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPrefixKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cKeyAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cKeySTRINGTerminalRuleCall_2_0 = (RuleCall)cKeyAssignment_2.eContents().get(0);
		private final Keyword cMaskKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cValueAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cValueSTRINGTerminalRuleCall_4_0 = (RuleCall)cValueAssignment_4.eContents().get(0);
		
		//UiPrefixToMaskMapEntry:
		//	{UiPrefixToMaskMapEntry} "prefix" key=STRING "mask" value=STRING;
		public ParserRule getRule() { return rule; }

		//{UiPrefixToMaskMapEntry} "prefix" key=STRING "mask" value=STRING
		public Group getGroup() { return cGroup; }

		//{UiPrefixToMaskMapEntry}
		public Action getUiPrefixToMaskMapEntryAction_0() { return cUiPrefixToMaskMapEntryAction_0; }

		//"prefix"
		public Keyword getPrefixKeyword_1() { return cPrefixKeyword_1; }

		//key=STRING
		public Assignment getKeyAssignment_2() { return cKeyAssignment_2; }

		//STRING
		public RuleCall getKeySTRINGTerminalRuleCall_2_0() { return cKeySTRINGTerminalRuleCall_2_0; }

		//"mask"
		public Keyword getMaskKeyword_3() { return cMaskKeyword_3; }

		//value=STRING
		public Assignment getValueAssignment_4() { return cValueAssignment_4; }

		//STRING
		public RuleCall getValueSTRINGTerminalRuleCall_4_0() { return cValueSTRINGTerminalRuleCall_4_0; }
	}

	public class UiRichTextAreaElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRichTextArea");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiRichTextAreaAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRichtextAreaKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0 = (RuleCall)cI18nInfoAssignment_2_1_1.eContents().get(0);
		private final Assignment cAsBlobAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cAsBlobAsBlobKeyword_2_1_2_0 = (Keyword)cAsBlobAssignment_2_1_2.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_2_1_3_0 = (Keyword)cReadonlyAssignment_2_1_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiRichTextArea:
		//	{UiRichTextArea} "richtextArea" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? &
		//	readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiRichTextArea} "richtextArea" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? &
		//readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiRichTextArea}
		public Action getUiRichTextAreaAction_0() { return cUiRichTextAreaAction_0; }

		//"richtextArea"
		public Keyword getRichtextAreaKeyword_1() { return cRichtextAreaKeyword_1; }

		//("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }

		//"styles"
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }

		//asBlob?="asBlob"?
		public Assignment getAsBlobAssignment_2_1_2() { return cAsBlobAssignment_2_1_2; }

		//"asBlob"
		public Keyword getAsBlobAsBlobKeyword_2_1_2_0() { return cAsBlobAsBlobKeyword_2_1_2_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiSuggestTextFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSuggestTextField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSuggestTextFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSuggestTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_0_2 = (Keyword)cGroup_4_1_0.eContents().get(2);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cCaptionFieldKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cItemCaptionPropertyAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final CrossReference cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0 = (CrossReference)cItemCaptionPropertyAssignment_4_1_1_1.eContents().get(0);
		private final RuleCall cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1 = (RuleCall)cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_1_2 = (Keyword)cGroup_4_1_1.eContents().get(2);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cFilterFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cItemFilterPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final CrossReference cItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0 = (CrossReference)cItemFilterPropertyAssignment_4_1_2_1.eContents().get(0);
		private final RuleCall cItemFilterPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1 = (RuleCall)cItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_2_2 = (Keyword)cGroup_4_1_2.eContents().get(2);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cUuidFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cItemUUIDPropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final CrossReference cItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0 = (CrossReference)cItemUUIDPropertyAssignment_4_1_3_1.eContents().get(0);
		private final RuleCall cItemUUIDPropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1 = (RuleCall)cItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Assignment cAutoHidePopupAssignment_4_1_4 = (Assignment)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cAutoHidePopupAutoHidePopupKeyword_4_1_4_0 = (Keyword)cAutoHidePopupAssignment_4_1_4.eContents().get(0);
		private final Assignment cReadonlyAssignment_4_1_5 = (Assignment)cUnorderedGroup_4_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_4_1_5_0 = (Keyword)cReadonlyAssignment_4_1_5.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiSuggestTextField:
		//	{UiSuggestTextField} "suggestText" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
		//	(("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("filterField"
		//	itemFilterProperty=[JvmOperation] ";"?)? & ("uuidField" itemUUIDProperty=[JvmOperation] ";"?)? &
		//	autoHidePopup?="autoHidePopup"? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiSuggestTextField} "suggestText" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("filterField"
		//itemFilterProperty=[JvmOperation] ";"?)? & ("uuidField" itemUUIDProperty=[JvmOperation] ";"?)? &
		//autoHidePopup?="autoHidePopup"? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiSuggestTextField}
		public Action getUiSuggestTextFieldAction_0() { return cUiSuggestTextFieldAction_0; }

		//"suggestText"
		public Keyword getSuggestTextKeyword_1() { return cSuggestTextKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? &
		//("filterField" itemFilterProperty=[JvmOperation] ";"?)? & ("uuidField" itemUUIDProperty=[JvmOperation] ";"?)? &
		//autoHidePopup?="autoHidePopup"? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("filterField"
		//itemFilterProperty=[JvmOperation] ";"?)? & ("uuidField" itemUUIDProperty=[JvmOperation] ";"?)? &
		//autoHidePopup?="autoHidePopup"? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }

		//("type" jvmType=JvmTypeReference ";"?)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }

		//"type"
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }

		//("captionField" itemCaptionProperty=[JvmOperation] ";"?)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }

		//"captionField"
		public Keyword getCaptionFieldKeyword_4_1_1_0() { return cCaptionFieldKeyword_4_1_1_0; }

		//itemCaptionProperty=[JvmOperation]
		public Assignment getItemCaptionPropertyAssignment_4_1_1_1() { return cItemCaptionPropertyAssignment_4_1_1_1; }

		//[JvmOperation]
		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0; }

		//ID
		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }

		//("filterField" itemFilterProperty=[JvmOperation] ";"?)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }

		//"filterField"
		public Keyword getFilterFieldKeyword_4_1_2_0() { return cFilterFieldKeyword_4_1_2_0; }

		//itemFilterProperty=[JvmOperation]
		public Assignment getItemFilterPropertyAssignment_4_1_2_1() { return cItemFilterPropertyAssignment_4_1_2_1; }

		//[JvmOperation]
		public CrossReference getItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0; }

		//ID
		public RuleCall getItemFilterPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemFilterPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }

		//("uuidField" itemUUIDProperty=[JvmOperation] ";"?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }

		//"uuidField"
		public Keyword getUuidFieldKeyword_4_1_3_0() { return cUuidFieldKeyword_4_1_3_0; }

		//itemUUIDProperty=[JvmOperation]
		public Assignment getItemUUIDPropertyAssignment_4_1_3_1() { return cItemUUIDPropertyAssignment_4_1_3_1; }

		//[JvmOperation]
		public CrossReference getItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0() { return cItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0; }

		//ID
		public RuleCall getItemUUIDPropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1() { return cItemUUIDPropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }

		//autoHidePopup?="autoHidePopup"?
		public Assignment getAutoHidePopupAssignment_4_1_4() { return cAutoHidePopupAssignment_4_1_4; }

		//"autoHidePopup"
		public Keyword getAutoHidePopupAutoHidePopupKeyword_4_1_4_0() { return cAutoHidePopupAutoHidePopupKeyword_4_1_4_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_1_5() { return cReadonlyAssignment_4_1_5; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_1_5_0() { return cReadonlyReadonlyKeyword_4_1_5_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}

	public class UiBeanReferenceFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBeanReferenceField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiBeanReferenceFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cReferenceFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_0_2 = (Keyword)cGroup_4_1_0.eContents().get(2);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cRefSourceKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cReferenceSourceJvmTypeAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final RuleCall cReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0 = (RuleCall)cReferenceSourceJvmTypeAssignment_4_1_1_1.eContents().get(0);
		private final Keyword cColonKeyword_4_1_1_2 = (Keyword)cGroup_4_1_1.eContents().get(2);
		private final Assignment cReferenceSourceFieldAssignment_4_1_1_3 = (Assignment)cGroup_4_1_1.eContents().get(3);
		private final CrossReference cReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0 = (CrossReference)cReferenceSourceFieldAssignment_4_1_1_3.eContents().get(0);
		private final RuleCall cReferenceSourceFieldJvmFieldIDTerminalRuleCall_4_1_1_3_0_1 = (RuleCall)cReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_1_4 = (Keyword)cGroup_4_1_1.eContents().get(4);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cCaptionFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cCaptionPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final RuleCall cCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0 = (RuleCall)cCaptionPropertyAssignment_4_1_2_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_2_2 = (Keyword)cGroup_4_1_2.eContents().get(2);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cDescriptionFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cDescriptionPropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final RuleCall cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0 = (RuleCall)cDescriptionPropertyAssignment_4_1_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cImageFieldKeyword_4_1_4_0 = (Keyword)cGroup_4_1_4.eContents().get(0);
		private final Assignment cImagePropertyAssignment_4_1_4_1 = (Assignment)cGroup_4_1_4.eContents().get(1);
		private final RuleCall cImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0 = (RuleCall)cImagePropertyAssignment_4_1_4_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_4_2 = (Keyword)cGroup_4_1_4.eContents().get(2);
		private final Group cGroup_4_1_5 = (Group)cUnorderedGroup_4_1.eContents().get(5);
		private final Keyword cInMemoryServiceKeyword_4_1_5_0 = (Keyword)cGroup_4_1_5.eContents().get(0);
		private final Assignment cInMemoryBeanProviderAssignment_4_1_5_1 = (Assignment)cGroup_4_1_5.eContents().get(1);
		private final RuleCall cInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0 = (RuleCall)cInMemoryBeanProviderAssignment_4_1_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_5_2 = (Keyword)cGroup_4_1_5.eContents().get(2);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiBeanReferenceField:
		//	{UiBeanReferenceField} "referenceField" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
		//	(("type" jvmType=JvmTypeReference ";"?)? & ("refSource" referenceSourceJvmType=JvmTypeReference ":"
		//	referenceSourceField=[JvmField] ";"?)? & ("captionField" captionProperty=UiNestedProperty ";"?)? & ("descriptionField"
		//	descriptionProperty=UiNestedProperty ";"?)? & ("imageField" imageProperty=UiNestedProperty ";"?)? & ("inMemoryService"
		//	inMemoryBeanProvider=JvmTypeReference ";"?)?) (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiBeanReferenceField} "referenceField" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
		//(("type" jvmType=JvmTypeReference ";"?)? & ("refSource" referenceSourceJvmType=JvmTypeReference ":"
		//referenceSourceField=[JvmField] ";"?)? & ("captionField" captionProperty=UiNestedProperty ";"?)? & ("descriptionField"
		//descriptionProperty=UiNestedProperty ";"?)? & ("imageField" imageProperty=UiNestedProperty ";"?)? & ("inMemoryService"
		//inMemoryBeanProvider=JvmTypeReference ";"?)?) (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiBeanReferenceField}
		public Action getUiBeanReferenceFieldAction_0() { return cUiBeanReferenceFieldAction_0; }

		//"referenceField"
		public Keyword getReferenceFieldKeyword_1() { return cReferenceFieldKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (("type" jvmType=JvmTypeReference ";"?)? & ("refSource" referenceSourceJvmType=JvmTypeReference ":"
		//referenceSourceField=[JvmField] ";"?)? & ("captionField" captionProperty=UiNestedProperty ";"?)? & ("descriptionField"
		//descriptionProperty=UiNestedProperty ";"?)? & ("imageField" imageProperty=UiNestedProperty ";"?)? & ("inMemoryService"
		//inMemoryBeanProvider=JvmTypeReference ";"?)?) (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//("type" jvmType=JvmTypeReference ";"?)? & ("refSource" referenceSourceJvmType=JvmTypeReference ":"
		//referenceSourceField=[JvmField] ";"?)? & ("captionField" captionProperty=UiNestedProperty ";"?)? & ("descriptionField"
		//descriptionProperty=UiNestedProperty ";"?)? & ("imageField" imageProperty=UiNestedProperty ";"?)? & ("inMemoryService"
		//inMemoryBeanProvider=JvmTypeReference ";"?)?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }

		//("type" jvmType=JvmTypeReference ";"?)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }

		//"type"
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }

		//("refSource" referenceSourceJvmType=JvmTypeReference ":" referenceSourceField=[JvmField] ";"?)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }

		//"refSource"
		public Keyword getRefSourceKeyword_4_1_1_0() { return cRefSourceKeyword_4_1_1_0; }

		//referenceSourceJvmType=JvmTypeReference
		public Assignment getReferenceSourceJvmTypeAssignment_4_1_1_1() { return cReferenceSourceJvmTypeAssignment_4_1_1_1; }

		//JvmTypeReference
		public RuleCall getReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0() { return cReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0; }

		//":"
		public Keyword getColonKeyword_4_1_1_2() { return cColonKeyword_4_1_1_2; }

		//referenceSourceField=[JvmField]
		public Assignment getReferenceSourceFieldAssignment_4_1_1_3() { return cReferenceSourceFieldAssignment_4_1_1_3; }

		//[JvmField]
		public CrossReference getReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0() { return cReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0; }

		//ID
		public RuleCall getReferenceSourceFieldJvmFieldIDTerminalRuleCall_4_1_1_3_0_1() { return cReferenceSourceFieldJvmFieldIDTerminalRuleCall_4_1_1_3_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_1_4() { return cSemicolonKeyword_4_1_1_4; }

		//("captionField" captionProperty=UiNestedProperty ";"?)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }

		//"captionField"
		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }

		//captionProperty=UiNestedProperty
		public Assignment getCaptionPropertyAssignment_4_1_2_1() { return cCaptionPropertyAssignment_4_1_2_1; }

		//UiNestedProperty
		public RuleCall getCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0() { return cCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }

		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }

		//"descriptionField"
		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }

		//descriptionProperty=UiNestedProperty
		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }

		//UiNestedProperty
		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }

		//("imageField" imageProperty=UiNestedProperty ";"?)?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }

		//"imageField"
		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }

		//imageProperty=UiNestedProperty
		public Assignment getImagePropertyAssignment_4_1_4_1() { return cImagePropertyAssignment_4_1_4_1; }

		//UiNestedProperty
		public RuleCall getImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0() { return cImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_4_2() { return cSemicolonKeyword_4_1_4_2; }

		//("inMemoryService" inMemoryBeanProvider=JvmTypeReference ";"?)?
		public Group getGroup_4_1_5() { return cGroup_4_1_5; }

		//"inMemoryService"
		public Keyword getInMemoryServiceKeyword_4_1_5_0() { return cInMemoryServiceKeyword_4_1_5_0; }

		//inMemoryBeanProvider=JvmTypeReference
		public Assignment getInMemoryBeanProviderAssignment_4_1_5_1() { return cInMemoryBeanProviderAssignment_4_1_5_1; }

		//JvmTypeReference
		public RuleCall getInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0() { return cInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_5_2() { return cSemicolonKeyword_4_1_5_2; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}

	public class UiSearchFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSearchField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSearchFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchfieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cPropertyAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cPropertyUiNestedPropertyParserRuleCall_3_0 = (RuleCall)cPropertyAssignment_3.eContents().get(0);
		
		//UiSearchField:
		//	{UiSearchField} "searchfield" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? property=UiNestedProperty;
		public ParserRule getRule() { return rule; }

		//{UiSearchField} "searchfield" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? property=UiNestedProperty
		public Group getGroup() { return cGroup; }

		//{UiSearchField}
		public Action getUiSearchFieldAction_0() { return cUiSearchFieldAction_0; }

		//"searchfield"
		public Keyword getSearchfieldKeyword_1() { return cSearchfieldKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//property=UiNestedProperty
		public Assignment getPropertyAssignment_3() { return cPropertyAssignment_3; }

		//UiNestedProperty
		public RuleCall getPropertyUiNestedPropertyParserRuleCall_3_0() { return cPropertyUiNestedPropertyParserRuleCall_3_0; }
	}

	public class UiTextAreaElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTextArea");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTextAreaAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTextareaKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiTextArea:
		//	{UiTextArea} "textarea" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		//	("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiTextArea} "textarea" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiTextArea}
		public Action getUiTextAreaAction_0() { return cUiTextAreaAction_0; }

		//"textarea"
		public Keyword getTextareaKeyword_1() { return cTextareaKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiDateFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDateField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiDateFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDatefieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cDateFormatAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cDateFormatUiDateFormatEnumRuleCall_2_1_0_0 = (RuleCall)cDateFormatAssignment_2_1_0.eContents().get(0);
		private final Assignment cResolutionAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0 = (RuleCall)cResolutionAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0 = (RuleCall)cI18nInfoAssignment_2_1_3.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final Keyword cReadonlyReadonlyKeyword_2_1_4_0 = (Keyword)cReadonlyAssignment_2_1_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiDateField:
		//	{UiDateField} "datefield" ("(" (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ("styles"
		//	styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator |
		//	bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiDateField} "datefield" ("(" (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ("styles" styles=STRING)?
		//& i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiDateField}
		public Action getUiDateFieldAction_0() { return cUiDateFieldAction_0; }

		//"datefield"
		public Keyword getDatefieldKeyword_1() { return cDatefieldKeyword_1; }

		//("(" (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ("styles" styles=STRING)? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ("styles" styles=STRING)? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//dateFormat=UiDateFormat?
		public Assignment getDateFormatAssignment_2_1_0() { return cDateFormatAssignment_2_1_0; }

		//UiDateFormat
		public RuleCall getDateFormatUiDateFormatEnumRuleCall_2_1_0_0() { return cDateFormatUiDateFormatEnumRuleCall_2_1_0_0; }

		//resolution=UiDateTimeResolution?
		public Assignment getResolutionAssignment_2_1_1() { return cResolutionAssignment_2_1_1; }

		//UiDateTimeResolution
		public RuleCall getResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0() { return cResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiBrowserElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBrowser");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiBrowserAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cBrowserKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiBrowser:
		//	{UiBrowser} "browser" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		//	("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiBrowser} "browser" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiBrowser}
		public Action getUiBrowserAction_0() { return cUiBrowserAction_0; }

		//"browser"
		public Keyword getBrowserKeyword_1() { return cBrowserKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiProgressBarElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiProgressBar");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiProgressBarAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cProgressbarKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiProgressBar:
		//	{UiProgressBar} "progressbar" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiProgressBar} "progressbar" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiProgressBar}
		public Action getUiProgressBarAction_0() { return cUiProgressBarAction_0; }

		//"progressbar"
		public Keyword getProgressbarKeyword_1() { return cProgressbarKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiImageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiImage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiImageAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cImageKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Group cGroup_4_1 = (Group)cGroup_4.eContents().get(1);
		private final Keyword cIconPathKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
		private final Assignment cValueAssignment_4_1_1 = (Assignment)cGroup_4_1.eContents().get(1);
		private final RuleCall cValueSTRINGTerminalRuleCall_4_1_1_0 = (RuleCall)cValueAssignment_4_1_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_2 = (Keyword)cGroup_4_1.eContents().get(2);
		private final Assignment cBindingsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_0 = (RuleCall)cBindingsAssignment_4_2.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiImage:
		//	{UiImage} "image" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" ("iconPath" value=STRING
		//	";"?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiImage} "image" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" ("iconPath" value=STRING
		//";"?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiImage}
		public Action getUiImageAction_0() { return cUiImageAction_0; }

		//"image"
		public Keyword getImageKeyword_1() { return cImageKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" ("iconPath" value=STRING ";"?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//("iconPath" value=STRING ";"?)?
		public Group getGroup_4_1() { return cGroup_4_1; }

		//"iconPath"
		public Keyword getIconPathKeyword_4_1_0() { return cIconPathKeyword_4_1_0; }

		//value=STRING
		public Assignment getValueAssignment_4_1_1() { return cValueAssignment_4_1_1; }

		//STRING
		public RuleCall getValueSTRINGTerminalRuleCall_4_1_1_0() { return cValueSTRINGTerminalRuleCall_4_1_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_2() { return cSemicolonKeyword_4_1_2; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}

	public class UiTableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTable");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTableAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_0_2 = (Keyword)cGroup_4_1_0.eContents().get(2);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cSelectionTypeKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cSelectionTypeAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final RuleCall cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0 = (RuleCall)cSelectionTypeAssignment_4_1_1_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_1_2 = (Keyword)cGroup_4_1_1.eContents().get(2);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cImageFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cItemImagePropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final CrossReference cItemImagePropertyJvmOperationCrossReference_4_1_2_1_0 = (CrossReference)cItemImagePropertyAssignment_4_1_2_1.eContents().get(0);
		private final RuleCall cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1 = (RuleCall)cItemImagePropertyJvmOperationCrossReference_4_1_2_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_2_2 = (Keyword)cGroup_4_1_2.eContents().get(2);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Assignment cConsumeBeanServiceAssignment_4_1_3_0 = (Assignment)cGroup_4_1_3.eContents().get(0);
		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_3_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_3_1 = (Keyword)cGroup_4_1_3.eContents().get(1);
		private final Assignment cReadonlyAssignment_4_1_4 = (Assignment)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cReadonlyReadonlyKeyword_4_1_4_0 = (Keyword)cReadonlyAssignment_4_1_4.eContents().get(0);
		private final Assignment cColumnAssignmentAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0 = (RuleCall)cColumnAssignmentAssignment_4_2.eContents().get(0);
		private final Assignment cSortOrderAssignmentAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0 = (RuleCall)cSortOrderAssignmentAssignment_4_3.eContents().get(0);
		private final Alternatives cAlternatives_4_4 = (Alternatives)cGroup_4.eContents().get(4);
		private final Assignment cValidatorsAssignment_4_4_0 = (Assignment)cAlternatives_4_4.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_4_0_0 = (RuleCall)cValidatorsAssignment_4_4_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_4_1 = (Assignment)cAlternatives_4_4.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_4_1_0 = (RuleCall)cBindingsAssignment_4_4_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_5 = (Assignment)cGroup_4.eContents().get(5);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0 = (RuleCall)cProcessorAssignmentsAssignment_4_5.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_6 = (Keyword)cGroup_4.eContents().get(6);
		
		//UiTable:
		//	{UiTable} "table" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//	jvmType=JvmTypeReference ";"?)? & ("selectionType" selectionType=UiSelectionType ";"?)? & ("imageField"
		//	itemImageProperty=[JvmOperation] ";"?)? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//	columnAssignment=UiColumnsAssignment? sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator |
		//	bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiTable} "table" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//jvmType=JvmTypeReference ";"?)? & ("selectionType" selectionType=UiSelectionType ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation] ";"?)? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//columnAssignment=UiColumnsAssignment? sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator |
		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiTable}
		public Action getUiTableAction_0() { return cUiTableAction_0; }

		//"table"
		public Keyword getTableKeyword_1() { return cTableKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (("type" jvmType=JvmTypeReference ";"?)? & ("selectionType" selectionType=UiSelectionType ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation] ";"?)? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//columnAssignment=UiColumnsAssignment? sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator |
		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//("type" jvmType=JvmTypeReference ";"?)? & ("selectionType" selectionType=UiSelectionType ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation] ";"?)? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }

		//("type" jvmType=JvmTypeReference ";"?)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }

		//"type"
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }

		//("selectionType" selectionType=UiSelectionType ";"?)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }

		//"selectionType"
		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }

		//selectionType=UiSelectionType
		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }

		//UiSelectionType
		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }

		//("imageField" itemImageProperty=[JvmOperation] ";"?)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }

		//"imageField"
		public Keyword getImageFieldKeyword_4_1_2_0() { return cImageFieldKeyword_4_1_2_0; }

		//itemImageProperty=[JvmOperation]
		public Assignment getItemImagePropertyAssignment_4_1_2_1() { return cItemImagePropertyAssignment_4_1_2_1; }

		//[JvmOperation]
		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_2_1_0; }

		//ID
		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }

		//(consumeBeanService?="useBeanService" ";"?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }

		//consumeBeanService?="useBeanService"
		public Assignment getConsumeBeanServiceAssignment_4_1_3_0() { return cConsumeBeanServiceAssignment_4_1_3_0; }

		//"useBeanService"
		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_3_1() { return cSemicolonKeyword_4_1_3_1; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_1_4() { return cReadonlyAssignment_4_1_4; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_1_4_0() { return cReadonlyReadonlyKeyword_4_1_4_0; }

		//columnAssignment=UiColumnsAssignment?
		public Assignment getColumnAssignmentAssignment_4_2() { return cColumnAssignmentAssignment_4_2; }

		//UiColumnsAssignment
		public RuleCall getColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0() { return cColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0; }

		//sortOrderAssignment=UiSortOrderAssignment?
		public Assignment getSortOrderAssignmentAssignment_4_3() { return cSortOrderAssignmentAssignment_4_3; }

		//UiSortOrderAssignment
		public RuleCall getSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0() { return cSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_4() { return cAlternatives_4_4; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_4_0() { return cValidatorsAssignment_4_4_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_4_0_0() { return cValidatorsUiValidatorParserRuleCall_4_4_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_4_1() { return cBindingsAssignment_4_4_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_4_1_0() { return cBindingsUiBindingParserRuleCall_4_4_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_5() { return cProcessorAssignmentsAssignment_4_5; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_6() { return cRightCurlyBracketKeyword_4_6; }
	}

	public class UiComboBoxElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiComboBox");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiComboBoxAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cComboKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_0_2 = (Keyword)cGroup_4_1_0.eContents().get(2);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cCaptionFieldKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cItemCaptionPropertyAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final CrossReference cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0 = (CrossReference)cItemCaptionPropertyAssignment_4_1_1_1.eContents().get(0);
		private final RuleCall cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1 = (RuleCall)cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_1_2 = (Keyword)cGroup_4_1_1.eContents().get(2);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cDescriptionFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cDescriptionPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final RuleCall cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0 = (RuleCall)cDescriptionPropertyAssignment_4_1_2_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_2_2 = (Keyword)cGroup_4_1_2.eContents().get(2);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cImageFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cItemImagePropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final CrossReference cItemImagePropertyJvmOperationCrossReference_4_1_3_1_0 = (CrossReference)cItemImagePropertyAssignment_4_1_3_1.eContents().get(0);
		private final RuleCall cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1 = (RuleCall)cItemImagePropertyJvmOperationCrossReference_4_1_3_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Assignment cConsumeBeanServiceAssignment_4_1_4_0 = (Assignment)cGroup_4_1_4.eContents().get(0);
		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_4_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_4_1 = (Keyword)cGroup_4_1_4.eContents().get(1);
		private final Assignment cReadonlyAssignment_4_1_5 = (Assignment)cUnorderedGroup_4_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_4_1_5_0 = (Keyword)cReadonlyAssignment_4_1_5.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiComboBox:
		//	{UiComboBox} "combo" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//	jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("descriptionField"
		//	descriptionProperty=UiNestedProperty ";"?)? & ("imageField" itemImageProperty=[JvmOperation] ";"?)? &
		//	(consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiComboBox} "combo" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("descriptionField"
		//descriptionProperty=UiNestedProperty ";"?)? & ("imageField" itemImageProperty=[JvmOperation] ";"?)? &
		//(consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiComboBox}
		public Action getUiComboBoxAction_0() { return cUiComboBoxAction_0; }

		//"combo"
		public Keyword getComboKeyword_1() { return cComboKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? &
		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField" itemImageProperty=[JvmOperation] ";"?)?
		//& (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?) (validators+=UiValidator |
		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? &
		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField" itemImageProperty=[JvmOperation] ";"?)?
		//& (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }

		//("type" jvmType=JvmTypeReference ";"?)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }

		//"type"
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }

		//("captionField" itemCaptionProperty=[JvmOperation] ";"?)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }

		//"captionField"
		public Keyword getCaptionFieldKeyword_4_1_1_0() { return cCaptionFieldKeyword_4_1_1_0; }

		//itemCaptionProperty=[JvmOperation]
		public Assignment getItemCaptionPropertyAssignment_4_1_1_1() { return cItemCaptionPropertyAssignment_4_1_1_1; }

		//[JvmOperation]
		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0; }

		//ID
		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }

		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }

		//"descriptionField"
		public Keyword getDescriptionFieldKeyword_4_1_2_0() { return cDescriptionFieldKeyword_4_1_2_0; }

		//descriptionProperty=UiNestedProperty
		public Assignment getDescriptionPropertyAssignment_4_1_2_1() { return cDescriptionPropertyAssignment_4_1_2_1; }

		//UiNestedProperty
		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }

		//("imageField" itemImageProperty=[JvmOperation] ";"?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }

		//"imageField"
		public Keyword getImageFieldKeyword_4_1_3_0() { return cImageFieldKeyword_4_1_3_0; }

		//itemImageProperty=[JvmOperation]
		public Assignment getItemImagePropertyAssignment_4_1_3_1() { return cItemImagePropertyAssignment_4_1_3_1; }

		//[JvmOperation]
		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_3_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_3_1_0; }

		//ID
		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }

		//(consumeBeanService?="useBeanService" ";"?)?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }

		//consumeBeanService?="useBeanService"
		public Assignment getConsumeBeanServiceAssignment_4_1_4_0() { return cConsumeBeanServiceAssignment_4_1_4_0; }

		//"useBeanService"
		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_4_1() { return cSemicolonKeyword_4_1_4_1; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_1_5() { return cReadonlyAssignment_4_1_5; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_1_5_0() { return cReadonlyReadonlyKeyword_4_1_5_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}

	public class UiButtonElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiButton");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiButtonAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cButtonKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		
		//UiButton:
		//	{UiButton} "button" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?;
		public ParserRule getRule() { return rule; }

		//{UiButton} "button" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		public Group getGroup() { return cGroup; }

		//{UiButton}
		public Action getUiButtonAction_0() { return cUiButtonAction_0; }

		//"button"
		public Keyword getButtonKeyword_1() { return cButtonKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
	}

	public class UiMobileNavigationButtonElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationButton");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileNavigationButtonAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNavButtonKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cTargetPageAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cTargetPageUiMobileNavigationPageParserRuleCall_4_0_0 = (RuleCall)cTargetPageAssignment_4_0.eContents().get(0);
		private final Group cGroup_4_1 = (Group)cAlternatives_4.eContents().get(1);
		private final Keyword cAliasKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
		private final Assignment cTargetPageAliasAssignment_4_1_1 = (Assignment)cGroup_4_1.eContents().get(1);
		private final CrossReference cTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0 = (CrossReference)cTargetPageAliasAssignment_4_1_1.eContents().get(0);
		private final RuleCall cTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1 = (RuleCall)cTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0.eContents().get(1);
		
		//UiMobileNavigationButton:
		//	{UiMobileNavigationButton} "navButton" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?)
		//	")")? name=ID? (targetPage=UiMobileNavigationPage | "alias" targetPageAlias=[UiMobileNavigationPage]);
		public ParserRule getRule() { return rule; }

		//{UiMobileNavigationButton} "navButton" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?)
		//")")? name=ID? (targetPage=UiMobileNavigationPage | "alias" targetPageAlias=[UiMobileNavigationPage])
		public Group getGroup() { return cGroup; }

		//{UiMobileNavigationButton}
		public Action getUiMobileNavigationButtonAction_0() { return cUiMobileNavigationButtonAction_0; }

		//"navButton"
		public Keyword getNavButtonKeyword_1() { return cNavButtonKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//targetPage=UiMobileNavigationPage | "alias" targetPageAlias=[UiMobileNavigationPage]
		public Alternatives getAlternatives_4() { return cAlternatives_4; }

		//targetPage=UiMobileNavigationPage
		public Assignment getTargetPageAssignment_4_0() { return cTargetPageAssignment_4_0; }

		//UiMobileNavigationPage
		public RuleCall getTargetPageUiMobileNavigationPageParserRuleCall_4_0_0() { return cTargetPageUiMobileNavigationPageParserRuleCall_4_0_0; }

		//"alias" targetPageAlias=[UiMobileNavigationPage]
		public Group getGroup_4_1() { return cGroup_4_1; }

		//"alias"
		public Keyword getAliasKeyword_4_1_0() { return cAliasKeyword_4_1_0; }

		//targetPageAlias=[UiMobileNavigationPage]
		public Assignment getTargetPageAliasAssignment_4_1_1() { return cTargetPageAliasAssignment_4_1_1; }

		//[UiMobileNavigationPage]
		public CrossReference getTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0() { return cTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0; }

		//ID
		public RuleCall getTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1() { return cTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1; }
	}

	public class UiMobileSwitchElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileSwitch");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSwitchAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSwitchItKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0 = (RuleCall)cProcessorAssignmentsAssignment_4_1.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiMobileSwitch returns UiSwitch:
		//	{UiSwitch} "switchIt" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		//	("{" processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiSwitch} "switchIt" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		//("{" processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* "}")?
		public Group getGroup() { return cGroup; }

		//{UiSwitch}
		public Action getUiSwitchAction_0() { return cUiSwitchAction_0; }

		//"switchIt"
		public Keyword getSwitchItKeyword_1() { return cSwitchItKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_1() { return cProcessorAssignmentsAssignment_4_1; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiLabelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiLabel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiLabelAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cLabelKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0 = (RuleCall)cProcessorAssignmentsAssignment_4_1.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_0 = (RuleCall)cBindingsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiLabel:
		//	{UiLabel} "label" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
		//	processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiLabel} "label" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
		//processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* "}")?
		public Group getGroup() { return cGroup; }

		//{UiLabel}
		public Action getUiLabelAction_0() { return cUiLabelAction_0; }

		//"label"
		public Keyword getLabelKeyword_1() { return cLabelKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_1() { return cProcessorAssignmentsAssignment_4_1; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0; }

		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiDecimalFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDecimalField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiDecimalFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDecimalFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cNoGroupingAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cNoGroupingNoGroupingKeyword_2_1_0_0 = (Keyword)cNoGroupingAssignment_2_1_0.eContents().get(0);
		private final Assignment cNoMarkNegativeAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0 = (Keyword)cNoMarkNegativeAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Group cGroup_2_1_3 = (Group)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cPrecisionKeyword_2_1_3_0 = (Keyword)cGroup_2_1_3.eContents().get(0);
		private final Assignment cPrecisionAssignment_2_1_3_1 = (Assignment)cGroup_2_1_3.eContents().get(1);
		private final RuleCall cPrecisionINTTerminalRuleCall_2_1_3_1_0 = (RuleCall)cPrecisionAssignment_2_1_3_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0 = (RuleCall)cI18nInfoAssignment_2_1_4.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_5 = (Assignment)cUnorderedGroup_2_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_2_1_5_0 = (Keyword)cReadonlyAssignment_2_1_5.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiDecimalField:
		//	{UiDecimalField} "decimalField" ("(" (noGrouping?="noGrouping"? & noMarkNegative?="noMarkNegative"? & ("styles"
		//	styles=STRING)? & ("precision=" precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiDecimalField} "decimalField" ("(" (noGrouping?="noGrouping"? & noMarkNegative?="noMarkNegative"? & ("styles"
		//styles=STRING)? & ("precision=" precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiDecimalField}
		public Action getUiDecimalFieldAction_0() { return cUiDecimalFieldAction_0; }

		//"decimalField"
		public Keyword getDecimalFieldKeyword_1() { return cDecimalFieldKeyword_1; }

		//("(" (noGrouping?="noGrouping"? & noMarkNegative?="noMarkNegative"? & ("styles" styles=STRING)? & ("precision="
		//precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//noGrouping?="noGrouping"? & noMarkNegative?="noMarkNegative"? & ("styles" styles=STRING)? & ("precision="
		//precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//noGrouping?="noGrouping"?
		public Assignment getNoGroupingAssignment_2_1_0() { return cNoGroupingAssignment_2_1_0; }

		//"noGrouping"
		public Keyword getNoGroupingNoGroupingKeyword_2_1_0_0() { return cNoGroupingNoGroupingKeyword_2_1_0_0; }

		//noMarkNegative?="noMarkNegative"?
		public Assignment getNoMarkNegativeAssignment_2_1_1() { return cNoMarkNegativeAssignment_2_1_1; }

		//"noMarkNegative"
		public Keyword getNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0() { return cNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//("precision=" precision=INT)?
		public Group getGroup_2_1_3() { return cGroup_2_1_3; }

		//"precision="
		public Keyword getPrecisionKeyword_2_1_3_0() { return cPrecisionKeyword_2_1_3_0; }

		//precision=INT
		public Assignment getPrecisionAssignment_2_1_3_1() { return cPrecisionAssignment_2_1_3_1; }

		//INT
		public RuleCall getPrecisionINTTerminalRuleCall_2_1_3_1_0() { return cPrecisionINTTerminalRuleCall_2_1_3_1_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_4() { return cI18nInfoAssignment_2_1_4; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_5() { return cReadonlyAssignment_2_1_5; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_5_0() { return cReadonlyReadonlyKeyword_2_1_5_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiOptionsGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiOptionsGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiOptionsGroupAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cOptionsgroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cSelectionTypeKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cSelectionTypeAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final RuleCall cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0 = (RuleCall)cSelectionTypeAssignment_4_1_1_1.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cCaptionFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cItemCaptionPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final CrossReference cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0 = (CrossReference)cItemCaptionPropertyAssignment_4_1_2_1.eContents().get(0);
		private final RuleCall cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1 = (RuleCall)cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0.eContents().get(1);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cDescriptionFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cDescriptionPropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final RuleCall cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0 = (RuleCall)cDescriptionPropertyAssignment_4_1_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cImageFieldKeyword_4_1_4_0 = (Keyword)cGroup_4_1_4.eContents().get(0);
		private final Assignment cItemImagePropertyAssignment_4_1_4_1 = (Assignment)cGroup_4_1_4.eContents().get(1);
		private final CrossReference cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0 = (CrossReference)cItemImagePropertyAssignment_4_1_4_1.eContents().get(0);
		private final RuleCall cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1 = (RuleCall)cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0.eContents().get(1);
		private final Group cGroup_4_1_5 = (Group)cUnorderedGroup_4_1.eContents().get(5);
		private final Assignment cConsumeBeanServiceAssignment_4_1_5_0 = (Assignment)cGroup_4_1_5.eContents().get(0);
		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_5_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_5_1 = (Keyword)cGroup_4_1_5.eContents().get(1);
		private final Assignment cReadonlyAssignment_4_1_6 = (Assignment)cUnorderedGroup_4_1.eContents().get(6);
		private final Keyword cReadonlyReadonlyKeyword_4_1_6_0 = (Keyword)cReadonlyAssignment_4_1_6.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiOptionsGroup:
		//	{UiOptionsGroup} "optionsgroup" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//	jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
		//	itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
		//	itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiOptionsGroup} "optionsgroup" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiOptionsGroup}
		public Action getUiOptionsGroupAction_0() { return cUiOptionsGroupAction_0; }

		//"optionsgroup"
		public Keyword getOptionsgroupKeyword_1() { return cOptionsgroupKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (("type" jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//("type" jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }

		//("type" jvmType=JvmTypeReference)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }

		//"type"
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }

		//("selectionType" selectionType=UiSelectionType)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }

		//"selectionType"
		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }

		//selectionType=UiSelectionType
		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }

		//UiSelectionType
		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }

		//("captionField" itemCaptionProperty=[JvmOperation])?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }

		//"captionField"
		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }

		//itemCaptionProperty=[JvmOperation]
		public Assignment getItemCaptionPropertyAssignment_4_1_2_1() { return cItemCaptionPropertyAssignment_4_1_2_1; }

		//[JvmOperation]
		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0; }

		//ID
		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }

		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }

		//"descriptionField"
		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }

		//descriptionProperty=UiNestedProperty
		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }

		//UiNestedProperty
		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }

		//("imageField" itemImageProperty=[JvmOperation])?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }

		//"imageField"
		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }

		//itemImageProperty=[JvmOperation]
		public Assignment getItemImagePropertyAssignment_4_1_4_1() { return cItemImagePropertyAssignment_4_1_4_1; }

		//[JvmOperation]
		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0; }

		//ID
		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1; }

		//(consumeBeanService?="useBeanService" ";"?)?
		public Group getGroup_4_1_5() { return cGroup_4_1_5; }

		//consumeBeanService?="useBeanService"
		public Assignment getConsumeBeanServiceAssignment_4_1_5_0() { return cConsumeBeanServiceAssignment_4_1_5_0; }

		//"useBeanService"
		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_5_1() { return cSemicolonKeyword_4_1_5_1; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_1_6() { return cReadonlyAssignment_4_1_6; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_1_6_0() { return cReadonlyReadonlyKeyword_4_1_6_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}

	public class UiListElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiList");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiListAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cListSelectKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cSelectionTypeKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cSelectionTypeAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final RuleCall cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0 = (RuleCall)cSelectionTypeAssignment_4_1_1_1.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cCaptionFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cItemCaptionPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final CrossReference cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0 = (CrossReference)cItemCaptionPropertyAssignment_4_1_2_1.eContents().get(0);
		private final RuleCall cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1 = (RuleCall)cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0.eContents().get(1);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cDescriptionFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cDescriptionPropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final RuleCall cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0 = (RuleCall)cDescriptionPropertyAssignment_4_1_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cImageFieldKeyword_4_1_4_0 = (Keyword)cGroup_4_1_4.eContents().get(0);
		private final Assignment cItemImagePropertyAssignment_4_1_4_1 = (Assignment)cGroup_4_1_4.eContents().get(1);
		private final CrossReference cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0 = (CrossReference)cItemImagePropertyAssignment_4_1_4_1.eContents().get(0);
		private final RuleCall cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1 = (RuleCall)cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0.eContents().get(1);
		private final Group cGroup_4_1_5 = (Group)cUnorderedGroup_4_1.eContents().get(5);
		private final Assignment cConsumeBeanServiceAssignment_4_1_5_0 = (Assignment)cGroup_4_1_5.eContents().get(0);
		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_5_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_5_1 = (Keyword)cGroup_4_1_5.eContents().get(1);
		private final Assignment cReadonlyAssignment_4_1_6 = (Assignment)cUnorderedGroup_4_1.eContents().get(6);
		private final Keyword cReadonlyReadonlyKeyword_4_1_6_0 = (Keyword)cReadonlyAssignment_4_1_6.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiList:
		//	{UiList} "listSelect" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//	jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
		//	itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
		//	itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiList} "listSelect" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
		//jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiList}
		public Action getUiListAction_0() { return cUiListAction_0; }

		//"listSelect"
		public Keyword getListSelectKeyword_1() { return cListSelectKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (("type" jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//("type" jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }

		//("type" jvmType=JvmTypeReference)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }

		//"type"
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }

		//("selectionType" selectionType=UiSelectionType)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }

		//"selectionType"
		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }

		//selectionType=UiSelectionType
		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }

		//UiSelectionType
		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }

		//("captionField" itemCaptionProperty=[JvmOperation])?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }

		//"captionField"
		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }

		//itemCaptionProperty=[JvmOperation]
		public Assignment getItemCaptionPropertyAssignment_4_1_2_1() { return cItemCaptionPropertyAssignment_4_1_2_1; }

		//[JvmOperation]
		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0; }

		//ID
		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }

		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }

		//"descriptionField"
		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }

		//descriptionProperty=UiNestedProperty
		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }

		//UiNestedProperty
		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }

		//("imageField" itemImageProperty=[JvmOperation])?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }

		//"imageField"
		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }

		//itemImageProperty=[JvmOperation]
		public Assignment getItemImagePropertyAssignment_4_1_4_1() { return cItemImagePropertyAssignment_4_1_4_1; }

		//[JvmOperation]
		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0; }

		//ID
		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1; }

		//(consumeBeanService?="useBeanService" ";"?)?
		public Group getGroup_4_1_5() { return cGroup_4_1_5; }

		//consumeBeanService?="useBeanService"
		public Assignment getConsumeBeanServiceAssignment_4_1_5_0() { return cConsumeBeanServiceAssignment_4_1_5_0; }

		//"useBeanService"
		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0; }

		//";"?
		public Keyword getSemicolonKeyword_4_1_5_1() { return cSemicolonKeyword_4_1_5_1; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_1_6() { return cReadonlyAssignment_4_1_6; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_1_6_0() { return cReadonlyReadonlyKeyword_4_1_6_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}

	public class UiColumnsAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiColumnsAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiColumnsAssignmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cColumnsKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cColumnsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cColumnsUiColumnParserRuleCall_3_0 = (RuleCall)cColumnsAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiColumnsAssignment:
		//	{UiColumnsAssignment} "columns" "{" columns+=UiColumn* "}";
		public ParserRule getRule() { return rule; }

		//{UiColumnsAssignment} "columns" "{" columns+=UiColumn* "}"
		public Group getGroup() { return cGroup; }

		//{UiColumnsAssignment}
		public Action getUiColumnsAssignmentAction_0() { return cUiColumnsAssignmentAction_0; }

		//"columns"
		public Keyword getColumnsKeyword_1() { return cColumnsKeyword_1; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }

		//columns+=UiColumn*
		public Assignment getColumnsAssignment_3() { return cColumnsAssignment_3; }

		//UiColumn
		public RuleCall getColumnsUiColumnParserRuleCall_3_0() { return cColumnsUiColumnParserRuleCall_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}

	public class UiSortOrderAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSortOrderAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSortOrderAssignmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSortKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cColumnsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cColumnsUiSortOrderParserRuleCall_3_0 = (RuleCall)cColumnsAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiSortOrderAssignment:
		//	{UiSortOrderAssignment} "sort" "{" columns+=UiSortOrder* "}";
		public ParserRule getRule() { return rule; }

		//{UiSortOrderAssignment} "sort" "{" columns+=UiSortOrder* "}"
		public Group getGroup() { return cGroup; }

		//{UiSortOrderAssignment}
		public Action getUiSortOrderAssignmentAction_0() { return cUiSortOrderAssignmentAction_0; }

		//"sort"
		public Keyword getSortKeyword_1() { return cSortKeyword_1; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }

		//columns+=UiSortOrder*
		public Assignment getColumnsAssignment_3() { return cColumnsAssignment_3; }

		//UiSortOrder
		public RuleCall getColumnsUiSortOrderParserRuleCall_3_0() { return cColumnsUiSortOrderParserRuleCall_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}

	public class UiSortOrderElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSortOrder");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cColumnKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cPropertyAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPropertyUiNestedPropertyParserRuleCall_1_0 = (RuleCall)cPropertyAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Keyword cDescKeyword_2_0 = (Keyword)cAlternatives_2.eContents().get(0);
		private final Assignment cAscAssignment_2_1 = (Assignment)cAlternatives_2.eContents().get(1);
		private final Keyword cAscAscKeyword_2_1_0 = (Keyword)cAscAssignment_2_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		//UiSortOrder:
		//	"column" property=UiNestedProperty ("desc" | asc?="asc")? ";"?;
		public ParserRule getRule() { return rule; }

		//"column" property=UiNestedProperty ("desc" | asc?="asc")? ";"?
		public Group getGroup() { return cGroup; }

		//"column"
		public Keyword getColumnKeyword_0() { return cColumnKeyword_0; }

		//property=UiNestedProperty
		public Assignment getPropertyAssignment_1() { return cPropertyAssignment_1; }

		//UiNestedProperty
		public RuleCall getPropertyUiNestedPropertyParserRuleCall_1_0() { return cPropertyUiNestedPropertyParserRuleCall_1_0; }

		//("desc" | asc?="asc")?
		public Alternatives getAlternatives_2() { return cAlternatives_2; }

		//"desc"
		public Keyword getDescKeyword_2_0() { return cDescKeyword_2_0; }

		//asc?="asc"
		public Assignment getAscAssignment_2_1() { return cAscAssignment_2_1; }

		//"asc"
		public Keyword getAscAscKeyword_2_1_0() { return cAscAscKeyword_2_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_3() { return cSemicolonKeyword_3; }
	}

	public class UiColumnElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiColumn");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiColumnAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cColumnKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cPropertyAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cPropertyUiNestedPropertyParserRuleCall_2_0 = (RuleCall)cPropertyAssignment_2.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cIconKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cIconNameAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cIconNameSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cIconNameAssignment_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiColumn:
		//	{UiColumn} "column" property=UiNestedProperty ("icon" iconName=STRING)? ";"?;
		public ParserRule getRule() { return rule; }

		//{UiColumn} "column" property=UiNestedProperty ("icon" iconName=STRING)? ";"?
		public Group getGroup() { return cGroup; }

		//{UiColumn}
		public Action getUiColumnAction_0() { return cUiColumnAction_0; }

		//"column"
		public Keyword getColumnKeyword_1() { return cColumnKeyword_1; }

		//property=UiNestedProperty
		public Assignment getPropertyAssignment_2() { return cPropertyAssignment_2; }

		//UiNestedProperty
		public RuleCall getPropertyUiNestedPropertyParserRuleCall_2_0() { return cPropertyUiNestedPropertyParserRuleCall_2_0; }

		//("icon" iconName=STRING)?
		public Group getGroup_3() { return cGroup_3; }

		//"icon"
		public Keyword getIconKeyword_3_0() { return cIconKeyword_3_0; }

		//iconName=STRING
		public Assignment getIconNameAssignment_3_1() { return cIconNameAssignment_3_1; }

		//STRING
		public RuleCall getIconNameSTRINGTerminalRuleCall_3_1_0() { return cIconNameSTRINGTerminalRuleCall_3_1_0; }

		//";"?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}

	public class UiEmbeddableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiEmbeddable");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiActionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiTabSheetParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//UiEmbeddable:
		//	UiLayout | UiField | UiAction | UiTabSheet;
		public ParserRule getRule() { return rule; }

		//UiLayout | UiField | UiAction | UiTabSheet
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiLayout
		public RuleCall getUiLayoutParserRuleCall_0() { return cUiLayoutParserRuleCall_0; }

		//UiField
		public RuleCall getUiFieldParserRuleCall_1() { return cUiFieldParserRuleCall_1; }

		//UiAction
		public RuleCall getUiActionParserRuleCall_2() { return cUiActionParserRuleCall_2; }

		//UiTabSheet
		public RuleCall getUiTabSheetParserRuleCall_3() { return cUiTabSheetParserRuleCall_3; }
	}

	public class UiMobileEmbeddableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileEmbeddable");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiMobileFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiMobileTabSheetParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMobileActionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//UiMobileEmbeddable:
		//	UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction;
		public ParserRule getRule() { return rule; }

		//UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiMobileLayout
		public RuleCall getUiMobileLayoutParserRuleCall_0() { return cUiMobileLayoutParserRuleCall_0; }

		//UiMobileField
		public RuleCall getUiMobileFieldParserRuleCall_1() { return cUiMobileFieldParserRuleCall_1; }

		//UiMobileTabSheet
		public RuleCall getUiMobileTabSheetParserRuleCall_2() { return cUiMobileTabSheetParserRuleCall_2; }

		//UiMobileAction
		public RuleCall getUiMobileActionParserRuleCall_3() { return cUiMobileActionParserRuleCall_3; }
	}

	public class UiMobileLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileLayout");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileHorizontalButtonGroupParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiMobileVerticalComponentGroupParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiMobileNavigationPageParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMobileHorizontalLayoutParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiMobileVerticalLayoutParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiMobileSearchPanelParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiMobileNavigationRootParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		
		//UiMobileLayout:
		//	UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
		//	UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot;
		public ParserRule getRule() { return rule; }

		//UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
		//UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiMobileHorizontalButtonGroup
		public RuleCall getUiMobileHorizontalButtonGroupParserRuleCall_0() { return cUiMobileHorizontalButtonGroupParserRuleCall_0; }

		//UiMobileVerticalComponentGroup
		public RuleCall getUiMobileVerticalComponentGroupParserRuleCall_1() { return cUiMobileVerticalComponentGroupParserRuleCall_1; }

		//UiMobileNavigationPage
		public RuleCall getUiMobileNavigationPageParserRuleCall_2() { return cUiMobileNavigationPageParserRuleCall_2; }

		//UiMobileHorizontalLayout
		public RuleCall getUiMobileHorizontalLayoutParserRuleCall_3() { return cUiMobileHorizontalLayoutParserRuleCall_3; }

		//UiMobileVerticalLayout
		public RuleCall getUiMobileVerticalLayoutParserRuleCall_4() { return cUiMobileVerticalLayoutParserRuleCall_4; }

		//UiMobileSearchPanel
		public RuleCall getUiMobileSearchPanelParserRuleCall_5() { return cUiMobileSearchPanelParserRuleCall_5; }

		//UiMobileNavigationRoot
		public RuleCall getUiMobileNavigationRootParserRuleCall_6() { return cUiMobileNavigationRootParserRuleCall_6; }
	}

	public class UiMobileFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileField");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileSwitchParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiTextFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiMaskedTextFieldParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMaskedNumericFieldParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiMaskedDecimalFieldParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiPrefixedMaskedTextFieldParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiRichTextAreaParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cUiPasswordFieldParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cUiSuggestTextFieldParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cUiNumericFieldParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cUiTableParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		private final RuleCall cUiComboBoxParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
		private final RuleCall cUiImageParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
		private final RuleCall cUiSearchFieldParserRuleCall_13 = (RuleCall)cAlternatives.eContents().get(13);
		private final RuleCall cUiLabelParserRuleCall_14 = (RuleCall)cAlternatives.eContents().get(14);
		private final RuleCall cUiDecimalFieldParserRuleCall_15 = (RuleCall)cAlternatives.eContents().get(15);
		private final RuleCall cUiTextAreaParserRuleCall_16 = (RuleCall)cAlternatives.eContents().get(16);
		private final RuleCall cUiDateFieldParserRuleCall_17 = (RuleCall)cAlternatives.eContents().get(17);
		private final RuleCall cUiBrowserParserRuleCall_18 = (RuleCall)cAlternatives.eContents().get(18);
		private final RuleCall cUiProgressBarParserRuleCall_19 = (RuleCall)cAlternatives.eContents().get(19);
		private final RuleCall cUiOptionsGroupParserRuleCall_20 = (RuleCall)cAlternatives.eContents().get(20);
		
		//UiMobileField:
		//	UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
		//	UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
		//	UiComboBox | UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar
		//	| UiOptionsGroup;
		public ParserRule getRule() { return rule; }

		//UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
		//UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
		//UiComboBox | UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar
		//| UiOptionsGroup
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiMobileSwitch
		public RuleCall getUiMobileSwitchParserRuleCall_0() { return cUiMobileSwitchParserRuleCall_0; }

		//UiTextField
		public RuleCall getUiTextFieldParserRuleCall_1() { return cUiTextFieldParserRuleCall_1; }

		//UiMaskedTextField
		public RuleCall getUiMaskedTextFieldParserRuleCall_2() { return cUiMaskedTextFieldParserRuleCall_2; }

		//UiMaskedNumericField
		public RuleCall getUiMaskedNumericFieldParserRuleCall_3() { return cUiMaskedNumericFieldParserRuleCall_3; }

		//UiMaskedDecimalField
		public RuleCall getUiMaskedDecimalFieldParserRuleCall_4() { return cUiMaskedDecimalFieldParserRuleCall_4; }

		//UiPrefixedMaskedTextField
		public RuleCall getUiPrefixedMaskedTextFieldParserRuleCall_5() { return cUiPrefixedMaskedTextFieldParserRuleCall_5; }

		//UiRichTextArea
		public RuleCall getUiRichTextAreaParserRuleCall_6() { return cUiRichTextAreaParserRuleCall_6; }

		//UiPasswordField
		public RuleCall getUiPasswordFieldParserRuleCall_7() { return cUiPasswordFieldParserRuleCall_7; }

		//UiSuggestTextField
		public RuleCall getUiSuggestTextFieldParserRuleCall_8() { return cUiSuggestTextFieldParserRuleCall_8; }

		//UiNumericField
		public RuleCall getUiNumericFieldParserRuleCall_9() { return cUiNumericFieldParserRuleCall_9; }

		//UiTable
		public RuleCall getUiTableParserRuleCall_10() { return cUiTableParserRuleCall_10; }

		//UiComboBox
		public RuleCall getUiComboBoxParserRuleCall_11() { return cUiComboBoxParserRuleCall_11; }

		//UiImage
		public RuleCall getUiImageParserRuleCall_12() { return cUiImageParserRuleCall_12; }

		//UiSearchField
		public RuleCall getUiSearchFieldParserRuleCall_13() { return cUiSearchFieldParserRuleCall_13; }

		//UiLabel
		public RuleCall getUiLabelParserRuleCall_14() { return cUiLabelParserRuleCall_14; }

		//UiDecimalField
		public RuleCall getUiDecimalFieldParserRuleCall_15() { return cUiDecimalFieldParserRuleCall_15; }

		//UiTextArea
		public RuleCall getUiTextAreaParserRuleCall_16() { return cUiTextAreaParserRuleCall_16; }

		//UiDateField
		public RuleCall getUiDateFieldParserRuleCall_17() { return cUiDateFieldParserRuleCall_17; }

		//UiBrowser
		public RuleCall getUiBrowserParserRuleCall_18() { return cUiBrowserParserRuleCall_18; }

		//UiProgressBar
		public RuleCall getUiProgressBarParserRuleCall_19() { return cUiProgressBarParserRuleCall_19; }

		//UiOptionsGroup
		public RuleCall getUiOptionsGroupParserRuleCall_20() { return cUiOptionsGroupParserRuleCall_20; }
	}

	public class UiLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiLayout");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiGridLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiFormLayoutParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiHorizontalLayoutParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiVerticalLayoutParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiSplitpanelParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiPanelParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiSearchPanelParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		
		//UiLayout:
		//	UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel;
		public ParserRule getRule() { return rule; }

		//UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiGridLayout
		public RuleCall getUiGridLayoutParserRuleCall_0() { return cUiGridLayoutParserRuleCall_0; }

		//UiFormLayout
		public RuleCall getUiFormLayoutParserRuleCall_1() { return cUiFormLayoutParserRuleCall_1; }

		//UiHorizontalLayout
		public RuleCall getUiHorizontalLayoutParserRuleCall_2() { return cUiHorizontalLayoutParserRuleCall_2; }

		//UiVerticalLayout
		public RuleCall getUiVerticalLayoutParserRuleCall_3() { return cUiVerticalLayoutParserRuleCall_3; }

		//UiSplitpanel
		public RuleCall getUiSplitpanelParserRuleCall_4() { return cUiSplitpanelParserRuleCall_4; }

		//UiPanel
		public RuleCall getUiPanelParserRuleCall_5() { return cUiPanelParserRuleCall_5; }

		//UiSearchPanel
		public RuleCall getUiSearchPanelParserRuleCall_6() { return cUiSearchPanelParserRuleCall_6; }
	}

	public class UiFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiField");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiTextFieldParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiMaskedTextFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiMaskedNumericFieldParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMaskedDecimalFieldParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiPrefixedMaskedTextFieldParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiRichTextAreaParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiPasswordFieldParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cUiSuggestTextFieldParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cUiListParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cUiNumericFieldParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cUiCheckBoxParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		private final RuleCall cUiTableParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
		private final RuleCall cUiComboBoxParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
		private final RuleCall cUiImageParserRuleCall_13 = (RuleCall)cAlternatives.eContents().get(13);
		private final RuleCall cUiSearchFieldParserRuleCall_14 = (RuleCall)cAlternatives.eContents().get(14);
		private final RuleCall cUiLabelParserRuleCall_15 = (RuleCall)cAlternatives.eContents().get(15);
		private final RuleCall cUiDecimalFieldParserRuleCall_16 = (RuleCall)cAlternatives.eContents().get(16);
		private final RuleCall cUiTextAreaParserRuleCall_17 = (RuleCall)cAlternatives.eContents().get(17);
		private final RuleCall cUiDateFieldParserRuleCall_18 = (RuleCall)cAlternatives.eContents().get(18);
		private final RuleCall cUiBrowserParserRuleCall_19 = (RuleCall)cAlternatives.eContents().get(19);
		private final RuleCall cUiProgressBarParserRuleCall_20 = (RuleCall)cAlternatives.eContents().get(20);
		private final RuleCall cUiOptionsGroupParserRuleCall_21 = (RuleCall)cAlternatives.eContents().get(21);
		private final RuleCall cUiBeanReferenceFieldParserRuleCall_22 = (RuleCall)cAlternatives.eContents().get(22);
		
		//UiField:
		//	UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField | UiPrefixedMaskedTextField |
		//	UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
		//	UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar |
		//	UiOptionsGroup | UiBeanReferenceField;
		public ParserRule getRule() { return rule; }

		//UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField | UiPrefixedMaskedTextField |
		//UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
		//UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar |
		//UiOptionsGroup | UiBeanReferenceField
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiTextField
		public RuleCall getUiTextFieldParserRuleCall_0() { return cUiTextFieldParserRuleCall_0; }

		//UiMaskedTextField
		public RuleCall getUiMaskedTextFieldParserRuleCall_1() { return cUiMaskedTextFieldParserRuleCall_1; }

		//UiMaskedNumericField
		public RuleCall getUiMaskedNumericFieldParserRuleCall_2() { return cUiMaskedNumericFieldParserRuleCall_2; }

		//UiMaskedDecimalField
		public RuleCall getUiMaskedDecimalFieldParserRuleCall_3() { return cUiMaskedDecimalFieldParserRuleCall_3; }

		//UiPrefixedMaskedTextField
		public RuleCall getUiPrefixedMaskedTextFieldParserRuleCall_4() { return cUiPrefixedMaskedTextFieldParserRuleCall_4; }

		//UiRichTextArea
		public RuleCall getUiRichTextAreaParserRuleCall_5() { return cUiRichTextAreaParserRuleCall_5; }

		//UiPasswordField
		public RuleCall getUiPasswordFieldParserRuleCall_6() { return cUiPasswordFieldParserRuleCall_6; }

		//UiSuggestTextField
		public RuleCall getUiSuggestTextFieldParserRuleCall_7() { return cUiSuggestTextFieldParserRuleCall_7; }

		//UiList
		public RuleCall getUiListParserRuleCall_8() { return cUiListParserRuleCall_8; }

		//UiNumericField
		public RuleCall getUiNumericFieldParserRuleCall_9() { return cUiNumericFieldParserRuleCall_9; }

		//UiCheckBox
		public RuleCall getUiCheckBoxParserRuleCall_10() { return cUiCheckBoxParserRuleCall_10; }

		//UiTable
		public RuleCall getUiTableParserRuleCall_11() { return cUiTableParserRuleCall_11; }

		//UiComboBox
		public RuleCall getUiComboBoxParserRuleCall_12() { return cUiComboBoxParserRuleCall_12; }

		//UiImage
		public RuleCall getUiImageParserRuleCall_13() { return cUiImageParserRuleCall_13; }

		//UiSearchField
		public RuleCall getUiSearchFieldParserRuleCall_14() { return cUiSearchFieldParserRuleCall_14; }

		//UiLabel
		public RuleCall getUiLabelParserRuleCall_15() { return cUiLabelParserRuleCall_15; }

		//UiDecimalField
		public RuleCall getUiDecimalFieldParserRuleCall_16() { return cUiDecimalFieldParserRuleCall_16; }

		//UiTextArea
		public RuleCall getUiTextAreaParserRuleCall_17() { return cUiTextAreaParserRuleCall_17; }

		//UiDateField
		public RuleCall getUiDateFieldParserRuleCall_18() { return cUiDateFieldParserRuleCall_18; }

		//UiBrowser
		public RuleCall getUiBrowserParserRuleCall_19() { return cUiBrowserParserRuleCall_19; }

		//UiProgressBar
		public RuleCall getUiProgressBarParserRuleCall_20() { return cUiProgressBarParserRuleCall_20; }

		//UiOptionsGroup
		public RuleCall getUiOptionsGroupParserRuleCall_21() { return cUiOptionsGroupParserRuleCall_21; }

		//UiBeanReferenceField
		public RuleCall getUiBeanReferenceFieldParserRuleCall_22() { return cUiBeanReferenceFieldParserRuleCall_22; }
	}

	public class UiActionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiAction");
		private final RuleCall cUiButtonParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//UiAction:
		//	UiButton;
		public ParserRule getRule() { return rule; }

		//UiButton
		public RuleCall getUiButtonParserRuleCall() { return cUiButtonParserRuleCall; }
	}

	public class UiMobileActionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileAction");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileNavigationButtonParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiButtonParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//UiMobileAction:
		//	UiMobileNavigationButton | UiButton;
		public ParserRule getRule() { return rule; }

		//UiMobileNavigationButton | UiButton
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiMobileNavigationButton
		public RuleCall getUiMobileNavigationButtonParserRuleCall_0() { return cUiMobileNavigationButtonParserRuleCall_0; }

		//UiButton
		public RuleCall getUiButtonParserRuleCall_1() { return cUiButtonParserRuleCall_1; }
	}

	public class UiNumericFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiNumericField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiNumericFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNumericFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cNoGroupingAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cNoGroupingNoGroupingKeyword_2_1_0_0 = (Keyword)cNoGroupingAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cNoMarkNegativeAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0 = (Keyword)cNoMarkNegativeAssignment_2_1_2.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0 = (RuleCall)cI18nInfoAssignment_2_1_3.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final Keyword cReadonlyReadonlyKeyword_2_1_4_0 = (Keyword)cReadonlyAssignment_2_1_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiNumericField:
		//	{UiNumericField} "numericField" ("(" (noGrouping?="noGrouping"? & ("styles" styles=STRING)? &
		//	noMarkNegative?="noMarkNegative"? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiNumericField} "numericField" ("(" (noGrouping?="noGrouping"? & ("styles" styles=STRING)? &
		//noMarkNegative?="noMarkNegative"? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiNumericField}
		public Action getUiNumericFieldAction_0() { return cUiNumericFieldAction_0; }

		//"numericField"
		public Keyword getNumericFieldKeyword_1() { return cNumericFieldKeyword_1; }

		//("(" (noGrouping?="noGrouping"? & ("styles" styles=STRING)? & noMarkNegative?="noMarkNegative"? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//noGrouping?="noGrouping"? & ("styles" styles=STRING)? & noMarkNegative?="noMarkNegative"? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//noGrouping?="noGrouping"?
		public Assignment getNoGroupingAssignment_2_1_0() { return cNoGroupingAssignment_2_1_0; }

		//"noGrouping"
		public Keyword getNoGroupingNoGroupingKeyword_2_1_0_0() { return cNoGroupingNoGroupingKeyword_2_1_0_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }

		//"styles"
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }

		//noMarkNegative?="noMarkNegative"?
		public Assignment getNoMarkNegativeAssignment_2_1_2() { return cNoMarkNegativeAssignment_2_1_2; }

		//"noMarkNegative"
		public Keyword getNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0() { return cNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiCheckBoxElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiCheckBox");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiCheckBoxAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cCheckboxKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiCheckBox:
		//	{UiCheckBox} "checkbox" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		//	("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
		public ParserRule getRule() { return rule; }

		//{UiCheckBox} "checkbox" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup() { return cGroup; }

		//{UiCheckBox}
		public Action getUiCheckBoxAction_0() { return cUiCheckBoxAction_0; }

		//"checkbox"
		public Keyword getCheckboxKeyword_1() { return cCheckboxKeyword_1; }

		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
		public Group getGroup_2() { return cGroup_2; }

		//"("
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }

		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }

		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }

		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }

		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }

		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }

		//("styles" styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }

		//"styles"
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }

		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }

		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }

		//")"
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }

		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }

		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }

		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }

		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }

		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }

		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }

		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }

		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}

	public class UiValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiValidator");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMaxLengthValidatorParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiMinLengthValidatorParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiRegexpValidatorParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiXbaseValidatorParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiBeanValidationValidatorParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		
		//UiValidator:
		//	UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator;
		public ParserRule getRule() { return rule; }

		//UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator
		public Alternatives getAlternatives() { return cAlternatives; }

		//UiMaxLengthValidator
		public RuleCall getUiMaxLengthValidatorParserRuleCall_0() { return cUiMaxLengthValidatorParserRuleCall_0; }

		//UiMinLengthValidator
		public RuleCall getUiMinLengthValidatorParserRuleCall_1() { return cUiMinLengthValidatorParserRuleCall_1; }

		//UiRegexpValidator
		public RuleCall getUiRegexpValidatorParserRuleCall_2() { return cUiRegexpValidatorParserRuleCall_2; }

		//UiXbaseValidator
		public RuleCall getUiXbaseValidatorParserRuleCall_3() { return cUiXbaseValidatorParserRuleCall_3; }

		//UiBeanValidationValidator
		public RuleCall getUiBeanValidationValidatorParserRuleCall_4() { return cUiBeanValidationValidatorParserRuleCall_4; }
	}

	public class UiMaxLengthValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMaxLengthValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMaxLengthValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaxLengthValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cMaxLengthAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cMaxLengthINTTerminalRuleCall_4_0 = (RuleCall)cMaxLengthAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cErrorCodeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
		
		//UiMaxLengthValidator:
		//	{UiMaxLengthValidator} "MaxLengthValidator" name=ID? "(" maxLength=INT ")" errorCode=UiErrorCode?;
		public ParserRule getRule() { return rule; }

		//{UiMaxLengthValidator} "MaxLengthValidator" name=ID? "(" maxLength=INT ")" errorCode=UiErrorCode?
		public Group getGroup() { return cGroup; }

		//{UiMaxLengthValidator}
		public Action getUiMaxLengthValidatorAction_0() { return cUiMaxLengthValidatorAction_0; }

		//"MaxLengthValidator"
		public Keyword getMaxLengthValidatorKeyword_1() { return cMaxLengthValidatorKeyword_1; }

		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }

		//maxLength=INT
		public Assignment getMaxLengthAssignment_4() { return cMaxLengthAssignment_4; }

		//INT
		public RuleCall getMaxLengthINTTerminalRuleCall_4_0() { return cMaxLengthINTTerminalRuleCall_4_0; }

		//")"
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }

		//errorCode=UiErrorCode?
		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }

		//UiErrorCode
		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
	}

	public class UiMinLengthValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMinLengthValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMinLengthValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMinLengthValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cMinLengthAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cMinLengthINTTerminalRuleCall_4_0 = (RuleCall)cMinLengthAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cErrorCodeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
		
		//UiMinLengthValidator:
		//	{UiMinLengthValidator} "MinLengthValidator" name=ID? "(" minLength=INT ")" errorCode=UiErrorCode?;
		public ParserRule getRule() { return rule; }

		//{UiMinLengthValidator} "MinLengthValidator" name=ID? "(" minLength=INT ")" errorCode=UiErrorCode?
		public Group getGroup() { return cGroup; }

		//{UiMinLengthValidator}
		public Action getUiMinLengthValidatorAction_0() { return cUiMinLengthValidatorAction_0; }

		//"MinLengthValidator"
		public Keyword getMinLengthValidatorKeyword_1() { return cMinLengthValidatorKeyword_1; }

		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }

		//minLength=INT
		public Assignment getMinLengthAssignment_4() { return cMinLengthAssignment_4; }

		//INT
		public RuleCall getMinLengthINTTerminalRuleCall_4_0() { return cMinLengthINTTerminalRuleCall_4_0; }

		//")"
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }

		//errorCode=UiErrorCode?
		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }

		//UiErrorCode
		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
	}

	public class UiRegexpValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRegexpValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiRegexpValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRegexValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cRegExpressionAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cRegExpressionSTRINGTerminalRuleCall_4_0 = (RuleCall)cRegExpressionAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cErrorCodeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
		
		//UiRegexpValidator:
		//	{UiRegexpValidator} "RegexValidator" name=ID? "(" regExpression=STRING ")" errorCode=UiErrorCode?;
		public ParserRule getRule() { return rule; }

		//{UiRegexpValidator} "RegexValidator" name=ID? "(" regExpression=STRING ")" errorCode=UiErrorCode?
		public Group getGroup() { return cGroup; }

		//{UiRegexpValidator}
		public Action getUiRegexpValidatorAction_0() { return cUiRegexpValidatorAction_0; }

		//"RegexValidator"
		public Keyword getRegexValidatorKeyword_1() { return cRegexValidatorKeyword_1; }

		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }

		//regExpression=STRING
		public Assignment getRegExpressionAssignment_4() { return cRegExpressionAssignment_4; }

		//STRING
		public RuleCall getRegExpressionSTRINGTerminalRuleCall_4_0() { return cRegExpressionSTRINGTerminalRuleCall_4_0; }

		//")"
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }

		//errorCode=UiErrorCode?
		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }

		//UiErrorCode
		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
	}

	public class UiXbaseValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiXbaseValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiXbaseValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cExpressionKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cJvmTypeAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_0 = (RuleCall)cJvmTypeAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cErrorCodesAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cErrorCodesUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodesAssignment_6.eContents().get(0);
		private final Assignment cExpressionAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cExpressionXBlockExpressionParserRuleCall_7_0 = (RuleCall)cExpressionAssignment_7.eContents().get(0);
		
		//UiXbaseValidator:
		//	{UiXbaseValidator} "Expression" name=ID "(" jvmType=JvmTypeReference ")" errorCodes+=UiErrorCode*
		//	expression=XBlockExpression?;
		public ParserRule getRule() { return rule; }

		//{UiXbaseValidator} "Expression" name=ID "(" jvmType=JvmTypeReference ")" errorCodes+=UiErrorCode*
		//expression=XBlockExpression?
		public Group getGroup() { return cGroup; }

		//{UiXbaseValidator}
		public Action getUiXbaseValidatorAction_0() { return cUiXbaseValidatorAction_0; }

		//"Expression"
		public Keyword getExpressionKeyword_1() { return cExpressionKeyword_1; }

		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }

		//"("
		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }

		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4() { return cJvmTypeAssignment_4; }

		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_0; }

		//")"
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }

		//errorCodes+=UiErrorCode*
		public Assignment getErrorCodesAssignment_6() { return cErrorCodesAssignment_6; }

		//UiErrorCode
		public RuleCall getErrorCodesUiErrorCodeParserRuleCall_6_0() { return cErrorCodesUiErrorCodeParserRuleCall_6_0; }

		//expression=XBlockExpression?
		public Assignment getExpressionAssignment_7() { return cExpressionAssignment_7; }

		//XBlockExpression
		public RuleCall getExpressionXBlockExpressionParserRuleCall_7_0() { return cExpressionXBlockExpressionParserRuleCall_7_0; }
	}

	public class UiBeanValidationValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBeanValidationValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiBeanValidationValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cBeanValidationValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		
		//UiBeanValidationValidator:
		//	{UiBeanValidationValidator} "BeanValidationValidator" name=ID?;
		public ParserRule getRule() { return rule; }

		//{UiBeanValidationValidator} "BeanValidationValidator" name=ID?
		public Group getGroup() { return cGroup; }

		//{UiBeanValidationValidator}
		public Action getUiBeanValidationValidatorAction_0() { return cUiBeanValidationValidatorAction_0; }

		//"BeanValidationValidator"
		public Keyword getBeanValidationValidatorKeyword_1() { return cBeanValidationValidatorKeyword_1; }

		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
	}

	public class UiErrorCodeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiErrorCode");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cCodeKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cDefaultMessageAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDefaultMessageSTRINGTerminalRuleCall_2_0 = (RuleCall)cDefaultMessageAssignment_2.eContents().get(0);
		
		//UiErrorCode:
		//	"code" name=ID defaultMessage=STRING?;
		public ParserRule getRule() { return rule; }

		//"code" name=ID defaultMessage=STRING?
		public Group getGroup() { return cGroup; }

		//"code"
		public Keyword getCodeKeyword_0() { return cCodeKeyword_0; }

		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }

		//defaultMessage=STRING?
		public Assignment getDefaultMessageAssignment_2() { return cDefaultMessageAssignment_2; }

		//STRING
		public RuleCall getDefaultMessageSTRINGTerminalRuleCall_2_0() { return cDefaultMessageSTRINGTerminalRuleCall_2_0; }
	}

	public class UiVisibilityProcessorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiVisibilityProcessor");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVisibilityProcessorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cVisibilityKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cDataUsedAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0 = (RuleCall)cDataUsedAssignment_4_0.eContents().get(0);
		private final Assignment cChangeTriggersAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
		private final RuleCall cChangeTriggersUiChangeTriggerParserRuleCall_4_1_0 = (RuleCall)cChangeTriggersAssignment_4_1.eContents().get(0);
		private final Assignment cImportedElementsAssignment_4_2 = (Assignment)cAlternatives_4.eContents().get(2);
		private final RuleCall cImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0 = (RuleCall)cImportedElementsAssignment_4_2.eContents().get(0);
		private final Assignment cRuleAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cRuleUiXbaseVisibilityRuleParserRuleCall_5_0 = (RuleCall)cRuleAssignment_5.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//UiVisibilityProcessor:
		//	{UiVisibilityProcessor} "visibility" name=ID "{" (dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger |
		//	importedElements+=UiTypedBindableRawTypeAlias)* rule=UiXbaseVisibilityRule? "}";
		public ParserRule getRule() { return rule; }

		//{UiVisibilityProcessor} "visibility" name=ID "{" (dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger |
		//importedElements+=UiTypedBindableRawTypeAlias)* rule=UiXbaseVisibilityRule? "}"
		public Group getGroup() { return cGroup; }

		//{UiVisibilityProcessor}
		public Action getUiVisibilityProcessorAction_0() { return cUiVisibilityProcessorAction_0; }

		//"visibility"
		public Keyword getVisibilityKeyword_1() { return cVisibilityKeyword_1; }

		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }

		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }

		//(dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger | importedElements+=UiTypedBindableRawTypeAlias)*
		public Alternatives getAlternatives_4() { return cAlternatives_4; }

		//dataUsed+=UiBindingEndpointAlias
		public Assignment getDataUsedAssignment_4_0() { return cDataUsedAssignment_4_0; }

		//UiBindingEndpointAlias
		public RuleCall getDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0() { return cDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0; }

		//changeTriggers+=UiChangeTrigger
		public Assignment getChangeTriggersAssignment_4_1() { return cChangeTriggersAssignment_4_1; }

		//UiChangeTrigger
		public RuleCall getChangeTriggersUiChangeTriggerParserRuleCall_4_1_0() { return cChangeTriggersUiChangeTriggerParserRuleCall_4_1_0; }

		//importedElements+=UiTypedBindableRawTypeAlias
		public Assignment getImportedElementsAssignment_4_2() { return cImportedElementsAssignment_4_2; }

		//UiTypedBindableRawTypeAlias
		public RuleCall getImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0() { return cImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0; }

		//rule=UiXbaseVisibilityRule?
		public Assignment getRuleAssignment_5() { return cRuleAssignment_5; }

		//UiXbaseVisibilityRule
		public RuleCall getRuleUiXbaseVisibilityRuleParserRuleCall_5_0() { return cRuleUiXbaseVisibilityRuleParserRuleCall_5_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}

	public class UiXbaseVisibilityRuleElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiXbaseVisibilityRule");
		private final Assignment cExpressionAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cExpressionXBlockExpressionParserRuleCall_0 = (RuleCall)cExpressionAssignment.eContents().get(0);
		
		//UiXbaseVisibilityRule:
		//	expression=XBlockExpression;
		public ParserRule getRule() { return rule; }

		//expression=XBlockExpression
		public Assignment getExpressionAssignment() { return cExpressionAssignment; }

		//XBlockExpression
		public RuleCall getExpressionXBlockExpressionParserRuleCall_0() { return cExpressionXBlockExpressionParserRuleCall_0; }
	}

	public class UiChangeTriggerElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiChangeTrigger");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cFireOnKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cEndpointAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0 = (RuleCall)cEndpointAssignment_1.eContents().get(0);
		private final Keyword cAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAliasAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAliasIDTerminalRuleCall_3_0 = (RuleCall)cAliasAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiChangeTrigger:
		//	"fireOn" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?;
		public ParserRule getRule() { return rule; }

		//"fireOn" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?
		public Group getGroup() { return cGroup; }

		//"fireOn"
		public Keyword getFireOnKeyword_0() { return cFireOnKeyword_0; }

		//endpoint=UiBindingEndpointAssignment
		public Assignment getEndpointAssignment_1() { return cEndpointAssignment_1; }

		//UiBindingEndpointAssignment
		public RuleCall getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0() { return cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0; }

		//"as"
		public Keyword getAsKeyword_2() { return cAsKeyword_2; }

		//alias=ID
		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }

		//ID
		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }

		//";"?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	
	
	public class UiDateFormatElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "UiDateFormat");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cDATEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cDATEDateKeyword_0_0 = (Keyword)cDATEEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cDATE_TIMEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cDATE_TIMEDatetimeKeyword_1_0 = (Keyword)cDATE_TIMEEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cTIMEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cTIMETimeKeyword_2_0 = (Keyword)cTIMEEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum UiDateFormat:
		//	DATE="date" | DATE_TIME="datetime" | TIME="time";
		public EnumRule getRule() { return rule; }

		//DATE="date" | DATE_TIME="datetime" | TIME="time"
		public Alternatives getAlternatives() { return cAlternatives; }

		//DATE="date"
		public EnumLiteralDeclaration getDATEEnumLiteralDeclaration_0() { return cDATEEnumLiteralDeclaration_0; }

		//"date"
		public Keyword getDATEDateKeyword_0_0() { return cDATEDateKeyword_0_0; }

		//DATE_TIME="datetime"
		public EnumLiteralDeclaration getDATE_TIMEEnumLiteralDeclaration_1() { return cDATE_TIMEEnumLiteralDeclaration_1; }

		//"datetime"
		public Keyword getDATE_TIMEDatetimeKeyword_1_0() { return cDATE_TIMEDatetimeKeyword_1_0; }

		//TIME="time"
		public EnumLiteralDeclaration getTIMEEnumLiteralDeclaration_2() { return cTIMEEnumLiteralDeclaration_2; }

		//"time"
		public Keyword getTIMETimeKeyword_2_0() { return cTIMETimeKeyword_2_0; }
	}

	public class UiDateTimeResolutionElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "UiDateTimeResolution");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cUNDEFINEDEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cUNDEFINEDUndefinedKeyword_0_0 = (Keyword)cUNDEFINEDEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cSECONDEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cSECONDSecondKeyword_1_0 = (Keyword)cSECONDEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cMINUTEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cMINUTEMinuteKeyword_2_0 = (Keyword)cMINUTEEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cHOUREnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cHOURHourKeyword_3_0 = (Keyword)cHOUREnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cDAYEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cDAYDayKeyword_4_0 = (Keyword)cDAYEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cMONTHEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cMONTHMonthKeyword_5_0 = (Keyword)cMONTHEnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cYEAREnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cYEARYearKeyword_6_0 = (Keyword)cYEAREnumLiteralDeclaration_6.eContents().get(0);
		
		//enum UiDateTimeResolution:
		//	UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year";
		public EnumRule getRule() { return rule; }

		//UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year"
		public Alternatives getAlternatives() { return cAlternatives; }

		//UNDEFINED="undefined"
		public EnumLiteralDeclaration getUNDEFINEDEnumLiteralDeclaration_0() { return cUNDEFINEDEnumLiteralDeclaration_0; }

		//"undefined"
		public Keyword getUNDEFINEDUndefinedKeyword_0_0() { return cUNDEFINEDUndefinedKeyword_0_0; }

		//SECOND="second"
		public EnumLiteralDeclaration getSECONDEnumLiteralDeclaration_1() { return cSECONDEnumLiteralDeclaration_1; }

		//"second"
		public Keyword getSECONDSecondKeyword_1_0() { return cSECONDSecondKeyword_1_0; }

		//MINUTE="minute"
		public EnumLiteralDeclaration getMINUTEEnumLiteralDeclaration_2() { return cMINUTEEnumLiteralDeclaration_2; }

		//"minute"
		public Keyword getMINUTEMinuteKeyword_2_0() { return cMINUTEMinuteKeyword_2_0; }

		//HOUR="hour"
		public EnumLiteralDeclaration getHOUREnumLiteralDeclaration_3() { return cHOUREnumLiteralDeclaration_3; }

		//"hour"
		public Keyword getHOURHourKeyword_3_0() { return cHOURHourKeyword_3_0; }

		//DAY="day"
		public EnumLiteralDeclaration getDAYEnumLiteralDeclaration_4() { return cDAYEnumLiteralDeclaration_4; }

		//"day"
		public Keyword getDAYDayKeyword_4_0() { return cDAYDayKeyword_4_0; }

		//MONTH="month"
		public EnumLiteralDeclaration getMONTHEnumLiteralDeclaration_5() { return cMONTHEnumLiteralDeclaration_5; }

		//"month"
		public Keyword getMONTHMonthKeyword_5_0() { return cMONTHMonthKeyword_5_0; }

		//YEAR="year"
		public EnumLiteralDeclaration getYEAREnumLiteralDeclaration_6() { return cYEAREnumLiteralDeclaration_6; }

		//"year"
		public Keyword getYEARYearKeyword_6_0() { return cYEARYearKeyword_6_0; }
	}

	public class UiSelectionTypeElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "UiSelectionType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cSINGLEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cSINGLESingleKeyword_0_0 = (Keyword)cSINGLEEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cMULTIEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cMULTIMultiKeyword_1_0 = (Keyword)cMULTIEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cNONEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cNONENoneKeyword_2_0 = (Keyword)cNONEEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum UiSelectionType:
		//	SINGLE="single" | MULTI="multi" | NONE="none";
		public EnumRule getRule() { return rule; }

		//SINGLE="single" | MULTI="multi" | NONE="none"
		public Alternatives getAlternatives() { return cAlternatives; }

		//SINGLE="single"
		public EnumLiteralDeclaration getSINGLEEnumLiteralDeclaration_0() { return cSINGLEEnumLiteralDeclaration_0; }

		//"single"
		public Keyword getSINGLESingleKeyword_0_0() { return cSINGLESingleKeyword_0_0; }

		//MULTI="multi"
		public EnumLiteralDeclaration getMULTIEnumLiteralDeclaration_1() { return cMULTIEnumLiteralDeclaration_1; }

		//"multi"
		public Keyword getMULTIMultiKeyword_1_0() { return cMULTIMultiKeyword_1_0; }

		//NONE="none"
		public EnumLiteralDeclaration getNONEEnumLiteralDeclaration_2() { return cNONEEnumLiteralDeclaration_2; }

		//"none"
		public Keyword getNONENoneKeyword_2_0() { return cNONENoneKeyword_2_0; }
	}

	public class UiAlignmentElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "UiAlignment");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cUNDEFINEDEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cUNDEFINEDUndefinedKeyword_0_0 = (Keyword)cUNDEFINEDEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cBOTTOM_CENTEREnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cBOTTOM_CENTERBottomCenterKeyword_1_0 = (Keyword)cBOTTOM_CENTEREnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cBOTTOM_LEFTEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cBOTTOM_LEFTBottomLeftKeyword_2_0 = (Keyword)cBOTTOM_LEFTEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cBOTTOM_RIGHTEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cBOTTOM_RIGHTBottomRightKeyword_3_0 = (Keyword)cBOTTOM_RIGHTEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cBOTTOM_FILLEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cBOTTOM_FILLBottomFillKeyword_4_0 = (Keyword)cBOTTOM_FILLEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cMIDDLE_CENTEREnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cMIDDLE_CENTERMiddleCenterKeyword_5_0 = (Keyword)cMIDDLE_CENTEREnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cMIDDLE_LEFTEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cMIDDLE_LEFTMiddleLeftKeyword_6_0 = (Keyword)cMIDDLE_LEFTEnumLiteralDeclaration_6.eContents().get(0);
		private final EnumLiteralDeclaration cMIDDLE_RIGHTEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
		private final Keyword cMIDDLE_RIGHTMiddleRightKeyword_7_0 = (Keyword)cMIDDLE_RIGHTEnumLiteralDeclaration_7.eContents().get(0);
		private final EnumLiteralDeclaration cMIDDLE_FILLEnumLiteralDeclaration_8 = (EnumLiteralDeclaration)cAlternatives.eContents().get(8);
		private final Keyword cMIDDLE_FILLMiddleFillKeyword_8_0 = (Keyword)cMIDDLE_FILLEnumLiteralDeclaration_8.eContents().get(0);
		private final EnumLiteralDeclaration cTOP_CENTEREnumLiteralDeclaration_9 = (EnumLiteralDeclaration)cAlternatives.eContents().get(9);
		private final Keyword cTOP_CENTERTopCenterKeyword_9_0 = (Keyword)cTOP_CENTEREnumLiteralDeclaration_9.eContents().get(0);
		private final EnumLiteralDeclaration cTOP_LEFTEnumLiteralDeclaration_10 = (EnumLiteralDeclaration)cAlternatives.eContents().get(10);
		private final Keyword cTOP_LEFTTopLeftKeyword_10_0 = (Keyword)cTOP_LEFTEnumLiteralDeclaration_10.eContents().get(0);
		private final EnumLiteralDeclaration cTOP_RIGHTEnumLiteralDeclaration_11 = (EnumLiteralDeclaration)cAlternatives.eContents().get(11);
		private final Keyword cTOP_RIGHTTopRightKeyword_11_0 = (Keyword)cTOP_RIGHTEnumLiteralDeclaration_11.eContents().get(0);
		private final EnumLiteralDeclaration cTOP_FILLEnumLiteralDeclaration_12 = (EnumLiteralDeclaration)cAlternatives.eContents().get(12);
		private final Keyword cTOP_FILLTopFillKeyword_12_0 = (Keyword)cTOP_FILLEnumLiteralDeclaration_12.eContents().get(0);
		private final EnumLiteralDeclaration cFILL_CENTEREnumLiteralDeclaration_13 = (EnumLiteralDeclaration)cAlternatives.eContents().get(13);
		private final Keyword cFILL_CENTERFillCenterKeyword_13_0 = (Keyword)cFILL_CENTEREnumLiteralDeclaration_13.eContents().get(0);
		private final EnumLiteralDeclaration cFILL_LEFTEnumLiteralDeclaration_14 = (EnumLiteralDeclaration)cAlternatives.eContents().get(14);
		private final Keyword cFILL_LEFTFillLeftKeyword_14_0 = (Keyword)cFILL_LEFTEnumLiteralDeclaration_14.eContents().get(0);
		private final EnumLiteralDeclaration cFILL_RIGHTEnumLiteralDeclaration_15 = (EnumLiteralDeclaration)cAlternatives.eContents().get(15);
		private final Keyword cFILL_RIGHTFillRightKeyword_15_0 = (Keyword)cFILL_RIGHTEnumLiteralDeclaration_15.eContents().get(0);
		private final EnumLiteralDeclaration cFILL_FILLEnumLiteralDeclaration_16 = (EnumLiteralDeclaration)cAlternatives.eContents().get(16);
		private final Keyword cFILL_FILLFillFillKeyword_16_0 = (Keyword)cFILL_FILLEnumLiteralDeclaration_16.eContents().get(0);
		
		//enum UiAlignment:
		//	UNDEFINED="undefined" | BOTTOM_CENTER="bottom-center" | BOTTOM_LEFT="bottom-left" | BOTTOM_RIGHT="bottom-right" |
		//	BOTTOM_FILL="bottom-fill" | MIDDLE_CENTER="middle-center" | MIDDLE_LEFT="middle-left" | MIDDLE_RIGHT="middle-right" |
		//	MIDDLE_FILL="middle-fill" | TOP_CENTER="top-center" | TOP_LEFT="top-left" | TOP_RIGHT="top-right" |
		//	TOP_FILL="top-fill" | FILL_CENTER="fill-center" | FILL_LEFT="fill-left" | FILL_RIGHT="fill-right" |
		//	FILL_FILL="fill-fill";
		public EnumRule getRule() { return rule; }

		//UNDEFINED="undefined" | BOTTOM_CENTER="bottom-center" | BOTTOM_LEFT="bottom-left" | BOTTOM_RIGHT="bottom-right" |
		//BOTTOM_FILL="bottom-fill" | MIDDLE_CENTER="middle-center" | MIDDLE_LEFT="middle-left" | MIDDLE_RIGHT="middle-right" |
		//MIDDLE_FILL="middle-fill" | TOP_CENTER="top-center" | TOP_LEFT="top-left" | TOP_RIGHT="top-right" | TOP_FILL="top-fill"
		//| FILL_CENTER="fill-center" | FILL_LEFT="fill-left" | FILL_RIGHT="fill-right" | FILL_FILL="fill-fill"
		public Alternatives getAlternatives() { return cAlternatives; }

		//UNDEFINED="undefined"
		public EnumLiteralDeclaration getUNDEFINEDEnumLiteralDeclaration_0() { return cUNDEFINEDEnumLiteralDeclaration_0; }

		//"undefined"
		public Keyword getUNDEFINEDUndefinedKeyword_0_0() { return cUNDEFINEDUndefinedKeyword_0_0; }

		//BOTTOM_CENTER="bottom-center"
		public EnumLiteralDeclaration getBOTTOM_CENTEREnumLiteralDeclaration_1() { return cBOTTOM_CENTEREnumLiteralDeclaration_1; }

		//"bottom-center"
		public Keyword getBOTTOM_CENTERBottomCenterKeyword_1_0() { return cBOTTOM_CENTERBottomCenterKeyword_1_0; }

		//BOTTOM_LEFT="bottom-left"
		public EnumLiteralDeclaration getBOTTOM_LEFTEnumLiteralDeclaration_2() { return cBOTTOM_LEFTEnumLiteralDeclaration_2; }

		//"bottom-left"
		public Keyword getBOTTOM_LEFTBottomLeftKeyword_2_0() { return cBOTTOM_LEFTBottomLeftKeyword_2_0; }

		//BOTTOM_RIGHT="bottom-right"
		public EnumLiteralDeclaration getBOTTOM_RIGHTEnumLiteralDeclaration_3() { return cBOTTOM_RIGHTEnumLiteralDeclaration_3; }

		//"bottom-right"
		public Keyword getBOTTOM_RIGHTBottomRightKeyword_3_0() { return cBOTTOM_RIGHTBottomRightKeyword_3_0; }

		//BOTTOM_FILL="bottom-fill"
		public EnumLiteralDeclaration getBOTTOM_FILLEnumLiteralDeclaration_4() { return cBOTTOM_FILLEnumLiteralDeclaration_4; }

		//"bottom-fill"
		public Keyword getBOTTOM_FILLBottomFillKeyword_4_0() { return cBOTTOM_FILLBottomFillKeyword_4_0; }

		//MIDDLE_CENTER="middle-center"
		public EnumLiteralDeclaration getMIDDLE_CENTEREnumLiteralDeclaration_5() { return cMIDDLE_CENTEREnumLiteralDeclaration_5; }

		//"middle-center"
		public Keyword getMIDDLE_CENTERMiddleCenterKeyword_5_0() { return cMIDDLE_CENTERMiddleCenterKeyword_5_0; }

		//MIDDLE_LEFT="middle-left"
		public EnumLiteralDeclaration getMIDDLE_LEFTEnumLiteralDeclaration_6() { return cMIDDLE_LEFTEnumLiteralDeclaration_6; }

		//"middle-left"
		public Keyword getMIDDLE_LEFTMiddleLeftKeyword_6_0() { return cMIDDLE_LEFTMiddleLeftKeyword_6_0; }

		//MIDDLE_RIGHT="middle-right"
		public EnumLiteralDeclaration getMIDDLE_RIGHTEnumLiteralDeclaration_7() { return cMIDDLE_RIGHTEnumLiteralDeclaration_7; }

		//"middle-right"
		public Keyword getMIDDLE_RIGHTMiddleRightKeyword_7_0() { return cMIDDLE_RIGHTMiddleRightKeyword_7_0; }

		//MIDDLE_FILL="middle-fill"
		public EnumLiteralDeclaration getMIDDLE_FILLEnumLiteralDeclaration_8() { return cMIDDLE_FILLEnumLiteralDeclaration_8; }

		//"middle-fill"
		public Keyword getMIDDLE_FILLMiddleFillKeyword_8_0() { return cMIDDLE_FILLMiddleFillKeyword_8_0; }

		//TOP_CENTER="top-center"
		public EnumLiteralDeclaration getTOP_CENTEREnumLiteralDeclaration_9() { return cTOP_CENTEREnumLiteralDeclaration_9; }

		//"top-center"
		public Keyword getTOP_CENTERTopCenterKeyword_9_0() { return cTOP_CENTERTopCenterKeyword_9_0; }

		//TOP_LEFT="top-left"
		public EnumLiteralDeclaration getTOP_LEFTEnumLiteralDeclaration_10() { return cTOP_LEFTEnumLiteralDeclaration_10; }

		//"top-left"
		public Keyword getTOP_LEFTTopLeftKeyword_10_0() { return cTOP_LEFTTopLeftKeyword_10_0; }

		//TOP_RIGHT="top-right"
		public EnumLiteralDeclaration getTOP_RIGHTEnumLiteralDeclaration_11() { return cTOP_RIGHTEnumLiteralDeclaration_11; }

		//"top-right"
		public Keyword getTOP_RIGHTTopRightKeyword_11_0() { return cTOP_RIGHTTopRightKeyword_11_0; }

		//TOP_FILL="top-fill"
		public EnumLiteralDeclaration getTOP_FILLEnumLiteralDeclaration_12() { return cTOP_FILLEnumLiteralDeclaration_12; }

		//"top-fill"
		public Keyword getTOP_FILLTopFillKeyword_12_0() { return cTOP_FILLTopFillKeyword_12_0; }

		//FILL_CENTER="fill-center"
		public EnumLiteralDeclaration getFILL_CENTEREnumLiteralDeclaration_13() { return cFILL_CENTEREnumLiteralDeclaration_13; }

		//"fill-center"
		public Keyword getFILL_CENTERFillCenterKeyword_13_0() { return cFILL_CENTERFillCenterKeyword_13_0; }

		//FILL_LEFT="fill-left"
		public EnumLiteralDeclaration getFILL_LEFTEnumLiteralDeclaration_14() { return cFILL_LEFTEnumLiteralDeclaration_14; }

		//"fill-left"
		public Keyword getFILL_LEFTFillLeftKeyword_14_0() { return cFILL_LEFTFillLeftKeyword_14_0; }

		//FILL_RIGHT="fill-right"
		public EnumLiteralDeclaration getFILL_RIGHTEnumLiteralDeclaration_15() { return cFILL_RIGHTEnumLiteralDeclaration_15; }

		//"fill-right"
		public Keyword getFILL_RIGHTFillRightKeyword_15_0() { return cFILL_RIGHTFillRightKeyword_15_0; }

		//FILL_FILL="fill-fill"
		public EnumLiteralDeclaration getFILL_FILLEnumLiteralDeclaration_16() { return cFILL_FILLEnumLiteralDeclaration_16; }

		//"fill-fill"
		public Keyword getFILL_FILLFillFillKeyword_16_0() { return cFILL_FILLFillFillKeyword_16_0; }
	}
	
	private final UiModelElements pUiModel;
	private final UiImportsElements pUiImports;
	private final UiRootElementsElements pUiRootElements;
	private final UiValidatorAliasElements pUiValidatorAlias;
	private final UiValidatorAssignmentElements pUiValidatorAssignment;
	private final UiValidatorDefElements pUiValidatorDef;
	private final UiViewSetElements pUiViewSet;
	private final UiBindingEndpointAliasElements pUiBindingEndpointAlias;
	private final UiBeanSlotElements pUiBeanSlot;
	private final UiBindingElements pUiBinding;
	private final UiBindingEndpointAssignmentElements pUiBindingEndpointAssignment;
	private final UiPathSegmentElements pUiPathSegment;
	private final UiNestedPropertyElements pUiNestedProperty;
	private final UiTypedBindableDefElements pUiTypedBindableDef;
	private final UiTypedBindableRawTypeElements pUiTypedBindableRawType;
	private final UiTypedBindableRawTypeAliasElements pUiTypedBindableRawTypeAlias;
	private final UiRawBindablePathSegmentElements pUiRawBindablePathSegment;
	private final UiCommandBindableDefElements pUiCommandBindableDef;
	private final UiCommandElements pUiCommand;
	private final UiMobileNavigationCommandElements pUiMobileNavigationCommand;
	private final UiOpenDialogCommandElements pUiOpenDialogCommand;
	private final UiSearchWithDialogCommandElements pUiSearchWithDialogCommand;
	private final UiAddToTableCommandElements pUiAddToTableCommand;
	private final UiRemoveFromTableCommandElements pUiRemoveFromTableCommand;
	private final UiSetNewInstanceCommandElements pUiSetNewInstanceCommand;
	private final UiSendEventCommandElements pUiSendEventCommand;
	private final UiViewElements pUiView;
	private final UiIDEViewElements pUiIDEView;
	private final UiExposedActionElements pUiExposedAction;
	private final UiMobileNavBarActionElements pUiMobileNavBarAction;
	private final UiMobileViewElements pUiMobileView;
	private final UiI18nInfoElements pUiI18nInfo;
	private final UiGridLayoutElements pUiGridLayout;
	private final UiVisibilityProcessorAssignmentElements pUiVisibilityProcessorAssignment;
	private final UiGridLayoutAssigmentElements pUiGridLayoutAssigment;
	private final UiFormLayoutElements pUiFormLayout;
	private final UiFormLayoutAssigmentElements pUiFormLayoutAssigment;
	private final UiVerticalLayoutElements pUiVerticalLayout;
	private final UiVerticalLayoutAssigmentElements pUiVerticalLayoutAssigment;
	private final UiMobileVerticalLayoutElements pUiMobileVerticalLayout;
	private final UiMobileVerticalLayoutAssigmentElements pUiMobileVerticalLayoutAssigment;
	private final UiMobileNavigationRootElements pUiMobileNavigationRoot;
	private final UiMobileNavigationRootAssigmentElements pUiMobileNavigationRootAssigment;
	private final UiHorizontalLayoutElements pUiHorizontalLayout;
	private final UiHorizontalLayoutAssigmentElements pUiHorizontalLayoutAssigment;
	private final UiMobileHorizontalLayoutElements pUiMobileHorizontalLayout;
	private final UiMobileHorizontalLayoutAssigmentElements pUiMobileHorizontalLayoutAssigment;
	private final UiMobileHorizontalButtonGroupElements pUiMobileHorizontalButtonGroup;
	private final UiMobileHorizontalButtonGroupAssigmentElements pUiMobileHorizontalButtonGroupAssigment;
	private final UiMobileVerticalComponentGroupElements pUiMobileVerticalComponentGroup;
	private final UiMobileVerticalComponentGroupAssigmentElements pUiMobileVerticalComponentGroupAssigment;
	private final UiSearchPanelElements pUiSearchPanel;
	private final UiMobileSearchPanelElements pUiMobileSearchPanel;
	private final UiMobileTabSheetElements pUiMobileTabSheet;
	private final UiMobileTabAssignmentElements pUiMobileTabAssignment;
	private final UiTabSheetElements pUiTabSheet;
	private final UiTabAssignmentElements pUiTabAssignment;
	private final UiSplitpanelElements pUiSplitpanel;
	private final UiSplitpanelAssigmentElements pUiSplitpanelAssigment;
	private final UiPanelElements pUiPanel;
	private final UiDialogElements pUiDialog;
	private final UiDialogAssignmentElements pUiDialogAssignment;
	private final UiSearchDialogElements pUiSearchDialog;
	private final UiDialogSearchFieldAssignmentElements pUiDialogSearchFieldAssignment;
	private final UiMobileNavigationPageElements pUiMobileNavigationPage;
	private final UiMobileNavigationPageAssignmentElements pUiMobileNavigationPageAssignment;
	private final UiPointElements pUiPoint;
	private final UiTextFieldElements pUiTextField;
	private final UiPasswordFieldElements pUiPasswordField;
	private final UiMaskedTextFieldElements pUiMaskedTextField;
	private final UiMaskedNumericFieldElements pUiMaskedNumericField;
	private final UiMaskedDecimalFieldElements pUiMaskedDecimalField;
	private final UiPrefixedMaskedTextFieldElements pUiPrefixedMaskedTextField;
	private final UiPrefixToMaskMapEntryElements pUiPrefixToMaskMapEntry;
	private final UiRichTextAreaElements pUiRichTextArea;
	private final UiSuggestTextFieldElements pUiSuggestTextField;
	private final UiBeanReferenceFieldElements pUiBeanReferenceField;
	private final UiSearchFieldElements pUiSearchField;
	private final UiTextAreaElements pUiTextArea;
	private final UiDateFieldElements pUiDateField;
	private final UiDateFormatElements unknownRuleUiDateFormat;
	private final UiDateTimeResolutionElements unknownRuleUiDateTimeResolution;
	private final UiBrowserElements pUiBrowser;
	private final UiProgressBarElements pUiProgressBar;
	private final UiImageElements pUiImage;
	private final UiTableElements pUiTable;
	private final UiComboBoxElements pUiComboBox;
	private final UiButtonElements pUiButton;
	private final UiMobileNavigationButtonElements pUiMobileNavigationButton;
	private final UiMobileSwitchElements pUiMobileSwitch;
	private final UiLabelElements pUiLabel;
	private final UiDecimalFieldElements pUiDecimalField;
	private final UiOptionsGroupElements pUiOptionsGroup;
	private final UiListElements pUiList;
	private final UiSelectionTypeElements unknownRuleUiSelectionType;
	private final UiAlignmentElements unknownRuleUiAlignment;
	private final UiColumnsAssignmentElements pUiColumnsAssignment;
	private final UiSortOrderAssignmentElements pUiSortOrderAssignment;
	private final UiSortOrderElements pUiSortOrder;
	private final UiColumnElements pUiColumn;
	private final UiEmbeddableElements pUiEmbeddable;
	private final UiMobileEmbeddableElements pUiMobileEmbeddable;
	private final UiMobileLayoutElements pUiMobileLayout;
	private final UiMobileFieldElements pUiMobileField;
	private final UiLayoutElements pUiLayout;
	private final UiFieldElements pUiField;
	private final UiActionElements pUiAction;
	private final UiMobileActionElements pUiMobileAction;
	private final UiNumericFieldElements pUiNumericField;
	private final UiCheckBoxElements pUiCheckBox;
	private final UiValidatorElements pUiValidator;
	private final UiMaxLengthValidatorElements pUiMaxLengthValidator;
	private final UiMinLengthValidatorElements pUiMinLengthValidator;
	private final UiRegexpValidatorElements pUiRegexpValidator;
	private final UiXbaseValidatorElements pUiXbaseValidator;
	private final UiBeanValidationValidatorElements pUiBeanValidationValidator;
	private final UiErrorCodeElements pUiErrorCode;
	private final UiVisibilityProcessorElements pUiVisibilityProcessor;
	private final UiXbaseVisibilityRuleElements pUiXbaseVisibilityRule;
	private final UiChangeTriggerElements pUiChangeTrigger;
	
	private final Grammar grammar;

	private final XbaseGrammarAccess gaXbase;

	@Inject
	public UIGrammarGrammarAccess(GrammarProvider grammarProvider,
		XbaseGrammarAccess gaXbase) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaXbase = gaXbase;
		this.pUiModel = new UiModelElements();
		this.pUiImports = new UiImportsElements();
		this.pUiRootElements = new UiRootElementsElements();
		this.pUiValidatorAlias = new UiValidatorAliasElements();
		this.pUiValidatorAssignment = new UiValidatorAssignmentElements();
		this.pUiValidatorDef = new UiValidatorDefElements();
		this.pUiViewSet = new UiViewSetElements();
		this.pUiBindingEndpointAlias = new UiBindingEndpointAliasElements();
		this.pUiBeanSlot = new UiBeanSlotElements();
		this.pUiBinding = new UiBindingElements();
		this.pUiBindingEndpointAssignment = new UiBindingEndpointAssignmentElements();
		this.pUiPathSegment = new UiPathSegmentElements();
		this.pUiNestedProperty = new UiNestedPropertyElements();
		this.pUiTypedBindableDef = new UiTypedBindableDefElements();
		this.pUiTypedBindableRawType = new UiTypedBindableRawTypeElements();
		this.pUiTypedBindableRawTypeAlias = new UiTypedBindableRawTypeAliasElements();
		this.pUiRawBindablePathSegment = new UiRawBindablePathSegmentElements();
		this.pUiCommandBindableDef = new UiCommandBindableDefElements();
		this.pUiCommand = new UiCommandElements();
		this.pUiMobileNavigationCommand = new UiMobileNavigationCommandElements();
		this.pUiOpenDialogCommand = new UiOpenDialogCommandElements();
		this.pUiSearchWithDialogCommand = new UiSearchWithDialogCommandElements();
		this.pUiAddToTableCommand = new UiAddToTableCommandElements();
		this.pUiRemoveFromTableCommand = new UiRemoveFromTableCommandElements();
		this.pUiSetNewInstanceCommand = new UiSetNewInstanceCommandElements();
		this.pUiSendEventCommand = new UiSendEventCommandElements();
		this.pUiView = new UiViewElements();
		this.pUiIDEView = new UiIDEViewElements();
		this.pUiExposedAction = new UiExposedActionElements();
		this.pUiMobileNavBarAction = new UiMobileNavBarActionElements();
		this.pUiMobileView = new UiMobileViewElements();
		this.pUiI18nInfo = new UiI18nInfoElements();
		this.pUiGridLayout = new UiGridLayoutElements();
		this.pUiVisibilityProcessorAssignment = new UiVisibilityProcessorAssignmentElements();
		this.pUiGridLayoutAssigment = new UiGridLayoutAssigmentElements();
		this.pUiFormLayout = new UiFormLayoutElements();
		this.pUiFormLayoutAssigment = new UiFormLayoutAssigmentElements();
		this.pUiVerticalLayout = new UiVerticalLayoutElements();
		this.pUiVerticalLayoutAssigment = new UiVerticalLayoutAssigmentElements();
		this.pUiMobileVerticalLayout = new UiMobileVerticalLayoutElements();
		this.pUiMobileVerticalLayoutAssigment = new UiMobileVerticalLayoutAssigmentElements();
		this.pUiMobileNavigationRoot = new UiMobileNavigationRootElements();
		this.pUiMobileNavigationRootAssigment = new UiMobileNavigationRootAssigmentElements();
		this.pUiHorizontalLayout = new UiHorizontalLayoutElements();
		this.pUiHorizontalLayoutAssigment = new UiHorizontalLayoutAssigmentElements();
		this.pUiMobileHorizontalLayout = new UiMobileHorizontalLayoutElements();
		this.pUiMobileHorizontalLayoutAssigment = new UiMobileHorizontalLayoutAssigmentElements();
		this.pUiMobileHorizontalButtonGroup = new UiMobileHorizontalButtonGroupElements();
		this.pUiMobileHorizontalButtonGroupAssigment = new UiMobileHorizontalButtonGroupAssigmentElements();
		this.pUiMobileVerticalComponentGroup = new UiMobileVerticalComponentGroupElements();
		this.pUiMobileVerticalComponentGroupAssigment = new UiMobileVerticalComponentGroupAssigmentElements();
		this.pUiSearchPanel = new UiSearchPanelElements();
		this.pUiMobileSearchPanel = new UiMobileSearchPanelElements();
		this.pUiMobileTabSheet = new UiMobileTabSheetElements();
		this.pUiMobileTabAssignment = new UiMobileTabAssignmentElements();
		this.pUiTabSheet = new UiTabSheetElements();
		this.pUiTabAssignment = new UiTabAssignmentElements();
		this.pUiSplitpanel = new UiSplitpanelElements();
		this.pUiSplitpanelAssigment = new UiSplitpanelAssigmentElements();
		this.pUiPanel = new UiPanelElements();
		this.pUiDialog = new UiDialogElements();
		this.pUiDialogAssignment = new UiDialogAssignmentElements();
		this.pUiSearchDialog = new UiSearchDialogElements();
		this.pUiDialogSearchFieldAssignment = new UiDialogSearchFieldAssignmentElements();
		this.pUiMobileNavigationPage = new UiMobileNavigationPageElements();
		this.pUiMobileNavigationPageAssignment = new UiMobileNavigationPageAssignmentElements();
		this.pUiPoint = new UiPointElements();
		this.pUiTextField = new UiTextFieldElements();
		this.pUiPasswordField = new UiPasswordFieldElements();
		this.pUiMaskedTextField = new UiMaskedTextFieldElements();
		this.pUiMaskedNumericField = new UiMaskedNumericFieldElements();
		this.pUiMaskedDecimalField = new UiMaskedDecimalFieldElements();
		this.pUiPrefixedMaskedTextField = new UiPrefixedMaskedTextFieldElements();
		this.pUiPrefixToMaskMapEntry = new UiPrefixToMaskMapEntryElements();
		this.pUiRichTextArea = new UiRichTextAreaElements();
		this.pUiSuggestTextField = new UiSuggestTextFieldElements();
		this.pUiBeanReferenceField = new UiBeanReferenceFieldElements();
		this.pUiSearchField = new UiSearchFieldElements();
		this.pUiTextArea = new UiTextAreaElements();
		this.pUiDateField = new UiDateFieldElements();
		this.unknownRuleUiDateFormat = new UiDateFormatElements();
		this.unknownRuleUiDateTimeResolution = new UiDateTimeResolutionElements();
		this.pUiBrowser = new UiBrowserElements();
		this.pUiProgressBar = new UiProgressBarElements();
		this.pUiImage = new UiImageElements();
		this.pUiTable = new UiTableElements();
		this.pUiComboBox = new UiComboBoxElements();
		this.pUiButton = new UiButtonElements();
		this.pUiMobileNavigationButton = new UiMobileNavigationButtonElements();
		this.pUiMobileSwitch = new UiMobileSwitchElements();
		this.pUiLabel = new UiLabelElements();
		this.pUiDecimalField = new UiDecimalFieldElements();
		this.pUiOptionsGroup = new UiOptionsGroupElements();
		this.pUiList = new UiListElements();
		this.unknownRuleUiSelectionType = new UiSelectionTypeElements();
		this.unknownRuleUiAlignment = new UiAlignmentElements();
		this.pUiColumnsAssignment = new UiColumnsAssignmentElements();
		this.pUiSortOrderAssignment = new UiSortOrderAssignmentElements();
		this.pUiSortOrder = new UiSortOrderElements();
		this.pUiColumn = new UiColumnElements();
		this.pUiEmbeddable = new UiEmbeddableElements();
		this.pUiMobileEmbeddable = new UiMobileEmbeddableElements();
		this.pUiMobileLayout = new UiMobileLayoutElements();
		this.pUiMobileField = new UiMobileFieldElements();
		this.pUiLayout = new UiLayoutElements();
		this.pUiField = new UiFieldElements();
		this.pUiAction = new UiActionElements();
		this.pUiMobileAction = new UiMobileActionElements();
		this.pUiNumericField = new UiNumericFieldElements();
		this.pUiCheckBox = new UiCheckBoxElements();
		this.pUiValidator = new UiValidatorElements();
		this.pUiMaxLengthValidator = new UiMaxLengthValidatorElements();
		this.pUiMinLengthValidator = new UiMinLengthValidatorElements();
		this.pUiRegexpValidator = new UiRegexpValidatorElements();
		this.pUiXbaseValidator = new UiXbaseValidatorElements();
		this.pUiBeanValidationValidator = new UiBeanValidationValidatorElements();
		this.pUiErrorCode = new UiErrorCodeElements();
		this.pUiVisibilityProcessor = new UiVisibilityProcessorElements();
		this.pUiXbaseVisibilityRule = new UiXbaseVisibilityRuleElements();
		this.pUiChangeTrigger = new UiChangeTriggerElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.ecview.dsl.UIGrammar".equals(grammar.getName())) {
				return grammar;
			}
			List<Grammar> grammars = grammar.getUsedGrammars();
			if (!grammars.isEmpty()) {
				grammar = grammars.iterator().next();
			} else {
				return null;
			}
		}
		return grammar;
	}
	
	
	public Grammar getGrammar() {
		return grammar;
	}
	

	public XbaseGrammarAccess getXbaseGrammarAccess() {
		return gaXbase;
	}

	
	//UiModel:
	//	"package" packageName=QualifiedName imports+=UiImports* roots+=UiRootElements*;
	public UiModelElements getUiModelAccess() {
		return pUiModel;
	}
	
	public ParserRule getUiModelRule() {
		return getUiModelAccess().getRule();
	}

	//UiImports:
	//	"import" importedNamespace=QualifiedNameWithWildcard ";"?;
	public UiImportsElements getUiImportsAccess() {
		return pUiImports;
	}
	
	public ParserRule getUiImportsRule() {
		return getUiImportsAccess().getRule();
	}

	//UiRootElements:
	//	UiView | UiViewSet | UiValidatorAlias | UiMobileView;
	public UiRootElementsElements getUiRootElementsAccess() {
		return pUiRootElements;
	}
	
	public ParserRule getUiRootElementsRule() {
		return getUiRootElementsAccess().getRule();
	}

	//UiValidatorAlias:
	//	"validatorAlias" validator=UiValidator "as" alias=ID ";"?;
	public UiValidatorAliasElements getUiValidatorAliasAccess() {
		return pUiValidatorAlias;
	}
	
	public ParserRule getUiValidatorAliasRule() {
		return getUiValidatorAliasAccess().getRule();
	}

	//UiValidatorAssignment:
	//	"fieldValidation" field=[UiField] "+=" (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
	//	";"?);
	public UiValidatorAssignmentElements getUiValidatorAssignmentAccess() {
		return pUiValidatorAssignment;
	}
	
	public ParserRule getUiValidatorAssignmentRule() {
		return getUiValidatorAssignmentAccess().getRule();
	}

	//UiValidatorDef:
	//	validator=UiValidator;
	public UiValidatorDefElements getUiValidatorDefAccess() {
		return pUiValidatorDef;
	}
	
	public ParserRule getUiValidatorDefRule() {
		return getUiValidatorDefAccess().getRule();
	}

	//UiViewSet:
	//	"viewset" name=ID "{" beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias* "}";
	public UiViewSetElements getUiViewSetAccess() {
		return pUiViewSet;
	}
	
	public ParserRule getUiViewSetRule() {
		return getUiViewSetAccess().getRule();
	}

	//UiBindingEndpointAlias:
	//	"dataAlias" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?;
	public UiBindingEndpointAliasElements getUiBindingEndpointAliasAccess() {
		return pUiBindingEndpointAlias;
	}
	
	public ParserRule getUiBindingEndpointAliasRule() {
		return getUiBindingEndpointAliasAccess().getRule();
	}

	//UiBeanSlot:
	//	"datasource" name=ID ":" jvmType=JvmTypeReference ("eventTopic" eventTopic=STRING)? ";"?;
	public UiBeanSlotElements getUiBeanSlotAccess() {
		return pUiBeanSlot;
	}
	
	public ParserRule getUiBeanSlotRule() {
		return getUiBeanSlotAccess().getRule();
	}

	//UiBinding:
	//	"bind" listBinding?="list"? source=UiBindingEndpointAssignment (targetToSource?="<"? "--" sourceToTarget?=">"?)
	//	target=UiBindingEndpointAssignment ";"?;
	public UiBindingElements getUiBindingAccess() {
		return pUiBinding;
	}
	
	public ParserRule getUiBindingRule() {
		return getUiBindingAccess().getRule();
	}

	//UiBindingEndpointAssignment returns UiBindingExpression:
	//	UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
	//	{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
	//	typedBindableAlias=[UiTypedBindable] path=UiPathSegment?;
	public UiBindingEndpointAssignmentElements getUiBindingEndpointAssignmentAccess() {
		return pUiBindingEndpointAssignment;
	}
	
	public ParserRule getUiBindingEndpointAssignmentRule() {
		return getUiBindingEndpointAssignmentAccess().getRule();
	}

	//UiPathSegment:
	//	{UiPathSegment} "." getter=[JvmOperation] path=UiPathSegment?;
	public UiPathSegmentElements getUiPathSegmentAccess() {
		return pUiPathSegment;
	}
	
	public ParserRule getUiPathSegmentRule() {
		return getUiPathSegmentAccess().getRule();
	}

	//UiNestedProperty:
	//	{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?;
	public UiNestedPropertyElements getUiNestedPropertyAccess() {
		return pUiNestedProperty;
	}
	
	public ParserRule getUiNestedPropertyRule() {
		return getUiNestedPropertyAccess().getRule();
	}

	//UiTypedBindableDef returns UiBindingExpression:
	//	{UiTypedBindableDef} ("[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]" "."
	//	method=[cfg::UxEndpointDef]);
	public UiTypedBindableDefElements getUiTypedBindableDefAccess() {
		return pUiTypedBindableDef;
	}
	
	public ParserRule getUiTypedBindableDefRule() {
		return getUiTypedBindableDefAccess().getRule();
	}

	//UiTypedBindableRawType returns UiBindingExpression:
	//	{UiTypedBindableRawType} "[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]";
	public UiTypedBindableRawTypeElements getUiTypedBindableRawTypeAccess() {
		return pUiTypedBindableRawType;
	}
	
	public ParserRule getUiTypedBindableRawTypeRule() {
		return getUiTypedBindableRawTypeAccess().getRule();
	}

	//UiTypedBindableRawTypeAlias:
	//	"ui" type=UiTypedBindableRawType "as" alias=ID ";"?;
	public UiTypedBindableRawTypeAliasElements getUiTypedBindableRawTypeAliasAccess() {
		return pUiTypedBindableRawTypeAlias;
	}
	
	public ParserRule getUiTypedBindableRawTypeAliasRule() {
		return getUiTypedBindableRawTypeAliasAccess().getRule();
	}

	//UiRawBindablePathSegment:
	//	{UiRawBindablePathSegment} ("." | toParent?="..") rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?;
	public UiRawBindablePathSegmentElements getUiRawBindablePathSegmentAccess() {
		return pUiRawBindablePathSegment;
	}
	
	public ParserRule getUiRawBindablePathSegmentRule() {
		return getUiRawBindablePathSegmentAccess().getRule();
	}

	//UiCommandBindableDef:
	//	{UiCommandBindableDef} command=UiCommand;
	public UiCommandBindableDefElements getUiCommandBindableDefAccess() {
		return pUiCommandBindableDef;
	}
	
	public ParserRule getUiCommandBindableDefRule() {
		return getUiCommandBindableDefAccess().getRule();
	}

	//UiCommand:
	//	UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
	//	UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand;
	public UiCommandElements getUiCommandAccess() {
		return pUiCommand;
	}
	
	public ParserRule getUiCommandRule() {
		return getUiCommandAccess().getRule();
	}

	//UiMobileNavigationCommand:
	//	{UiMobileNavigationCommand} "navigateTo" targetPage=UiMobileNavigationPage;
	public UiMobileNavigationCommandElements getUiMobileNavigationCommandAccess() {
		return pUiMobileNavigationCommand;
	}
	
	public ParserRule getUiMobileNavigationCommandRule() {
		return getUiMobileNavigationCommandAccess().getRule();
	}

	//UiOpenDialogCommand:
