<?xml version="1.0" encoding="UTF-16"?>

<!DOCTYPE article  PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.docbook.org/xml/4.4/docbookx.dtd" [ ]>

<article lang="en" class="whitepaper">
  <articleinfo>
    <title>Visualizing IBM SAN Volume Controller FlashCopy Mappings</title>
    <author>
      <firstname>Dan</firstname>
      <surname>Rumney</surname>
    </author>
    <authorinitials>DCR</authorinitials>
    <pubdate>January 22, 2009</pubdate>
  </articleinfo>

  <abstract>
    <para> With the introduction of Multiple-Target <trademark class="registered"
        >FlashCopy</trademark> and Cascaded FlashCopy to <trademark class="registered"
        >IBM</trademark>
      <trademark class="trade">System Storage</trademark>
      <firstterm>SAN Volume Controller</firstterm> (SVC) , it can become difficult to keep track of
      which Virtual Disks are mapped to which, and how <firstterm>FlashCopy Mappings</firstterm>
      (FCM) depend upon one another. While submitting <command>svcinfo</command>commands or using
      the SVC Console can provide this information in a textual format, there are times when a
      diagram provides all the information you need in an easy to understand format. </para>
    <para> This paper outlines a method for generating diagrams that link VDisks and FlashCopy
      Mappings. It also serves as a worked example of automation on the SVC Command Line. This paper
      assumes familiarity with SVC and the FlashCopy functionality. </para>
  </abstract>

  <section>
    <title>SVC FlashCopy Mappings</title>
    <para> When SVC was introduced in 2003 it included a number of Copy Services: FlashCopy and
      Remote Copy. FlashCopy is a Point-In-Time Copy Service, whereby the contents of a
        <firstterm>Source Virtual Disk</firstterm> (Source) is copied to a <firstterm>Target Virtual
        Disk</firstterm> (Target), such that the Target is an <emphasis>exact</emphasis> copy of the
      Source, at that point in time. The relationship between a Source and a Target is called a
      FlashCopy Mapping (FCM). The original implementation was such that a Source could only ever
      have one active Target. In addition to this, a Target of one FCM could not be the Source of
      another FCM. A number of FCMs can be gathered together into a <firstterm>FlashCopy Consistency
        Group</firstterm> (FCG) and managed as a single entity, to ensure that all Target VDisks in
      the FCG represent the exact same point in time.</para>
    <para> With the release of SVC 4.2.1, new types of FlashCopy arrangements can be created. A
      single VDisk can act as the Source to multiple Targets. In addition to this, a VDisk which is
      acting as the Target of one FCM can also act as the Source of a different FCM. For more
      details on Copy Services in SVC, see the Redbook <citetitle>SVC 4.2.1 Advanced Copy
        Services</citetitle>
      <ulink url="http://www.redbooks.ibm.com/abstracts/sg247574.html">
        <citation>SG24-7574-00</citation>
      </ulink>. </para>
    <para> In a complex environment, the interactions between FCMs and VDisks can get quite
      involved. Dependencies between FCMs stem from internal data structures within the cluster
      rather than the logical connections between VDisks. All of these dependencies can be
      discovered by submitting the appropriate <command>svcinfo</command> commands, but the
      information is presented in a purely textual way; this provides no insight into the
      interaction between cluster objects. <xref linkend="eSampleCLI"/> shows how this output
      looks.</para>
    <example id="eSampleCLI">
      <title>Sample output from SVC commands, viewing FCM interactions</title>
      <screen><![CDATA[IBM_2145:cluster_name:admin>svcinfo lsfcmap -delim :
id:name:source_vdisk_id:source_vdisk_name:target_vdisk_id:target_vdisk_name:
group_id:group_name:status:progress:copy_rate:clean_progress:incremental
0:fcmap0:1039:vdisk1039:1040:vdisk1040:::idle_or_copied:100:93:100:on
1:fcmap1:1041:vdisk1041:1042:vdisk1042:::idle_or_copied:100:30:100:off
2:fcmap2:1043:vdisk1043:1044:vdisk1044:::idle_or_copied:100:88:100:on
3:fcmap3:1045:vdisk1045:1046:vdisk1046:::idle_or_copied:100:36:100:off
4:fcmap4:1046:vdisk1046:1047:vdisk1047:::idle_or_copied:100:96:100:on
IBM_2145:cluster_name:admin>
IBM_2145:cluster_name:admin>svcinfo lsfcmapdependentmaps -delim : 2
fc_id:fc_name
1:fcmap1
3:fcmap3]]></screen>
    </example>
    <para> The output from the <command>svcinfo</command> command does not lend itself to a swift
      overview of the cluster state. We look to the DOT language to generate a graphical
      representation of this information. </para>
  </section>

  <section>
    <title>The DOT Language</title>
    <para> The DOT Language is a language used to describe directed and undirected graphs. Once
      written, the DOT can then be processed by an appropriate program, to render the graph on
      screen.</para>
    <para> A <firstterm>directed graph</firstterm> consists of <firstterm>nodes</firstterm> and
        <firstterm>edges</firstterm>. A node is a graphical shape which may or may not contain some
      text. The nodes are interconnected by lines, called edges. In a directed graph, the edges have
      arrows at one or both ends. <xref linkend="fSampledigraph"/> shows a sample directed graph.
      Ellipses <varname>a</varname>,<varname>b</varname>, <varname>c</varname> and
        <varname>d</varname> are all nodes.</para>
    <figure id="fSampledigraph">
      <title>Sample directed graph</title>
      <mediaobject>
        <imageobject>
          <imagedata fileref="figure\sampleDigraph.gif"/>
        </imageobject>
        <textobject>
          <phrase>Sample directed graph generated by a DOT parser</phrase>
        </textobject>
      </mediaobject>
    </figure>
    <para> The DOT language is quite straightforward; for instance, the DOT required to generate
        <xref linkend="fSampledigraph"/> can be seen in <xref linkend="eSampleDOT"/>. The nodes are
      represented by the various letters. In each line in the example, you can see the 'arrow'
      notation which indicates a directed edge, joining two nodes.</para>
    <example id="eSampleDOT">
      <title>DOT language for generating a directed graph</title>
      <programlisting>digraph EXAMPLE
{
  a -> c;
  b -> c;
  c -> d;
  d -> a;
}</programlisting>
    </example>
    <para> A DOT file only <emphasis>describes</emphasis> the graph. You must pass this file to a
      rendering program in order to generate a graphical representation. Once such program is
        <command>dot</command>, which is part of the 
      <ulink url="http://graphviz.org/"><application>Graphviz</application></ulink> package. 
      Once installed, the invocation shown in <xref linkend="eDOTCmd"/> will
      generate a GIF file rendering of the sample directed graph described in <xref
        linkend="eSampleDOT"/>. </para>
    <example id="eDOTCmd">
      <title>Invocation to generate graphic from DOT language (Windows)</title>
      <screen>dot -T gif -o sampleDigraph.gif -K dot -v sampleDiGraph.dot</screen>
    </example>
    <para> The capabilities of the DOT language lend themselves directly to the challenge of
      visualizing FlashCopy Mapping and VDisk relationships. The challenge is to generate the DOT
      necessary to generate our required visualization. In order to do this, we can use SVC Command
      Line Scripting. </para>
  </section>

  <section>
    <title>SVC Command Line Scripting</title>
    <para>The SVC Command Line Interface is based on a restricted Bash Shell. This provides us with
      a double-edged opportunity. On one hand, the Bash Shell means that we have the opportunity to
      execute scripts while logged in to the SVC Command Line. On the other hand, the restricted
      aspect strongly limits what we can do and results in the need for some imaginative scripting. </para>
    <para> The Bash Shell includes a number of 'built-in' commands that can be used, such as:
        <simplelist>
        <member>
          <command>if</command>
        </member>
        <member>
          <command>while</command>
        </member>
        <member>
          <command>for</command>
        </member>
        <member>
          <command>read</command>
        </member>
        <member>
          <command>echo</command>
        </member>
      </simplelist></para>
    <para>The restrictions on the Shell mean that there is no access to scripting standards such as
        <command>sed</command>, <command>awk</command> and <command>grep</command>. In addition, IO
      cannot be redirected to files. However, command output <emphasis>can</emphasis> be redirected
      to other commands, via pipes.</para>
    <para>
      <xref linkend="aScript"/> contains the script that we'll be discussing for the remainder of
      this paper. This script creates a CLI function which, when executed, generates DOT language
      which describes the connections between a set of VDisks and FCMs. The CLI function has one
      parameter, which is the id of one of the cluster's VDisks. Given a VDisk ID, this command
      follows the procedure below.</para>
    <procedure>
      <step>
        <para>Search for any FCMs which have the provided VDisk as a Source or Target</para>
      </step>
      <step>
        <para> For any FCMs found, identify the counterpart VDisks and repeat step 1 for each of the new VDisks</para>
      </step>
      <step>
        <para>For all of the FCMs found, search for all dependant FCMs</para>
      </step>
      <step>
        <para>Generate the DOT language, describing the VDisk and FCM interactions</para>
      </step>
    </procedure>
    <para><xref linkend="eOutputFromScript"/> shows example output from this function. When rendered
      by <command>dot</command>, the graphic shown in <xref linkend="fSampleFCDigraph"/>
    </para>
    <example id="eOutputFromScript">
      <title>Sample output from script</title>
      <screen><![CDATA[IBM_2145:cluster_name:admin>makeFCMapTree 1212
digraph F {
  1210 [style=filled,fillcolor=green]
  514 [shape=box,height=0.4,width=0.4,fillcolor=green,style=filled]
  1210 -> 514
  514 -> 1212
  515 [shape=box,height=0.4,width=0.4,fillcolor=green,style=filled]
  1210 -> 515
  515 -> 1213
  1212 [style=filled,fillcolor=green]
  1213 [style=filled,fillcolor=green]
  1211 [style=filled,fillcolor=green]
  512 [shape=box,height=0.4,width=0.4,fillcolor=green,style=filled]
  1211 -> 512
  512 -> 1209
  513 [shape=box,height=0.4,width=0.4,fillcolor=green,style=filled]
  1211 -> 513
  513 -> 1210
  1209 [style=filled,fillcolor=green]
}]]></screen>
    </example>
    <para> The ellipses represent VDisks. The rectangles represent FlashCopy Mappings. The colours
      of the shapes represent the state of the FlashCopy Mappings and VDisks. In one glance, the
      interactions between VDisks and FlashCopy Mappings are clear and any issues are immediately
      obvious. </para>
    <figure id="fSampleFCDigraph">
      <title>Sample directed graph</title>
      <mediaobject>
        <imageobject>
          <imagedata fileref="figure\fc.gif"/>
        </imageobject>
        <textobject>
          <phrase>Sample FlashCopy graph</phrase>
        </textobject>
      </mediaobject>
    </figure>
    <para>
      In the next section, we will go through this script line by line and explain what is being done. The techniques used in this script can be used in scripts of your own to perform whatever actions you require. 
      If you prefer, you can skip to <xref linkend="sUsage"/> to learn how to use the script.
    </para>
  </section>

  <section>
    <title>Script Analysis</title>
    <para>When the script in <xref linkend="aScript"/> is executed, it creates a new function called
        <function>makeFCMapTree</function> in the active SVC CLI session. The script itself has
        <emphasis>no</emphasis> output. Once the function has been created, it is invoked by
      providing the function name and a VDisk ID. It generates output in the DOT language which can
      be captured and saved for later rendering. In this section, we analysis the script section by
      section and explain its function.</para>
    <section>
      <title>Lines 1-18</title>
      <para>The first 18 lines are concerned with setting up variables for use during the main
        loop.</para>
      <formalpara>
        <title>Lines 1-15</title>
        <para> The fifteen first lines simply start the function and set up some variables assigning
          colours to FCM and VDisk states. These can be changed to suit your needs, with the
          requirement that all 10 states are present and the colours that are selected are part of
          the DOT language. <xref linkend="aDOTColours"/> shows the colours supported by DOT.</para>
      </formalpara>
      <formalpara>
        <title>Line 16</title>
        <para>This line outputs the first line of DOT, which indicates that we'll be describing a
          directed graph. We call it F for FlashCopy, but the name is entirely arbitrary (within the
          constraints of the DOT language) </para>
      </formalpara>
      <formalpara>
        <title>Line 17</title>
        <para>In this line, we create an array called <varname>$possSrcs</varname>. This array will be
          treated as a FIFO stack. It will contain a list of VDisks which are possibly acting as the Sources
          of an FCM. At this point in the execution, we add the VDisk ID that was provided as the
          sole parameter to the function. In subsequent passes through the main loop, new VDisk IDs
          may be added, as required. </para>
      </formalpara>

      <formalpara>
        <title>Line 18</title>
        <para>Here, we create an empty array which will keep track of all  VDisk IDs which
          have been processed. This is to ensure that the script processes each VDisk ID once and
          once only. </para>
      </formalpara>
    </section>

    <section>
      <title>Lines 19-26</title>
      <para>These lines start the main loop and gather information about the next VDisk ID in the
          <varname>$possSrcs</varname> stack.</para>
      <formalpara>
        <title>Line 19</title>
        <para>This starts the main loop of this script. The loop will execute as long as there are
          VDisk IDs in <varname>$possSrcs</varname>. This loop ends on line 56.</para>
      </formalpara>
      <formalpara>
        <title>Lines 20-21</title>
        <para>Lines 20-21 perform the <function>pop</function> operation of a stack, removing the
          first element from <varname>$possSrcs</varname> and assigning it to
            <varname>$currSrc</varname>.</para>
      </formalpara>
      <formalpara>
        <title>Lines 22-26</title>
        <para> Lines 22-26 show a technique that will be repeated a number of times in this script.
          This technique is to run an <command>svcinfo</command> command and execute a series of
          commands based on each line of output from the <command>svcinfo</command> command.</para>
      </formalpara>
      <para> The technique has the following form:
        <programlisting>svcinfo xxxx | while read var1 var2 var3 rest; do
          some commands using $var1, $var2, etc
done</programlisting>
        This technique will take each line of output from the <command>svcinfo</command> command and
        pass it to the <command>read</command> built-in command. The read command works in the
        following way: <cmdsynopsis>
          <command>read</command>
          <arg choice="opt" rep="repeat">
            <replaceable>name</replaceable>
          </arg>
        </cmdsynopsis></para>
      <para> The <command>read</command> command takes a line from STDIN and splits it into words
        separated according to the <firstterm>Internal Field Separator</firstterm> (IFS). By default, IFS is
        set to whitespace. The first word is assigned to the first
          <varname>name</varname>, the second to  the second <varname>name</varname> and so on. Any leftover
        words are assigned to the final name with the intervening IFS included.</para>
      <para>In the technique shown above, the variables <varname>$var1</varname>, <varname>$var2</varname>, etc can now be used by commands inside the
          <command>while</command> loop. The loop will repeat once per line of output from the
          <command>svcinfo</command> command. The variable <varname>$rest</varname> is needed to
        capture any remaining values at the end of the line of output. </para>

      <para>The command <code>svcinfo lsvdisk -nohdr -filtervalue id=$currSrc</code> will
        generate zero or one line of output. (depending on whether the value in
          <varname>$currSrc</varname> is an actual VDisk ID). </para>

      <formalpara>
        <title>Line 24</title>
        <para> This line acts to 'dereference' the VDisk status. The code <varname>$(eval echo
            \$$vStatus)</varname> will take the value stored in <varname>$vStatus</varname> and
          treat it as the name of a variable and try to find the value stored in that. For instance,
          if <varname>$vStatus</varname> is equal to 'preparing' then this line will look for the
          value found in <varname>$preparing</varname> and, in this case, return 'yellow'. In this
          way, we can assign colours to VDisk states.</para>
      </formalpara>
      <formalpara>
        <title>Line 25</title>
        <para> This generates lines of DOT which define a node in the graph. In this instance a
          VDisk node is generated. The VDisk node is an ellipse, filled in a colour representing the
          VDisk's state. </para>
      </formalpara>
    </section>

    <section>
      <title>Lines 27-30</title>
      <para> These two lines generate an array of FCM Target VDisk IDs and mark the current VDisk ID
        (held in <varname>$currentSrc</varname>) as having been processed. </para>
      <formalpara>
        <title>Lines 27-29</title>
        <para> Lines 27-29 create a new array that holds all of the FCMs which have the current
          VDisk (represented by <varname>$currSrc</varname>) as the Source VDisk. This array is
          called <varname>$newTgts</varname>. These three lines shows a method of generating an
          array directly from the output of an <command>svcinfo</command> command. In this
          particular instance, each line of <command>svcinfo</command> output generates 3 array
          elements: <variablelist>
            <varlistentry>
              <term>
                <varname>$newTgts[L]</varname>
              </term>
              <listitem>
                <para>FlashCopy Mapping ID</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>
                <varname>$newTgts[L+1]</varname>
              </term>
              <listitem>
                <para>Target VDisk ID</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>
                <varname>$newTgts[L+2]</varname>
              </term>
              <listitem>
                <para> FlashCopy Mapping status</para>
              </listitem>
            </varlistentry>
          </variablelist> where <varname>L</varname> increases by one per line of
            <command>svcinfo</command> output.</para>
      </formalpara>

      <formalpara>
        <title>Line 30</title>
        <para> Line 30 keeps track of the fact that we have now processed the VDisk ID(as an
          FCM Source... it may appear later as an FCM Target). </para>
      </formalpara>
    </section>

    <section>
      <title>Lines 31-46</title>
      <para>These lines process the FCMs that were placed into <varname>$newTgts</varname> and
        generate the appropriate DOT to represent them.</para>
      <formalpara>
        <title>Line 31</title>
        <para> Lines 31 creates the loop to process <varname>$newTgts</varname>. It creates an index
          variable which is incremented by 3 for each pass (since 3 elements in an array represent <emphasis>one</emphasis>
          FC Mapping). </para>
      </formalpara>
      <formalpara>
        <title>Lines 32-35</title>
        <para>Lines 32 to 34 simply collect the relevant array elements in to clearer variable
          names. Line 35 decodes the FC Mapping status into a colour, much like line 24. </para>
      </formalpara>
      <formalpara>
        <title>Lines 36-39</title>
        <para>Lines 36-39 generate DOT language; lines 36 and 37 creates an FC Mapping node, which
          is a square filled with a colour that represents its state. </para>
      </formalpara>
      <para>Lines 38 and 39 generate the edges that link the FC Mapping node with its Source and
        Target VDisks. </para>
      <formalpara>
        <title>Lines 40-42</title>
        <para>Lines 40-42 look at the FCM Target and determine whether or not it has been processed as
          a Source. If it has not, it is added to our list of possible Sources: <varname>$possSrcs</varname>. The
          code in line 41 acts to place this new VDisk ID at the end of the stack. </para>
      </formalpara>
      <formalpara>
        <title>Lines 43-45</title>
        <para>Lines 43-45 look to see if there are any dependencies between this FCM and other FCMs.
          If there are, a new edge is generated to indicate this. </para>
      </formalpara>
    </section>

    <section>
      <title>Lines 48-55</title>
      <para> Lines 48-55 perform a similar task to line 27 and the loop that follows it.</para>

      <formalpara>
        <title>Line 48</title>
        <para>Line 48 generates an array of FCM Source VDisk IDs, which have
            <varname>$currentSrc</varname> as their Target. This array is called
            <varname>$newSrcs</varname>. Instead of generating any DOT in the loop, however, this
          loop simply adds the indicated VDisk IDs to the <varname>$possSrcs</varname> array, if they
          have not previously been processed. </para>
      </formalpara>
    </section>

    <section>
      <title>Lines 56-58</title>
      <para> All that remains at this point is to complete the loops, close out the DOT language
        with a curly bracket and the function is complete. </para>
    </section>
  </section>

  <section id="sUsage">
    <title>Using the script</title>
    <para> There are two simple ways to use the script. It can be executed directly from an
      interactive CLI session, or it can be used as part of a batch session.</para>
    <section>
      <title>Interactive session</title>
      <para>Adding the <function>makeFCTreeMap</function> function to an interactive session is very
        straightforward. Simply copy the full text of the script into the clipboard and then paste
        it into the terminal. Once the script has executed, the <function>makeFCTreeMap</function>
        function will be available to you for the remainder of that CLI session.</para>
      <para> Once you've passed a VDisk ID to  the function, you will need to copy the output from the CLI
        session and place it into a dot file for rendering. </para>
    </section>
    <section>
      <title>Batch session</title>
      <para> Adding the <function>makeFCTreeMap</function> function to a batch session depends on
        your SSH client. Here, we will discuss <application>PuTTY</application> for the Windows
        operating system and <command>ssh</command> for Linux or <trademark class="registered"
          >AIX</trademark>. </para>
      <para> Whichever operating system you use, the output from the script will be returned to the
        STDOUT stream on your local system. You can redirect this output to a dot file, and then
        pass it to your rendering application. </para>
      <section>
        <title>Required script changes</title>
        <para> When a script is submitted to the SVC Cluster in this way, STDIN is replaced by the
          contents of the script and executed as if it was typed in manually. Once the end of the
          file is reached, control returns to the local command line and <emphasis>not</emphasis>
          the SVC command line. Since the normal function of the makeFCTreeMap script is to create a
          new function in the CLI session (and nothing more), the following modifications are needed
          to generate output: <itemizedlist>
            <listitem>
              <para>Delete lines 1 and 2</para>
            </listitem>
            <listitem>
              <para>Delete line 58</para>
            </listitem>
            <listitem>
              <para>Replace <varname>$1</varname> in line 17 with the ID of the VDisk that you're
                interested in.</para>
            </listitem>
          </itemizedlist>
        </para>
        <para>
          Once these changes have been made, the resulting <varname>script_file</varname> should be submitted to the cluster using one of the methods shown in the next subsections.
        </para>
      </section>
      
      <section>
        <title>PuTTY</title>
        <para> The <command>plink</command> command comes as part of the
            <application>PuTTY</application> application. <xref linkend="ePlink"/> shows the command
          to use to submit a script to an SVC cluster. </para>
        <example id="ePlink">
          <title>Submitting script to an SVC cluster using <command>plink</command></title>
          <screen>
plink -l admin -m script_file -i private_key_file cluster_name 
              </screen>
          <variablelist>
            <varlistentry>
              <term>
                <varname>script_file</varname>
              </term>
              <listitem>
                <para>The file containing the makeFCTreeMap script</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>
                <varname>private_key_file</varname>
              </term>
              <listitem>
                <para>An SSH private key which corresponds to a public key that has been uploaded to
                  the SVC cluster in question</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>
                <varname>cluster_name</varname>
              </term>
              <listitem>
                <para>The IP address or DNS name</para>
              </listitem>
            </varlistentry>
          </variablelist>
        </example>

      </section>
      <section>
        <title>SSH</title>
        <para> The <command>ssh</command> command comes with most (if not all) *nix operating
          systems. <xref linkend="eSSH"/> shows the invocation required to submit a script to an SVC
          cluster using <command>ssh</command>. </para>
        <example id="eSSH">
          <title>Submitting script to an SVC cluster using <command>ssh</command></title>
          <screen>
ssh -i private_key_file -T admin@cluster_name &lt; script_file 
          </screen>
          <variablelist>
            <varlistentry>
              <term>
                <varname>script_file</varname>
              </term>
              <listitem>
                <para>The file containing the makeFCTreeMap script</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>
                <varname>private_key_file</varname>
              </term>
              <listitem>
                <para>An SSH private key which corresponds to a public key that has been uploaded to
                  the SVC cluster in question</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>
                <varname>cluster_name</varname>
              </term>
              <listitem>
                <para>The IP address or DNS name</para>
              </listitem>
            </varlistentry>
          </variablelist>
        </example>
      </section>
    </section>

  </section>
  <section>
    <title>Possible Improvements</title>
    <para>
      The script in <xref linkend="aScript"/> functions correctly for all possible VDisk IDs, including ones that are not present on the cluster. However, there are some interesting changes that could be made to enhance the script. These
      are offered as suggestions and are left to the reader to implement:
      <variablelist><title>Possible improvements to script</title>
        <varlistentry><term>Handle Multiple VDisk IDs</term>
          <listitem><para>The current version of the <function>makeFCTreeMap</function> only accepts a single VDisk ID. It would be a fairly simple task to change the script to allow the function to accept any number of VDisk IDs. It would be important
          to check for duplicate VDisk IDs appearing in the <varname>$possSrcs</varname> stack.</para></listitem>
        </varlistentry>
        <varlistentry><term>Handle FlashCopy Mapping IDs</term>
          <listitem><para>Expanding this script to support FCM IDs instead of VDisk IDs is the straightforward task of taking the FCM ID, determining the Source VDisk's ID and placing this into the <varname>$possSrcs</varname> stack and then proceeding
          as before. The challenge lies in making the one script support VDisk IDs <emphasis>and</emphasis> FCM IDs.</para></listitem>
        </varlistentry>
        <varlistentry><term>Handle FlashCopy Consistency Group IDs</term>
          <listitem><para>Handling FlashCopy Consistency Groups is the natural combination of handling multiple VDisk IDs and handling FlashCopy Mappings, since an FCG is simply a group of  FCMs. The following code will turn an FCG id into an array of
            FCM ids: <code><![CDATA[fcmIDs=(`svcinfo lsfcmap -nohdr -filtervalue group_id=0 | while read fcmid rest; do echo $fcmid; done`)]]></code></para></listitem></varlistentry>
      </variablelist>
      
      
    </para>
  </section>
  
  
  <appendix id="aScript">
    <title>Graph generating script</title>
    <para> The script below has been formatted so that it will fit onto the page. As a result, line
      continuation operators have been used on lines 22, 27, 28, 36 and 48. </para>
    <programlisting linenumbering="numbered" language="bash"><![CDATA[makeFCMapTree ()
{
  # Define the colouring for FC Mapping and VDisk states
  idle_or_copied=green
  preparing=yellow
  prepared=green
  copying=green
  stopped=red
  suspended=red
  stopping=yellow
  online=green
  offline=red
  degraded=yellow
  
  # Start the directed graph
  echo "digraph F {";
  possSrcs=($1);
  processed=();
  while [ ${#possSrcs[@]} -gt 0 ]; do
    currSrc=${possSrcs[0]};
    possSrcs=(${possSrcs[@]:1});
    svcinfo lsvdisk -nohdr -filtervalue id=$currSrc | while read id name \
iogId iogName vStatus junk; do
      vdkColour=$(eval echo \$$vStatus);
      echo "$currSrc [style=filled,fillcolor=$vdkColour]";
    done
    newTgts=(`svcinfo lsfcmap -nohdr -filtervalue source_vdisk_id=$currSrc \
-delim :| while IFS=: read id n srcId srcName tgtId tgtName gId gName \
status junk; do echo "$id $tgtId $status"; done`);
    processed[$currSrc]=y;
    for ((i=0; i<${#newTgts[@]};i=$(($i + 3)))); do
      fcm=${newTgts[$i]};
      tgt=${newTgts[$(($i + 1))]};
      status=${newTgts[$(($i + 2))]};
      colour=$(eval echo \$$status);
      echo "fc$fcm [label=\"$fcm\"shape=box,height=0.4,width=0.4,\
fillcolor=$colour,style=filled]";
      echo "$currSrc -> fc$fcm";
      echo "fc$fcm -> $tgt";
      if [ "${processed[$tgt]}" != "y" ]; then
      possSrcs=(${possSrcs[@]} $tgt);
      fi;
      svcinfo lsfcmapdependentmaps -nohdr $fcm | while read fcId fcName; do
        echo "$fcm -> $fcId [style=dotted]"
      done
    done;
    
    newSrcs=(`svcinfo lsfcmap -nohdr -filtervalue target_vdisk_id=$currSrc| \
while read id name srcId junk; do echo "$srcId "; done`);
    for src in ${newSrcs[@]};
    do
      if [ "${processed[$src]}" != "y" ]; then
      possSrcs=(${possSrcs[@]} $src);
      fi;
    done;
  done;
  echo "}";
}]]></programlisting>
  </appendix>
  <appendix id="aDOTColours">
    <title>Valid colours in the DOT language</title>
    <para>The following are acceptable colours in the DOT language: This list can also be found at <ulink url="http://www.graphviz.org/doc/info/colors.html"><citetitle>Graphviz Color Names</citetitle></ulink></para>
    <simplelist columns="4">
      <member><code>aliceblue</code></member>
<member><code>antiquewhite</code></member>
<member><code>antiquewhite1</code></member>
<member><code>antiquewhite2</code></member>
<member><code>antiquewhite3</code></member>
<member><code>antiquewhite4</code></member>
<member><code>aquamarine</code></member>
<member><code>aquamarine1</code></member>
<member><code>aquamarine2</code></member>
<member><code>aquamarine3</code></member>
<member><code>aquamarine4</code></member>
<member><code>azure</code></member>
<member><code>azure1</code></member>
<member><code>azure2</code></member>
<member><code>azure3</code></member>
<member><code>azure4</code></member>
<member><code>beige</code></member>
<member><code>bisque</code></member>
<member><code>bisque1</code></member>
<member><code>bisque2</code></member>
<member><code>bisque3</code></member>
<member><code>bisque4</code></member>
<member><code>black</code></member>
<member><code>blanchedalmond</code></member>
<member><code>blue</code></member>
<member><code>blue1</code></member>
<member><code>blue2</code></member>
<member><code>blue3</code></member>
<member><code>blue4</code></member>
<member><code>blueviolet</code></member>
<member><code>brown</code></member>
<member><code>brown1</code></member>
<member><code>brown2</code></member>
<member><code>brown3</code></member>
<member><code>brown4</code></member>
<member><code>burlywood</code></member>
<member><code>burlywood1</code></member>
<member><code>burlywood2</code></member>
<member><code>burlywood3</code></member>
<member><code>burlywood4</code></member>
<member><code>cadetblue</code></member>
<member><code>cadetblue1</code></member>
<member><code>cadetblue2</code></member>
<member><code>cadetblue3</code></member>
<member><code>cadetblue4</code></member>
<member><code>chartreuse</code></member>
<member><code>chartreuse1</code></member>
<member><code>chartreuse2</code></member>
<member><code>chartreuse3</code></member>
<member><code>chartreuse4</code></member>
<member><code>chocolate</code></member>
<member><code>chocolate1</code></member>
<member><code>chocolate2</code></member>
<member><code>chocolate3</code></member>
<member><code>chocolate4</code></member>
<member><code>coral</code></member>
<member><code>coral1</code></member>
<member><code>coral2</code></member>
<member><code>coral3</code></member>
<member><code>coral4</code></member>
<member><code>cornflowerblue</code></member>
<member><code>cornsilk</code></member>
<member><code>cornsilk1</code></member>
<member><code>cornsilk2</code></member>
<member><code>cornsilk3</code></member>
<member><code>cornsilk4</code></member>
<member><code>crimson</code></member>
<member><code>cyan</code></member>
<member><code>cyan1</code></member>
<member><code>cyan2</code></member>
<member><code>cyan3</code></member>
<member><code>cyan4</code></member>
<member><code>darkgoldenrod</code></member>
<member><code>darkgoldenrod1</code></member>
<member><code>darkgoldenrod2</code></member>
<member><code>darkgoldenrod3</code></member>
<member><code>darkgoldenrod4</code></member>
<member><code>darkgreen</code></member>
<member><code>darkkhaki</code></member>
<member><code>darkolivegreen</code></member>
<member><code>darkolivegreen1</code></member>
<member><code>darkolivegreen2</code></member>
<member><code>darkolivegreen3</code></member>
<member><code>darkolivegreen4</code></member>
<member><code>darkorange</code></member>
<member><code>darkorange1</code></member>
<member><code>darkorange2</code></member>
<member><code>darkorange3</code></member>
<member><code>darkorange4</code></member>
<member><code>darkorchid</code></member>
<member><code>darkorchid1</code></member>
<member><code>darkorchid2</code></member>
<member><code>darkorchid3</code></member>
<member><code>darkorchid4</code></member>
<member><code>darksalmon</code></member>
<member><code>darkseagreen</code></member>
<member><code>darkseagreen1</code></member>
<member><code>darkseagreen2</code></member>
<member><code>darkseagreen3</code></member>
<member><code>darkseagreen4</code></member>
<member><code>darkslateblue</code></member>
<member><code>darkslategray</code></member>
<member><code>darkslategray1</code></member>
<member><code>darkslategray2</code></member>
<member><code>darkslategray3</code></member>
<member><code>darkslategray4</code></member>
<member><code>darkslategrey</code></member>
<member><code>darkturquoise</code></member>
<member><code>darkviolet</code></member>
<member><code>deeppink</code></member>
<member><code>deeppink1</code></member>
<member><code>deeppink2</code></member>
<member><code>deeppink3</code></member>
<member><code>deeppink4</code></member>
<member><code>deepskyblue</code></member>
<member><code>deepskyblue1</code></member>
<member><code>deepskyblue2</code></member>
<member><code>deepskyblue3</code></member>
<member><code>deepskyblue4</code></member>
<member><code>dimgray</code></member>
<member><code>dimgrey</code></member>
<member><code>dodgerblue</code></member>
<member><code>dodgerblue1</code></member>
<member><code>dodgerblue2</code></member>
<member><code>dodgerblue3</code></member>
<member><code>dodgerblue4</code></member>
<member><code>firebrick</code></member>
<member><code>firebrick1</code></member>
<member><code>firebrick2</code></member>
<member><code>firebrick3</code></member>
<member><code>firebrick4</code></member>
<member><code>floralwhite</code></member>
<member><code>forestgreen</code></member>
<member><code>gainsboro</code></member>
<member><code>ghostwhite</code></member>
<member><code>gold</code></member>
<member><code>gold1</code></member>
<member><code>gold2</code></member>
<member><code>gold3</code></member>
<member><code>gold4</code></member>
<member><code>goldenrod</code></member>
<member><code>goldenrod1</code></member>
<member><code>goldenrod2</code></member>
<member><code>goldenrod3</code></member>
<member><code>goldenrod4</code></member>
<member><code>gray</code></member>
<member><code>gray0</code></member>
<member><code>gray1</code></member>
<member><code>gray2</code></member>
<member><code>gray3</code></member>
<member><code>gray4</code></member>
<member><code>gray5</code></member>
<member><code>gray6</code></member>
<member><code>gray7</code></member>
<member><code>gray8</code></member>
<member><code>gray9</code></member>
<member><code>gray10</code></member>
<member><code>gray11</code></member>
<member><code>gray12</code></member>
<member><code>gray13</code></member>
<member><code>gray14</code></member>
<member><code>gray15</code></member>
<member><code>gray16</code></member>
<member><code>gray17</code></member>
<member><code>gray18</code></member>
<member><code>gray19</code></member>
<member><code>gray20</code></member>
<member><code>gray21</code></member>
<member><code>gray22</code></member>
<member><code>gray23</code></member>
<member><code>gray24</code></member>
<member><code>gray25</code></member>
<member><code>gray26</code></member>
<member><code>gray27</code></member>
<member><code>gray28</code></member>
<member><code>gray29</code></member>
<member><code>gray30</code></member>
<member><code>gray31</code></member>
<member><code>gray32</code></member>
<member><code>gray33</code></member>
<member><code>gray34</code></member>
<member><code>gray35</code></member>
<member><code>gray36</code></member>
<member><code>gray37</code></member>
<member><code>gray38</code></member>
<member><code>gray39</code></member>
<member><code>gray40</code></member>
<member><code>gray41</code></member>
<member><code>gray42</code></member>
<member><code>gray43</code></member>
<member><code>gray44</code></member>
<member><code>gray45</code></member>
<member><code>gray46</code></member>
<member><code>gray47</code></member>
<member><code>gray48</code></member>
<member><code>gray49</code></member>
<member><code>gray50</code></member>
<member><code>gray51</code></member>
<member><code>gray52</code></member>
<member><code>gray53</code></member>
<member><code>gray54</code></member>
<member><code>gray55</code></member>
<member><code>gray56</code></member>
<member><code>gray57</code></member>
<member><code>gray58</code></member>
<member><code>gray59</code></member>
<member><code>gray60</code></member>
<member><code>gray61</code></member>
<member><code>gray62</code></member>
<member><code>gray63</code></member>
<member><code>gray64</code></member>
<member><code>gray65</code></member>
<member><code>gray66</code></member>
<member><code>gray67</code></member>
<member><code>gray68</code></member>
<member><code>gray69</code></member>
<member><code>gray70</code></member>
<member><code>gray71</code></member>
<member><code>gray72</code></member>
<member><code>gray73</code></member>
<member><code>gray74</code></member>
<member><code>gray75</code></member>
<member><code>gray76</code></member>
<member><code>gray77</code></member>
<member><code>gray78</code></member>
<member><code>gray79</code></member>
<member><code>gray80</code></member>
<member><code>gray81</code></member>
<member><code>gray82</code></member>
<member><code>gray83</code></member>
<member><code>gray84</code></member>
<member><code>gray85</code></member>
<member><code>gray86</code></member>
<member><code>gray87</code></member>
<member><code>gray88</code></member>
<member><code>gray89</code></member>
<member><code>gray90</code></member>
<member><code>gray91</code></member>
<member><code>gray92</code></member>
<member><code>gray93</code></member>
<member><code>gray94</code></member>
<member><code>gray95</code></member>
<member><code>gray96</code></member>
<member><code>gray97</code></member>
<member><code>gray98</code></member>
<member><code>gray99</code></member>
<member><code>gray100</code></member>
<member><code>green</code></member>
<member><code>green1</code></member>
<member><code>green2</code></member>
<member><code>green3</code></member>
<member><code>green4</code></member>
<member><code>greenyellow</code></member>
<member><code>grey</code></member>
<member><code>grey0</code></member>
<member><code>grey1</code></member>
<member><code>grey2</code></member>
<member><code>grey3</code></member>
<member><code>grey4</code></member>
<member><code>grey5</code></member>
<member><code>grey6</code></member>
<member><code>grey7</code></member>
<member><code>grey8</code></member>
<member><code>grey9</code></member>
<member><code>grey10</code></member>
<member><code>grey11</code></member>
<member><code>grey12</code></member>
<member><code>grey13</code></member>
<member><code>grey14</code></member>
<member><code>grey15</code></member>
<member><code>grey16</code></member>
<member><code>grey17</code></member>
<member><code>grey18</code></member>
<member><code>grey19</code></member>
<member><code>grey20</code></member>
<member><code>grey21</code></member>
<member><code>grey22</code></member>
<member><code>grey23</code></member>
<member><code>grey24</code></member>
<member><code>grey25</code></member>
<member><code>grey26</code></member>
<member><code>grey27</code></member>
<member><code>grey28</code></member>
<member><code>grey29</code></member>
<member><code>grey30</code></member>
<member><code>grey31</code></member>
<member><code>grey32</code></member>
<member><code>grey33</code></member>
<member><code>grey34</code></member>
<member><code>grey35</code></member>
<member><code>grey36</code></member>
<member><code>grey37</code></member>
<member><code>grey38</code></member>
<member><code>grey39</code></member>
<member><code>grey40</code></member>
<member><code>grey41</code></member>
<member><code>grey42</code></member>
<member><code>grey43</code></member>
<member><code>grey44</code></member>
<member><code>grey45</code></member>
<member><code>grey46</code></member>
<member><code>grey47</code></member>
<member><code>grey48</code></member>
<member><code>grey49</code></member>
<member><code>grey50</code></member>
<member><code>grey51</code></member>
<member><code>grey52</code></member>
<member><code>grey53</code></member>
<member><code>grey54</code></member>
<member><code>grey55</code></member>
<member><code>grey56</code></member>
<member><code>grey57</code></member>
<member><code>grey58</code></member>
<member><code>grey59</code></member>
<member><code>grey60</code></member>
<member><code>grey61</code></member>
<member><code>grey62</code></member>
<member><code>grey63</code></member>
<member><code>grey64</code></member>
<member><code>grey65</code></member>
<member><code>grey66</code></member>
<member><code>grey67</code></member>
<member><code>grey68</code></member>
<member><code>grey69</code></member>
<member><code>grey70</code></member>
<member><code>grey71</code></member>
<member><code>grey72</code></member>
<member><code>grey73</code></member>
<member><code>grey74</code></member>
<member><code>grey75</code></member>
<member><code>grey76</code></member>
<member><code>grey77</code></member>
<member><code>grey78</code></member>
<member><code>grey79</code></member>
<member><code>grey80</code></member>
<member><code>grey81</code></member>
<member><code>grey82</code></member>
<member><code>grey83</code></member>
<member><code>grey84</code></member>
<member><code>grey85</code></member>
<member><code>grey86</code></member>
<member><code>grey87</code></member>
<member><code>grey88</code></member>
<member><code>grey89</code></member>
<member><code>grey90</code></member>
<member><code>grey91</code></member>
<member><code>grey92</code></member>
<member><code>grey93</code></member>
<member><code>grey94</code></member>
<member><code>grey95</code></member>
<member><code>grey96</code></member>
<member><code>grey97</code></member>
<member><code>grey98</code></member>
<member><code>grey99</code></member>
<member><code>grey100</code></member>
<member><code>honeydew</code></member>
<member><code>honeydew1</code></member>
<member><code>honeydew2</code></member>
<member><code>honeydew3</code></member>
<member><code>honeydew4</code></member>
<member><code>hotpink</code></member>
<member><code>hotpink1</code></member>
<member><code>hotpink2</code></member>
<member><code>hotpink3</code></member>
<member><code>hotpink4</code></member>
<member><code>indianred</code></member>
<member><code>indianred1</code></member>
<member><code>indianred2</code></member>
<member><code>indianred3</code></member>
<member><code>indianred4</code></member>
<member><code>indigo</code></member>
<member><code>ivory</code></member>
<member><code>ivory1</code></member>
<member><code>ivory2</code></member>
<member><code>ivory3</code></member>
<member><code>ivory4</code></member>
<member><code>khaki</code></member>
<member><code>khaki1</code></member>
<member><code>khaki2</code></member>
<member><code>khaki3</code></member>
<member><code>khaki4</code></member>
<member><code>lavender</code></member>
<member><code>lavenderblush</code></member>
<member><code>lavenderblush1</code></member>
<member><code>lavenderblush2</code></member>
<member><code>lavenderblush3</code></member>
<member><code>lavenderblush4</code></member>
<member><code>lawngreen</code></member>
<member><code>lemonchiffon</code></member>
<member><code>lemonchiffon1</code></member>
<member><code>lemonchiffon2</code></member>
<member><code>lemonchiffon3</code></member>
<member><code>lemonchiffon4</code></member>
<member><code>lightblue</code></member>
<member><code>lightblue1</code></member>
<member><code>lightblue2</code></member>
<member><code>lightblue3</code></member>
<member><code>lightblue4</code></member>
<member><code>lightcoral</code></member>
<member><code>lightcyan</code></member>
<member><code>lightcyan1</code></member>
<member><code>lightcyan2</code></member>
<member><code>lightcyan3</code></member>
<member><code>lightcyan4</code></member>
<member><code>lightgoldenrod</code></member>
<member><code>lightgoldenrod1</code></member>
<member><code>lightgoldenrod2</code></member>
<member><code>lightgoldenrod3</code></member>
<member><code>lightgoldenrod4</code></member>
<member><code>lightgoldenrodyellow</code></member>
<member><code>lightgray</code></member>
<member><code>lightgrey</code></member>
<member><code>lightpink</code></member>
<member><code>lightpink1</code></member>
<member><code>lightpink2</code></member>
<member><code>lightpink3</code></member>
<member><code>lightpink4</code></member>
<member><code>lightsalmon</code></member>
<member><code>lightsalmon1</code></member>
<member><code>lightsalmon2</code></member>
<member><code>lightsalmon3</code></member>
<member><code>lightsalmon4</code></member>
<member><code>lightseagreen</code></member>
<member><code>lightskyblue</code></member>
<member><code>lightskyblue1</code></member>
<member><code>lightskyblue2</code></member>
<member><code>lightskyblue3</code></member>
<member><code>lightskyblue4</code></member>
<member><code>lightslateblue</code></member>
<member><code>lightslategray</code></member>
<member><code>lightslategrey</code></member>
<member><code>lightsteelblue</code></member>
<member><code>lightsteelblue1</code></member>
<member><code>lightsteelblue2</code></member>
<member><code>lightsteelblue3</code></member>
<member><code>lightsteelblue4</code></member>
<member><code>lightyellow</code></member>
<member><code>lightyellow1</code></member>
<member><code>lightyellow2</code></member>
<member><code>lightyellow3</code></member>
<member><code>lightyellow4</code></member>
<member><code>limegreen</code></member>
<member><code>linen</code></member>
<member><code>magenta</code></member>
<member><code>magenta1</code></member>
<member><code>magenta2</code></member>
<member><code>magenta3</code></member>
<member><code>magenta4</code></member>
<member><code>maroon</code></member>
<member><code>maroon1</code></member>
<member><code>maroon2</code></member>
<member><code>maroon3</code></member>
<member><code>maroon4</code></member>
<member><code>mediumaquamarine</code></member>
<member><code>mediumblue</code></member>
<member><code>mediumorchid</code></member>
<member><code>mediumorchid1</code></member>
<member><code>mediumorchid2</code></member>
<member><code>mediumorchid3</code></member>
<member><code>mediumorchid4</code></member>
<member><code>mediumpurple</code></member>
<member><code>mediumpurple1</code></member>
<member><code>mediumpurple2</code></member>
<member><code>mediumpurple3</code></member>
<member><code>mediumpurple4</code></member>
<member><code>mediumseagreen</code></member>
<member><code>mediumslateblue</code></member>
<member><code>mediumspringgreen</code></member>
<member><code>mediumturquoise</code></member>
<member><code>mediumvioletred</code></member>
<member><code>midnightblue</code></member>
<member><code>mintcream</code></member>
<member><code>mistyrose</code></member>
<member><code>mistyrose1</code></member>
<member><code>mistyrose2</code></member>
<member><code>mistyrose3</code></member>
<member><code>mistyrose4</code></member>
<member><code>moccasin</code></member>
<member><code>navajowhite</code></member>
<member><code>navajowhite1</code></member>
<member><code>navajowhite2</code></member>
<member><code>navajowhite3</code></member>
<member><code>navajowhite4</code></member>
<member><code>navy</code></member>
<member><code>navyblue</code></member>
<member><code>oldlace</code></member>
<member><code>olivedrab</code></member>
<member><code>olivedrab1</code></member>
<member><code>olivedrab2</code></member>
<member><code>olivedrab3</code></member>
<member><code>olivedrab4</code></member>
<member><code>orange</code></member>
<member><code>orange1</code></member>
<member><code>orange2</code></member>
<member><code>orange3</code></member>
<member><code>orange4</code></member>
<member><code>orangered</code></member>
<member><code>orangered1</code></member>
<member><code>orangered2</code></member>
<member><code>orangered3</code></member>
<member><code>orangered4</code></member>
<member><code>orchid</code></member>
<member><code>orchid1</code></member>
<member><code>orchid2</code></member>
<member><code>orchid3</code></member>
<member><code>orchid4</code></member>
<member><code>palegoldenrod</code></member>
<member><code>palegreen</code></member>
<member><code>palegreen1</code></member>
<member><code>palegreen2</code></member>
<member><code>palegreen3</code></member>
<member><code>palegreen4</code></member>
<member><code>paleturquoise</code></member>
<member><code>paleturquoise1</code></member>
<member><code>paleturquoise2</code></member>
<member><code>paleturquoise3</code></member>
<member><code>paleturquoise4</code></member>
<member><code>palevioletred</code></member>
<member><code>palevioletred1</code></member>
<member><code>palevioletred2</code></member>
<member><code>palevioletred3</code></member>
<member><code>palevioletred4</code></member>
<member><code>papayawhip</code></member>
<member><code>peachpuff</code></member>
<member><code>peachpuff1</code></member>
<member><code>peachpuff2</code></member>
<member><code>peachpuff3</code></member>
<member><code>peachpuff4</code></member>
<member><code>peru</code></member>
<member><code>pink</code></member>
<member><code>pink1</code></member>
<member><code>pink2</code></member>
<member><code>pink3</code></member>
<member><code>pink4</code></member>
<member><code>plum</code></member>
<member><code>plum1</code></member>
<member><code>plum2</code></member>
<member><code>plum3</code></member>
<member><code>plum4</code></member>
<member><code>powderblue</code></member>
<member><code>purple</code></member>
<member><code>purple1</code></member>
<member><code>purple2</code></member>
<member><code>purple3</code></member>
<member><code>purple4</code></member>
<member><code>red</code></member>
<member><code>red1</code></member>
<member><code>red2</code></member>
<member><code>red3</code></member>
<member><code>red4</code></member>
<member><code>rosybrown</code></member>
<member><code>rosybrown1</code></member>
<member><code>rosybrown2</code></member>
<member><code>rosybrown3</code></member>
<member><code>rosybrown4</code></member>
<member><code>royalblue</code></member>
<member><code>royalblue1</code></member>
<member><code>royalblue2</code></member>
<member><code>royalblue3</code></member>
<member><code>royalblue4</code></member>
<member><code>saddlebrown</code></member>
<member><code>salmon</code></member>
<member><code>salmon1</code></member>
<member><code>salmon2</code></member>
<member><code>salmon3</code></member>
<member><code>salmon4</code></member>
<member><code>sandybrown</code></member>
<member><code>seagreen</code></member>
<member><code>seagreen1</code></member>
<member><code>seagreen2</code></member>
<member><code>seagreen3</code></member>
<member><code>seagreen4</code></member>
<member><code>seashell</code></member>
<member><code>seashell1</code></member>
<member><code>seashell2</code></member>
<member><code>seashell3</code></member>
<member><code>seashell4</code></member>
<member><code>sienna</code></member>
<member><code>sienna1</code></member>
<member><code>sienna2</code></member>
<member><code>sienna3</code></member>
<member><code>sienna4</code></member>
<member><code>skyblue</code></member>
<member><code>skyblue1</code></member>
<member><code>skyblue2</code></member>
<member><code>skyblue3</code></member>
<member><code>skyblue4</code></member>
<member><code>slateblue</code></member>
<member><code>slateblue1</code></member>
<member><code>slateblue2</code></member>
<member><code>slateblue3</code></member>
<member><code>slateblue4</code></member>
<member><code>slategray</code></member>
<member><code>slategray1</code></member>
<member><code>slategray2</code></member>
<member><code>slategray3</code></member>
<member><code>slategray4</code></member>
<member><code>slategrey</code></member>
<member><code>snow</code></member>
<member><code>snow1</code></member>
<member><code>snow2</code></member>
<member><code>snow3</code></member>
<member><code>snow4</code></member>
<member><code>springgreen</code></member>
<member><code>springgreen1</code></member>
<member><code>springgreen2</code></member>
<member><code>springgreen3</code></member>
<member><code>springgreen4</code></member>
<member><code>steelblue</code></member>
<member><code>steelblue1</code></member>
<member><code>steelblue2</code></member>
<member><code>steelblue3</code></member>
<member><code>steelblue4</code></member>
<member><code>tan</code></member>
<member><code>tan1</code></member>
<member><code>tan2</code></member>
<member><code>tan3</code></member>
<member><code>tan4</code></member>
<member><code>thistle</code></member>
<member><code>thistle1</code></member>
<member><code>thistle2</code></member>
<member><code>thistle3</code></member>
<member><code>thistle4</code></member>
<member><code>tomato</code></member>
<member><code>tomato1</code></member>
<member><code>tomato2</code></member>
<member><code>tomato3</code></member>
<member><code>tomato4</code></member>
<member><code>transparent</code></member>
<member><code>turquoise</code></member>
<member><code>turquoise1</code></member>
<member><code>turquoise2</code></member>
<member><code>turquoise3</code></member>
<member><code>turquoise4</code></member>
<member><code>violet</code></member>
<member><code>violetred</code></member>
<member><code>violetred1</code></member>
<member><code>violetred2</code></member>
<member><code>violetred3</code></member>
<member><code>violetred4</code></member>
<member><code>wheat</code></member>
<member><code>wheat1</code></member>
<member><code>wheat2</code></member>
<member><code>wheat3</code></member>
<member><code>wheat4</code></member>
<member><code>white</code></member>
<member><code>whitesmoke</code></member>
<member><code>yellow</code></member>
<member><code>yellow1</code></member>
<member><code>yellow2</code></member>
<member><code>yellow3</code></member>
<member><code>yellow4</code></member>
<member><code>yellowgreen</code></member>
    </simplelist>
    
  </appendix>
  
  
</article>
