/********************
	 The Geometer's Sketchpad
	 (C) 1989-1998 by Key Curriculum Press, Inc.
	 All rights reserved.																				

	uic_sel.dat
 
	Original Author:		Nick Jackiw
	Creation Date:			29 December 1997
	Most Recent:			$Author$
	Edit Date:				$Date$
	
	Overview:
	uic_sel.h defines all of the Sketchpad-specific constant data and symbolic
	identifiers that define the command specifiers parsed by the UI Command's
	UIC_ObjSelection_appProc(). In English: this file describes the selection-
	requirements that enable various commands in Sketchpad's menus. See #409
	for a complete overview of the UIC_ObjSelection protocol.
	
	This file should only be #included by uic_appr.c. It is >not< a header
	file, in that it declares constant data, and is not set up for multiple inclusion!

	When any variants below are added, modified or removed, the declarations
	of the offsets in uic_appr.h must be adjusted accordingly.

	$History:  $
	$NoKeyWords: $
		
*******************/

/* 
	Currently, all platforms and builds use byte-size storage for specifier tokens.
	On desktop platforms with no particular memory constraints, we might want to
	someday expand this to a larger unit, if the host processor can access larger
	units more efficiently than bytes.
	
	N.B. This value should always be unsigned!
*/

#include "uic_actn.h"
#ifdef SUPPORTS_Color
#include "dlg_colorize.h"	/* Get Colorization user interface */
#endif
#include "custtrans.h"

#define gObjSelectionSpecifier_UNIT unsigned char

/*
	Currently, the appearances+actions referenced by the specifiers below
	are stored within the first 256 possible appearance return
	values or indexed actionProcs referenced by UI Commands. If and when we have 
	more than 256 possible appearances or actions, we may wish to shift these to 
	some higher (consecutive) range of 256 values by increasing the base offsets, below.
*/

#define	SELECTION_SPECIFIER_AppearanceBase (0)
#define	SELECTION_SPECIFIER_ActionProcBase (0)

#define AT_LEAST(x) (128 + (x))
#define AT_MOST(x) (192 + (x))

#define BYTEPLEX(iBiggerNum, iSmallerNum) (iBiggerNum & 255), iSmallerNum | ((iBiggerNum & 256) ? 128 : 0)
/*
	As of 0858, we ran out of appearanceStrings -- gObjSelectionCommandSpecifiers is a table of bytes, and
	we hit the 256th appearanceString. So we redefine the storage protocol for
	"acceptance clauses" such that the appearanceString is now "byte-plexed"
	with its neighboring embellishment, so that rather than two eight-bit quantities
	we have a 9-bit stringIndex (good for 512 strings total) and a 7-bit embellishment
	code (good for 127 embellishments). Since there are only a handful of embellishments,
	this could be extended to (10, 6) or even (11, 5). But note any change to the
	BYTEPLEX() macro should correspond to a corresponding demultiplex in UIC_ObjSelection_appProc.
	
	Also notice the BYTEPLEX() macro counts as two bytes when counting specifier runlengths;
	and that you technically only need it for specifiers whose string index is >255
	(XCode will warn you when you have one).
*/


static const gObjSelectionSpecifier_UNIT gObjSelectionCommandSpecifiers[]=
/*
	Specifiers for all commands that use UIC_ObjSelection_appProc(). To parse a particular
	specifier, invoke UIC_ObjSelection_appProc() with a referenceData value corresponding
	to the specifier's zero-based offset in this data table.

	When any variants below are added, modified or removed, the declarations
	of the offsets in uic_appr.h must be adjusted accordingly.

*/

#define ConstructGObjs (UIC_ConstructObjects_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase)
/*	When using ConstructGObjs, the second byte following is an index into the table
	defined in uic_cons.dat.
*/

{
	/* Perpendicular command */
		16, 		/* Variant: 1 point, 1 straight -> Perpendicular */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3, 
				Object_Genus, 2, 
				Point_Genus, 1, 
				Straight_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Perpendicular_appStr, no_Embellishment), true, ConstructGObjs, 0, 0,

		18,		/* Variant: 1 point, >1 straights -> Perpendiculars */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Point_Genus, 1, 
		 		Straight_Genus, AT_LEAST(1),
		 	UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Straight_Genus, 1,
		 	UIC_ObjSelGrammar_endConditional_ID,
		 	BYTEPLEX(Perpendiculars_appStr, no_Embellishment), true, ConstructGObjs, 0, 0, 

		18,		/* Variant: >1 point, 1 straight -> Perpendiculars */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, AT_LEAST(1), 
				Straight_Genus, 1,
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Perpendiculars_appStr, no_Embellishment), true, ConstructGObjs, 0, 5,
			 
		8,		/* Variant: Perpendicular (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Perpendicular_appStr, no_Embellishment), false, 0, 0, 0,
			
	/* Parallel command */
		16, 		/* Variant: 1 point, 1 straight -> Parallel */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3, 
				Object_Genus, 2, 
				Point_Genus, 1, 
				Straight_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Parallel_appStr, no_Embellishment), true, ConstructGObjs, 0, 25,

		18,		/* Variant: 1 point, >1 straights -> Parallels */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Point_Genus, 1, 
		 		Straight_Genus, AT_LEAST(1),
		 	UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Straight_Genus, 1,
		 	UIC_ObjSelGrammar_endConditional_ID,
		 	BYTEPLEX(Parallels_appStr, no_Embellishment), true, ConstructGObjs, 0, 25, 

		18,		/* Variant: >1 point, 1 straight -> Parallels */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, AT_LEAST(1), 
				Straight_Genus, 1,
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Parallels_appStr, no_Embellishment), true, ConstructGObjs, 0, 30,
			 
		8,		/* Variant: Parallel (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Parallel_appStr, no_Embellishment), false, 0, 0, 0,
			
	/* Midpoint command */
		14,	/* Variant: 1 segment -> Midpoint */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 1,
				Segment_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Midpoint_appStr, no_Embellishment), true, ConstructGObjs, 0, 10,
		
		16,	/* Variant: n segments -> Midpoints */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Segment_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Segment_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Midpoints_appStr, no_Embellishment), true, ConstructGObjs, 0, 10,
		
		8,	/* Variant: Midpoint (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Midpoint_appStr, no_Embellishment), false, 0, 0, 0,
	
	/* Circle command */
		10,	/* Variant: Circle by Center+Point */
			UIC_ObjSelGrammar_flagTrueCheck_ID, twoPointsDistinct_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Circle_appStr, no_Embellishment, true, ConstructGObjs, 0, 13,
		
		8,	/* Variant: Circle by Center+Point (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Circle_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Circle by Radius command */
		22, /* Variant: Circle by Center+radius (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2,
				Point_Genus, 1,
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Point_Genus, Segment_Genus, DistanceMeasure_Genus,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			CircleRadius_appStr, no_Embellishment, true, ConstructGObjs, 0, 15,
			
		22,	/* Variant: 1 point, >1 distances -> Circles by Center + Radii */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Object_Genus, AT_LEAST(2),
		 		Point_Genus, 1, 
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Point_Genus, Segment_Genus, DistanceMeasure_Genus,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
		 	UIC_ObjSelGrammar_endConditional_ID,
		 	CirclesRadii_appStr, no_Embellishment, true, ConstructGObjs, 0, 15, 

		18,		/* Variant: >1 point, 1 segment -> Circles by Centers + Radius */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, AT_LEAST(1), 
				Segment_Genus, 1,
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			CirclesRadius_appStr, no_Embellishment, true, ConstructGObjs, 0, 20,
			 
		20,		/* Variant: >1 point, 1 distance measurement -> Circles by Centers + Radius */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, AT_LEAST(1), 
				DistanceMeasure_Genus, 1,
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 1,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			CirclesRadius_appStr, no_Embellishment, true, ConstructGObjs, 0, 20,

		8,		/* Variant: Circle by Center+radius (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			CircleRadius_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Bisector command */
		16, /* Variant: Bisector (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 3,
				Point_Genus, 3,
			UIC_ObjSelGrammar_notProcedureCheck_ID, StraightAngle_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Bisector_appStr, no_Embellishment, true, ConstructGObjs, 0, 35,
		22, /* Variant: 2 (ray or segment)s */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check 2 genera */
				Object_Genus, AT_MOST(3),
				Straight_Genus, 2,
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Ray_Genus, Segment_Genus, Point_Genus,
			UIC_ObjSelGrammar_proceduralCheck_ID, StraightsAreTwoEndpointSharingRaysOrSegments_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Bisector_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 171,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		8, /* Variant: Bisector (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Bisector_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Segment command */
		10,	/* Variant: 2 distinct points -> Segment (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, twoPointsDistinct_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Segment_appStr, no_Embellishment, true, UIC_ConstructStraights_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, Segment_C, 
		16,	/* Variant: >2 points -> Segments (enabled) */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(3),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			Segments_appStr, no_Embellishment, true, UIC_ConstructStraights_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, Segment_C, 
		8, /* Variant: Segment (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Segment_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Interior command */
		16, /* Variant: >6 points - Polygon Interior (enabled) */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Point_Genus, AT_LEAST(7),
			UIC_ObjSelGrammar_endConditional_ID,
			PolyInterior_appStr, no_Embellishment, true, ConstructGObjs, 0, 37,
		
		16, /* Variant: >3..6 points - Triangle/Quadrilateral/Pentagon/Hexagon Interior (enabled) */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Point_Genus, AT_LEAST(3),
			UIC_ObjSelGrammar_endConditional_ID,
			NamedPolygonInterior_appStr, namePolygonByVertices_Embellishment, true, ConstructGObjs, 0, 37,
				
		14,	/* Variant: 1 circle - Circle Interior (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Circle_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			CircleInterior_appStr, no_Embellishment, true, ConstructGObjs, 0, 41,
			
		16,	/* Variant: >1 circles - Circle Interiors (enabled) */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Circle_Genus, 0,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Circle_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_endConditional_ID,
			CircleInteriors_appStr, no_Embellishment, true, ConstructGObjs, 0, 41,
			
		14,	/* Variant: 1 arc - Special Arc Menu Embellishment for Arc Interiors (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				SimpleArc_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			ArcInterior_appStr, ArcInteriorChoice_Embellishment, true, UIC_OS_ArcInteriorDecider_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		16,	/* Variant: >1 arc - Special Arc Menu Embellishment for Arc Interiors (enabled) */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, SimpleArc_Genus, 0,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				SimpleArc_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_endConditional_ID,
			ArcInteriors_appStr, ArcInteriorChoice_Embellishment, true, UIC_OS_ArcInteriorDecider_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		8, /* Variant: Interior (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Interior_appStr, no_Embellishment, false, 0, 0, 0,	
	
	/* Intersection command */
		16, /* Variant: 2 straights that intersect -> Point at Intersection */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2,
				Straight_Genus, 2,
			UIC_ObjSelGrammar_proceduralCheck_ID, StraightsIntersect_checkID,	
			UIC_ObjSelGrammar_endConditional_ID,
			Intersection_appStr, no_Embellishment, true, ConstructGObjs, 0, 39,
		
		22,	/* Variant: 1 straight or curved + 1 curved, intersecting only once */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2,
				Curved_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Straight_Genus, Circle_Genus, SimpleArc_Genus,
			UIC_ObjSelGrammar_countExistingQuadIntersectionCheck_ID, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			Intersection_appStr, no_Embellishment, true, UIC_ConstructQuadIntersections_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		22, /* Variant: 1 straight or curved + 1 curved, intersecting twice -> Points at Intersection */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 2,
				Curved_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Straight_Genus, Circle_Genus, SimpleArc_Genus,
			UIC_ObjSelGrammar_countExistingQuadIntersectionCheck_ID, 2,
			UIC_ObjSelGrammar_endConditional_ID,
			Intersections_appStr, no_Embellishment, true, UIC_ConstructQuadIntersections_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		18,	/* Variant: 1 ray + 1 polygon, intersecting -> "First Intersection" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Object_Genus, 2,
				Ray_Genus, 1,
				Polygon_Genus, 1,
			UIC_ObjSelGrammar_proceduralCheck_ID, RayPolyIntersection_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			FirstIntersection_appStr, no_Embellishment, true, ConstructGObjs, 0, 148,
		
		16, /* Variant: 1 ray + 1 polygon, not-intersecting: -> "First Intersection" (disabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Object_Genus, 2,
				Ray_Genus, 1,
				Polygon_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			FirstIntersection_appStr, no_Embellishment, false, 0, 0, 0,		
#ifdef SUPPORTS_PATH_INTERSECTIONS		
		14,	/* Variant: 1 intersectable path objects intersecting once */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Path_Genus, 2,
			UIC_ObjSelGrammar_proceduralCheck_ID, ExactlyOneStitchIntersection_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Intersection_appStr, no_Embellishment, true, UIC_ConstructAllStitchIntersections_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		14,	/* Variant: 2 intersectable path objects intersecting more than once */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Path_Genus, 2,
			UIC_ObjSelGrammar_proceduralCheck_ID, MoreThanOneStitchIntersection_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Intersections_appStr, no_Embellishment, true, UIC_ConstructAllStitchIntersections_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
#endif	
		8, /* Variant: Point at Intersection (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Intersection_appStr, no_Embellishment, false, 0, 0, 0,
		
	/* Point on Object command */
		14,	/* Variant: 1 polygon -> Point on Perimeter (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 1,
				Polygon_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			PointOnPerimeter_appStr, no_Embellishment, true, UIC_ConstructPtOnObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0, 

		14,	/* Variant: 1 circle interior -> Point on Circumference (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 1,
				CircleInt_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			PointOnCircumference_appStr, no_Embellishment, true, UIC_ConstructPtOnObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0, 

		14,	/* Variant: 1 other path -> Point on [path] (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 1,
				Path_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			PointOnParamObject_appStr, nameSelectionGroup_Embellishment, true, UIC_ConstructPtOnObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0, 

		16,	/* Variant: >1 polygons -> Points on Perimeters (enabled) */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Polygon_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Polygon_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			PointsOnPerimeters_appStr, no_Embellishment, true, UIC_ConstructPtOnObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0, 

		17,	/* Variant: >1 circle interiors + >0 circles  -> Points on Circumferences (enabled) */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		CircleInt_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, CircleInt_Genus, Circle_Genus,
			UIC_ObjSelGrammar_endConditional_ID,
			PointsOnCircumferences_appStr, no_Embellishment, true, UIC_ConstructPtOnObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0, 

		16,	/* Variant: >1 paths -> Points on [paths] (enabled) */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Path_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Path_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			PointsOnParamObjects_appStr, nameSelectionGroup_Embellishment, true, UIC_ConstructPtOnObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0, 

		8, /* Variant: Point on Object (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			PointOnConstantObject_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Translate command */
		10,	/* Variant: n>0 geometric gobjects -> Translate */
			UIC_ObjSelGrammar_flagTrueCheck_ID, mostlyTransformable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Translate_appStr, no_Embellishment, true, UIC_Transform_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, TranslationClass,		
		
		8,	/* Variant: Translate (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Translate_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Rotate command */
		10,	/* Variant: n>0 geometric gobjects -> Rotate */
			UIC_ObjSelGrammar_flagTrueCheck_ID, mostlyTransformable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Rotate_appStr, no_Embellishment, true, UIC_Transform_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, RotationClass,		
		
		8,	/* Variant: Rotate (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Rotate_appStr, no_Embellishment, false, 0, 0, 0,

	/* Dilate command */
		10,	/* Variant: n>0 geometric gobjects -> Dilate */
			UIC_ObjSelGrammar_flagTrueCheck_ID, mostlyTransformable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Dilate_appStr, no_Embellishment, true, UIC_Transform_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, DilationClass,		
		
		8,	/* Variant: Dilate (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Dilate_appStr, no_Embellishment, false, 0, 0, 0,


	/* Reflect command */
		10,	/* Variant: n>0 geometric gobjects -> Reflect */
			UIC_ObjSelGrammar_flagTrueCheck_ID, mostlyTransformable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Reflect_appStr, no_Embellishment, true, UIC_Transform_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, ReflectionClass,		
		
		8,	/* Variant: Reflect (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Reflect_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Mark Transform Parameter command */
		14,	/* Variant: exactly 2 points -> Mark Vector */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 2,
				Point_Genus, 2,
			UIC_ObjSelGrammar_endConditional_ID,
			MarkVector_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedVectorHead_Param,
		14,	/* Variant: exactly 2 segments -> Mark Ratio */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 2,
				Segment_Genus, 2,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark2Ratio_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedSegmentScaleFactorDenominator_Param,
		16, /* Variant: exactly 3 points, collinear -> Mark Ratio */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, 3,
				Object_Genus, 3,
			UIC_ObjSelGrammar_proceduralCheck_ID, Collinear_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark3Ratio_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedPointScaleFactorImage_Param,
		14, /* Variant: exactly 3 points -> Mark Angle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, 3,
				Object_Genus, 3,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark3Angle_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedPointAngleC_Param,
		12, /* Variant: at least 1 angle marker -> Mark Angle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				AngleMarker_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			Mark1AngleMarker_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedAngleMarker_Param,
		22, /* Variant: 2 (ray or segment)s */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check 2 genera */
				Object_Genus, AT_MOST(3),
				Straight_Genus, 2,
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Ray_Genus, Segment_Genus, Point_Genus,
			UIC_ObjSelGrammar_proceduralCheck_ID, StraightsAreTwoEndpointSharingRaysOrSegments_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark2Angle_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedRayOrSegAngleB_Param,
		12,	/* Variant: at least 1 point -> Mark Center */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				Point_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			MarkCenter_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedCenter_Param,
		12,	/* Variant: at least 1 straight -> Mark Mirror */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				Straight_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			MarkMirror_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedMirror_Param,
		14,	/* Variant: scalar measurement -> Mark Ratio */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				ScalarMeasure_Genus, 1,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			MarkScaleFactor_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedScaleFactorMeasure_Param,
		14,	/* Variant: distance measurement -> Mark Distance */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				DistanceMeasure_Genus, 1,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark1Distance_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kRoleSentinel_MarkDistanceXandYUsingNewDistance,
		14,	/* Variant: angle measurement -> Mark Angle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				AngleMeasure_Genus, 1,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark1AngleMeasure_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedAngleMeasure_Param,
		8,	/* Variant: Mark (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MarkNothing_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Construct Locus command */
		16,	/* Variant: 2 gobjects, at least one of which is a point on path */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 2,
				PointOnPath_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_proceduralCheck_ID, LocusDisablingIdler_checkID, 
			UIC_ObjSelGrammar_endConditional_ID,
			Locus_appStr, no_Embellishment, true, UIC_Locus_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kGeometric_LocusActionProcParam,
		18, /* Variant: 1 points, 1 sampleGObj, and a path */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Object_Genus, 3,
				Point_Genus, AT_LEAST(1),
				Path_Genus, AT_LEAST(1),	
			UIC_ObjSelGrammar_proceduralCheck_ID, LocusDisablingIdler_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Locus_appStr, no_Embellishment, true, UIC_Locus_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kGeometric_LocusActionProcParam,

		16, /* Variant: 1 point which is colorized and descends from a point on path */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 1,
				Point_Genus, 1,
			UIC_ObjSelGrammar_proceduralCheck_ID, PointIsColorizedPointOnPath_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Locus_appStr, no_Embellishment, true, UIC_Locus_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kColorization_LocusActionProcParam,
			
		16,	/* Variant: 2 gobjects, at least one of which is a Scalar Parameter */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				ScalarParameter_Genus, 1,
				Object_Genus, 2,
			UIC_ObjSelGrammar_proceduralCheck_ID, LocusDisablingIdler_checkID, 
			UIC_ObjSelGrammar_endConditional_ID,
			ParametricLocus_appStr, no_Embellishment, true, UIC_Locus_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kParametric_LocusActionProcParam,

		16,	/* Variant: 2 gobjects, at least one of which is a Distance Parameter */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				DistanceParameter_Genus, 1,
				Object_Genus, 2,
			UIC_ObjSelGrammar_proceduralCheck_ID, LocusDisablingIdler_checkID, 
			UIC_ObjSelGrammar_endConditional_ID,
			ParametricLocus_appStr, no_Embellishment, true, UIC_Locus_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kParametric_LocusActionProcParam,

		16,	/* Variant: 2 gobjects, at least one of which is an Angle Parameter */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				AngleParameter_Genus, 1,
				Object_Genus, 2,
			UIC_ObjSelGrammar_proceduralCheck_ID, LocusDisablingIdler_checkID, 
			UIC_ObjSelGrammar_endConditional_ID,
			ParametricLocus_appStr, no_Embellishment, true, UIC_Locus_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kParametric_LocusActionProcParam,

		8,	/* Variant: Locus (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Locus_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Hide GObjs command */
		12, /* Variant: Hide Selection -> any non-empty selection */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			HideSelection_appStr, nameSelectionGroup_Embellishment, true, UIC_HideGObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		8,	/* Variant: Hide Objects (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			HideGObjs_appStr, no_Embellishment, false, 0, 0, 0,
				
	/* Animate command */
		10, /* Variant: Animation is paused; the only thing we can do is resume */
			UIC_ObjSelGrammar_flagTrueCheck_ID, motionPaused_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			/* Note that "Pause/Resume Motion" is dynamically classified into the Sketch Context menu */
			ResumePausedMotions_appStr, no_Embellishment, true, UIC_PauseResumeMotions_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicSketchContextMenuCompatibility >> 24, 1,
		
		14, /* Variant: Animation is happening, no selections -> Pause animation */
			UIC_ObjSelGrammar_flagTrueCheck_ID, motionActive_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			PauseMotions_appStr, no_Embellishment, true, UIC_PauseResumeMotions_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicSketchContextMenuCompatibility >> 24, 0,
					
		12, /* Variant: any selection containing stationary, moveable gobjs -> Animate Selection */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anySelectionsAreMoveable_selectFlag,
			UIC_ObjSelGrammar_flagFalseCheck_ID, allMoveableSelectionsAreFullyMoving_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			/* "Animate Object(s)" is dynamically classified into the Object Context menu */
			AnimateSelection_appStr, nameAnimatableSelectionGroup_Embellishment, true, UIC_Animate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, 0,
			
		8,	/* Variant: Animate Objects (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Animate_appStr, no_Embellishment, false, 0, 0, 0,
		
	/* Trace command */
		10, /* Variant: Trace -> No traceable objects selected */
			UIC_ObjSelGrammar_flagFalseCheck_ID, anyTraceable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Trace_appStr, no_Embellishment, false, 0,0,0,
			
		12, /* Variant: Trace -> there are both traceable & untraceable objects, none are traced */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyUntraceable_selectFlag,
			UIC_ObjSelGrammar_flagFalseCheck_ID, anyTraced_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Trace_appStr, no_Embellishment, true, UIC_Trace_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		12, /* Variant: Trace -> there are both traceable & untraceable objects, not all are traced */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyUntraceable_selectFlag,
			UIC_ObjSelGrammar_flagFalseCheck_ID, allTraced_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Trace_appStr, partialCheck_Embellishment, true, UIC_Trace_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		10, /* Variant: Trace -> there are both traceable & untraceable objects, and all are traced */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyUntraceable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Trace_appStr, checked_Embellishment, true, UIC_Trace_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		10, /* Variant: Trace -> there are only traceable objects, none are traced */
			UIC_ObjSelGrammar_flagFalseCheck_ID, anyTraced_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			TraceSelection_appStr, nameSelectionGroup_Embellishment, true, UIC_Trace_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		10, /* Variant: Trace -> there are only traceable objects, not all are traced */
			UIC_ObjSelGrammar_flagFalseCheck_ID, allTraced_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			TraceSelection_appStr, partialCheckAndNameSelectionGroup_Embellishment, true, UIC_Trace_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		12,	/* Variant: Trace -> all are traced */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				gObject_Genus, AT_LEAST(1),			
			UIC_ObjSelGrammar_endConditional_ID,
			TraceSelection_appStr, checkAndNameSelectionGroup_Embellishment, true, UIC_Trace_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
						
		8,	/* Variant: Trace -> none are traced */
			UIC_ObjSelGrammar_endConditional_ID,
			Trace_appStr, no_Embellishment, false, 0, 0, 0,
						
	/* DeleteGObjs command */
		/* (If you alter this, consider parallel alterations to ClipboardClear, below) */
		12, /* Variant: Delete -> non-empty selection, enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			DeleteNamedGObjs_appStr, nameSelectionGroup_Embellishment, true, UIC_DeleteGObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		8,	/* Variant: Delete -> empty selection, disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			DeleteGObjs_appStr, no_Embellishment, false, 0,0,0,
			
	/* Measure Length command */
		14,	/* Variant: n=1 segment -> Length */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	
				Object_Genus, 1,
		 		Segment_Genus, 1,	/* One segment must be selected */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureLength_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 44,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		16,	/* Variant: n>1 segments -> Lengths */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Segment_Genus, AT_LEAST(2),	/* At least two segments must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Segment_Genus, 0,	/* all selections must be segments */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureLengths_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 44,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: Length (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureLength_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Measure Distance command */
		14,	/* Variant: n=2 points -> Distance */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2, /* 2 gobjs selected */
		 		Point_Genus, 2,	/* 2 points selected */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureDistance_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 102,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		16,	/* Variant: 1 point, 1 straight -> Distance */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Object_Genus, 2, /* 2 gobjs selected */
		 		Point_Genus, 1,	/* 1 point selected */
		 		Straight_Genus, 1,	/* 1 straight selected */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureDistance_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 47,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		21,	/* Variant: 1 point, n straights -> Distances */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Object_Genus, AT_LEAST(3), /* More than 2 gobjs selected */
		 		Point_Genus, 1,	/* 1 point selected */
		 		Straight_Genus, AT_LEAST(2),	/* At least 2 straights selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, Point_Genus, Straight_Genus,
					/* all selections must be points or straights */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureDistances_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 47,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		21,	/* Variant: n points, 1 straight -> Distances */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Object_Genus, AT_LEAST(3), /* More than 2 gobjs selected */
		 		Point_Genus, AT_LEAST(2),	/* At least 2 points selected */
		 		Straight_Genus, 1,	/* 1 straight selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, Point_Genus, Straight_Genus,
					/* all selections must be points or straights */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureDistances_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 52,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		8,	/* Variant: Distance (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureDistance_appStr, no_Embellishment, false, 0, 0, 0,

	/* Measure Perimeter command */
		17,	/* Variant: n=1 polygon or arc interior -> Perimeter */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, 1,	/* One object must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, Polygon_Genus, ArcInterior_Genus,
					/* all selections must be polygons or arc interiors */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePerimeter_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 57,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
	
		17,	/* Variant: n>1 polygons or arc interiors -> Perimeters */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, AT_LEAST(2),	/* At least two objects must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, Polygon_Genus, ArcInterior_Genus,
					/* all selections must be polygons or arc interiors */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePerimeters_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 57,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: Perimeter (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePerimeter_appStr, no_Embellishment, false, 0, 0, 0,

	/* Measure Circumference command */
		17,	/* Variant: n=1 circle or circle interior -> Circumference */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, 1,	/* At least one object must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, Circle_Genus, CircleInt_Genus,
					/* all selections must be circles or circle interiors */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCircumference_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 60,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		17,	/* Variant: n>1 circles or circle interiors -> Circumferences */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, AT_LEAST(2),	/* At least two objects must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, Circle_Genus, CircleInt_Genus,
					/* all selections must be circles or circle interiors */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCircumferences_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 60,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		8,	/* Variant: Circumference (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCircumference_appStr, no_Embellishment, false, 0, 0, 0,
 
	/* Measure Angle command */
		14, /* Variant: 3 points -> Measure Angle (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check two genera */
				Object_Genus, 3,
				Point_Genus, 3,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 63,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		22, /* Variant: 2 (ray or segment)s */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check 2 genera */
				Object_Genus, AT_MOST(3),
				Straight_Genus, 2,
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Ray_Genus, Segment_Genus, Point_Genus,
			UIC_ObjSelGrammar_proceduralCheck_ID, StraightsAreTwoEndpointSharingRaysOrSegments_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 167,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		14, /* Variant: 1 angle marker -> Measure Angle (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check two genera */
				AngleMarker_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 175,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		16,	/* Variant: >1 angle markers -> Measure Angles (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		AngleMarker_Genus, AT_LEAST(2),	/* At least two markers must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, AngleMarker_Genus, 0,
					/* all selections must be angle markers */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAngles_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 175,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		8, /* Variant: Angle (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAngle_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Measure Area command */
		18,	/* Variant: n=1 interiors -> Measure Area */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, 1,	/* At least one object must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Interior_Genus, ArcInterior_Genus, Circle_Genus,
					/* all selections must be circles, interiors or arc interiors */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArea_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 65,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		18,	/* Variant: n>1 interiors -> Measure Area */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, AT_LEAST(2),	/* At least two objects must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Interior_Genus, ArcInterior_Genus, Circle_Genus,
					/* all selections must be circles, interiors or arc interiors */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAreas_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 65,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: Area (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArea_appStr, no_Embellishment, false, 0, 0, 0,

	/* Measure ArcAngle command */
		16,	/* Variant: arc or arc interior -> ArcAngle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		MetaArc_Genus, 1,	/* One object must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, MetaArc_Genus, 0,
					/* all selections must be meta-arcs */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 68,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		16,	/* Variant: arcs or arc interiors -> ArcAngles */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		MetaArc_Genus, AT_LEAST(2),	/* At least two objects must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, MetaArc_Genus, 0,
					/* all selections must be meta-arcs */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcAngles_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 68,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		18,	/* Variant: circle + 2 co-radial (?) points -> ArcAngle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,	/* check three genera */
		 		Object_Genus, 3,	/* Exactly 3 objects must be selected */
		 		Circle_Genus, 1,	/* Exactly one circle must be selected */
		 		Point_Genus, 2,	/* Exactly 2 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 71,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		18,	/* Variant: circle + 3 co-radial (?) points -> ArcAngle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,	/* check three genera */
		 		Object_Genus, 4,	/* Exactly 4 objects must be selected */
		 		Circle_Genus, 1,	/* Exactly one circle must be selected */
		 		Point_Genus, 3,	/* Exactly 3 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 71,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: ArcAngle (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcAngle_appStr, no_Embellishment, false, 0, 0, 0,

	/* Measure ArcLength command */
		14,	/* Variant: arc or arc interior -> ArcLength */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check one genus */
		 		MetaArc_Genus, 1,	/* One MetaArc must be selected */
		 		Object_Genus, 1,	/* One object must be selected */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcLength_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 75,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		16,	/* Variant: arcs or arc interiors -> ArcLengths */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		MetaArc_Genus, AT_LEAST(2),	/* At least two objects must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, MetaArc_Genus, 0,
					/* all selections must be meta-arcs */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcLengths_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 75,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		18,	/* Variant: circle + 2 points -> ArcLength */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,	/* check three genera */
		 		Object_Genus, 3,	/* Exactly 3 objects must be selected */
		 		Circle_Genus, 1,	/* Exactly one circle must be selected */
		 		Point_Genus, 2,	/* Exactly 2 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcLength_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 78,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		18,	/* Variant: circle + 3 points -> ArcLength */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,	/* check three genera */
		 		Object_Genus, 4,	/* Exactly 4 objects must be selected */
		 		Circle_Genus, 1,	/* Exactly one circle must be selected */
		 		Point_Genus, 3,	/* Exactly 3 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcLength_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 78,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: ArcLength (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcLength_appStr, no_Embellishment, false, 0, 0, 0,

	/* Measure Geometric Slope command */
		16,	/* Variant: n>0 straights -> Slope */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Straight_Genus, AT_LEAST(1),	/* At least one straight must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Straight_Genus, 0,	/* all selections must be segments */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureGeometricSlope_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 82,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: Length (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureGeometricSlope_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Measure Radius command */
		18,	/* Variant: n=1 circles, circle interiors, or meta-arcs -> Radius */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, 1,	/* One object must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Circle_Genus, CircleInt_Genus, MetaArc_Genus,
					/* all selections must be circles, circle interiors, or arcs */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureRadius_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 85,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		18,	/* Variant: n>1 circles, circle interiors, or meta-arcs -> Radius */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, AT_LEAST(2),	/* At least two objects must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Circle_Genus, CircleInt_Genus, MetaArc_Genus,
					/* all selections must be circles, circle interiors, or arcs */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureRadii_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 85,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: Radius (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureRadius_appStr, no_Embellishment, false, 0, 0, 0,

	/* Measure Ratio command */
		14,	/* Variant: 2 segments -> Ratio */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check two genera */
		 		Object_Genus, 2,	/* two segments must be selected */
		 		Segment_Genus, 2,	/* two segments must be selected */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureRatio_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 88,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		16,	/* Variant: 3 collinear points -> Ratio */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check two genera */
		 		Object_Genus, 3,	/* Exactly 3 objects must be selected */
		 		Point_Genus, 3,	/* Exactly 2 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, Collinear_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureRatio_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 88,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
				
		8,	/* Variant: Ratio (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureRatio_appStr, no_Embellishment, false, 0, 0, 0,

	/* Measure Calculate command */
	
		8,	/* Variant: Calculate (always enabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCalculate_appStr, no_Embellishment, true, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicSketchContextMenuCompatibility >> 24, 0,
	
	/* Measure Coordinates command */
		 18,	/* Variant: SHIFT + exactly one point -> (Rect) Abscissa & Ordinate (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Point_Genus, 1,
		 		Object_Genus, 1,
			UIC_ObjSelGrammar_flagTrueCheck_ID, noMarkedPolarCoordSys_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAbscissaAndOrdinate_appStr, no_Embellishment, true, UIC_ConstructCoordinateComponentsSeparately_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, kCartesian_CoordinateComponentRequest,

		 20,	/* Variant: SHIFT + 2 or more points -> (Rect) Abscissae & Ordinates (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_flagTrueCheck_ID, noMarkedPolarCoordSys_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAbscissaeAndOrdinates_appStr, no_Embellishment, true, UIC_ConstructCoordinateComponentsSeparately_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, kCartesian_CoordinateComponentRequest,

		 18,	/* Variant: 1 or more points -> (Rect) Coordinates (enabled) */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_flagTrueCheck_ID, noMarkedPolarCoordSys_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCoordinates_appStr, no_Embellishment, true, ConstructGObjs, 0, 104,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		 16,	/* Variant: SHIFT + 1 point -> (Polar) Polar Distance & Direction (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Point_Genus, 1,
		 		Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePolarDistanceAndDirection_appStr, no_Embellishment, true, UIC_ConstructCoordinateComponentsSeparately_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, kPolar_CoordinateComponentRequest,

		 18,	/* Variant: SHIFT + 2 or more points -> (Rect) Distances & Directions (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePolarDistancesAndDirections_appStr, no_Embellishment, true, UIC_ConstructCoordinateComponentsSeparately_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, kPolar_CoordinateComponentRequest,

		 16,	/* Variant: 1 or more points -> (Polar) Coordinates (enabled) */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCoordinates_appStr, no_Embellishment, true, ConstructGObjs, 0, 114,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		8,	/* Variant: Coordinates (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCoordinates_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Measure Equation command */
		17,	/* Variant: 1 line or circle -> Equation (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, 
				Object_Genus, 2, Line_Genus, Circle_Genus,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureEquation_appStr, no_Embellishment, true, UIC_ConstructEquation_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		17,	/* Variant: >1 line or circle -> Equation (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, 
				Object_Genus, 2, Line_Genus, Circle_Genus,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureEquations_appStr, no_Embellishment, true, UIC_ConstructEquation_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,

		8,	/* Variant: Measure Equation (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureEquation_appStr, no_Embellishment, false, 0, 0, 0,
		
	/* Select Parents command */
		10, /* Variant: non-empty selection with parents -> Select Parents, enabled */
			UIC_ObjSelGrammar_flagTrueCheck_ID, selectionHasParents_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			SelectParents_appStr, no_Embellishment, true, UIC_SelectParentsOrChildren_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		8,	/* Variant: non-empty selection -> Select Parents, disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			SelectParents_appStr, no_Embellishment, false, 0,0,0,
			
	/* Select Children command */
		10, /* Variant: non-empty selection -> Select Children, enabled */
			UIC_ObjSelGrammar_flagTrueCheck_ID, selectionHasChildren_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			SelectChildren_appStr, no_Embellishment, true, UIC_SelectParentsOrChildren_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1,
		
		8,	/* Variant: non-empty selection -> Select Children, disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			SelectChildren_appStr, no_Embellishment, false, 0,0,0,
			
	/* Action Button: Show/Hide command */
		14, /* Variant: non-empty selection -> "Hide / Show", enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_flagFalseCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_ShowOrHideToggle_appStr, no_Embellishment, true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) hideButton,
		
		14, /* Variant: non-empty selection -> "Hide / Show", enabled */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_ShowAndHidePair_appStr, no_Embellishment, true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) hideAndShowPair_metaButtonTagSentinel,

		8,	/* Variant: non-empty selection -> "Hide / Show", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_ShowOrHideToggle_appStr, no_Embellishment, false, 0,0,0,
			
	/* Action Button: Animation command */	
		10, /* Variant: non-empty animatable selection -> "Animation", enabled */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anySelectionsAreMoveable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_Animation_appStr, no_Embellishment, true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) animateButton,
		
		8,	/* Variant: otherwise -> "Animation", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_Animation_appStr, no_Embellishment, false, 0,0,0,
			
	/* Action Button: Presentation command */
		16, /* Variant: 1 or more buttons, nothing else */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Action_Genus, AT_LEAST(1), /* SHOULD IT BE AT_LEAST 1? OR AT_LEAST 2? */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Action_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			PresentationButton_appStr, no_Embellishment, true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) presentationButton,
		
		8,	/* Variant: any other selection -> "Presentation...", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			PresentationButton_appStr, no_Embellishment, false, 0,0,0,
			
	/* Action Button: Movement command */	
		18, /* Variant: non-empty animatable selection -> "Movement", enabled */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_proceduralCheck_ID, CheckEvenNumberOfSelections_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_Movement_appStr, no_Embellishment, true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) moveButton,

		19, /* Variant: non-empty animatable selection with pairs (pt, pt) or (parameter, measure) -> "Movement", enabled */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, Measure_Genus, Point_Genus,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_proceduralCheck_ID, MovableGObjectPairs_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_Movement_appStr, no_Embellishment, true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) moveButton,
		
		8,	/* Variant: otherwise -> "Movement", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_Movement_appStr, no_Embellishment, false, 0,0,0,
			
#ifdef SUPPORTS_SKETCHBOOK_EDITING

	/* Action Button: Scroll command */	
		16, /* Variant: single point selection -> "Scroll", enabled */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Point_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_Scroll_appStr, no_Embellishment, true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) scrollButton,
		
		8,	/* Variant: otherwise -> "Movement", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			ActionButton_Scroll_appStr, no_Embellishment, false, 0,0,0,

#endif

	/* Graph Menu: New Coordinate System */
		14,	/* Variant: single selected point -> "Define Origin" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Point_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			DefineOrigin_appStr, no_Embellishment, true, UIC_CreateCoordSys_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, CoordSys_UseSelectedOrigin,
			
		14,	/* Variant: single selected circle -> "Define Unit Circle" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 1,
				Circle_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			DefineUnitCircle_appStr, no_Embellishment, true, UIC_CreateCoordSys_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, CoordSys_UseSelectedUnitCircle,
			
		19,	/* Variant: single selected distance -> "Define Unit Distance" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 1, 			
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, 
				Object_Genus, 2, Segment_Genus, DistanceMeasure_Genus,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			DefineUnitDistance_appStr, no_Embellishment, true, UIC_CreateCoordSys_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, CoordSys_UseSelectedDistance,

		22, /* Variant: single selected distance + Point -> "Define Unit Distance" (with Origin)  */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2, 
				Point_Genus, 1,
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, 
				Object_Genus, 3, Segment_Genus, DistanceMeasure_Genus, Point_Genus,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			DefineUnitDistance_appStr, no_Embellishment, true, UIC_CreateCoordSys_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, CoordSys_UseSelectedOrigin | CoordSys_UseSelectedDistance,
						
		19, /* Variant: two selected distances -> "Define Rectangular Coordinates"  */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 2, 
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, 
				Object_Genus, 2, Segment_Genus, DistanceMeasure_Genus,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			DefineRectangularCoords_appStr, no_Embellishment, true, UIC_CreateCoordSys_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, CoordSys_UseSelectedDistance | CoordSys_UseSelectedSecondDistance,
						
		22, /* Variant: two selected distances + Point -> "Define Rectangular Coordinates" (with Origin) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 3, 
				Point_Genus, 1,
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, 
				Object_Genus, 3, Segment_Genus, DistanceMeasure_Genus, Point_Genus,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			DefineRectangularCoords_appStr, no_Embellishment, true, UIC_CreateCoordSys_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, CoordSys_UseSelectedOrigin | CoordSys_UseSelectedDistance | CoordSys_UseSelectedSecondDistance,
							
		10,	/* Variant: all else -> No marked coordinate system? "New Coordinate System", enabled. */
			UIC_ObjSelGrammar_notProcedureCheck_ID, CheckMarkedCoordSysExists_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			NewCoordinateSystem_appStr, no_Embellishment, true, UIC_CreateCoordSys_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase,0,0,

		8,	/* Variant: all else -> "New Coordinate System", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			NewCoordinateSystem_appStr, no_Embellishment, false, UIC_CreateCoordSys_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase,0,0,
		
	/* Graph Menu: Mark Coordinate SYSTEM */
		21,	/* Variant: one coordinate system, axis, or origin or unit point with a single coordinate system child  -> "Mark Coordinate System", enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 1, 
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID,
				Object_Genus, 4, Axis_Genus, Point_Genus, CoordSys_Genus, Circle_Genus,
				/* Note: though measurements can also be an active ancestor of a unit-distance
				   coordinate system family of objects, we do not permit them for marking,
				   as they're physically disjoint from the coordinate system appearance. */
			UIC_ObjSelGrammar_proceduralCheck_ID, SingleSelectionDeterminesMarkableCoordSys_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MarkCoordinateSystem_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedCoordSys,
		
		8,	/* Variant: all else -> "Mark Coordinate System", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			MarkCoordinateSystem_appStr, no_Embellishment, false, 0,0,0,

	/* Graph Menu: Plot Value */
		18,	/* Variant: 1 measure + >=1 selected path -> "Plot Value on [Path{s}]" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, 1,
				Path_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Path_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(PlotValueOnPathNoDialog_appStr, RemainingNonValueGenus_Embellishment), true,  ConstructGObjs, kDynamicObjectContextMenuCompatibility >> 24 | 0, 162,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		18,	/* Variant: 2 or more measures and a path => "Plot Values on [Path]" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, AT_LEAST(2),
				Path_Genus, 1,
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, UniMeasure_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(PlotValuesOnPathNoDialog_appStr, RemainingNonValueGenus_Embellishment), true,  ConstructGObjs, kDynamicObjectContextMenuCompatibility >> 24 |  0, 157,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		14,	/* Variant: 1 path -> "Plot Value on [Path]...", enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Path_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(PlotValueOnPathWithDialog_appStr, nameSelectionGroup_Embellishment), true, UIC_PlotValue_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase,kDynamicObjectContextMenuCompatibility >> 24,0,

		14,	/* Variant: 1 value -> "Plot Value on Axis...", enabled -- also appearing on the OBJECT Context menu */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(PlotValueOnPathWithDialog_appStr, nameSingularAxisGenus_Embellishment), true, UIC_PlotValue_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase,kDynamicObjectContextMenuCompatibility >> 24,0,

		8,	/* Variant: all else -> "Plot Value on Axis...", enabled -- also appearing on the SKETCH Context menu. */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(PlotValueOnPathWithDialog_appStr, nameSingularAxisGenus_Embellishment), true, UIC_PlotValue_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase,kDynamicSketchContextMenuCompatibility >> 24,0,

		/* Graph Menu: Plot Table Data ... */
		#ifdef SUPPORTS_TABLES
		14, /* Variant: 1 table -> "Plot Table Data..." */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Table_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			PlotTableData_appStr, no_Embellishment, true, UIC_PlotTableData_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0,0,
			
		8,	/* Variant: all else -> "Plot Value on Axis...", enabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			PlotTableData_appStr, no_Embellishment, false, 0,0,0,
		#endif

		/* Graph Menu: Plot Points, Plot as (x, y), Plot as (r, theta), Plot Value on Path */

		18,	/* Variant: 2 measures, square grid -> "Plot as (x, y)" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, 2,
				Object_Genus, 2,
			UIC_ObjSelGrammar_flagTrueCheck_ID, noMarkedPolarCoordSys_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			PlotMeasureXY_appStr, no_Embellishment, true,  ConstructGObjs, 0, 108,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
				
		16, /* Variant: 2 measures, polar grid -> "Plot as (r, t)" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, 2,
				Object_Genus, 2,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			PlotMeasureRTheta_appStr, no_Embellishment, true, ConstructGObjs, 0, 111,  /* use ConstructGObjs with rule at given offset in uic_cons.dat */

		8,	/* Variant: all else -> "Plot Points", enabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			PlotPoint_appStr, no_Embellishment, true, UIC_PlotPoints_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase,kDynamicSketchContextMenuCompatibility >> 24,0,

	/* Graph Menu: Plot Function */
		14, /* Variant: 1 selected function -> "Plot Function," enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Function_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			PlotExistingFunction_appStr, no_Embellishment, true, UIC_PlotExistingFunctions_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, 0,
			
		16,	/* Variant: >1 select functions, nothing else -> "Plot Functions," enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Function_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Function_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			PlotExistingFunctions_appStr, no_Embellishment, true, UIC_PlotExistingFunctions_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, 0,
			
		12,	/* Variant: no functions selected -> "Plot Function...", enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Function_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			PlotFunction_appStr, no_Embellishment, true, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicSketchContextMenuCompatibility >> 24, 4 | 1,

		8,	/* Variant: all else -> "Plot Function...", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			PlotFunction_appStr, no_Embellishment, false, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicSketchContextMenuCompatibility >> 24, 4 | 1,

	/* Line command */
		10,	/* Variant: 2 distinct points -> Line (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, twoPointsDistinct_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Line_appStr, no_Embellishment, true, UIC_ConstructStraights_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, Line_C, 
		16,	/* Variant: >2 points -> Rays (enabled) */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(3),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			Lines_appStr, no_Embellishment, true, UIC_ConstructStraights_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, Line_C, 
		8, /* Variant: Ray (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Line_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Ray command */
		10,	/* Variant: 2 distinct points -> Ray (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, twoPointsDistinct_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Ray_appStr, no_Embellishment, true, UIC_ConstructStraights_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, Ray_C, 
		16,	/* Variant: >2 points -> Rays (enabled) */
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(3),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			Rays_appStr, no_Embellishment, true, UIC_ConstructStraights_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, Ray_C, 
		8, /* Variant: Ray (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Ray_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* ShowHide Labels command */
		16,	/* Variant: some can show labels and all that can, do; more than one selected -> Hide Labels */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyCanShowLabels_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allShowingLabels_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		gObject_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_endConditional_ID,
			HideLabels_appStr, no_Embellishment, true, UIC_ShowHideLabels_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0, 
		 		
		12,	/* Variant: some can show labels and all that can, do; only one selected -> Hide Label */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyCanShowLabels_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, allShowingLabels_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			HideLabel_appStr, no_Embellishment, true, UIC_ShowHideLabels_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0, 
			
		14,	/* Variant: some can show labels and not all that can, do; multiple candidates -> Show Labels */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyCanShowLabels_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		gObject_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_endConditional_ID,
			ShowLabels_appStr, no_Embellishment, true, UIC_ShowHideLabels_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1, 

		10,	/* Variant: some can show labels and not all that can, do -> Show Labels */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyCanShowLabels_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			ShowLabel_appStr, no_Embellishment, true, UIC_ShowHideLabels_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1, 
			
		8,	/* Variant: Show Labels (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			ShowLabels_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Mark Center command */
		12,	/* Variant: at least 1 point -> Mark Center */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				Point_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			MarkCenter_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedCenter_Param,
		 	
		8,	/* Variant: Mark Center (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MarkCenter_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Mark Mirror command */
		12,	/* Variant: at least 1 straight -> Mark Mirror */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				Straight_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			MarkMirror_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedMirror_Param,

		8,	/* Variant: Mark Mirror (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MarkMirror_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Mark Angle command */
		14,	/* Variant: angle measurement -> Mark Angle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				AngleMeasure_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark1AngleMeasure_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedAngleMeasure_Param,

		12, /* Variant: at least 1 angle marker -> Mark Angle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				AngleMarker_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_endConditional_ID,
			Mark1AngleMarker_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedAngleMarker_Param,
			
		12, /* Variant: at least 3 points -> Mark Angle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				Point_Genus, AT_LEAST(3),
			UIC_ObjSelGrammar_endConditional_ID,
			Mark3Angle_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedPointAngleC_Param,

		22, /* Variant: 2 (ray or segment)s */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check 2 genera */
				Object_Genus, AT_MOST(3),
				Straight_Genus, 2,
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Ray_Genus, Segment_Genus, Point_Genus,
			UIC_ObjSelGrammar_proceduralCheck_ID, StraightsAreTwoEndpointSharingRaysOrSegments_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark2Angle_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedRayOrSegAngleB_Param,

		8,	/* Variant: Mark Angle (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Mark3Angle_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Mark Ratio command */
		12,	/* Variant: at least 2 segments -> Mark Ratio */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				Segment_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_endConditional_ID,
			Mark2Ratio_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedSegmentScaleFactorDenominator_Param,
			
		16, /* Variant: exactly 3 points, collinear -> Mark Ratio */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, 3,
				Object_Genus, 3,
			UIC_ObjSelGrammar_proceduralCheck_ID, Collinear_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark3Ratio_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedPointScaleFactorImage_Param,

		14,	/* Variant: scalar measurement -> Mark Ratio */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				ScalarMeasure_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			MarkScaleFactor_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedScaleFactorMeasure_Param,

		8,	/* Variant: Mark Ratio (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MarkRatio_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Mark Distance command */
		14,	/* Variant: distance measurement -> Mark Distance */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				DistanceMeasure_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_flagTrueCheck_ID, allMeasuresDefinedAndNotInfinite_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			Mark1Distance_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kRoleSentinel_MarkDistanceXandYUsingNewDistance,

		8,	/* Variant: Mark Distance (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			Mark1Distance_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Mark Vector command */
		12,	/* Variant: at least 2 points -> Mark Vector */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_endConditional_ID,
			MarkVector_appStr, no_Embellishment, true, UIC_MarkTransformParam_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, MarkedVectorHead_Param,
			
		8,	/* Variant: Mark Vector (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MarkVector_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Measure Abscissa */
		 16,	/* Variant: 1 point (Rect) -> Abscissa (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, noMarkedPolarCoordSys_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Point_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAbscissa_appStr, no_Embellishment, true, ConstructGObjs, 0, 90,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		 18,	/* Variant: 2 or more points (Rect) -> Abscissas (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, noMarkedPolarCoordSys_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAbscissae_appStr, no_Embellishment, true, ConstructGObjs, 0, 90,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		 14,	/* Variant: 1 point (Polar) -> Distance (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Point_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePolarDistance_appStr, no_Embellishment, true, ConstructGObjs, 0, 178,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		 16,	/* Variant: 2 or more points (Polar) -> Distances (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePolarDistances_appStr, no_Embellishment, true, ConstructGObjs, 0, 178,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
	
		10,	/* Variant: (Polar) Polar Distance (disabled) */
			UIC_ObjSelGrammar_flagFalseCheck_ID, noMarkedPolarCoordSys_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePolarDistance_appStr, no_Embellishment, false, 0, 0, 0,
	
		8,	/* Variant: (NonPolar) Abscissa (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAbscissa_appStr, no_Embellishment, false, 0, 0, 0,
	
	/* Measure Ordinate */
		 16,	/* Variant: 1 point (Rect) -> Ordinate (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, noMarkedPolarCoordSys_selectFlag,
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Point_Genus, 1,
		 		Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureOrdinate_appStr, no_Embellishment, true, ConstructGObjs, 0, 96,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		 18,	/* Variant: 2 or more points (Rect)  -> Ordinates (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, noMarkedPolarCoordSys_selectFlag,
		 	UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureOrdinates_appStr, no_Embellishment, true, ConstructGObjs, 0, 96,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */			
		 14,	/* Variant: 1 point (Polar) -> Direction (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
		 		Point_Genus, 1,  
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePolarDirection_appStr, no_Embellishment, true, ConstructGObjs, 0, 184,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		 16,	/* Variant: 2 or more points (Polar) -> Directions (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
		 		Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePolarDirections_appStr, no_Embellishment, true, ConstructGObjs, 0, 184,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		10,	/* Variant: (Polar) Polar Direction (disabled) */
			UIC_ObjSelGrammar_flagFalseCheck_ID, noMarkedPolarCoordSys_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePolarDirection_appStr, no_Embellishment, false, 0, 0, 0,
	
		8,	/* Variant: Ordinate (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureOrdinate_appStr, no_Embellishment, false, 0, 0, 0,

	/* Object Properties */
		12, /* Variant: non-empty selection -> "Object Properties", enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			ObjProperties_appStr, no_Embellishment, true, UIC_ObjProperties_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		/* KLOOGE: Provide better */
		8,	/* Variant: Object Properties (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			ObjProperties_appStr, no_Embellishment, false, 0, 0, 0,
			
#ifdef SUPPORTS_VariableFontStyles
	/* Text Style: MotionAndSelection_MetaSensitive_UICFamily */
			
		12, /* Variant: selection with text + meta -> "Text Style...", enabled and update the future */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, someSelectionsHaveText_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			TextStyle_appStr, PlatformTextStyle_Embellishment, true, UIC_TextStyle_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1,
		
		10, /* Variant: selection with text + no meta -> "Text Style...", enabled and don't update the future */
			UIC_ObjSelGrammar_flagTrueCheck_ID, someSelectionsHaveText_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			TextStyle_appStr, PlatformTextStyle_Embellishment, true, UIC_TextStyle_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		10, /* Variant: MFS editing session active, enabled */
			UIC_ObjSelGrammar_proceduralCheck_ID, MFSEditingInTextStyleableSession_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			TextStyle_appStr, PlatformTextStyle_Embellishment, true, UIC_TextStyle_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		8,	/* Variant: Text Style... (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			TextStyle_appStr, no_Embellishment, false, 0, 0, 0,
#endif			
	/* ComboMeasurement: Length/Distance/Radius/ArcLength */
		14,	/* Variant: 2 points -> Distance */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2, /* 2 gobjs selected */
		 		Point_Genus, 2,	/* 2 points selected */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureDistance_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 102,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
				
		16,	/* Variant: 1 point, 1 straight -> Distance */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Object_Genus, 2, /* 2 gobjs selected */
		 		Point_Genus, 1,	/* 1 point selected */
		 		Straight_Genus, 1,	/* 1 straight selected */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureDistance_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 47,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		16,	/* Variant: n>0 segments -> Length */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Segment_Genus, AT_LEAST(1),	/* At least one segment must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Segment_Genus, 0,	/* all selections must be segments */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureLength_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 44,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
	
		18,	/* Variant: n>0 circles, circle interiors, or meta-arcs -> Radius */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, AT_LEAST(1),	/* At least one object must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, Circle_Genus, CircleInt_Genus, MetaArc_Genus,
					/* all selections must be circles, circle interiors, or arcs */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureRadius_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 85,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		18,	/* Variant: circle + 2 points -> ArcLength */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,	/* check three genera */
		 		Object_Genus, 3,	/* Exactly 3 objects must be selected */
		 		Circle_Genus, 1,	/* Exactly one circle must be selected */
		 		Point_Genus, 2,	/* Exactly 2 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcLength_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 78,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		18,	/* Variant: circle + 3 points -> ArcLength */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,	/* check three genera */
		 		Object_Genus, 4,	/* Exactly 4 objects must be selected */
		 		Circle_Genus, 1,	/* Exactly one circle must be selected */
		 		Point_Genus, 3,	/* Exactly 3 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcLength_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 78,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: Length/Distance (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			LengthDistance_appStr, no_Embellishment, false, 0, 0, 0,		

	/* ComboMeasurement: Perimeter/Circumference */
		16,	/* Variant: n>0 polygons -> Perimeter */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Polygon_Genus, AT_LEAST(1),	/* At least one polygon must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Polygon_Genus, 0,	/* all selections must be polygons */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePerimeter_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 57,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		17,	/* Variant: n>0 circles or circle interiors -> Circumference */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, AT_LEAST(1),	/* At least one object must be selected */
			UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 2, Circle_Genus, CircleInt_Genus,
					/* all selections must be circles or circle interiors */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCircumference_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 60,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		8,	/* Variant: Perimeter (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasurePerimeter_appStr, no_Embellishment, false, 0, 0, 0,	
			
	/* ComboMeasurement: Angle/ArcAngle */	
		14, /* Variant: 3 points -> Measure Angle (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check two genera */
				Object_Genus, 3,
				Point_Genus, 3,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 63,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		18,	/* Variant: circle + 2 co-radial (?) points -> ArcAngle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,	/* check three genera */
		 		Object_Genus, 3,	/* Exactly 3 objects must be selected */
		 		Circle_Genus, 1,	/* Exactly one circle must be selected */
		 		Point_Genus, 2,	/* Exactly 2 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 71,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		18,	/* Variant: circle + 3 co-radial (?) points -> ArcAngle */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,	/* check three genera */
		 		Object_Genus, 4,	/* Exactly 4 objects must be selected */
		 		Circle_Genus, 1,	/* Exactly one circle must be selected */
		 		Point_Genus, 3,	/* Exactly 3 points must be selected */
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureArcAngle_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 71,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8, /* Variant: Angle (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAngle_appStr, no_Embellishment, false, 0, 0, 0,

	/* Any LineWidth command */
		5,	/* Variant: Any LineWidth gobjs + Shift -> "Line Width" not updating prefs */
			/* UIC_ObjSelGrammar_endRenderStyleSet_ID will figure out embellishment, appearance, enabling, and actionProc */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,	/* meta down: reassign width but don't update widthPrefs */
			UIC_ObjSelGrammar_endRenderStyleSet_ID, 1,

		3,	/* Variant: Any LineWidth gobjs -> "Line Width" updating prefs */
			/* UIC_ObjSelGrammar_endRenderStyleSet_ID will figure out embellishment, appearance, enabling, and actionProc */
			/* meta up: reassign width possibly updating colorPrefs */
			UIC_ObjSelGrammar_endRenderStyleSet_ID, 0,
				
	/* Any PointStyle command */
	/* KLOOGE: Reimplement this! */
		5,	/* Variant: Any LineWidth gobjs + Shift -> "Line Width" not updating prefs */
			/* UIC_ObjSelGrammar_endRenderStyleSet_ID will figure out embellishment, appearance, enabling, and actionProc */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,	/* meta down: reassign width but don't update widthPrefs */
			UIC_ObjSelGrammar_endRenderStyleSet_ID, 1,

		3,	/* Variant: Any LineWidth gobjs -> "Line Width" updating prefs */
			/* UIC_ObjSelGrammar_endRenderStyleSet_ID will figure out embellishment, appearance, enabling, and actionProc */
			/* meta up: reassign width possibly updating colorPrefs */
			UIC_ObjSelGrammar_endRenderStyleSet_ID, 0,
				
			
	#ifdef SUPPORTS_Color
	
	/* ParametricColor_UIC */
		16, /* Variant: Colorable Preimages + 1 measurement -> "Colorize (Single Parameter)" */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, 1,	/* And one measurement */
				Text_Genus, 1,		/* And no other text */
			
			UIC_ObjSelGrammar_flagTrueCheck_ID, anySelectionsAreColorationPreimages_selectFlag, /* and some of our non-measurements are colorizable */
				
			UIC_ObjSelGrammar_endConditional_ID,
			ParametricColor_appStr, no_Embellishment, true, UIC_ParametricColor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kColorizeObject_SingleParameterColor,
			
		16, /* Variant: Colorable Objects + 3 measurements -> "RGB Colorize..." */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, 3,	/* And 3 measurements */
				Text_Genus, 3,		/* And no other text */
				
			UIC_ObjSelGrammar_flagTrueCheck_ID, anySelectionsAreColorationPreimages_selectFlag, /* and some of our non-measurements are colorizable */

			UIC_ObjSelGrammar_endConditional_ID,
			ParametricColor_appStr, no_Embellishment, true, UIC_ParametricColor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kColorizeObject_RGBParametersColor,

		8,	/* Variant: Colorize Objects (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			ParametricColor_appStr, no_Embellishment, false, 0, 0, 0,
		
	/* OtherColor_UIC: MotionAndSelection_MetaSensitive_UICFamily */
	
		12, /* Variant: Colorable Objects -> "Other..." */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyColorable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			OtherColor_appStr, no_Embellishment, true, UIC_OtherColor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1,

		10, /* Variant: Colorable Objects -> "Other..." */
			UIC_ObjSelGrammar_flagTrueCheck_ID, anyColorable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			OtherColor_appStr, no_Embellishment, true, UIC_OtherColor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		10, /* Variant: MFS editing session active-> "Other...", enabled, no effect on color prefs. */
			UIC_ObjSelGrammar_proceduralCheck_ID, MFSEditingInTextStyleableSession_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			OtherColor_appStr, no_Embellishment, true, UIC_OtherColor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1,
			
		8,	/* Variant: "Other..." (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			OtherColor_appStr, no_Embellishment, false, 0, 0, 0,

	#endif /* SUPPORTS_Color */
	
	/* NewFunction */
	
		8,	/* Variant: all else -> "New Function...", enabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			NewFunction_appStr, no_Embellishment, true, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicSketchContextMenuCompatibility >> 24, 1,
	
	/* IncreaseSpeed */
		12, /* Variant: Animation not paused; some moving object selected -> "Increase Speed" */
			UIC_ObjSelGrammar_flagFalseCheck_ID, motionPaused_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, anySelectionIsMoving_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			IncreaseSpeed_appStr, no_Embellishment, true, UIC_AlterMotionSpeed_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 
				kDynamicObjectContextMenuCompatibility >> 24, kAffectSelections_AlterMotionSpeedActionBitField | kIncreaseSpeed_AlterMotionSpeedActionBitField,
			
		16, /* Variant: Animation active & not paused; no objects selected -> "Increase All Speeds" */
			UIC_ObjSelGrammar_flagFalseCheck_ID, motionPaused_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, motionActive_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 0,		
			UIC_ObjSelGrammar_endConditional_ID,
			IncreaseAllSpeeds_appStr, no_Embellishment, true, UIC_AlterMotionSpeed_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 
				kDynamicSketchContextMenuCompatibility >> 24, kAffectAllMotions_AlterMotionSpeedActionBitField | kIncreaseSpeed_AlterMotionSpeedActionBitField,  
					
		8,	/* Variant: Increase Speed (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			IncreaseSpeed_appStr, no_Embellishment, false, 0, 0, 0,

	/* DecreaseSpeed */
		12, /* Variant: Animation not paused; some moving object selected -> "Increase Speed" */
			UIC_ObjSelGrammar_flagFalseCheck_ID, motionPaused_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, anySelectionIsMoving_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			DecreaseSpeed_appStr, no_Embellishment, true, UIC_AlterMotionSpeed_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 
				kDynamicObjectContextMenuCompatibility >> 24, kAffectSelections_AlterMotionSpeedActionBitField | kDecreaseSpeed_AlterMotionSpeedActionBitField,
			
		16, /* Variant: Animation active & not paused; no objects selected -> "Increase All Speeds" */
			UIC_ObjSelGrammar_flagFalseCheck_ID, motionPaused_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, motionActive_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 0,		
			UIC_ObjSelGrammar_endConditional_ID,
			DecreaseAllSpeeds_appStr, no_Embellishment, true, UIC_AlterMotionSpeed_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 
				kDynamicSketchContextMenuCompatibility >> 24, kAffectAllMotions_AlterMotionSpeedActionBitField | kDecreaseSpeed_AlterMotionSpeedActionBitField,
					
		8,	/* Variant: Increase Speed (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			DecreaseSpeed_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Stop Motion */

#ifndef SUPPORTS_SingleSketchOnly
		12, /* Variant: Any sketch has an active motion and meta-key is down -> "Stop All Sketches" */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, motionInAnySketchActive_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			StopAllSketchMotions_appStr, no_Embellishment, true, UIC_StopAllSketchesMotions_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 
				0, 0,
#endif
			
		12, /* Variant: Animation not paused; some moving object selected -> "Stop (Selected) Motion" */
			UIC_ObjSelGrammar_flagFalseCheck_ID, motionPaused_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, anySelectionIsMoving_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			StopSelectedMotions_appStr, no_Embellishment, true, UIC_StopMotions_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 
				kDynamicObjectContextMenuCompatibility >> 24, kStopMotions_ApplyToSelectionsOnly_Flag,
			
		16, /* Variant: Animation active & not paused; no objects selected -> "Stop All Motions" */
			UIC_ObjSelGrammar_flagFalseCheck_ID, motionPaused_selectFlag,
			UIC_ObjSelGrammar_flagTrueCheck_ID, motionActive_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 0,		
			UIC_ObjSelGrammar_endConditional_ID,
			StopAllMotions_appStr, no_Embellishment, true, UIC_StopMotions_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 
				kDynamicSketchContextMenuCompatibility >> 24, 0,
					
		8,	/* Variant: Stop Motion (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			StopSelectedMotions_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* ShowHideMotionController:
		This appearance specifier is complicated, because it needs to do more than enable show/hide motion controller (which is
		in no way ObjectSelectionSensitive). In addition, it needs to enable and disable all of the motion controller panes
		individually. By associating these panes directly with ShowHideMotionController_UIC, we guarantee that the motionController
		will work properly when ShowHideMotionController is in the menuSet regardless of which other constituent UICommands
		(e. g. stop motion, animate, speeds, etc.) are in the menuSet.
	*/
		12, /* Variant: MotionController is visible */
			UIC_ObjSelGrammar_flagTrueCheck_ID, motionControllerIsVisible_selectFlag,
			UIC_ObjSelGrammar_proceduralCheck_ID, UpdateMotionControllerPanes_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			HideMotionController_appStr, no_Embellishment, true, UIC_ShowHideMotionController_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,

		8, /* Variant: Show Motion Controller (enabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			ShowMotionController_appStr, no_Embellishment, true, UIC_ShowHideMotionController_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1,
			
	/* ClipboardClear command */
		/* (If you alter this, consider parallel alterations to DeleteGObjs, above) */
		10, /* Variant: Clear -> non-empty MFS selection in editing session, enabled */
			UIC_ObjSelGrammar_proceduralCheck_ID, MFSEditingSelExists_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			ClipboardClear_appStr, no_Embellishment, true, UIC_DeleteGObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		14, /* Not in MFS Session Variant: Clear -> non-empty GObj selection, enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_notProcedureCheck_ID, MFSEditing_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			ClearNamedGObjs_appStr, nameSelectionGroup_Embellishment, true, UIC_DeleteGObjs_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,		

		8,	/* Variant: Copy -> empty selection, either in MFS session or in sketch; disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			ClipboardClear_appStr, no_Embellishment, false, 0,0,0,
			
	/* ClipboardCut command */
		/* (If you alter this, consider parallel alterations to DeleteGObjs, above) */
		10, /* Variant: Cut -> non-empty selection in editing session, enabled */
			UIC_ObjSelGrammar_proceduralCheck_ID, MFSEditingSelExists_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			ClipboardCut_appStr, no_Embellishment, true, UIC_ClipboardCut_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		14, /* Variant: Cut -> non-empty selection, enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_notProcedureCheck_ID, MFSEditing_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			ClipboardCut_appStr, no_Embellishment, true, UIC_ClipboardCut_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		8,	/* Variant: Cut -> empty selection, either in MFS session or in sketch; disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			ClipboardCut_appStr, no_Embellishment, false, 0,0,0,
			
	/* ClipboardCopy command */
		/* (If you alter this, consider parallel alterations to DeleteGObjs, above) */
		10, /* Variant: Copy -> non-empty selection in editing session, enabled */
			UIC_ObjSelGrammar_proceduralCheck_ID, MFSEditingSelExists_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			ClipboardCopy_appStr, no_Embellishment, true, UIC_ClipboardCopy_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		14, /* Variant: Copy -> non-empty selection, enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_notProcedureCheck_ID, MFSEditing_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			ClipboardCopy_appStr, no_Embellishment, true, UIC_ClipboardCopy_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		8,	/* Variant: Copy -> empty selection, either in MFS session or in sketch; disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			ClipboardCopy_appStr, no_Embellishment, false, 0,0,0,
			
	/* Derivative command */
		
		14, /* Variant: 1 selected function -> "Derivative," enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Function_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			Derivative_appStr, no_Embellishment, true, UIC_Derivative_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, 0,
			
		16,	/* Variant: >1 select functions, nothing else -> "Derivatives," enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Function_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Function_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			Derivatives_appStr, no_Embellishment, true, UIC_Derivative_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, 0,
			
		8,	/* Variant: all else -> "Derivative", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			Derivative_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Arc On Circle command */
		
		18, /* Variant: 1 selected circle, 2 selected coradial points -> "Arc On Circle", enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Circle_Genus, 1,
				Point_Genus, 2,
				Object_Genus, 3,
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,	
			UIC_ObjSelGrammar_endConditional_ID,
			ArcOnCircle_appStr, no_Embellishment, true, ConstructGObjs, 0, 122,

		16, /* Variant: 1 selected center, 2 selected coradial points -> "Arc On Circle", enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Point_Genus, 3,
				Object_Genus, 3,
			UIC_ObjSelGrammar_proceduralCheck_ID, CoRadial_checkID,	
			UIC_ObjSelGrammar_endConditional_ID,
			ArcOnCircle_appStr, no_Embellishment, true, ConstructGObjs, 0, 126,

		8,	/* Variant: all else -> "Arc On Circle", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			ArcOnCircle_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* Arc By 3 Points command */
		
		16, /* Variant: 3 selected points, not collinear -> "Arc By 3 Points", enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Point_Genus, 3,
				Object_Genus, 3,
			UIC_ObjSelGrammar_notProcedureCheck_ID, Collinear_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			Arc3Points_appStr, no_Embellishment, true, ConstructGObjs, 0, 128,
			
		8,	/* Variant: all else -> "Arc By 3 Points", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			Arc3Points_appStr, no_Embellishment, false, 0, 0, 0,
			
	/* EditDefinition command */
		14, /* Variant: Single selected parameter -> Edit Parameter... */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				ScalarParameter_Genus, 1, 	
			UIC_ObjSelGrammar_flagTrueCheck_ID, singleSelectedCalcKind_selectFlag, 
			UIC_ObjSelGrammar_endConditional_ID,
			EditParameter_appStr, no_Embellishment, true, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24,  10,
			
		14, /* Variant: Single selected angle parameter -> Edit Parameter... */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				AngleParameter_Genus, 1, 	
			UIC_ObjSelGrammar_flagTrueCheck_ID, singleSelectedCalcKind_selectFlag, 
			UIC_ObjSelGrammar_endConditional_ID,
			EditParameter_appStr, no_Embellishment, true, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24,  10,
			
		14, /* Variant: Single selected distance parameter -> Edit Parameter... */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				DistanceParameter_Genus, 1, 	
			UIC_ObjSelGrammar_flagTrueCheck_ID, singleSelectedCalcKind_selectFlag, 
			UIC_ObjSelGrammar_endConditional_ID,
			EditParameter_appStr, no_Embellishment, true, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24,  10,
			
		16, /* Variant: Single selected calculated measurement, no functions -> Edit Calculation... */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, 1, 	
				Object_Genus, 1,
			UIC_ObjSelGrammar_flagTrueCheck_ID, singleSelectedCalcKind_selectFlag, 
			UIC_ObjSelGrammar_endConditional_ID,
			EditCalculation_appStr, no_Embellishment, true, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24,  2,
			
		18, /* Variant: Single selected function; not a derivative or data function -> "Edit Function...," enabled. */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 4,
				Function_Genus, 1,
				Object_Genus, 1,
				MetaDerivative_Genus, 0,
				DataFunction_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			EditFunction_appStr, no_Embellishment, true, UIC_Calculate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, kDynamicObjectContextMenuCompatibility >> 24, 3,

#if 1
/*	GSP5_SHIPPABLE_KLOOGE/DISABLE EDIT PLOT POINTS. For the time being (0926),
    we never allow Editing of Plotted Points, since the common code and platform UI
	for the dialog has not yet grown to allow convenient editing of non-(Fixed, Fixed)
	coordinate pairs. Ideally we want a UI which allows easy motion between Fixed and
	Marked values for each coordinate, which suggests that like the Calculator this
	dialog will need to be able to retroactively change parentage, prevent the creation
	of construction graph cycles, etc. Post-GSP5!
*/
#else
	
		16, /* Variant: 1 fixed plotted point -> "Edit Plotted Point..." */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				PlottedPoint_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_proceduralCheck_ID, CheckPlottedPointIsFixed_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			EditPlottedPoint_appStr, no_Embellishment, true, UIC_PlotPoints_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase,kDynamicObjectContextMenuCompatibility >> 24,1,
#endif


#ifdef SUPPORTS_ACTION_BUTTON_REPARENTING
        16, /* Variant: an action button & some other objects, possibly becomes -> "Redefine Action Button" */
            UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
            Action_Genus, AT_LEAST(1),
            Object_Genus, AT_LEAST(2),
            UIC_ObjSelGrammar_proceduralCheck_ID, ReparentableActionButton_checkID,
            UIC_ObjSelGrammar_endConditional_ID,
            BYTEPLEX(ReparentActionButton_appStr, no_Embellishment), true, UIC_ReparentActionButton_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase,kDynamicObjectContextMenuCompatibility >> 24,1,
#endif


		8,	/* Variant: all else -> "Edit Definition...", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			EditDefinition_appStr, no_Embellishment, false, 0, 0, 0,
		
#ifdef SUPPORTS_IMPORTED_PICTURES
		16, /* Variant: 1 picture + 1 polygon -> "Crop Picture To Polygon Interior" (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				ImportedPicture_Genus, 1,
				Polygon_Genus, 1,
				Object_Genus, 2,
			UIC_ObjSelGrammar_endConditional_ID,
			CropPictureToSomething_appStr, pictureAndRemainingSelection_Embellishment, true, UIC_ConstructCroppedPicture_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kUserInteraction_ConstructCroppedPicture_actionArg,

		8, /* Variant:  "Crop Picture To Polygon" (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			CropPictureToPolygon_appStr, no_Embellishment, false, 0, 0, 0,
#endif

	/* Measure Coordinate Distance command */
		14,	/* Variant: n=2 points -> Distance */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2, /* 2 gobjs selected */
		 		Point_Genus, 2,	/* 2 points selected */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCoordinateDistance_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 136,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: Distance (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureCoordinateDistance_appStr, no_Embellishment, false, 0, 0, 0,

	/* Measure Analytic Slope command */
		14,	/* Variant: n=1 straight -> Slope */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,	/* check one genus */
		 		Straight_Genus, 1,	/* One straight must be selected */
		 		Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAnalyticSlope_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 139,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */

		16,	/* Variant: n>1 straights -> Slopes */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Straight_Genus, AT_LEAST(2),	/* At least two straights must be selected */
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Straight_Genus, 0,	/* all selections must be straights */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAnalyticSlopes_appStr, no_Embellishment, true, /* enabled */
				ConstructGObjs, 0, 139,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
		
		8,	/* Variant: Length (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			MeasureAnalyticSlope_appStr, no_Embellishment, false, 0, 0, 0,
			
#ifdef SUPPORTS_ITERATION
	/* Transform: Iterate command */
		18,	/* Variant: Shift Key + Pre-Images + UniMeasure as most-recently selected => Iterate to Depth... (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UniMeasure_Genus, AT_LEAST(1),
				Object_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_proceduralCheck_ID, IterateToSpecifiedDepthEligibility_checkID,	
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(IterateToSpecificDepth_appStr, no_Embellishment), true, UIC_Iterate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 1, 0,

		10, /* Variant: >0 iterable objects and nothing else, all are free: Iterate... (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, someSelectionsAreIterablePreimages_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Iterate_appStr, no_Embellishment), true, UIC_Iterate_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
		16, /* Variant: 1 iteratedImages of point under single mapped iterations, and nothing else => Terminal Point*/
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				IterateImage_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_proceduralCheck_ID, TerminalIterationPointEligibility_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(TerminalPoint_appStr, no_Embellishment), true, ConstructGObjs, 0, 143,
			
		18, /* Variant: >1 iteratedImages of points under single mapped iterations, and nothing else => Terminal Points */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				IterateImage_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, IterateImage_Genus, 0,
			UIC_ObjSelGrammar_proceduralCheck_ID, TerminalIterationPointEligibility_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(TerminalPoints_appStr, no_Embellishment), true, ConstructGObjs, 0, 143,
			 
		10,	/* Variant: Shift key => Iterate to Specific Depth (disabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(IterateToSpecificDepth_appStr, no_Embellishment), false, 0, 0, 0,

		8,	/* Variant: Iterate (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Iterate_appStr, no_Embellishment), false, 0, 0, 0,
			
	/* Object Context: Increase Iterations */
		15, /* Variant: >0 iterated images or FixedEntry tables and anything else. Increase Iterations if these correspond to an iterable map. */
			UIC_ObjSelGrammar_disjointGeneraPoolCheck_ID, 
				AT_LEAST(1), 2 /* check two genera for at least 1 object */,
				IterateImage_Genus, FixedEntryTable_Genus,
			UIC_ObjSelGrammar_proceduralCheck_ID, AlterIterationDepthEligibility_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(IncreaseIterations_appStr, no_Embellishment), true, UIC_IncreaseOrDecreaseIterations_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
		
		8,	/* Variant: Iterate (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(IncreaseIterations_appStr, no_Embellishment), false, 0, 0, 0,

	/* Object Context: Decrease Iterations */
		15, /* Variant: >0 iterated images or FixedEntry tables and anything else. Increase Iterations if these correspond to an iterable map. */
			UIC_ObjSelGrammar_disjointGeneraPoolCheck_ID, 
				AT_LEAST(1), 2 /* check two genera for at least 1 object */,
				IterateImage_Genus, FixedEntryTable_Genus,
			UIC_ObjSelGrammar_proceduralCheck_ID, AlterIterationDepthEligibility_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DecreaseIterations_appStr, no_Embellishment), true, UIC_IncreaseOrDecreaseIterations_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1,
		
		8,	/* Variant: Iterate (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DecreaseIterations_appStr, no_Embellishment), false, 0, 0, 0,

#endif

#ifdef SUPPORTS_TABLES
	/* Graph: Tabulate */
		18,	/* Variant: 1 or more unimeasures or multimeasures => tabulate, enabled  */
		UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,	/* check one genus */
		 		Object_Genus, AT_LEAST(1),	/* At least one object must be selected */
		UIC_ObjSelGrammar_combinedGeneraPoolCheck_ID, Object_Genus, 3, UniMeasure_Genus, MultiMeasure_Genus, CompositeText_Genus,
		UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Tabulate_appStr, no_Embellishment), true, /* enabled */
			ConstructGObjs, 0, 146,	/* use ConstructGObjs with rule at given offset in uic_cons.dat */
			
		8,	/* Variant: Tabulate (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Tabulate_appStr, no_Embellishment), false, 0, 0, 0,
		
	/* Graph: Add Table Entry */
		14, /* Variant: 1 editable table and nothing else => Add Table Entry */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UserEditableTable_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(AddTableEntry_appStr, no_Embellishment), true, UIC_AddTableEntry_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,

		8,	/* Variant: Add Table Entry (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(AddTableEntry_appStr, no_Embellishment), false, 0, 0, 0,
			
	/* Graph: Remove Entry */
		16, /* Variant: 1 editable table and nothing else => Remove Table Entry */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				UserEditableTable_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_proceduralCheck_ID, UserTabulationContainsRemovableData_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(RemoveTableEntry_appStr, no_Embellishment), true, UIC_RemoveTableEntry_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,

		8,	/* Variant: Remove Table Entry (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(RemoveTableEntry_appStr, no_Embellishment), false, 0, 0, 0,
			

#endif /* SUPPORTS_Tables */

	/* Edit: Label {selection}... */
		14, /* Variant: 1 or more objects all of whom are labelable -> Label {selection}... */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_flagTrueCheck_ID, allAreLabelable_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(LabelSelection_appStr, nameSelectionGroup_Embellishment), true, UIC_LabelSelection_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,
			
	14, /* Variant: 0 objects Label {selection}... */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1,
				Object_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ResetLabelPool_appStr, no_Embellishment), true, UIC_LabelSelection_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,

		8,	/* Variant: Label... (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(Label_appStr, no_Embellishment), false, 0, 0, 0,
			
	/* Measure: Value of Point */
	/* KLOOGE: Think about this. Should only parametric paths be enabled, and SHIFT down for geometric paths?
		Should only points-on-paths be allowed and separate points-not-on-paths+the-paths-on-which-to-evaluate-them be SHIFT allowed? */
		14,	/* Variant: 1 point on any path */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Object_Genus, 1,
				PointOnPath_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ValueOfPoint_appStr, no_Embellishment), true, UIC_ConstructValueOfPointOnPath_actionProcIndex, kDynamicObjectContextMenuCompatibility >> 24, 0,

		16,	/* Variant: >1 points on any path */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 1, 
				PointOnPath_Genus, AT_LEAST(1),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, PointOnPath_Genus, 0,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ValuesOfPoints_appStr, no_Embellishment), true, UIC_ConstructValueOfPointOnPath_actionProcIndex, kDynamicObjectContextMenuCompatibility >> 24, 0,
			
		18,	/* Variant: 2 gobjects: a point and a path, and the Shift key */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3, 
				Object_Genus, 2,
				Point_Genus, 1,
				Path_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ValueOfPoint_appStr, no_Embellishment), true, ConstructGObjs, 0, 152,

		20,	/* Variant: 3 or more gobjects: >1 points and a path, and the Shift key */
			UIC_ObjSelGrammar_flagTrueCheck_ID, metaKey_selectFlag,
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Path_Genus, 1,
				Point_Genus, AT_LEAST(2),
			UIC_ObjSelGrammar_relativeGeneraPoolCheck_ID, Object_Genus, Point_Genus, 1,	
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ValuesOfPoints_appStr, no_Embellishment), true, ConstructGObjs, 0, 152,
			
		8,	/* Variant: Value of Point (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ValueOfPoint_appStr, no_Embellishment), false, 0, 0, 0,
			
	#ifdef SUPPORTS_SOUND_GENERATION
	/* Action Button: Sound */
		14, /* Variant: 1 function, nothing else => "Sound", enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 1,
				Function_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ActionButton_Sound_appStr, no_Embellishment), true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) monoSoundButton,
		
		14, /* Variant: 1 function plot, nothing else => "Sound", enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 1,
				FunctionPlot_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ActionButton_Sound_appStr, no_Embellishment), true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) monoSoundButton,

		14, /* Variant: 2 functions, nothing else => "Sound", enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2,
				Function_Genus, 2,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ActionButton_Sound_appStr, no_Embellishment), true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) stereoSoundButton,
		
		14, /* Variant: 2 function plots, nothing else => "Sound", enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Object_Genus, 2,
				FunctionPlot_Genus, 2,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ActionButton_Sound_appStr, no_Embellishment), true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) stereoSoundButton,

		16, /* Variant: 1 function plot, 1 function, nothing else => "Sound", enabled */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 3,
				Object_Genus, 2,
				FunctionPlot_Genus, 1,
				Function_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ActionButton_Sound_appStr, no_Embellishment), true, UIC_ActionButtonConstructor_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, (unsigned char) stereoSoundButton,

		8,	/* Variant: any other selection -> "Sound", disabled. */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(ActionButton_Sound_appStr, no_Embellishment), false, 0,0,0,
		
	#endif

	/* Object Context: Increase Resolution */
		10, /* Variant: >0 samplers, as well as anything else -> Increase Resolution (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, containsSamplers_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(IncreaseResolution_appStr, no_Embellishment), true, UIC_IncreaseOrDecreaseResolution_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,

		8, /* Variant:  Increase Resolution (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(IncreaseResolution_appStr, no_Embellishment), false, 0, 0, 0,

	/* Object Context: Decrease Resolution */
		10, /* Variant: >0 samplers, as well as anything else -> Increase Resolution (enabled) */
			UIC_ObjSelGrammar_flagTrueCheck_ID, containsSamplers_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DecreaseResolution_appStr, no_Embellishment), true, UIC_IncreaseOrDecreaseResolution_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1,

		8, /* Variant:  Increase Resolution (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DecreaseResolution_appStr, no_Embellishment), false, 0, 0, 0,

	/* Object Context: Increase Value */
		14, /* Variant: >0 parameters, as well as anything else -> Increase Value (enabled) */
			UIC_ObjSelGrammar_disjointGeneraPoolCheck_ID, 
				AT_LEAST(1), 3,
				ScalarParameter_Genus, AngleParameter_Genus, DistanceParameter_Genus,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(IncreaseValue_appStr, no_Embellishment), true, UIC_IncreaseOrDecreaseValue_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,

		8, /* Variant:  Increase Value (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(IncreaseValue_appStr, no_Embellishment), false, 0, 0, 0,

	/* Object Context: Decrease Value */
		14, /* Variant: >0 parameters, as well as anything else -> Increase Value (enabled) */
			UIC_ObjSelGrammar_disjointGeneraPoolCheck_ID, 
				AT_LEAST(1), 3,
				ScalarParameter_Genus, AngleParameter_Genus, DistanceParameter_Genus,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DecreaseValue_appStr, no_Embellishment), true, UIC_IncreaseOrDecreaseValue_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 1,

		8, /* Variant:  Decrease Value (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DecreaseValue_appStr, no_Embellishment), false, 0, 0, 0,
	
#ifdef SUPPORTS_CUSTOMTRANSFORMS
	/* Define Custom Transform */
		16, /* Variant: 1 point which is colorized and descends from a free point */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				Point_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_proceduralCheck_ID, PointIsColorizedFreePoint_checkID,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DefineCustomColorTransform_appStr, no_Embellishment), 
				true, UIC_DefineCustomTransform_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kColorized1PointTransform_ActionParam,

		18,	/* Variant: exactly 2 points, one of which is colorized -> Define Custom Transform */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, 2,
				Object_Genus, 2,
			UIC_ObjSelGrammar_flagTrueCheck_ID, atLeastOneColorizedObj_selectFlag,	
			UIC_ObjSelGrammar_proceduralCheck_ID, LocusDisablingIdler_checkID, 
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DefineCustomColorTransform_appStr, no_Embellishment), true, 
				UIC_DefineCustomTransform_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kColorized2PointTransform_ActionParam,
		16,	/* Variant: exactly 2 points -> Define Custom Transform */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2, 
				Point_Genus, 2,
				Object_Genus, 2,
			UIC_ObjSelGrammar_proceduralCheck_ID, LocusDisablingIdler_checkID, 
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DefineCustomTransform_appStr, no_Embellishment), true, 
				UIC_DefineCustomTransform_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, kNonColorizedTransform_ActionParam,
		/* KLOOGE: Should be enabled for two objects one of which is transformed of other; should also trigger locusJob to detect causality */
		8,	/* Variant: Define Custom Transform (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DefineCustomTransform_appStr, no_Embellishment), false, 0, 0, 0,
			
	/* Custom Transforms Placeholder */
		10,	/* Variant: n>0 geometric gobjects -> Set Custom Transforms enabled */
			UIC_ObjSelGrammar_flagTrueCheck_ID, allSelectionsAreCustomTransformPreimages_selectFlag,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(0, UpdateAllCustomTransformsEnablement_Embellishment), true, 0, 0, 0,		
		
		8,	/* Variant-> Set Custom Transforms disabled */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(0, UpdateAllCustomTransformsEnablement_Embellishment), false, 0, 0, 0,		
		
#endif

		14, /* Variant: 1 picture -> "Define Function from Picture" (enabled) */
			UIC_ObjSelGrammar_absoluteGeneraPoolCheck_ID, 2,
				ImportedPicture_Genus, 1,
				Object_Genus, 1,
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DataFunctionFromPictureEnabled_appStr, nameSelectionGroup_Embellishment), true, UIC_DataFunctionFromPicture_actionProcIndex-SELECTION_SPECIFIER_ActionProcBase, 0, 0,

		8, /* Variant:  "Define Function from Picture" (disabled) */
			UIC_ObjSelGrammar_endConditional_ID,
			BYTEPLEX(DataFunctionFromPictureDisabled_appStr, no_Embellishment), false, 0, 0, 0,

 
/*
		WARNING: As you add new specifiers OR IF YOU CHANGE THE DEFINITION OF ANY PREVIOUS
		SPECIFIER in such a way that its variant size changes, be sure to update the
		#defined list of specOffsets in uic_appr.h!
*/
#undef ConstructGObjs



};
