>
<!--
# Extensible 3D (X3D) Document Type Definition (DTD) x3d-3.0.dtd
#
# X3D Specification DTD:
#
#	http://www.web3D.org/specifications/x3d-3.0.dtd
#
#	current version:  3.0.11
#
#	revised:          31 December 2003
#
#	Author:           Don Brutzman
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.0.dtd
#	http://www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensions.dtd
#
# Final doctype:
#  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
#
# Transitional doctype:
#  <!DOCTYPE X3D PUBLIC "http://www.web3d.org/specifications/x3d-3.0.dtd" "file:///www.web3d.org/TaskGroups/x3d/translation/x3d-3.0.dtd">
#
# Typical system location for this resource:
#	file://c:/www.web3d.org/TaskGroups/x3d/translation/x3d-3.0.dtd
#	  file:///www.web3d.org/TaskGroups/x3d/translation/x3d-3.0.dtd
#
# Change log:
#	http://www.web3d.org/TaskGroups/x3d/translation/x3d-dtd-changelog.txt
#
# Further information on the Extensible 3D (X3D) specification is available at
#	http://www.web3D.org/x3d.html
-->

<!--	Profile:  default is Full profile and all components.
	Authors can override these default IGNORE/INCLUDE values.
	If InterchangeProfile or InterchangeProfile is INCLUDEd, then IGNORE all others. -->
<!ENTITY % ImmersiveProfile	"INCLUDE">
<!ENTITY % InterchangeProfile	"IGNORE">
<!ENTITY % InteractiveProfile	"IGNORE">
<!ENTITY % DISComponent 	"INCLUDE">
<!ENTITY % GeoSpatialComponent	"INCLUDE">
<!ENTITY % HAnimComponent 	"INCLUDE">
<!ENTITY % NurbsComponent 	"INCLUDE">
<!ENTITY % Web3dExtensionComponent	"INCLUDE">
<!ENTITY % X3dInputOutputFields	"INCLUDE">
<!ENTITY % X3dExtensions	"IGNORE">

<!ENTITY % profileNames "(Full|Immersive|Interactive|Interchange|Core|MPEG4Interactive)">

<!ENTITY % componentNames  "(Core|DIS|EnvironmentalEffects|EnvironmentalSensor|EventUtilities|Geometry2D|Geometry3D|Geospatial|Grouping|H-Anim|Interpolation|KeyDeviceSensor|Lighting|Navigation|Networking|NURBS|PointingDeviceSensor|Rendering|Scripting|Shape|Sound|Text|Texturing|Time)">

<!ENTITY % componentLevels "(1|2|3|4)">

<!ENTITY % X3dFieldTypes " SFBool | MFBool | SFColor | MFColor | SFColorRGBA | MFColorRGBA | SFDouble | MFDouble | SFFloat | MFFloat | SFImage | MFImage | SFInt32 | MFInt32 | SFNode | MFNode | SFRotation | MFRotation | SFString | MFString | SFTime | MFTime | SFVec2f | MFVec2f | SFVec3f | MFVec3f| SFVec3d | MFVec3d ">

<!-- X3D type definitions as DTD types -->
<!ENTITY % SFBool	"(true|false)">
<!ENTITY % MFBool	"CDATA">
<!ENTITY % SFColor	"CDATA">
<!ENTITY % MFColor	"CDATA">
<!ENTITY % SFColorRGBA	"CDATA">
<!ENTITY % MFColorRGBA	"CDATA">
<!ENTITY % SFFloat	"CDATA">
<!ENTITY % MFFloat	"CDATA">
<!ENTITY % SFDouble	"CDATA">
<!ENTITY % MFDouble	"CDATA">
<!ENTITY % SFImage	"CDATA">
<!ENTITY % MFImage	"CDATA">
<!ENTITY % SFInt32	"CDATA">
<!ENTITY % MFInt32	"CDATA">
<!ENTITY % SFRotation	"CDATA">
<!ENTITY % MFRotation	"CDATA">
<!ENTITY % SFString	"CDATA">
<!ENTITY % MFString	"CDATA">
<!ENTITY % SFTime	"CDATA">
<!ENTITY % MFTime	"CDATA">
<!ENTITY % SFVec2f	"CDATA">
<!ENTITY % MFVec2f	"CDATA">
<!ENTITY % SFVec3f	"CDATA">
<!ENTITY % MFVec3f	"CDATA">
<!ENTITY % SFVec3d	"CDATA">
<!ENTITY % MFVec3d	"CDATA">

<!ENTITY % TextureCoordinateGeneratorModes	"(SPHERE|CAMERASPACENORMAL|CAMERASPACEPOSITION|CAMERASPACEREFLECTIONVECTOR|SPHERE-LOCAL|COORD|COORD-EYE|NOISE|NOISE-EYE|SPHERE-REFLECT|SPHERE-REFLECT-LOCAL)">
<!ENTITY % MultiTextureModes		"CDATA">	<!-- MFString -->
<!ENTITY % MultiTextureSourceValues	"CDATA">	<!-- MFString -->
<!ENTITY % MultiTextureFunctionValues	"CDATA">	<!-- MFString -->

<!--	User needs to append | after listing each new node in any of these extensions.
	For an example, see examples/ProtoTagDtdDeclarationExamples.xml   -->
<!ENTITY % AppearanceNodeExtensions "">
<!ENTITY % AudioClipNodeExtensions "">
<!ENTITY % BindableNodeExtensions "">
<!ENTITY % ColorNodeExtensions "">
<!ENTITY % CoordinateNodeExtensions "">
<!ENTITY % FontStyleNodeExtensions "">
<!ENTITY % EventUtilityNodeExtensions "">
<!ENTITY % GeometryNodeExtensions "">
<!ENTITY % GroupingNodeExtensions "">
<!ENTITY % InterpolatorNodeExtensions "">
<!ENTITY % LightNodeExtensions "">
<!ENTITY % MaterialNodeExtensions "">
<!ENTITY % MetadataNodeExtensions "">
<!ENTITY % NormalNodeExtensions "">
<!ENTITY % ScriptNodeExtensions "">
<!ENTITY % SensorNodeExtensions "">
<!ENTITY % ShapeNodeExtensions "">
<!ENTITY % SoundNodeExtensions "">
<!-- MovieTexture must be able to appear twice: -->
<!ENTITY % MovieTextureNodeExtensions "">
<!ENTITY % TextureNodeExtensions "">
<!ENTITY % TextureCoordinateNodeExtensions "">
<!ENTITY % TextureTransformNodeExtensions "">
<!ENTITY % UrlNodeExtensions "">
<!ENTITY % WorldInfoNodeExtensions "">
<!-- Users defining PROTOs do not override any of the following parameter entity declarations. -->
<![%ImmersiveProfile;[
<!ENTITY % WildcardNodes       	" (ProtoInstance) " >
]]>
<![%InterchangeProfile;[
<!ENTITY % WildcardNodes       	" " >
]]>
<![%DISComponent;[
<!ENTITY % DISGroupingNodes	" EspduTransform | SignalPdu | ReceiverPdu | TransmitterPdu | " >
]]>
<![%GeoSpatialComponent;[
<!ENTITY % GeoCoordinateNode		" GeoCoordinate | " >
<!ENTITY % GeoElevationGridNode		" GeoElevationGrid | " >
<!ENTITY % GeoGroupingNodes		" GeoLocation | GeoLOD | " >
<!ENTITY % GeoMetadataNode		" GeoMetadata | " >
<!ENTITY % GeoOriginNode		" GeoOrigin | " >
<!ENTITY % GeoBehaviorNodes		" GeoPositionInterpolator | GeoTouchSensor | " >
<!ENTITY % GeoViewpointNode		" GeoViewpoint | " >
]]>
<![%HAnimComponent;[
<!ENTITY % HAnimGroupingNodes		" HAnimJoint | HAnimSegment | HAnimSite | HAnimHumanoid | " >
<!ENTITY % DisplacerNode		" HAnimDisplacer | " >
]]>
<![%NurbsComponent;[
<!ENTITY % NurbsGroupingNodes	  " Contour2D | NurbsGroup | NurbsTextureSurface | " >
<!ENTITY % NurbsGeometryNodes	  " ContourPolyline2D | NurbsCurve | NurbsCurve2D | NurbsPatchSurface | NurbsTrimmedSurface | NurbsSweptSurface | NurbsSwungSurface | " >
<!ENTITY % NurbsInterpolators	  " NurbsPositionInterpolator | NurbsOrientationInterpolator | NurbsSurfaceInterpolator | " >
<!ENTITY % NurbsControlCurveNodes " NurbsCurve | ContourPolyline2D " >
]]>

<![%Web3dExtensionComponent;[

<!ENTITY % Web3dExtensionGeometryNodes	" XvlShell | " >

]]>


<!-- otherwise set tag lists to null strings if not previously defined by DIS, GeoSpatial, HAnim, Nurbs, Web3dExtension -->
<!ENTITY % DISGroupingNodes "">
<!ENTITY % GeoCoordinateNode "">
<!ENTITY % GeoElevationGridNode "">
<!ENTITY % GeoGroupingNodes "">
<!ENTITY % GeoMetadataNode "">
<!ENTITY % GeoOriginNode "">
<!ENTITY % GeoBehaviorNodes "">
<!ENTITY % GeoViewpointNode "">
<!ENTITY % HAnimGroupingNodes "">
<!ENTITY % DisplacerNode "">
<!ENTITY % NurbsGroupingNodes "">
<!ENTITY % NurbsGeometryNodes "">
<!ENTITY % NurbsInterpolators "">
<!ENTITY % Web3dExtensionGroupingNodes "">
<!ENTITY % Web3dExtensionGeometryNodes "">
<!-- no further content-model extensions needed -->

<![%InterchangeProfile;[
<!ENTITY % AudioClipNodes "" >
<!ENTITY % FontStyleNodes "" >
<!ENTITY % EventUtilityNodes "" >
<!ENTITY % MovieTextureNodes "" >
<!ENTITY % NormalNodes "" >
<!ENTITY % ScriptNodes "" >
<!ENTITY % SoundNodes "" >
<!ENTITY % TextureCoordinateNodes "" >
<!ENTITY % TextureTransformNodes "" >
]]>

<!-- UrlNodes used by LoadSensor -->
<!ENTITY % UrlNodes " %UrlNodeExtensions; Anchor | AudioClip | ImageTexture | Inline | MovieTexture | Script ">

<!-- Declarations appearing only in ImmersiveProfile -->
<![%ImmersiveProfile;[

<!ENTITY % AudioClipNodes		" %AudioClipNodeExtensions; AudioClip " >

<!ENTITY % FontStyleNodes		" %FontStyleNodeExtensions; FontStyle " >

<!ENTITY % EventUtilityNodes		" %EventUtilityNodeExtensions; BooleanFilter | BooleanSequencer | BooleanToggle | BooleanTrigger | IntegerSequencer | IntegerTrigger | TimeTrigger " >

<!ENTITY % MovieTextureNodes		" %MovieTextureNodeExtensions; MovieTexture " >

<!ENTITY % NormalNodes			" %NormalNodeExtensions; Normal " >

<!ENTITY % ScriptNodes			" %ScriptNodeExtensions; Script " >

<!ENTITY % SoundNodes			" %SoundNodeExtensions; Sound " >

<!ENTITY % TextureCoordinateNodes	" %TextureCoordinateNodeExtensions; TextureCoordinate | TextureCoordinateGenerator | MultiTextureCoordinate | NurbsTextureCoordinate " >

<!ENTITY % TextureTransformNodes	" %TextureTransformNodeExtensions; TextureTransform | MultiTextureTransform " >
]]>

<!-- Declarations appearing differently in X3dExtensions, ImmersiveProfile and InterchangeProfile -->
<!-- X3D Extensions (superset overriding some ImmersiveProfile declarations) not yet defined. -->
<![%X3dExtensions;[

<!ENTITY % AppearanceNodeX3dExtensions "" >
<!ENTITY % GeometryNodesX3dExtensions  "" >
]]>

<!ENTITY % AppearanceNodeX3dExtensions "">
<!ENTITY % GeometryNodesX3dExtensions "">

<![%InterchangeProfile;[

<!ENTITY % AppearanceNodes  	" Appearance " >

<!ENTITY % BehaviorLeafNodes	" CoordinateInterpolator | KeySensor | OrientationInterpolator | PositionInterpolator | ScalarInterpolator | TimeSensor | TouchSensor " >

<!ENTITY % BindableNodes    	" Background | NavigationInfo | Viewpoint " >

<!ENTITY % ColorNodes       	" Color | ColorRGBA " >

<!ENTITY % CoordinateNodes  	" Coordinate | CoordinateDouble " >

<!ENTITY % GeometryNodes    	" IndexedFaceSet | IndexedLineSet | LineSet | PointSet " >

<!ENTITY % GroupingNodes    	" Anchor | Group | Inline | Transform " >

<!ENTITY % LightNodes       	" DirectionalLight " >

<!ENTITY % MaterialNodes    	" Material " >

<!ENTITY % ShapeNodes       	" Shape " >

<!ENTITY % TextureNodes     	" ImageTexture " >

<!ENTITY % WorldInfoNodes   	" WorldInfo " >
]]>

<![%ImmersiveProfile;[

<!ENTITY % AppearanceNodes  	" %AppearanceNodeExtensions; %AppearanceNodeX3dExtensions; Appearance " >

<!ENTITY % BehaviorLeafNodes	" %InterpolatorNodeExtensions; %SensorNodeExtensions; %ScriptNodeExtensions; %GeoBehaviorNodes; %DisplacerNode; %NurbsInterpolators; %EventUtilityNodes; | ColorInterpolator | CoordinateInterpolator | CoordinateInterpolator2D | CylinderSensor |  KeySensor | LoadSensor | NormalInterpolator | OrientationInterpolator | PlaneSensor | PositionInterpolator | PositionInterpolator2D | ProximitySensor | ScalarInterpolator | Script | SphereSensor | StringSensor | TimeSensor | TouchSensor | VisibilitySensor " >

<!ENTITY % BindableNodes    	" %BindableNodeExtensions; %GeoViewpointNode; Background | Fog | NavigationInfo | TextureBackground | Viewpoint " >

<!ENTITY % ColorNodes       	" %ColorNodeExtensions; Color | ColorRGBA " >

<!ENTITY % CoordinateNodes  	" %CoordinateNodeExtensions; %GeoCoordinateNode; Coordinate | CoordinateDouble " >
]]>

<![%ImmersiveProfile;[

<!ENTITY % Geometry2DNodes    	" Arc2D | ArcClose2D | Circle2D | Disk2D | Polyline2D | Polypoint2D | Rectangle2D | TriangleSet2D " >

<!ENTITY % GeometryNodes    	" %GeometryNodeExtensions; %GeometryNodesX3dExtensions; %GeoElevationGridNode; %NurbsGeometryNodes; %Web3dExtensionGeometryNodes; %Geometry2DNodes; | Box | Cone | Cylinder | ElevationGrid | Extrusion | IndexedFaceSet | IndexedLineSet | LineSet | PointSet | Sphere | Text | IndexedTriangleFanSet | IndexedTriangleSet | IndexedTriangleStripSet | TriangleFanSet | TriangleSet | TriangleStripSet " >

<!ENTITY % GroupingNodes    	" %GroupingNodeExtensions; %DISGroupingNodes; %GeoGroupingNodes; %HAnimGroupingNodes; %NurbsGroupingNodes; %Web3dExtensionGroupingNodes; Anchor | Billboard | Collision | Group | Inline | LOD | StaticGroup | Switch | Transform " >

<!ENTITY % LightNodes       	" %LightNodeExtensions; DirectionalLight | SpotLight | PointLight " >

<!ENTITY % MaterialNodes    	" %MaterialNodeExtensions; Material " >

<!ENTITY % ShapeNodes       	" %ShapeNodeExtensions; Shape " >

<!ENTITY % TextureNodes     	" %TextureNodeExtensions; ImageTexture | MovieTexture | MultiTexture | PixelTexture " > <!--| CompositeTexture3D -->

<!ENTITY % MultiTextureChildTextures " %TextureNodeExtensions; ImageTexture | MovieTexture | PixelTexture " >

<!ENTITY % WorldInfoNodes   	  " %WorldInfoNodeExtensions; %GeoMetadataNode; WorldInfo " >
]]>

<!ENTITY % MetadataNodes " %MetadataNodeExtensions; MetadataDouble | MetadataFloat | MetadataInteger | MetadataSet | MetadataString ">

<![%InterchangeProfile;[

<!ENTITY % GeometricPropertyNodes " %ColorNodes; " >

<!ENTITY % AppearanceChildNodes	" %MaterialNodes; " >

<!ENTITY % SceneLeafNodes   	" %LightNodes; | %ShapeNodes; | %WorldInfoNodes; " >

<!ENTITY % ProtoNodes       	"" >
]]>

<![%ImmersiveProfile;[

<!ENTITY % GeometricPropertyNodes " %CoordinateNodes; | %ColorNodes; | %NormalNodes; | %TextureCoordinateNodes; " >

<!ENTITY % AppearanceChildNodes	" %MaterialNodes; | %TextureNodes; | %TextureTransformNodes; " >

<!ENTITY % SceneLeafNodes   	" %GeoOriginNode; %LightNodes; | %ShapeNodes; | %SoundNodes; | %WorldInfoNodes; " >

<!ENTITY % OtherLeafNodes   	" AudioClip | LineProperties | FillProperties " >

<!ENTITY % ProtoNodes       	" %OtherLeafNodes; | %AppearanceNodes; | %AppearanceChildNodes; | %BehaviorLeafNodes; | %BindableNodes; | %FontStyleNodes; | %GeometricPropertyNodes; | %GeometryNodes; | %GroupingNodes; | %SceneLeafNodes; | ProtoDeclare | ProtoInstance " >
]]>

<![%InterchangeProfile;[

<!ENTITY % ChildrenNodes	" %BehaviorLeafNodes; | %BindableNodes; | %GroupingNodes; | %SceneLeafNodes; | ROUTE | EXPORT | IMPORT " >

<!ENTITY % SceneNodes       	" %ChildrenNodes; | %WildcardNodes; " >
]]>

<![%ImmersiveProfile;[

<!ENTITY % ChildrenNodes    	" %BehaviorLeafNodes; | %BindableNodes; | %GroupingNodes; | %SceneLeafNodes; | ROUTE | EXPORT | IMPORT " >

<!-- need any order for prototypes -->

<!ENTITY % SceneNodes       	" ExternProtoDeclare | ProtoDeclare | %ChildrenNodes; | %WildcardNodes; " >
]]>

<!ENTITY % AllVRML97Nodes " Anchor|Appearance|AudioClip|Background|BooleanFilter|BooleanSequencer|BooleanToggle|BooleanTrigger|Billboard|Box|Collision|Color|ColorInterpolator|Cone|Coordinate|CoordinateDouble|CoordinateInterpolator|Cylinder|CylinderSensor|DirectionalLight|ElevationGrid|Extrusion|FillProperties|Fog|FontStyle|Group|head|ImageTexture|IndexedFaceSet|IndexedLineSet|Inline|IntegerSequencer|IntegerTrigger|KeySensor|LineProperties|LineSet|LOD|Material|MovieTexture|MultiTextureCoordinate|NavigationInfo|Normal|NormalInterpolator|OrientationInterpolator|PixelTexture|PlaneSensor|PointLight|PointSet|PositionInterpolator|ProximitySensor|ScalarInterpolator|Scene|Script|Shape|Sound|Sphere|SphereSensor|SpotLight|StringSensor|StaticGroup|Switch|Text|TextureBackground|TextureCoordinate|TextureCoordinateGenerator|TextureTransform|TimeSensor|TimeTrigger|TouchSensor|Transform|TriangleFanSet|TriangleSet|TriangleStripSet|Viewpoint|VisibilitySensor|PositionInterpolator2D|CoordinateInterpolator2D|WorldInfo ">
<!ENTITY % AllGeoSpatialTags " GeoCoordinate|GeoElevationGrid|GeoLocation|GeoLOD|GeoMetadata|GeoOrigin|GeoPositionInterpolator|GeoTouchSensor|GeoViewpoint ">
<!ENTITY % AllHAnimTags " HAnimDisplacer|HAnimHumanoid|HAnimJoint|HAnimSegment|HAnimSite ">
<!-- SensorNodes not used (yet, anyway) in tagset content-model definitions. -->
<!ENTITY % SensorNodes " Anchor | Collision | CylinderSensor | KeySensor | PlaneSensor | ProximitySensor | SphereSensor | StringSensor | TimeSensor | TouchSensor | VisibilitySensor ">
<!ENTITY % DragSensors " CylinderSensor | PlaneSensor | SphereSensor ">
<!ENTITY % EnvironmentalSensorNodes " Collision | ProximitySensor | TimeSensor | VisibilitySensor ">
<!ENTITY % PointingDeviceSensors " Anchor | CylinderSensor | PlaneSensor | SphereSensor | TouchSensor ">
<!ENTITY % KeyDeviceSensors " ">
<!ENTITY % InterpolatorNodes " ColorInterpolator | CoordinateInterpolator | CoordinateInterpolator2D | NormalInterpolator | OrientationInterpolator | PositionInterpolator | PositionInterpolator2D | ScalarInterpolator ">
<!ENTITY % TimeDependentNodes " AudioClip | MovieTexture | TimeSensor ">

<!-- ****************************** X3D DTD ****************************** -->
<![%ImmersiveProfile;[

<!ELEMENT Anchor (IS?, (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* ) >
<!ATTLIST Anchor 
	description %SFString; #IMPLIED
	parameter   %MFString; #IMPLIED
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED 
	USE         IDREF      #IMPLIED >
]]>
<![%InterchangeProfile;[

<!ELEMENT Anchor (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* > 
<!ATTLIST Anchor 
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED 
	USE         IDREF      #IMPLIED >
]]>
<![%ImmersiveProfile;[

<!-- Complete, unordered, concisely enumerated version of Appearance by Heiko Grussbach.  Prepended either-order FillProperties/LineProperties. -->
<!ELEMENT Appearance (IS?, (%MetadataNodes;)?,
(  (FillProperties, LineProperties?) | (LineProperties, FillProperties)? )?,
(  ((%MaterialNodes;), (((%TextureNodes;),((%TextureTransformNodes;)|%WildcardNodes;)?) |
			((%TextureTransformNodes;),((%TextureNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%TextureNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) )? )
 | ((%TextureNodes;), (	((%MaterialNodes;),((%TextureTransformNodes;)|%WildcardNodes;)?) |
			((%TextureTransformNodes;),((%MaterialNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) )? )
 | ((%TextureTransformNodes;), (((%MaterialNodes;),((%TextureNodes;)|%WildcardNodes;)?) |
			((%TextureNodes;),((%MaterialNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%TextureNodes;)|%WildcardNodes;)?) )? )
 | (%WildcardNodes;, (	((%MaterialNodes;),((%TextureNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) |
			((%TextureNodes;),((%MaterialNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) |
			((%TextureTransformNodes;),((%MaterialNodes;)|(%TextureNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%TextureNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) )? )
)? ) >
]]>
<![%InterchangeProfile;[

<!ELEMENT Appearance ( (%MetadataNodes;)?, 
(  ((%MaterialNodes;), (%TextureNodes;)?  )
 | ((%TextureNodes;),  (%MaterialNodes;)? )
)? ) > 
]]>
<!ATTLIST Appearance
	containerField NMTOKEN "appearance"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT AudioClip ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST AudioClip
	description %SFString; #IMPLIED
	loop        %SFBool;   "false"
	pitch       %SFFloat;  "1.0"
	startTime   %SFTime;   "0"
	stopTime    %SFTime;   "0"
	pauseTime   %SFTime;   "0"
	resumeTime  %SFTime;   "0"
	url         %MFString; #IMPLIED
	containerField NMTOKEN "source"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED>
]]>
<!ELEMENT Background ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Background
	groundAngle %MFFloat; #IMPLIED
	groundColor %MFColor; #IMPLIED
	backUrl %MFString; #IMPLIED
	bottomUrl %MFString; #IMPLIED
	frontUrl %MFString; #IMPLIED
	leftUrl %MFString; #IMPLIED
	rightUrl %MFString; #IMPLIED
	topUrl %MFString; #IMPLIED
	skyAngle %MFFloat; #IMPLIED
	skyColor %MFColor; "0 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT Billboard (IS?, (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* ) >
<!ATTLIST Billboard
	axisOfRotation %SFVec3f; "0 1 0"
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class	 CDATA     #IMPLIED
	DEF            ID        #IMPLIED 
	USE            IDREF     #IMPLIED>

<!ELEMENT BooleanFilter ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanFilter
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFFloat; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanToggle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanToggle
	toggle      %SFBool;  "false"
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanTrigger
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[

<!-- Geometry2D nodes -->

<!ELEMENT Arc2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Arc2D
	radius     %SFFloat; "1"
	startAngle %SFFloat; "0"
	endAngle   %SFFloat; "1.570796"
	containerField NMTOKEN "geometry"
	class      CDATA    #IMPLIED
	DEF  ID    #IMPLIED 
	USE  IDREF #IMPLIED>

<!ELEMENT ArcClose2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ArcClose2D
	radius      %SFFloat; "1"
	startAngle  %SFFloat; "0"
	endAngle    %SFFloat; "1.570796"
	closureType (PIE|CHORD) "PIE"
	containerField NMTOKEN "geometry"
	class       CDATA    #IMPLIED
	DEF  ID     #IMPLIED 
	USE  IDREF  #IMPLIED>

<!ELEMENT Circle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Circle2D
	radius     %SFFloat; "1"
	containerField NMTOKEN "geometry"
	class      CDATA    #IMPLIED
	DEF  ID    #IMPLIED 
	USE  IDREF #IMPLIED>

<!ELEMENT Disk2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Disk2D
	innerRadius %SFFloat; "0"
	outerRadius %SFFloat; "1"
	containerField NMTOKEN "geometry"
	class       CDATA    #IMPLIED
	DEF  ID     #IMPLIED 
	USE  IDREF  #IMPLIED>

<!ELEMENT Polyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polyline2D
	lineSegments %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED 
	USE  IDREF   #IMPLIED>

<!ELEMENT Polypoint2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polypoint2D
	points       %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED 
	USE  IDREF   #IMPLIED>

<!ELEMENT Rectangle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Rectangle2D
	size         %SFVec2f; "2 2"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED 
	USE  IDREF   #IMPLIED>

<!ELEMENT TriangleSet2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TriangleSet2D
	vertices     %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED 
	USE  IDREF   #IMPLIED>
]]>
<![%ImmersiveProfile;[

<!ELEMENT Box ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Box
	size %SFVec3f; "2 2 2"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF  ID        #IMPLIED 
	USE  IDREF     #IMPLIED>

<!ELEMENT Collision ( (IS?), (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* )  >
<!ATTLIST Collision
	enabled     %SFBool;  "true"
	bboxCenter  %SFVec3f; "0 0 0"
	bboxSize    %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF         ID        #IMPLIED 
	USE         IDREF     #IMPLIED >
]]>
<!ELEMENT Color ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Color
	color %MFColor; #IMPLIED
	class CDATA #IMPLIED
	containerField NMTOKEN "color"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ColorRGBA ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ColorRGBA
	color %MFColorRGBA; #IMPLIED
	containerField NMTOKEN "color"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT component EMPTY>
<!ATTLIST component
	name  %componentNames;  #REQUIRED
	level %componentLevels; #REQUIRED
>

<![%ImmersiveProfile;[

<!ELEMENT ColorInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ColorInterpolator
	key         %MFFloat; #IMPLIED
	keyValue    %MFColor; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT Cone ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cone
	bottomRadius %SFFloat; "1"
	height       %SFFloat; "2"
	side         %SFBool;  "true"
	bottom       %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Coordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Coordinate
	point %MFVec3f; #IMPLIED
	containerField NMTOKEN "coord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateDouble ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateDouble
	point %MFVec3d; #IMPLIED
	containerField NMTOKEN "coord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT CoordinateInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CoordinateInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT Cylinder ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cylinder 
	bottom   %SFBool; "true"
	height   %SFFloat; "2"
	radius   %SFFloat; "1"
	side     %SFBool;  "true"
	top      %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT CylinderSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CylinderSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	diskAngle  %SFFloat;    "0.26179167"
	maxAngle   %SFFloat;    "-1"
	minAngle   %SFFloat;    "0"
	offset     %SFFloat;    "0"
	enabled    %SFBool;     "true"
	containerField NMTOKEN "children"
	class	CDATA     #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>

<!ELEMENT DirectionalLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST DirectionalLight
	ambientIntensity %SFFloat; "0"
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[

<!ELEMENT DirectionalLight (%MetadataNodes;)? >
<!ATTLIST DirectionalLight
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[

<!-- Complete, concisely enumerated unordered version of ElevationGrid by Heiko Grussbach -->
<!ELEMENT ElevationGrid (IS?, (%MetadataNodes;)?, (
   ((%ColorNodes;), (		((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 | ((%NormalNodes;), (		((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 | ((%TextureCoordinateNodes;), (((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 | (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
)? ) >

<!ATTLIST ElevationGrid
	height          %MFFloat; #IMPLIED
	ccw             %SFBool;  "true"
	colorPerVertex  %SFBool;  "true"
	creaseAngle     %SFFloat; "0"
	normalPerVertex %SFBool;  "true"
	solid           %SFBool;  "true"
	xDimension      %SFInt32; "0"
	xSpacing        %SFFloat; "1.0"
	zDimension      %SFInt32; "0"
	zSpacing        %SFFloat; "1.0"
	containerField NMTOKEN "geometry"
	class	  CDATA     #IMPLIED
	DEF             ID        #IMPLIED
	USE             IDREF     #IMPLIED>

<!ELEMENT ExternProtoDeclare ( field* ) >
<!ATTLIST ExternProtoDeclare
	name		NMTOKEN		#REQUIRED
	url		%MFString;	#REQUIRED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT Extrusion ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Extrusion
	beginCap     %SFBool;     "true"
	ccw          %SFBool;     "true"
	convex       %SFBool;     "true"
	creaseAngle  %SFFloat;    "0.0"
	crossSection %MFVec2f;    "1 1 1 -1 -1 -1 -1 1 1 1"
	endCap       %SFBool;     "true"
	orientation  %MFRotation; "0 0 1 0"
	scale        %MFVec2f;    "1 1"
	solid        %SFBool;     "true"
	spine        %MFVec3f;    "0 0 0 0 1 0"
	containerField NMTOKEN "geometry"
	class        CDATA        #IMPLIED
	DEF          ID           #IMPLIED
	USE          IDREF        #IMPLIED>

<!-- field is only used in a Script, ProtoDeclare or ExternProtoDeclare.
     Initialization values for simple types go in the value attribute.
     Contained content tags are only for initialization of Node or Nodes. -->

<!ELEMENT field  ( %ProtoNodes; )* >
<!ATTLIST field
	name       	NMTOKEN  	#REQUIRED
	accessType (inputOnly | outputOnly | initializeOnly | inputOutput) #REQUIRED
	type 	   ( %X3dFieldTypes; ) #REQUIRED
	value      	CDATA   	#IMPLIED
  	xml:space  (default | preserve)	"default"
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>


<!-- fieldValue resets default field values inside a ProtoInstance.
     Initialization values for simple types go in the value attribute.  Otherwise
     contained-content tags are used for initialization of SFNode or MFNode values. -->

<!ELEMENT fieldValue ( %ProtoNodes; )* > 
<!ATTLIST fieldValue
	name	NMTOKEN	#REQUIRED
	value	CDATA	#IMPLIED>
]]>
<![%ImmersiveProfile;[

<!ELEMENT FillProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FillProperties
	filled   %SFBool;   "true"
	hatched  %SFBool;   "true"
	hatchStyle  %SFInt32;      "1"
	hatchColor  %SFColor;      "1 1 1"
	containerField NMTOKEN "fillProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT Fog ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Fog
	color           %SFColor;            "1 1 1"
	fogType         (LINEAR|EXPONENTIAL) "LINEAR"
	visibilityRange %SFFloat;            "0"
	containerField NMTOKEN "children"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT FontStyle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FontStyle
	family      %MFString; '&quot;SERIF&quot;'
	horizontal  %SFBool;   "true"
	justify     %MFString; '&quot;BEGIN&quot;'
	language    %SFString; #IMPLIED
	leftToRight %SFBool;   "true"
	size        %SFFloat;  "1.0"
	spacing     %SFFloat;  "1.0"
	style       (PLAIN|BOLD|ITALIC|BOLDITALIC) "PLAIN"
	topToBottom %SFBool;   "true"
	containerField NMTOKEN "fontStyle"
	class       CDATA       #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>

<!-- Minimum supported values mentioned in VRML 97 specification
	family      ' "SERIF" "SANS" "TYPEWRITER" '
	justify     ' "FIRST" "BEGIN" "MIDDLE" "END" '       -->
]]>
<!ELEMENT Group (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Group
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ImageTexture ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ImageTexture
	url %MFString; #IMPLIED
	repeatS %SFBool; "true"
	repeatT %SFBool; "true"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- Complete, unordered, concisely enumerated version of IndexedFaceSet content model by Heiko Grussbach -->
<!ENTITY % ColorCoordinateNormalTextureCoordinateContentModel "(IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	((%CoordinateNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	   			(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
 | ((%CoordinateNodes;), (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
 | ((%NormalNodes;),  (
 	((%ColorNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
 | ((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
 | (%WildcardNodes;,  (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)?  )">
<![%ImmersiveProfile;[

<!ELEMENT IndexedFaceSet ( %ColorCoordinateNormalTextureCoordinateContentModel; ) >

<!ELEMENT IndexedLineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;) | %WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;) | %WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;) | (%CoordinateNodes;) | %WildcardNodes;)?)
)? ) >

<!ELEMENT LineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;) | %WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;) | %WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;) | (%CoordinateNodes;) | %WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[

<!ELEMENT IndexedFaceSet ( (%MetadataNodes;)?, ((%ColorNodes;), Coordinate?) | (Coordinate, (%ColorNodes;)?) )? >

<!ELEMENT IndexedLineSet ( (%MetadataNodes;)?, ( Color, Coordinate? ) | ( Coordinate, Color?) )? >

<!ELEMENT LineSet ( (%MetadataNodes;)?, ( Color, Coordinate? ) | ( Coordinate, Color?) )? >
]]>
<!ATTLIST IndexedFaceSet
	ccw %SFBool; "true"
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	convex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	creaseAngle %SFFloat; "0"
	normalIndex %MFInt32; #IMPLIED
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	texCoordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ATTLIST IndexedLineSet
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ATTLIST LineSet
	lineCount %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Inline ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Inline
	load %SFBool; "true"
	url %MFString; #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT EXPORT EMPTY>
<!ATTLIST EXPORT
	localDEF IDREF #REQUIRED
	AS NMTOKEN #IMPLIED
>
<!ELEMENT IMPORT EMPTY>
<!ATTLIST IMPORT
	InlineDEF IDREF #REQUIRED
	importedDEF NMTOKEN #REQUIRED
	AS ID #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT IntegerSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFFloat; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IntegerTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerTrigger
	integerKey   %SFInt32; "-1"
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IS (connect)+ >

<!ELEMENT connect EMPTY >
<!ATTLIST connect 
	nodeField   NMTOKEN #REQUIRED
	protoField  NMTOKEN #REQUIRED>
]]>
<!ELEMENT KeySensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST KeySensor
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT LineProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST LineProperties
	applied %SFBool; "true"
	linetype %SFInt32; "1"
	linewidthScaleFactor %SFFloat; "0"
	containerField NMTOKEN "lineProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>
]]>
<!ELEMENT LoadSensor (IS?, (%MetadataNodes;)?, (%UrlNodes; | %WildcardNodes;)*)>
<!ATTLIST LoadSensor
	enabled %SFBool; "true"
	timeOut %SFTime; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT LOD (IS?, (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* ) >
<!ATTLIST LOD
	center %SFVec3f; "0 0 0"
	range  %MFFloat; #IMPLIED
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT Material ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Material
	ambientIntensity %SFFloat; "0.2"
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	shininess        %SFFloat; "0.2"
	specularColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       CDATA          #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[

<!ELEMENT Material ( (%MetadataNodes;)? ) >
<!ATTLIST Material
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       	 CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<!-- *** XHTML exerpts to define meta tag *** -->
<!-- i18n, language, meta tag definitions from XHTML 1.0
     http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd -->
<!ENTITY % LanguageCode "NMTOKEN">
<!-- a language code, as per [IETF RFC3066/BCP47] ftp://ftp.isi.edu/in-notes/bcp/bcp47.txt -->
<!-- internationalization attributes
  lang        language code (backwards compatible)
  xml:lang    language code (as per XML 1.0 spec)
  dir         direction for weak/neutral text
-->
<!ENTITY % i18n "lang        %LanguageCode; #IMPLIED
  xml:lang    %LanguageCode; #IMPLIED
  dir         (ltr|rtl)      #IMPLIED">
<!ELEMENT head (component*, meta*)>
<!-- generic metadata information, matches HTML usage, made attribute 'name' required -->
<!ELEMENT meta EMPTY>
<!ATTLIST meta
	http-equiv CDATA #IMPLIED
	name CDATA #REQUIRED
	content CDATA #REQUIRED
	scheme CDATA #IMPLIED
	%i18n; 
>
<!-- formal X3D Metadata nodes -->
<!ELEMENT MetadataDouble (IS?, (%MetadataNodes;)?)>
<!ATTLIST MetadataDouble
	name %SFString; #IMPLIED
	value %MFDouble; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataFloat (IS?, (%MetadataNodes;)?)>
<!ATTLIST MetadataFloat
	name %SFString; #IMPLIED
	value %MFFloat; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataInteger (IS?, (%MetadataNodes;)?)>
<!ATTLIST MetadataInteger
	name %SFString; #IMPLIED
	value %MFInt32; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataString (IS?, (%MetadataNodes;)?)>
<!ATTLIST MetadataString
	name %SFString; #IMPLIED
	value %MFString; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- containerField discriminates whether child Metadata node(s) are 'metadata' or 'value' fields.
	NMTOKEN vice enumeration, since containerField might have another value as field in a ProtoInstance. -->
<!ELEMENT MetadataSet (IS?, (%MetadataNodes;)*)>
<!ATTLIST MetadataSet
	reference %SFString; #IMPLIED
	name %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- FAQ:  MovieTexture
	containerField='source'  when used as a Sound source,
	containerField='texture' when used as a Appearance texture source-->
<![%ImmersiveProfile;[

<!ELEMENT MovieTexture ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST MovieTexture
	loop      %SFBool;   "false"
	speed     %SFFloat;  "1.0"
	startTime %SFTime;   "0"
	stopTime  %SFTime;   "0"
	url       %MFString; #IMPLIED
	repeatS   %SFBool;   "true"
	repeatT   %SFBool;   "true"
	pauseTime %SFTime;   "0"
	resumeTime %SFTime;  "0"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTexture ( (IS?), (%MetadataNodes;)?, (
   ((%MultiTextureChildTextures;)+, (%TextureTransformNodes;)*  )
 | ((%TextureTransformNodes;)+, (%MultiTextureChildTextures;)* )
)? ) >

<!ATTLIST MultiTexture
	mode           %MultiTextureModes;		#IMPLIED
	source         %MultiTextureFunctionValues;	#IMPLIED
	function       %MultiTextureSourceValues;	#IMPLIED
	color          %SFColor;  "1 1 1"
	alpha          %SFFloat;  "1.0"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTextureCoordinate ((IS?), (%MetadataNodes;)?, (TextureCoordinate | TextureCoordinateGenerator)* ) >
<!ATTLIST MultiTextureCoordinate
	containerField NMTOKEN "texCoord"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>
]]>
<!ELEMENT NavigationInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST NavigationInfo
	avatarSize %MFFloat; "0.25 1.6 0.75"
	headlight %SFBool; "true"
	speed %SFFloat; "1"
	type %MFString; "&quot;EXAMINE&quot; &quot;ANY&quot;"
	visibilityLimit %SFFloat; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT Normal ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Normal
	vector    %MFVec3f; #IMPLIED
	containerField NMTOKEN "normal"
	class	  CDATA     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>

<!ELEMENT NormalInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NormalInterpolator
	key      %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<!ELEMENT OrientationInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST OrientationInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFRotation; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT PixelTexture ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PixelTexture 
	image   %SFImage; "0 0 0"
	repeatS %SFBool;  "true"
	repeatT %SFBool;  "true"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF     ID        #IMPLIED
	USE     IDREF     #IMPLIED>

<!ELEMENT PlaneSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PlaneSensor
	description %SFString; #IMPLIED
	autoOffset  %SFBool;  "true"
	enabled     %SFBool;  "true"
	maxPosition %SFVec2f; "-1 -1"
	minPosition %SFVec2f; "0 0"
	offset      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT PointLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PointLight
	ambientIntensity %SFFloat;	"0"
	attenuation      %SFVec3f;	"1 0 0"
	color            %SFColor;	"1 1 1"
	intensity        %SFFloat;	"1"
	location         %SFVec3f;	"0 0 0"
	on               %SFBool;	"true"
	radius	 	 %SFFloat;	"100"
	containerField NMTOKEN "children"
	class	   CDATA    	#IMPLIED
	DEF	  	 ID		#IMPLIED
	USE		 IDREF		#IMPLIED>

<!ELEMENT PointSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;) | %WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;) | %WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;) | (%CoordinateNodes;) | %WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[

<!ELEMENT PointSet ( (%MetadataNodes;)?, ( ( Color, Coordinate? ) | ( Coordinate, Color? ) )? ) >
]]>
<!ATTLIST PointSet
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST PositionInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT PositionInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PositionInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[

<!ELEMENT ProtoInterface ( field+ ) >

<!-- choice of required first node contained in ProtoBody constrained by valid ( %ProtoNodes; ) rather than %SceneNodes; ) >  -->

<!ELEMENT ProtoBody      ( ( %ProtoNodes; ), ( %SceneNodes; )* ) >

<!-- include previous and proposed forms until content is updated and evaluated.  work in progress. -->

<!ELEMENT ProtoDeclare (ProtoInterface? , ProtoBody) > <!-- ( | ( field*, ( %ProtoNodes; ), ( %SceneNodes; )* )) -->
<!ATTLIST ProtoDeclare
	name 		NMTOKEN   	#REQUIRED
	appinfo		%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT ProtoInstance ( fieldValue*, IS? ) >
<!-- ( %SceneNodes; )* --><!-- direct children disallowed, let fieldValue name="children" handle them -->
<!ATTLIST ProtoInstance
	name     NMTOKEN           #REQUIRED
	containerField NMTOKEN "children"
	class	CDATA        #IMPLIED
	DEF      ID                #IMPLIED
	USE      IDREF             #IMPLIED>

<!ELEMENT ProximitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ProximitySensor
	center      %SFVec3f;    "0 0 0"
	size        %SFVec3f;    "0 0 0"
	enabled     %SFBool;     "true"
	containerField NMTOKEN "children"
	class       CDATA        #IMPLIED
	DEF         ID           #IMPLIED
	USE         IDREF        #IMPLIED>
]]>
<!ELEMENT ROUTE EMPTY>
<!ATTLIST ROUTE
	fromNode IDREF #REQUIRED
	fromField NMTOKEN #REQUIRED
	toNode IDREF #REQUIRED
	toField NMTOKEN #REQUIRED
>
<!ELEMENT ScalarInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ScalarInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFFloat; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Scene (%SceneNodes;)*>
<!-- Script is similar to PROTO regarding user definition of multiple fields -->
<![%ImmersiveProfile;[

<!-- script code should be included as CDATA sections.  watch out on content-model order, originally ( #PCDATA | field )* -->
<!-- can this mixed model be further tighted to allow only one IS, following zero or more field tags, prior to PCDATA?  
<!ELEMENT Script ( #PCDATA | field | IS )* >
<!ELEMENT Script ( (%MetadataNodes;)?, field*, IS?, #PCDATA ) >  

<!ELEMENT Script ( #PCDATA | (%MetadataNodes;)? | field* | IS? ) >

<!ELEMENT Script ( #PCDATA | MetadataDouble | MetadataFloat | MetadataInteger | MetadataSet | MetadataString | field | IS )* >
 -->

<!ELEMENT Script ( #PCDATA | %MetadataNodes; | field | IS )* >

<!ATTLIST Script
	url          %MFString; #IMPLIED
	directOutput %SFBool; "false"
	mustEvaluate %SFBool; "false"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
  	xml:space    (default | preserve) #FIXED "preserve"
  	DEF ID       #IMPLIED
	USE IDREF    #IMPLIED>

<!ELEMENT Shape (IS?, (%MetadataNodes;)?, (
     ( (%AppearanceNodes;), (( %GeometryNodes; ) | %WildcardNodes;)? ) |
     ( ( %GeometryNodes; ), ((%AppearanceNodes;) | %WildcardNodes;)? ) |
     ( %WildcardNodes;, (( %GeometryNodes; ) | (%AppearanceNodes;) | %WildcardNodes;)? )
)? ) >
]]>
<![%InterchangeProfile;[

<!ELEMENT Shape ( (%MetadataNodes;)?,
	( (%AppearanceNodes;), ( %GeometryNodes; )? ) |
	( ( %GeometryNodes; ), (%AppearanceNodes;)? )
)? >
]]>
<!ATTLIST Shape
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT Sound (IS?, (%MetadataNodes;)?, ( %AudioClipNodes; | %MovieTextureNodes; | %WildcardNodes; ) ) >
<!ATTLIST Sound
	direction  %SFVec3f; "0 0 1"
	intensity  %SFFloat; "1"
	location   %SFVec3f; "0 0 0"
	maxBack    %SFFloat; "10"
	maxFront   %SFFloat; "10"
	minBack    %SFFloat; "1"
	minFront   %SFFloat; "1"
	priority   %SFFloat; "0"
	spatialize %SFBool;  "true"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT Sphere ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Sphere
	radius %SFFloat; "1"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT SphereSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SphereSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	enabled    %SFBool;     "true"
	offset     %SFRotation; "0 1 0 0"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>
]]>
<![%ImmersiveProfile;[

<!ELEMENT SpotLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SpotLight
	ambientIntensity %SFFloat; "0"
	attenuation      %SFVec3f; "1 0 0"
	beamWidth        %SFFloat; "1.570796"
	color            %SFColor; "1 1 1"
	cutOffAngle      %SFFloat; "0.785398"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	location         %SFVec3f; "0 0 0"
	on               %SFBool;  "true"
	radius           %SFFloat; "100"
	containerField NMTOKEN "children"
	class	   CDATA    #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>

<!ELEMENT StaticGroup (IS?, (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* ) >
<!ATTLIST StaticGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize   %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT StringSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST StringSensor 
	enabled			%SFBool;	"true"
	deletionAllowed 	%SFBool;	"true"
	containerField NMTOKEN "children"
	class			CDATA    #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!ELEMENT Switch (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Switch
	whichChoice %SFInt32; "-1"
	containerField NMTOKEN "children"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT Text (IS?, (%MetadataNodes;)?, ( (%FontStyleNodes;)? | %WildcardNodes; ) ) >
<!ATTLIST Text
	string    %MFString; #IMPLIED
	length    %MFFloat;  #IMPLIED
	maxExtent %SFFloat;  "0.0"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!-- backTexture, bottomTexture, frontTexture, leftTexture, rightTexture, topTexture; could use rule for 0..6 children here -->

<!ELEMENT TextureBackground (IS?, (%MetadataNodes;)?, (%TextureNodes;)* )>
<!ATTLIST TextureBackground
	groundAngle  %MFFloat;  #IMPLIED
	groundColor  %MFColor;  #IMPLIED
	skyAngle     %MFFloat;  #IMPLIED
	skyColor     %MFColor;  "0 0 0"
	transparency %MFFloat;  "0"
	containerField NMTOKEN "children"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED 
	USE          IDREF      #IMPLIED >
]]>
<!ELEMENT TextureCoordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate
	point %MFVec2f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT TextureCoordinateGenerator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureCoordinateGenerator
	mode      %TextureCoordinateGeneratorModes;  "SPHERE"
	parameter %MFFloat;  #IMPLIED
	containerField NMTOKEN "texCoord"
	class       CDATA    #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>
	
<!ELEMENT TextureTransform ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransform
	center      %SFVec2f; "0 0"
	rotation    %SFFloat; "0"
	scale       %SFVec2f; "1 1"
	translation %SFVec2f; "0 0"
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>
	
<!ELEMENT MultiTextureTransform ((IS?), (TextureTransform)* ) >
<!ATTLIST MultiTextureTransform
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

]]>
<!ELEMENT TimeSensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TimeSensor
	cycleInterval %SFTime; "1.0"
	enabled %SFBool; "true"
	loop %SFBool; "false"
	startTime %SFTime; "0"
	stopTime %SFTime; "0"
	pauseTime %SFTime; "0"
	resumeTime %SFTime; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[

<!ELEMENT TimeTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TimeTrigger
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT TouchSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TouchSensor
	description %SFString; #IMPLIED
	enabled      %SFBool;  "true"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Transform (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Transform
	center %SFVec3f; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- Triangle*Set nodes are Immersive profile -->

<!ELEMENT IndexedTriangleFanSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST IndexedTriangleFanSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT IndexedTriangleSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST IndexedTriangleSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT IndexedTriangleStripSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST IndexedTriangleStripSet
	index %MFInt32; #IMPLIED
	stripCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleFanSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST TriangleFanSet
	fanCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST TriangleSet
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleStripSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST TriangleStripSet
	stripCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Viewpoint ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Viewpoint
	fieldOfView %SFFloat; "0.785398"
	jump %SFBool; "true"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 10"
	description %SFString; #IMPLIED
	centerOfRotation %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- centerOfRotation point relates to NavigationInfo EXAMINE mode. -->
<![%ImmersiveProfile;[

<!ELEMENT VisibilitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST VisibilitySensor 
	center    %SFVec3f; "0 0 0"
	enabled   %SFBool;  "true"
	size      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class     CDATA     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>
]]>
<!ELEMENT WorldInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST WorldInfo
	info %MFString; #IMPLIED
	title %SFString; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT X3D (head?, Scene)>
<!ATTLIST X3D
	xmlns:xsd CDATA "http://www.w3.org/2001/XMLSchema-instance"
	xsd:noNamespaceSchemaLocation CDATA "http://www.web3d.org/specifications/x3d-3.0.xsd"
	profile %profileNames; #REQUIRED
	version %SFString; #FIXED "3.0"
>

<!-- also included in EspduTransform:  CollisionPdu DetonatePdu FirePdu -->

<![%DISComponent;[

<!ELEMENT EspduTransform (IS?, (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* ) >
<!ATTLIST EspduTransform

	marking 	 %SFString;	#IMPLIED
	siteID  	 %SFInt32;	"0"
	applicationID	 %SFInt32;	"1"
	entityID	 %SFInt32;	"0"
	forceID		 %SFInt32;	"0"

	entityKind	 %SFInt32;	"0"
	entityDomain	 %SFInt32;	"0"
	entityCountry	 %SFInt32;	"0"
	entityCategory	 %SFInt32;	"0"
	entitySubCategory %SFInt32;	"0"
	entitySpecific	 %SFInt32;	"0"
	entityExtra	 %SFInt32;	"0"

	readInterval	 %SFTime;	"0.1"
	writeInterval	 %SFTime;	"1.0"
	networkMode	 (standAlone|networkReader|networkWriter)	"standAlone"

	translation	 %SFVec3f;	"0 0 0"
	rotation	 %SFRotation;	"0 0 1 0"
	scale   	 %SFVec3f;	"1 1 1"
	scaleOrientation %SFRotation;	"0 0 1 0"
	bboxCenter	 %SFVec3f;	"0 0 0"
	bboxSize	 %SFVec3f;	"-1 -1 -1"
	center  	 %SFVec3f;	"0 0 0"

	address 	 	%SFString;	"localhost"
	port    	 	%SFInt32;	"0"
	multicastRelayHost 	%SFString;	#IMPLIED
	multicastRelayPort 	%SFInt32;	"0"
	rtpHeaderExpected  	%SFBool;	"false"

	deadReckoning  		%SFInt32;	"0"
	linearVelocity		%SFVec3f;	"0 0 0"
	linearAcceleration	%SFVec3f;	"0 0 0"
	
	fired1   		%SFBool;	"false"
	fired2   		%SFBool;	"false"
	munitionStartPoint 	%SFVec3f;	"0 0 0"
	munitionEndPoint   	%SFVec3f;	"0 0 0"
	warhead			%SFInt32;	"0"
	fuse			%SFInt32;	"0"
	munitionQuantity	%SFInt32;	"0"
	firingRate		%SFInt32;	"0"
	firingRange		%SFInt32;	"0"
	munitionSiteID  	%SFInt32;	"0"
	munitionApplicationID	%SFInt32;	"1"
	munitionEntityID	%SFInt32;	"0"
	fireMissionIndex	%SFInt32;	"0"

	articulationParameterCount 		  %SFInt32;	"0"
	articulationParameterDesignatorArray 	  %MFInt32;	#IMPLIED
	articulationParameterChangeIndicatorArray %MFInt32;	#IMPLIED
	articulationParameterIdPartAttachedArray  %MFInt32;	#IMPLIED
	articulationParameterTypeArray 		  %MFInt32;	#IMPLIED
	articulationParameterArray 		  %MFFloat;	#IMPLIED

	containerField NMTOKEN "children"
	class			CDATA		""
	DEF   			ID		#IMPLIED 
	USE             	IDREF		#IMPLIED >

<!ELEMENT ReceiverPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ReceiverPdu 

	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	receivedPower		%SFFloat;	"0.0"
	receiverState		%SFInt32;	"0"
	transmitterSiteID	%SFInt32;	"0"
	transmitterApplicationID %SFInt32;	"0"
	transmitterEntityID	%SFInt32;	"0"
	transmitterRadioID	%SFInt32;	"0"

	containerField NMTOKEN "children"
	class			CDATA		""
	DEF   			ID		#IMPLIED 
	USE             	IDREF		#IMPLIED >

<!ELEMENT SignalPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SignalPdu
	whichGeometry		%SFInt32;	"1"
	bboxCenter		 %SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	encodingScheme		%SFInt32;	"0"
	tdlType			%SFInt32;	"0"
	sampleRate		%SFInt32;	"0"
	samples			%SFInt32;	"0"
	dataLength		%SFInt32;	"0"
	data			%MFInt32;	#IMPLIED

	containerField NMTOKEN "children"
	class			CDATA		""
	DEF   			ID		#IMPLIED 
	USE             	IDREF		#IMPLIED >

<!ELEMENT TransmitterPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TransmitterPdu 

	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	antennaLocation		%SFVec3f;	"0 0 0"
	antennaPatternLength	%SFInt32;	"0"
	antennaPatternType	%SFInt32;	"0"
	cryptoKeyId		%SFInt32;	"0"
	cryptoSystem		%SFInt32;	"0"
	frequency		%SFInt32;	"0"
	inputSource		%SFInt32;	"0"
	
	lengthOfModulationParameters	%SFInt32;	"0"
	modulationTypeDetail		%SFInt32;	"0"
	modulationTypeMajor		%SFInt32;	"0"
	modulationTypeSpreadSpectrum	%SFInt32;	"0"
	modulationTypeSystem		%SFInt32;	"0"
	power				%SFFloat;	"0.0"
	radioEntityTypeCategory		%SFInt32;	"0"
	radioEntityTypeCountry		%SFInt32;	"0"
	radioEntityTypeDomain		%SFInt32;	"0"
	radioEntityTypeKind		%SFInt32;	"0"
	radioEntityTypeNomenclature	%SFInt32;	"0"
	radioEntityTypeNomenclatureVersion %SFInt32;	"0"
	relativeAntennaLocation		%SFVec3f;	"0 0 0"
	transmitFrequencyBandwidth	%SFFloat;	"0.0"
	transmitState			%SFInt32;	"0"

	containerField NMTOKEN "children"
	class				CDATA		""
	DEF   				ID		#IMPLIED 
	USE             		IDREF		#IMPLIED >

]]>

<![%GeoSpatialComponent;[

<!ELEMENT GeoCoordinate ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >  <!-- X3DCoordinateNodeType -->
<!ATTLIST GeoCoordinate
	geoSystem	%MFString; '"GD" "WE"'
	point		%MFVec3d;	#IMPLIED
	containerField NMTOKEN "coord"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- need to restrict GeoOrigin to first element, or relax schema restriction -->
<!ELEMENT GeoElevationGrid (IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	(GeoOrigin, (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
	   			(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
 | (GeoOrigin, (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
 | ((%NormalNodes;),  (
 	((%ColorNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
 | ((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
 | (%WildcardNodes;,  (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)? ) >

<!ATTLIST GeoElevationGrid
	geoSystem	%MFString; '"GD" "WE"'
	geoGridOrigin	%SFVec3d;	"0 0 0"
	xDimension	%SFInt32;	"0"
	xSpacing	%SFDouble;	"1.0"
	yScale		%SFFloat;	"1.0"
	zDimension	%SFInt32;	"0"
	zSpacing	%SFDouble;	"1.0"
	height		%MFDouble; 	"0 0"
	normalPerVertex	%SFBool;	"true"
	ccw		%SFBool;	"true"
	colorPerVertex	%SFBool;	"true"
	creaseAngle	%SFFloat;	"0"
	solid		%SFBool;	"true"
	containerField NMTOKEN "geometry"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLocation (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes; | %WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes; | %WildcardNodes; )* )? ) >
<!ATTLIST GeoLocation
	geoSystem	%MFString; '"GD" "WE"'
	geoCoords	%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLOD (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes; | %WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes; | %WildcardNodes; )* )? ) >
<!ATTLIST GeoLOD
	geoSystem	%MFString; '"GD" "WE"'
	rootUrl	 	%MFString;	#IMPLIED
	child1Url	%MFString;	#IMPLIED
	child2Url	%MFString;	#IMPLIED
	child3Url	%MFString;	#IMPLIED
	child4Url 	%MFString;	#IMPLIED
	range		%SFDouble;	"10"
	center		%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoMetadata ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoMetadata
	url		%MFString;	#IMPLIED
	data		IDREFS		#IMPLIED
	summary		%MFString;	#IMPLIED
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!--
	title			%SFString;	#IMPLIED
	description		%SFString;	#IMPLIED
	coordinateSystem 	%SFString;	#IMPLIED
	horizontalDatum		%SFString;	#IMPLIED
	verticalDatum		%SFString;	#IMPLIED
	ellipsoid		%SFString;	#IMPLIED
	extent			%SFString;	#IMPLIED
	resolution		%SFString;	#IMPLIED
	originator		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	date			%SFString;	#IMPLIED
	metadataFormat		%SFString;	#IMPLIED
	dataUrl			%SFString;	#IMPLIED
	dataFormat		%SFString;	#IMPLIED
-->

<!ELEMENT GeoOrigin ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoOrigin
	geoSystem	%MFString; '"GD" "WE"'
	geoCoords	%SFVec3d;	"0 0 0"
	rotateYUp	%SFBool;	"false"
	containerField NMTOKEN "geoOrigin"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoPositionInterpolator ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoPositionInterpolator
	geoSystem	%MFString; '"GD" "WE"'
	key		%MFFloat;	#IMPLIED
	keyValue	%MFVec3d;	#IMPLIED
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoTouchSensor ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoTouchSensor
	geoSystem	%MFString; '"GD" "WE"'
	enabled		%SFBool;	"true"
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoViewpoint ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoViewpoint
	geoSystem	%MFString; '"GD" "WE"'
	description	%SFString;	#IMPLIED
	position	%SFVec3d;	"0 0 100000"
	orientation	%SFRotation;	"0 0 1 0"
	fieldOfView	%SFFloat;	"0.785398"
	jump		%SFBool;	"true"
	navType		%MFString;	'"EXAMINE" "ANY"'
	headlight	%SFBool;	"true"
	speedFactor	%SFFloat;	"1.0"
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

]]>

<!-- Note that setting JointNames as enumerations does not permit validation of other names. -->

<![%HAnimComponent;[

<!ENTITY % JointNames "(
c1|c2|c3|c4|c5|c6|c7|jaw|HumanoidRoot|l_acromioclavicular|l_ankle|l_calf|
l_clavicle|l_elbow|l_eyeball|l_eyeball_joint|l_eyebrow|l_eyebrow_joint|
l_eyelid|l_eyelid_joint|l_forearm|l_forefoot|l_hand|l_hindfoot|l_hip|
l_index_distal|l_index_metacarpal|l_index_middle|l_index_proximal|
l_index0|l_index1|l_index2|l_index3|l_knee|l_metatarsal|l_middistal|
l_middle_distal|l_middle_metacarpal|l_middle_middle|l_middle_proximal|
l_middle0|l_middle1|l_middle2|l_middle3|l_midproximal|l_midtarsal|
l_pinky_distal|l_pinky_metacarpal|l_pinky_middle|l_pinky_proximal|
l_pinky0|l_pinky1|l_pinky2|l_pinky3|l_ring_distal|l_ring_metacarpal|
l_ring_middle|l_ring_proximal|l_ring0|l_ring1|l_ring2|l_ring3|l_scapula|
l_shoulder|l_sternoclavicular|l_subtalar|l_thigh|l_thumb_distal|
l_thumb_metacarpal|l_thumb_proximal|l_thumb1|l_thumb2|l_thumb3|
l_upperarm|l_wrist|l1|l2|l3|l4|l5|pelvis|r_acromioclavicular|r_ankle|
r_calf|r_clavicle|r_elbow|r_eyeball|r_eyeball_joint|r_eyebrow|
r_eyebrow_joint|r_eyelid|r_eyelid_joint|r_forearm|r_forefoot|r_hand|
r_hindfoot|r_hip|r_index_distal|r_index_metacarpal|r_index_middle|
r_index_proximal|r_index0|r_index1|r_index2|r_index3|r_knee|r_metatarsal|
r_middistal|r_middle_distal|r_middle_metacarpal|r_middle_middle|
r_middle_proximal|r_middle0|r_middle1|r_middle2|r_middle3|r_midproximal|
r_midtarsal|r_pinky_distal|r_pinky_metacarpal|r_pinky_middle|
r_pinky_proximal|r_pinky0|r_pinky1|r_pinky2|r_pinky3|r_ring_distal|
r_ring_metacarpal|r_ring_middle|r_ring_proximal|r_ring0|r_ring1|r_ring2|
r_ring3|r_scapula|r_shoulder|r_sternoclavicular|r_subtalar|r_thigh|
r_thumb_distal|r_thumb_metacarpal|r_thumb_proximal|r_thumb1|r_thumb2|
r_thumb3|r_upperarm|r_wrist|sacroiliac|sacrum|skull|skullbase|
t1|t2|t3|t4|t5|t6|t7|t8|t9|t10|t11|t12|temporomandibular|
vc1|vc2|vc3|vc4|vc5|vc6|vc7|vl1|vl2|vl3|vl4|vl5|
vt1|vt2|vt3|vt4|vt5|vt6|vt7|vt8|vt9|vt10|vt11|vt12)" >

<!ELEMENT HAnimDisplacer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST HAnimDisplacer
	name		%SFString;	#IMPLIED
	coordIndex	%MFInt32;	#IMPLIED
	displacements	%MFVec3f;	#IMPLIED
	weight		%SFFloat;	#IMPLIED
	containerField NMTOKEN #IMPLIED
	class		CDATA  		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT HAnimHumanoid (IS?, (%MetadataNodes;)?, 
	(HAnimJoint*,	HAnimSegment*, HAnimSite*, (%CoordinateNodes;)?, (%NormalNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* ) ) >
<!-- skeleton/joints,	segments,      sites,      skinCoord,            skinNormal,       skin/viewpoints -->
<!-- note that joints, segments and sites should be USE nodes.  skin Shapes will USE preceding skinCoord, skinNormal definitions. -->
<!ATTLIST HAnimHumanoid
	name			%SFString;	#IMPLIED
	version			%SFString;	#IMPLIED
	info			%MFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class			CDATA  		""
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>

<!--	not treated as separate attributes, instead these are
	encoded as "attribute=value" SFString entries in the
	MFString info field.

	humanoidVersion		%SFString;	#IMPLIED
	authorName		%SFString;	#IMPLIED
	authorEmail		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	creationDate		%SFString;	#IMPLIED
	usageRestrictions	%SFString;	#IMPLIED
	age			%SFString;	#IMPLIED
	gender			%SFString;	#IMPLIED
	height			%SFString;	#IMPLIED
	weight			%SFString;	#IMPLIED
-->

<![%HAnimComponent;[

<!ELEMENT HAnimJoint (IS?, (%MetadataNodes;)?, ( %ChildrenNodes; | HAnimDisplacer | %WildcardNodes; )* ) >
<!ATTLIST HAnimJoint
	name			%JointNames;	#IMPLIED
	ulimit			%MFFloat;	#IMPLIED
	llimit			%MFFloat;	#IMPLIED
	limitOrientation	%SFRotation;	"0 0 1 0"
	skinCoordIndex		%MFInt32;	#IMPLIED
	skinCoordWeight		%MFFloat;	#IMPLIED
	stiffness		%MFFloat;	"0 0 0"
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class			CDATA		""
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!-- Multiple HAnimDisplacer nodes must appear consecutively inside HAnimSegment -->

<!ELEMENT HAnimSegment (IS?, (%MetadataNodes;)?, (
	((%ChildrenNodes;|%WildcardNodes;)*, ((Coordinate, HAnimDisplacer*) | (HAnimDisplacer+, Coordinate?))? ) |
	(Coordinate, (((%ChildrenNodes;)*, HAnimDisplacer*) | (HAnimDisplacer+, (%ChildrenNodes;|%WildcardNodes;)*))? ) |
	(HAnimDisplacer+, ((Coordinate, (%ChildrenNodes;|%WildcardNodes;)*) | ((%ChildrenNodes;|%WildcardNodes;)*, Coordinate?))? )?
) ) >
<!ATTLIST HAnimSegment
	name			%JointNames;	#IMPLIED
	mass			%SFFloat;	"0"
	centerOfMass		%SFVec3f;	"0 0 0"
	momentsOfInertia	%MFFloat;	"0 0 0 0 0 0 0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class			CDATA   	""
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT HAnimSite (IS?, (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; )* ) >
<!ATTLIST HAnimSite
	name			%SFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class			CDATA  		""
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<![%NurbsComponent;[

<!ELEMENT Contour2D (IS?, (%MetadataNodes;)?, ( %NurbsControlCurveNodes; | %WildcardNodes; )* ) >
<!ATTLIST Contour2D
	containerField NMTOKEN "trimmingContour"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT ContourPolyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ContourPolyline2D
	point		%MFVec2f;	#IMPLIED
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- child CoordinateNode has containerField controlPoint -->
<!ELEMENT NurbsCurve ( (IS?), (%MetadataNodes;)?, ( %CoordinateNodes; | %WildcardNodes; )? ) >
<!ATTLIST NurbsCurve
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN 		"geometry"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsCurve2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NurbsCurve2D
	controlPoint	%MFVec2f;	#IMPLIED
	knot		%MFFloat;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFFloat;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsOrientationInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsOrientationInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class			CDATA		""
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsPositionInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsPositionInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class			CDATA		""
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsSurfaceInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsSurfaceInterpolator
	weight		%MFDouble;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "children"
	class		CDATA		""
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT NurbsSet (IS?, (%MetadataNodes;)?, (NurbsPatchSurface | NurbsSweptSurface | NurbsSwungSurface | NurbsTrimmedSurface | %WildcardNodes; )* ) >
<!ATTLIST NurbsSet
	tessellationScale	%SFFloat;	"1.0"
	bboxCenter		%SFVec3f;	"0 0 0"	
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class			CDATA		""
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT NurbsPatchSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes; | %WildcardNodes; )?, ( %TextureCoordinateNodes; | NurbsTextureCoordinate)? ) >
<!ATTLIST NurbsPatchSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTrimmedSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes; | %WildcardNodes; )?, ( %TextureCoordinateNodes; | NurbsTextureCoordinate)?, Contour2D* ) >
<!ATTLIST NurbsTrimmedSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFFloat;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSweptSurface (IS?, (%MetadataNodes;)?, (NurbsCurve | %WildcardNodes; )?, ( %NurbsControlCurveNodes; | %WildcardNodes; )? ) >
<!ATTLIST NurbsSweptSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSwungSurface (IS?, (%MetadataNodes;)?, ( ( %NurbsControlCurveNodes; | %WildcardNodes; ), ( %NurbsControlCurveNodes; | %WildcardNodes; )? )? ) >
<!ATTLIST NurbsSwungSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class		CDATA		""
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTextureCoordinate ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsTextureCoordinate
	weight		%MFDouble;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "texCoord"
	class		CDATA		""
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>
]]>


<!-- 	Finally, add inputOnly/outputOnly attributes and Web3dExtensionComponent from separate DTDs.
	Note that Web3dExtensionComponent content-model extensions needed to be added at beginning,
	prior to node-type definitions. -->

<![%X3dInputOutputFields;[

<!ENTITY % FieldsDTD SYSTEM "x3d-3.0-InputOutputFields.dtd">

%FieldsDTD;

]]>

<![%Web3dExtensionComponent;[

<!ENTITY % Web3dExtensionsDTD SYSTEM "x3d-3.0-Web3dExtensions.dtd">

%Web3dExtensionsDTD;

]]>