<?xml version="1.0"?>

<!-- Header -->
<xs:schema
    targetNamespace="http://www.yworks.com/xml/graphml"

    xmlns="http://www.yworks.com/xml/graphml"
    xmlns:y="http://www.yworks.com/xml/graphml"
    xmlns:g="http://graphml.graphdrawing.org/xmlns"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xlink="http://www.w3.org/1999/xlink"

    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    >

  <!--                             -->
  <!-- Enumeration Types -->
  <!--                             -->

  <!-- LineType -->
  <xs:simpleType name="lineType.type">
    <xs:annotation>
      <xs:documentation>
        The valid line types for an edge or node realizer.
        <p>
          Valid values are:
          <ul>
            <li>
              <b>line</b>: for a continous line
            </li>
            <li>
              <b>dashed</b>: for a dashed line
            </li>
            <li>
              <b>dotted</b>: for a dotted line
            </li>
            <li>
              <b>dashed_dotted</b>: for a dash-dotted line
            </li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="line"/>
      <xs:enumeration value="dashed"/>
      <xs:enumeration value="dotted"/>
      <xs:enumeration value="dashed_dotted"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Font styles -->
  <xs:simpleType name="fontStyle.type">
    <xs:annotation>
      <xs:documentation>
        The valid font types for a label.
        <p>
          Valid values are:
          <ul>
            <li>
              <b>plain</b>
              : for a plain font
            </li>
            <li>
              <b>bold</b>
              : for a bold font
            </li>
            <li>
              <b>italic</b>
              : for an italic font
            </li>
            <li>
              <b>bolditalic</b>
              : for a bold and italic font
            </li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="plain"/>
      <xs:enumeration value="bold"/>
      <xs:enumeration value="italic"/>
      <xs:enumeration value="bolditalic"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Shape of Shape Nodes -->
  <xs:simpleType name="shapeType.type">

    <xs:restriction base="xs:NMTOKEN">
      <xs:annotation>
        <xs:documentation>
          The shape types for a ShapeNodeRealizer.
          <p>
            Valid values are:
            <ul>
              <li>
                <b>rectangle</b>
                : for a rectangular shape
              </li>
              <li>
                <b>roundrectangle</b>
                : for a rectangular shape with rounded corners
              </li>
              <li>
                <b>ellipse</b>
                : for an elliptical shape
              </li>
              <li>
                <b>parallelogram</b>
                : for a parallelogram shape
              </li>
              <li>
                <b>hexagon</b>
                : for a hexagonal shape
              </li>
              <li>
                <b>octagon</b>
                : for a octagonal shape
              </li>
              <li>
                <b>diamond</b>
                : for a diamond shape
              </li>
              <li>
                <b>triangle</b>
                : for a triangular shape
              </li>
              <li>
                <b>trapezoid</b>
                : for a trapezoidal shape, whose upper line is half as long as its lower line
              </li>
              <li>
                <b>trapezoid2</b>
                : for a trapezoidal shape, whose lower line is half as long as its upper line
              </li>
              <li>
                <b>rectangle3d</b>
                : for a rectangular shape with 3D-ish looks
              </li>
            </ul>
          </p>
        </xs:documentation>
      </xs:annotation>
      <xs:enumeration value="rectangle"/>
      <xs:enumeration value="roundrectangle"/>
      <xs:enumeration value="ellipse"/>
      <xs:enumeration value="parallelogram"/>
      <xs:enumeration value="hexagon"/>
      <xs:enumeration value="octagon"/>
      <xs:enumeration value="diamond"/>
      <xs:enumeration value="triangle"/>
      <xs:enumeration value="trapezoid"/>
      <xs:enumeration value="trapezoid2"/>
      <xs:enumeration value="rectangle3d"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Arrow types -->
  <xs:simpleType name="arrowType.type">
    <xs:annotation>
      <xs:documentation>
        The arrow types for EdgeRealizers.
        <p>
          Valid values are:
          <ul>
            <li><b>standard</b>: for the default arrow</li>
            <li><b>delta</b>: for a triangular arrow shape</li>
            <li><b>white_delta</b>: like delta, but filled white</li>
            <li><b>diamond</b>: for a diamond arrow shape</li>
            <li><b>white_diamond</b>: like diamond, but filled white</li>
            <li><b>none</b>: for no arrow</li>
            <li><b>plain</b>: for the plain arrow</li>
            <li><b>concave</b>: for a concave arrow</li>
            <li><b>convex</b>: for a convex arrow</li>
            <li><b>circle</b>: for a circle arrow</li>
            <li><b>dash</b>: for a dash arrow</li>
            <li><b>transparent_circle</b>: for a transparent circle arrow</li>
            <li><b>skewed_dash</b>: for a skewed dash arrow</li>
            <li><b>t_shape</b>: for a T-shaped arrow</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="standard"/>
      <xs:enumeration value="delta"/>
      <xs:enumeration value="diamond"/>
      <xs:enumeration value="white_diamond"/>
      <xs:enumeration value="white_delta"/>
      <xs:enumeration value="none"/>
      <xs:enumeration value="plain"/>
      <xs:enumeration value="concave"/>
      <xs:enumeration value="convex"/>
      <xs:enumeration value="circle"/>
      <xs:enumeration value="dash"/>
      <xs:enumeration value="transparent_circle"/>
      <xs:enumeration value="skewed_dash"/>
      <xs:enumeration value="t_shape"/>
    </xs:restriction>
  </xs:simpleType>


  <!-- Alignment of Labels -->
  <xs:simpleType name="alignment.type">
    <xs:annotation>
      <xs:documentation>
        The valid alignemts for labels.
        <p>
          Valid values are:
          <ul>
            <li><b>center</b>: center alignment</li>
            <li><b>left</b>: left alignment</li>
            <li><b>right</b>: right alignment</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="center"/>
      <xs:enumeration value="left"/>
      <xs:enumeration value="right"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Node Label Models -->
  <xs:simpleType name="nodeLabelModel.type">
    <xs:annotation>
      <xs:documentation>
        The valid label models for node labels.
        <p>
          Valid values are:
          <ul>
            <li><b>free</b>: free model</li>
            <li><b>sides</b>: sides model</li>
            <li><b>corners</b>: corners model</li>
            <li><b>eight_pos</b>: sides+corners model</li>
            <li><b>sandwich</b>: sandwich model</li>
            <li><b>internal</b>: internal model</li>
			<li><b>custom</b>: custom model</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="free"/>
      <xs:enumeration value="sides"/>
      <xs:enumeration value="corners"/>
      <xs:enumeration value="eight_pos"/>
      <xs:enumeration value="sandwich"/>
      <xs:enumeration value="internal"/>
	  <xs:enumeration value="custom"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Node Label Positions -->
  <xs:simpleType name="nodeLabelPosition.type">
    <xs:annotation>
      <xs:documentation>
        The valid label positions for node labels.
        <p>
          <b>Note:</b>
          For a given node label model, the set of valid
          label positions is a subset of this enumeration that depends on the
          actual node label model.
        </p>
        <p>
          Valid values are:
          <ul>
            <li><b>n</b>: north (outside)</li>
            <li><b>nw</b>: north west (outside)</li>
            <li><b>ne</b>: north east(outside)</li>
            <li><b>w</b>: west (outside)</li>
            <li><b>e</b>: east (outside)</li>
            <li><b>sw</b>: south west (outside)</li>
            <li><b>s</b>: south (outside)</li>
            <li><b>se</b>: south east (outside)</li>
            <li><b>c</b>: center (inside)</li>
            <li><b>tl</b>: top left (inside)</li>
            <li><b>t</b>: top (inside)</li>
            <li><b>tr</b>: top right (inside)</li>
            <li><b>r</b>: right (inside)</li>
            <li><b>l</b>: left (inside)</li>
            <li><b>bl</b>: bottom left (inside)</li>
            <li><b>b</b>: bottom (inside)</li>
            <li><b>br</b>: bottom right (inside)</li>
            <li><b>anywhere</b>: anywhere</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="n"/>
      <xs:enumeration value="nw"/>
      <xs:enumeration value="ne"/>
      <xs:enumeration value="w"/>
      <xs:enumeration value="e"/>
      <xs:enumeration value="sw"/>
      <xs:enumeration value="s"/>
      <xs:enumeration value="se"/>
      <xs:enumeration value="c"/>
      <xs:enumeration value="tl"/>
      <xs:enumeration value="t"/>
      <xs:enumeration value="tr"/>
      <xs:enumeration value="r"/>
      <xs:enumeration value="l"/>
      <xs:enumeration value="bl"/>
      <xs:enumeration value="b"/>
      <xs:enumeration value="br"/>
      <xs:enumeration value="anywhere"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- AutoSizePolicy -->
  <xs:simpleType name="autoSizePolicy.type">
    <xs:annotation>
      <xs:documentation>
        The auto size policies for node labels.
        <p>
          Valid values are:
          <ul>
            <li><b>node_width</b>: resize to node width</li>
            <li><b>node_height</b>:resize to node height</li>
            <li><b>content</b>: resize to content size</li>
            <li><b>none</b>: no automatic resizing</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="node_width"/>
      <xs:enumeration value="node_height"/>
      <xs:enumeration value="content"/>
      <xs:enumeration value="none"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Edge Label Models -->
  <xs:simpleType name="edgeLabelModel.type">
    <xs:annotation>
      <xs:documentation>
        The valid label models for node labels.
        <p>
          Valid values are:
          <ul>
            <li><b>centered</b>: edge center</li>
            <li><b>center_slider</b>: edge center, freeley movable</li>
            <li><b>side_slider</b>: edge side, freely movable</li>
            <li><b>free</b>: free model</li>
            <li><b>two_pos</b>: source or target only</li>
            <li><b>three_center</b>: three positions at edge center</li>
            <li><b>six_pos</b>: three positions at either source or target</li>
            <li><b>custom</b>: for a custom model</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="centered"/>
      <xs:enumeration value="center_slider"/>
      <xs:enumeration value="side_slider"/>
      <xs:enumeration value="free"/>
      <xs:enumeration value="two_pos"/>
      <xs:enumeration value="three_center"/>
      <xs:enumeration value="six_pos"/>
	  <xs:enumeration value="custom"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Edge Label Positions -->
  <xs:simpleType name="edgeLabelPosition.type">
    <xs:annotation>
      <xs:documentation>
        The valid label positions for edge labels.
        <p>
          <b>Note:</b>
          For a given edge label model, the set of valid
          label positions is a subset of this enumeration that depends on the
          actual edge label model.
        </p>
        <p>
          Valid values are:
          <ul>
            <li><b>center</b>: at source on the edge segment</li>
            <li><b>tcentr</b>: at target on the edge segment</li>
            <li><b>scentr</b>: at center on the edge segment</li>
            <li><b>stail</b>: at source below the edge segment</li>
            <li><b>ttail</b>: at target below the edge segment</li>
            <li><b>tail</b>: at center below the edge segment</li>
            <li><b>shead</b>: at source above the edge segment</li>
            <li><b>thead</b>: at target above the edge segment</li>
            <li><b>head</b>: at center above the edge segment</li>
            <li><b>anywhere</b>: anywhere</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="center"/>
      <xs:enumeration value="tcentr"/>
      <xs:enumeration value="scentr"/>
      <xs:enumeration value="anywhere"/>
      <xs:enumeration value="stail"/>
      <xs:enumeration value="ttail"/>
      <xs:enumeration value="tail"/>
      <xs:enumeration value="shead"/>
      <xs:enumeration value="thead"/>
      <xs:enumeration value="head"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Preferred Edge Label Positions -->
  <xs:simpleType name="preferredPlacement.type">
    <xs:annotation>
      <xs:documentation>
        The valid preferred label positions for edge labels.
        <p>
          <b>Note:</b>
          For a given edge label model, the set of valid
          preferred label positions is a subset of this enumeration that depends on the
          actual edge label model. This value is evaluated by automatic label layout algorithms and may differ
          from the actual label position.
        </p>
        <p>
          Valid values are:
          <ul>
            <li><b>target_right</b>: at target right from the edge segment</li>
            <li><b>target</b>: anywhere at the target</li>
            <li><b>target_left</b>: at target left from the edge segment</li>
            <li><b>target_on_edge</b>: at target on the edge segment</li>
            <li><b>source_right</b>: at source right from the edge segment</li>
            <li><b>source</b>: anywhere at the source</li>
            <li><b>source_left</b>: at source left from the edge segment</li>
            <li><b>source_on_edge</b>: at source on the edge segment</li>
            <li><b>center_right</b>: at center right from the edge segment</li>
            <li><b>center</b>: anywhere at the  center</li>
            <li><b>center_left</b>: at center left from the edge segment</li>
            <li><b>center_on_edge</b>: at center on the edge segment</li>
            <li><b>anywhere</b>: anywhere</li>
            <li><b>on_edge</b>: anywhere on the edge</li>
            <li><b>left</b>: anywhere left from the edge</li>
            <li><b>right</b>: anywhere right from the edge</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="target_right"/>
      <xs:enumeration value="target"/>
      <xs:enumeration value="target_left"/>
      <xs:enumeration value="target_on_edge"/>
      <xs:enumeration value="source_right"/>
      <xs:enumeration value="source"/>
      <xs:enumeration value="source_left"/>
      <xs:enumeration value="source_on_edge"/>
      <xs:enumeration value="center_right"/>
      <xs:enumeration value="center"/>
      <xs:enumeration value="center_left"/>
      <xs:enumeration value="center_on_edge"/>
      <xs:enumeration value="anywhere"/>
      <xs:enumeration value="on_edge"/>
      <xs:enumeration value="left"/>
      <xs:enumeration value="right"/>

    </xs:restriction>
  </xs:simpleType>

  <!-- horizontalTextPosition value type for labels -->
  <xs:simpleType name="horizontalTextPosition.type">
    <xs:annotation>
      <xs:documentation>
        The valid horizontal text vs. icon alignements for labels.
        <p>
          Valid values are:
          <ul>
            <li><b>left</b>: place text to the left of the icon</li>
            <li><b>right</b>: place text to the right of the icon</li>
            <li><b>center</b>: place text on center of the icon</li>
            <li><b>left_aligned</b>: align text to the left of the icon</li>
            <li><b>right_aligned</b>: align text to the right of the icon</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="left"/>
      <xs:enumeration value="right"/>
      <xs:enumeration value="center"/>
      <xs:enumeration value="left_aligned"/>
      <xs:enumeration value="right_aligned"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- verticalTextPosition value type for labels -->
  <xs:simpleType name="verticalTextPosition.type">
    <xs:annotation>
      <xs:documentation>
        The valid vertical text vs. icon alignements for labels.
        <p>
          Valid values are:
          <ul>
          <li><b>top</b>: place text above the icon</li>
          <li><b>bottom</b>: place text below the icon</li>
          <li><b>center</b>: place text on center of the icon</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="top"/>
      <xs:enumeration value="bottom"/>
      <xs:enumeration value="center"/>
    </xs:restriction>
  </xs:simpleType>

  <!--                             -->
  <!--  Geometric types     -->
  <!--                             -->

  <!-- Location defined by x,y coordinates -->
  <xs:attributeGroup name="Location.group">
    <xs:annotation>
      <xs:documentation>
        Attribute group that describes a two-dimensional location, specified by the x and y attribute.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="x" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
          The x coordinate of the point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="y" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
          The y coordinate of the point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>

  <!-- Location defined by x,y coordinates and width,height -->
  <xs:attributeGroup name="Rectangle.group">
    <xs:annotation>
      <xs:documentation>
        Attribute group that describes a two-dimensional rectangle.
        <p>
          The location is specified by the x and y attribute, the dimension by the width and height attributes.
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="x" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
          The x coordinate of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="y" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
          The y coordinate of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="width" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
          The width of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="height" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
          The height of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>

  <!-- type for required rectangles -->
  <xs:complexType name="Rectangle.type">
    <xs:annotation>
      <xs:documentation>
        Type definition for rectangles.
      </xs:documentation>
    </xs:annotation>
    <xs:attributeGroup ref="Rectangle.group"/>
  </xs:complexType>

  <!-- type for optional rectangles -->
  <xs:attributeGroup name="OpRectangle.group">
    <xs:annotation>
      <xs:documentation>
        Attribute group that describes a two-dimensional rectangle, where attribtue values are optional.
        <p>
          The location is specified by the x and y attribute, the dimension by the width and height attributes.
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="x" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The x coordinate of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="y" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The y coordinate of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="width" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The width of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="height" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The height of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>

  <!-- type for a path -->
  <xs:complexType name="Path.type">
    <xs:annotation>
      <xs:documentation>
        Attribute group that describes a two-dimensional path, consisting of a point list together with optional source
        and target locations.
        <p>
          The source resp. target location is specified by the sx and sy resp. tx and ty attributes.
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Point" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
            Single control point for two dimensional paths.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attributeGroup ref="Location.group"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="reversedPathRendering" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          true iff the path should be rendered in reverse order.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="sx" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The x coordinate of the source point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="sy" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The y coordinate of the source point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="tx" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The x coordinate of the target point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="ty" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The y coordinate of the target point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>


  <!--                             -->
  <!--     Misc Types       -->
  <!--                             -->

  <!-- color -->
  <xs:simpleType name="color.type">
    <xs:annotation>
      <xs:documentation>
        Simple type that encodes a color value.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:pattern value="#(([A-F]|[0-9]){2}){3,4}"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Style for a line -->
  <xs:complexType name="LineStyle.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a line style.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="color" type="color.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The color of the line.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="hasColor" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the line has a color set. If false, the line is invisible.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="type" type="lineType.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The type of the line.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="width" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The width of the line.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!-- drop shadow style -->
  <xs:complexType name="DropShadow.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a drop shadow.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="color" type="color.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The color of the drop shadow.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="offsetX" type="xs:byte" use="optional">
      <xs:annotation>
        <xs:documentation>
          The offset in x direction.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="offsetY" type="xs:byte" use="optional">
      <xs:annotation>
        <xs:documentation>
          The offset in y direction.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!--                             -->
  <!--        Labels            -->
  <!--                             -->
  
  <!-- Basic properties of all kind of labels -->
  <xs:complexType name="Label.type" mixed="true">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the common attributes of node and edge labels.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="LabelModel" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The (optional) custom label model.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:any minOccurs="1" maxOccurs="1" processContents="lax"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="ModelParameter" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The (optional) custom label model parameter.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:any minOccurs="1" maxOccurs="1" processContents="lax"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attributeGroup ref="OpRectangle.group"/>
    <xs:attribute name="visible" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the label is visible or not.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="alignment" type="alignment.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The alignment of the label.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="textColor" type="color.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The text color of the label.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="lineColor" type="color.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The border color of the label's content rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="hasLineColor" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the label border should be painted.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="backgroundColor" type="color.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The background color of the label's content rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="hasBackgroundColor" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the label background should be painted.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="hasText" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the label has (possibly empty) text.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="fontFamily" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>
          The font family for the label text.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="fontSize" type="xs:unsignedByte" use="optional">
      <xs:annotation>
        <xs:documentation>
          The font size for the label text.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="fontStyle" type="fontStyle.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The font style for the label text.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="rotationAngle" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The rotation angle style for the label.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="icon" type="xs:anyURI" use="optional">
      <xs:annotation>
        <xs:documentation>
          The URL of an icon for the label.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="image" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>
          Reference to an embedded image resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="iconData" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>
          Reference to an embedded arbitrary serializable resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="underlinedText" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether to underline the label text.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="horizontalTextPosition" type="horizontalTextPosition.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The horizontal text position wrt to an optional icon.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="verticalTextPosition" type="verticalTextPosition.type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The vertical text position wrt to an optional icon.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="iconTextGap" type="xs:byte" use="optional">
      <xs:annotation>
        <xs:documentation>
          The distance between the label text and an optional icon.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="configuration" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>
          The optional configuration of the label.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!-- Node Labels -->
  <xs:complexType name="NodeLabel.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the additional attributes of node labels.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Label.type">
        <xs:attribute name="modelName" type="nodeLabelModel.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="modelPosition" type="nodeLabelPosition.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The actual label position in the current label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="autoSizePolicy" type="autoSizePolicy.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The auto size policy of the label.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="borderDistance" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The distance of the label to the node.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Edge Labels -->
  <xs:complexType name="EdgeLabel.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the additional attributes of edge labels.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Label.type">
        <xs:attribute name="modelName" type="edgeLabelModel.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="modelPosition" type="edgeLabelPosition.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The actual label position in the current label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="preferredPlacement" type="preferredPlacement.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The preferred label position in the current label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="distance" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The current label distance from the edge.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="ratio" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The current label position along the edge, expressed as ratio from source to target.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="TableNodeLabelModel.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the label model for both row and column labels in TableGroupNodes.
      </xs:documentation>
    </xs:annotation>
	<xs:attribute name="offset" type="xs:double" use="optional">
        <xs:annotation>
          <xs:documentation>
              The offset of the label.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
  <xs:complexType name="TableNodeLabelModelParameter.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the common properties of the label model parameter for both row and column labels in TableGroupNodes.
      </xs:documentation>
    </xs:annotation>
	<xs:attribute name="id" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>
              The id of the column/row for the label.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
	<xs:attribute name="inside" type="xs:boolean" use="optional">
        <xs:annotation>
          <xs:documentation>
              Whether the label lies inside or not.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:element name="RowNodeLabelModel" type="TableNodeLabelModel.type">
    <xs:annotation>
      <xs:documentation>
        Element type definition for a row label model in TableGroupNodes.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  
  <xs:element name="ColumnNodeLabelModel" type="TableNodeLabelModel.type">
    <xs:annotation>
      <xs:documentation>
        Element type definition for a column label model in TableGroupNodes.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  
  <xs:element name="RowNodeLabelModelParameter">  
    <xs:annotation>
      <xs:documentation>
        Element type definition for a row label model parameter in TableGroupNodes.
      </xs:documentation>
    </xs:annotation>
	<xs:complexType>
	  <xs:complexContent>
        <xs:extension base="TableNodeLabelModelParameter.type">
		  <xs:attribute name="horizontalPosition" type="xs:double" use="optional">
            <xs:annotation>
              <xs:documentation>
                The horizontal position of the label.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
		</xs:extension>
	  </xs:complexContent>
	</xs:complexType>
  </xs:element>
  
  <xs:element name="ColumnNodeLabelModelParameter">  
    <xs:annotation>
      <xs:documentation>
        Element type definition for a column label model parameter in TableGroupNodes.
      </xs:documentation>
    </xs:annotation>
	<xs:complexType>
	  <xs:complexContent>
        <xs:extension base="TableNodeLabelModelParameter.type">
		  <xs:attribute name="verticalPosition" type="xs:double" use="optional">
            <xs:annotation>
              <xs:documentation>
                The vertical position of the label.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
		</xs:extension>
	  </xs:complexContent>
	</xs:complexType>
  </xs:element>

  <xs:complexType name="Geometry.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the geometry of simple graph elements.
      </xs:documentation>
    </xs:annotation>
    <xs:attributeGroup ref="Rectangle.group"/>
  </xs:complexType>

  <!--                             -->
  <!--      Nodes              -->
  <!--                             -->

  <!-- Generic attributes for all nodes -->
  <xs:complexType name="Node.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the common attributes of a node realizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Geometry" minOccurs="0" maxOccurs="1" type="Geometry.type">
        <xs:annotation>
          <xs:documentation>
            The location and size of the node.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Fill" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The fill attributes of the node.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="hasColor" type="xs:boolean" use="optional">
            <xs:annotation>
              <xs:documentation>
                Whether the node has a visible fill color.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="color" type="xs:string" use="optional">
            <xs:annotation>
              <xs:documentation>
                The first fill color.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="color2" type="xs:string" use="optional">
            <xs:annotation>
              <xs:documentation>
                The second fill color (for gradient fills).
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="transparent" type="xs:boolean" use="optional">
            <xs:annotation>
              <xs:documentation>
                Whether the node is transparent.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
      <xs:element name="BorderStyle" type="LineStyle.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The LineStyle of the border.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="NodeLabel" type="NodeLabel.type" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
            The (optional) node label.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="NodePorts" type="NodePorts.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The (optional) node port list.
          </xs:documentation>
        </xs:annotation>
        <xs:key name="nodeport_id_key">
          <xs:annotation>
            <xs:documentation>
             Ensures: existence and uniqueness of the id attributes of
             each &lt;NodePort> element in this resource block.
            </xs:documentation>
           </xs:annotation>
           <xs:selector xpath=".//y:NodePort"/>
           <xs:field xpath="@id"/>
          </xs:key>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="selected" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the node is currently selected.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!-- Shape Node -->
  <xs:complexType name="ShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a ShapeNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Node.type">
        <xs:sequence>
          <xs:element name="Shape" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The actual shape of a ShapeNodeRealizer.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="type" type="shapeType.type" use="required">
                <xs:annotation>
                  <xs:documentation>
                    The shape type.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
          <xs:element name="DropShadow" type="DropShadow.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The drop shadow.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Image Node -->
  <xs:complexType name="ImageNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of an ImageNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Node.type">
        <xs:sequence>
          <xs:element name="Image">
            <xs:annotation>
              <xs:documentation>
                Encodes an image for an ImageNodeRealizer.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="href" type="xs:anyURI" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The URL of an image for external image sources.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="alphaImage" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether to use alpha channel information from the image.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="refid" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Reference to an inlined image resource.
                    <p>The refid must point to an existing inlined image resource in a toplevel graphml y:Resource
                      block.
                    </p>
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="IntInsets.type">
    <xs:annotation>
      <xs:documentation>
        Type that can be used to describe insets in integer precision.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="top" type="xs:nonNegativeInteger" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the top in integer precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="bottom" type="xs:nonNegativeInteger" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the bottom in integer precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="left" type="xs:nonNegativeInteger" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the left in integer precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="right" type="xs:nonNegativeInteger" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the right in integer precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="FloatInsets.type">
    <xs:annotation>
      <xs:documentation>
        Type that can be used to describe insets in double precision.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="top" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the top in double precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="bottom" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the bottom in double precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="left" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the left in double precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="right" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the right in double precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="Insets.type">
    <xs:annotation>
      <xs:documentation>
        Type that can be used to describe insets in both integer and double precision.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="IntInsets.type">
        <xs:attribute name="topF" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The minimal inset at the top in double precision.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="bottomF" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The minimal inset at the bottom in double precision.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="leftF" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The minimal inset at the left in double precision.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="rightF" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The minimal inset at the right in double precision.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Group Node -->
  <xs:complexType name="GroupNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a GroupNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Node.type">
        <xs:sequence>
          <xs:element name="Shape" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The actual shape of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="type" type="shapeType.type" use="required">
                <xs:annotation>
                  <xs:documentation>
                    The shape type.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
          <xs:element name="DropShadow" type="DropShadow.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The drop shadow.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="State" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The state of a GroupNodeRealizer (open/closed etc.).
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="closed" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether the group is currently closed.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="innerGraphDisplayEnabled" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether to display the inner graph even in closed state.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
          <xs:element name="NodeBounds" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                Type that can be used to describe additional data for node bounds determination.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="considerNodeLabelSize" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether the size of the label should be respected for automatic bounds calculation.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
          <xs:element name="Insets" type="Insets.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The minimal insets of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="BorderInsets" type="Insets.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The extra insets of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Proxy Shape Node -->
  <xs:complexType name="ProxyShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a ProxyShapeNodeRealizer in yFiles.
        <p>This Realizer can multiplex between several different realizers for a node.</p>
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Realizers">
        <xs:annotation>
          <xs:documentation>
            List of subordinate realizers for this node realizer.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
          </xs:sequence>
          <xs:attribute name="active" type="xs:nonNegativeInteger" use="required">
            <xs:annotation>
              <xs:documentation>
                The list index of the currently active realizer (zero based).
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="UserData.type">
    <xs:annotation>
      <xs:documentation>
        Type for the UserData that holds the actual state of a generic Node or Edge Realizer.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="class" type="xs:string" use="required">
      <xs:annotation>
        <xs:documentation>
          Class name of the data holder instance.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="value" type="xs:string" use="required">
      <xs:annotation>
        <xs:documentation>
          String representation of the user data value.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
		  
  <!-- Generic Node -->
  <xs:complexType name="GenericNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a GenericNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Node.type">
        <xs:sequence>
          <xs:element name="UserData" type="UserData.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                Represents the UserData that holds the actual state of this realizer instance.
              </xs:documentation>
            </xs:annotation>            
          </xs:element>
		  <xs:element name="StyleProperties" type="StyleProperties.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                Represents the StyleProperties of this realizer instance.
              </xs:documentation>
            </xs:annotation>            
          </xs:element>
        </xs:sequence>
        <xs:attribute name="configuration" type="xs:string" use="required">
          <xs:annotation>
            <xs:documentation>
              The name of the configuration. This configuration must have been registered previously.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Generic Group Node -->
  <xs:complexType name="GenericGroupNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a GenericGroupNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="GenericNode.type">
	   <xs:sequence>
	    <xs:element name="State" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The state of a GenericGroupNodeRealizer (open/closed etc.).
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="closed" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether the group is currently closed.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="autoResize" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether the group node should automatically resize itself.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
			  <xs:attribute name="closedHeight" type="xs:double" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The height of the group node in closed state.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
			  <xs:attribute name="closedWidth" type="xs:double" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The width of the group node in closed state.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
		  <xs:element name="Insets" type="Insets.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The minimal insets of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="BorderInsets" type="Insets.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The extra insets of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
		</xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Table Node -->
  <xs:complexType name="TableNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a TableGroupNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="GenericGroupNode.type">
        <xs:sequence>
          <xs:element name="Table" type="Table.type">
            <xs:annotation>
              <xs:documentation>
                Represents the table structure of this realizer instance.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>        
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  
  <!-- Table type -->
  <xs:complexType name="Table.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a TableNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="DefaultColumnInsets" type="FloatInsets.type">
        <xs:annotation>
          <xs:documentation>
           The default insets for a column.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="DefaultRowInsets" type="FloatInsets.type">
        <xs:annotation>
          <xs:documentation>
           The default insets for a row.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Insets" type="FloatInsets.type">
        <xs:annotation>
          <xs:documentation>
           The insets for the table.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Columns">
        <xs:annotation>
          <xs:documentation>
            List of columns for this table.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Column" type="TableColumn.type" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation>
                <xs:documentation>
                  A single column element
                </xs:documentation>
              </xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Rows">
        <xs:annotation>
          <xs:documentation>
            List of rows for this table.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Row" type="TableRow.type" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation>
                <xs:documentation>
                  A single row element
                </xs:documentation>
              </xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="autoResizeTable" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether to automatically resize the table.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultColumnWidth" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The default column width of the table.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultMinimumColumnWidth" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The default minimum column width of the table.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultRowHeight" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The default row height of the table.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultMinimumRowHeight" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The default minimum row height of the table.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="TableColumn.type">
    <xs:annotation>
      <xs:documentation>
        Type definition for a TableNodeRealizer table column.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Insets" type="FloatInsets.type">
        <xs:annotation>
          <xs:documentation>
            The insets of the column
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string">
      <xs:annotation>
        <xs:documentation>
          The unique id of the column.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="minimumWidth" type="xs:double">
      <xs:annotation>
        <xs:documentation>
          The minimum width of the column.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="width" type="xs:double">
      <xs:annotation>
        <xs:documentation>
          The width of the column.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="TableRow.type">
    <xs:annotation>
      <xs:documentation>
        Type definition for a TableNodeRealizer table row.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Insets" type="FloatInsets.type">
        <xs:annotation>
          <xs:documentation>
            The insets of the row.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string">
      <xs:annotation>
        <xs:documentation>
          The unique id of the row.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="minimumHeight" type="xs:double">
      <xs:annotation>
        <xs:documentation>
          The minimum height of the row.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="height" type="xs:double">
      <xs:annotation>
        <xs:documentation>
          The height of the row.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!-- Element Definitions for  Nodes -->
  <xs:element name="ShapeNode" type="ShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        ShapeNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="ImageNode" type="ImageNode.type">
    <xs:annotation>
      <xs:documentation>
        ImageNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="GroupNode" type="GroupNode.type">
    <xs:annotation>
      <xs:documentation>
        GroupNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="GenericNode" type="GenericNode.type">
    <xs:annotation>
      <xs:documentation>
        GenericNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="GenericGroupNode" type="GenericGroupNode.type">
    <xs:annotation>
      <xs:documentation>
        GenericGroupNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="ProxyShapeNode" type="ProxyShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        ProxyShapeNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="ProxyAutoBoundsNode" type="ProxyShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        ProxyAutoBoundsNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>  
  <xs:element name="TableNode" type="TableNode.type">
    <xs:annotation>
      <xs:documentation>
        TableGroupNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>

  <!--                             -->
  <!--      Edges              -->
  <!--                             -->

  <!-- Generic attributes for all edges -->
  <xs:complexType name="Edge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the common attributes of an edge realizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Path" type="Path.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The edge path.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="LineStyle" type="LineStyle.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The line style used to draw the edge.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Arrows" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The source and target arrows.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="source" type="arrowType.type">
            <xs:annotation>
              <xs:documentation>
                The source arrow type.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="target" type="arrowType.type">
            <xs:annotation>
              <xs:documentation>
                The target arrow type.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
      <xs:element name="EdgeLabel" type="EdgeLabel.type" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
            The edge label(s).
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="SourcePort" type="EdgePort.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The visual edge source port.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="TargetPort" type="EdgePort.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The visual edge target port.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="selected" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the edge currently is selected.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="EdgePort.type">
    <xs:annotation>
      <xs:documentation>
        The type of a visual edge port.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Icon" type="Icon.type">
        <xs:annotation>
          <xs:documentation>
            The icon of the port.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="type" fixed="InterfacePort">
      <xs:annotation>
        <xs:documentation>
          The type of the port, currently fixed to InterfacePort.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="Icon.type">
    <xs:annotation>
      <xs:documentation>
        Type definition for an icon.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="icon" type="xs:anyURI" use="optional">
      <xs:annotation>
        <xs:documentation>
          The URL of an icon.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="image" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>
          Reference to an embedded image resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="iconData" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>
          Reference to an embedded arbitrary serializable resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <!-- Polyline edges -->
  <xs:complexType name="PolyLineEdge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a PolylineEdgeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Edge.type">
        <xs:sequence>
          <xs:element name="BendStyle">
            <xs:annotation>
              <xs:documentation>
                The style used to draw the bends.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="smoothed" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether to draw smooth instead of angular bends.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>


  <!-- Type of Arc edges -->
  <xs:simpleType name="arc.type">
    <xs:annotation>
      <xs:documentation>
        The arc types for ArcEdgeRealizers.
        <p>
          Valid values are:
          <ul>
            <li><b>fixedHeight</b>: fixed height, but variable ratio</li>
            <li><b>fixedRatio</b>: fixed ration, but variable height</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="fixedHeight"/>
      <xs:enumeration value="fixedRatio"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Arc edges -->
  <xs:complexType name="ArcEdge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of an ArcEdgeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Edge.type">
        <xs:sequence>
          <xs:element name="Arc">
            <xs:annotation>
              <xs:documentation>
                The Arc.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="type" type="arc.type" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The arc type.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="height" type="xs:double" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The current height of the arc.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="ratio" type="xs:double" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The current ratio of the arc.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- QuadCurve edges -->
  <xs:complexType name="QuadCurveEdge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a QuadCurveEdgeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Edge.type">
        <xs:attribute name="straightness" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The straightness of the curve.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Generic edges -->
  <xs:complexType name="GenericEdge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of an GenericEdgeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Edge.type">
        <xs:sequence>
          <xs:element name="UserData">
            <xs:annotation>
              <xs:documentation>
                Represents the UserData that holds the actual state of this realizer instance.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="class" type="xs:string" use="required">
                <xs:annotation>
                  <xs:documentation>
                    Class name of the data holder instance.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="value" type="xs:string" use="required">
                <xs:annotation>
                  <xs:documentation>
                    String representation of the user data value.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="configuration" type="xs:string" use="required">
          <xs:annotation>
            <xs:documentation>
              The name of the configuration. This configuration must have been registered previously.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Element definitions for edges -->
  <xs:element name="PolyLineEdge" type="PolyLineEdge.type">
    <xs:annotation>
      <xs:documentation>
        PolyLineEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="ArcEdge" type="ArcEdge.type">
    <xs:annotation>
      <xs:documentation>
        ArcEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="BezierEdge" type="Edge.type">
    <xs:annotation>
      <xs:documentation>
        BezierEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="SplineEdge" type="Edge.type">
    <xs:annotation>
      <xs:documentation>
        SplineEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="QuadCurveEdge" type="QuadCurveEdge.type">
    <xs:annotation>
      <xs:documentation>
        QuadCurveEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="GenericEdge" type="GenericEdge.type">
    <xs:annotation>
      <xs:documentation>
        GenericEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>

  <!-- Node port support -->
  <xs:complexType name="PortGeometry.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the geometry of port elements.
      </xs:documentation>
    </xs:annotation>
          <xs:sequence>
            <xs:any minOccurs="1" maxOccurs="1" processContents="lax"/>
          </xs:sequence>
  </xs:complexType>

  <xs:element name="Geometry" type="PortGeometry.type">
      <xs:annotation>
          <xs:documentation>
              Port geometry element definition.
          </xs:documentation>
      </xs:annotation>
  </xs:element>

  <xs:simpleType name="NodeScaledPortLocationModel.portLocationPolicy.type">
    <xs:annotation>
      <xs:documentation>
        The valid port location policies for NodeScaledPortLocationModel.
        <p>
          Valid values are:
          <ul>
            <li><b>POLICY_DISCRETE</b></li>
            <li><b>POLICY_BOUNDARY</b></li>
            <li><b>POLICY_BOUNDARY_CENTER</b></li>
            <li><b>POLICY_BOUNDARY_INSIDE</b></li>
            <li><b>POLICY_FREE</b></li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="POLICY_DISCRETE"/>
      <xs:enumeration value="POLICY_BOUNDARY"/>
      <xs:enumeration value="POLICY_BOUNDARY_CENTER"/>
      <xs:enumeration value="POLICY_BOUNDARY_INSIDE"/>
      <xs:enumeration value="POLICY_FREE"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="NodeScaledPortLocationModel.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes a NodeScaledPortLocationModel.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="portLocationPolicy" type="NodeScaledPortLocationModel.portLocationPolicy.type"/>
    <xs:attribute name="ratioX" type="xs:double"/>
    <xs:attribute name="ratioY" type="xs:double"/>
  </xs:complexType>

  <xs:element name="NodeScaledPortLocationModel" type="NodeScaledPortLocationModel.type">
      <xs:annotation>
          <xs:documentation>
              NodeScaledPortLocationModel element definition.
          </xs:documentation>
      </xs:annotation>
  </xs:element>

  <xs:complexType name="NodePorts.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes a list of node ports.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="NodePort" type="NodePort.type" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
             A single node port element
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="NodePort.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes a NodePort.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="id" use="required">
        <xs:annotation>
        <xs:documentation>
          The id of the port.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="PortLabelModel.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the label model for node ports.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="localCandidatesEnabled" type="xs:boolean" use="optional">
        <xs:annotation>
          <xs:documentation>
              Whether to allow local candidates.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
	<xs:attribute name="offset" type="xs:double" use="optional">
        <xs:annotation>
          <xs:documentation>
              The offset of the label.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:simpleType name="PortLabelModelParameter.position.type">
    <xs:annotation>
      <xs:documentation>
        The valid parameter positions for PortLabelModelParameter.
        <p>
          Valid values are:
          <ul>
            <li><b>north</b></li>
            <li><b>south</b></li>
            <li><b>east</b></li>
            <li><b>west</b></li>
            <li><b>center</b></li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="north"/>
      <xs:enumeration value="south"/>
      <xs:enumeration value="east"/>
      <xs:enumeration value="west"/>
      <xs:enumeration value="center"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="PortLabelModelParameter.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes a PortLabelModelParameter.
      </xs:documentation>
    </xs:annotation>
	<xs:attribute name="id" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>
              The id of the port for the label.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
	<xs:attribute name="position" type="PortLabelModelParameter.position.type" use="optional">
        <xs:annotation>
          <xs:documentation>
              The position of the parameter.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:element name="PortLabelModelParameter" type="PortLabelModelParameter.type">
      <xs:annotation>
          <xs:documentation>
              PortLabelModelParameter element definition.
          </xs:documentation>
      </xs:annotation>
  </xs:element>

  <xs:element name="PortLabelModel" type="PortLabelModel.type">
      <xs:annotation>
          <xs:documentation>
              PortLabelModel element definition.
          </xs:documentation>
      </xs:annotation>
  </xs:element>

  <xs:complexType name="PortGraphics.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the visual configuration for node ports.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="configuration" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>
              The port graphics configuration.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
	<xs:attribute name="selected" type="xs:boolean" use="optional">
        <xs:annotation>
          <xs:documentation>
              Whether the port is selected.
          </xs:documentation>
        </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:element name="Graphics" type="PortGraphics.type">
      <xs:annotation>
          <xs:documentation>
              PortGraphics element definition.
          </xs:documentation>
      </xs:annotation>
  </xs:element>

  <xs:element name="UserData" type="UserData.type">
      <xs:annotation>
          <xs:documentation>
              UserData element definition.
          </xs:documentation>
      </xs:annotation>
  </xs:element>

  <!-- Shared resource block definitions -->
  <xs:complexType name="Resource.type" mixed="true">
    <xs:annotation>
      <xs:documentation>
        Complex type for a shared resource element inside a resource block container.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:annotation>
        <xs:documentation>
          The actual content. Note that arbitrary (wellformed) content is allowed here.
        </xs:documentation>
      </xs:annotation>
      <xs:any minOccurs="0" maxOccurs="1" processContents="skip"/>
    </xs:sequence>
    <xs:attribute name="id" use="required">
      <xs:annotation>
        <xs:documentation>
          The id of the shared resource. Needed to reference this resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The type of the shared resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="format" use="optional">
      <xs:annotation>
        <xs:documentation>
          The format of the shared resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="ResourceBlock.type">
    <xs:annotation>
      <xs:documentation>
        Complex type for a shared resource block container.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Resource" type="Resource.type" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
            A shared resource element.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="Resources" type="ResourceBlock.type">
    <xs:annotation>
      <xs:documentation>
        Resource block element definition.
      </xs:documentation>
    </xs:annotation>
    <xs:key name="resource_id_key">
      <xs:annotation>
        <xs:documentation>
          Ensures: existence and uniqueness of the id attributes of
          each &lt;Resource> element in this resource block.
        </xs:documentation>
      </xs:annotation>
      <xs:selector xpath=".//y:Resource"/>
      <xs:field xpath="@id"/>
    </xs:key>
  </xs:element>
  
  <xs:complexType name="StyleProperty.type" mixed="true">
    <xs:annotation>
      <xs:documentation>
        Complex type definition for a single style property.
      </xs:documentation>
    </xs:annotation>
	<xs:sequence>
	  <xs:any minOccurs="0" maxOccurs="1" processContents="lax"/>
	</xs:sequence>
	<xs:attribute name="name" use="required" type="xs:string">
      <xs:annotation>
        <xs:documentation>
          The name of the property.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
	<xs:attribute name="class" use="optional" type="xs:string">
      <xs:annotation>
        <xs:documentation>
          The class name of the property.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
	<xs:attribute name="value" use="optional" type="xs:string">
      <xs:annotation>
        <xs:documentation>
          The string value of the property.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
  <xs:complexType name="StyleProperties.type">
    <xs:annotation>
      <xs:documentation>
        Complex type definition for a set of style properties for generic node/edge realizers.
      </xs:documentation>
    </xs:annotation>
	<xs:sequence>
	  <xs:element name="Property" type="StyleProperty.type" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>	
  </xs:complexType>
  
  <xs:element name="SimpleStyle">
    <xs:annotation>
      <xs:documentation>
        Element type definition for a simple style property.
      </xs:documentation>
    </xs:annotation>
	<xs:complexType>
	  <xs:attribute name="fillColor" type="color.type" use="optional">
        <xs:annotation>
          <xs:documentation>
             The fill color of the style.
          </xs:documentation>
        </xs:annotation>
       </xs:attribute>
	   <xs:attribute name="lineColor" type="color.type" use="optional">
        <xs:annotation>
          <xs:documentation>
             The line color of the style.
          </xs:documentation>
        </xs:annotation>
       </xs:attribute>
	   <xs:attribute name="lineType" type="lineType.type" use="optional">
        <xs:annotation>
          <xs:documentation>
             The line type of the style.
          </xs:documentation>
        </xs:annotation>
       </xs:attribute>
	   <xs:attribute name="lineWidth" type="xs:double" use="optional">
        <xs:annotation>
          <xs:documentation>
             The line width of the style.
          </xs:documentation>
        </xs:annotation>
       </xs:attribute>
	</xs:complexType>	
  </xs:element>

</xs:schema>

