diff --git a/books/bookvol10.3.pamphlet b/books/bookvol10.3.pamphlet
index 80207f1..97d6d81 100644
--- a/books/bookvol10.3.pamphlet
+++ b/books/bookvol10.3.pamphlet
@@ -52041,17 +52041,23 @@ GraphImage (): Exports == Implementation where
 --R
 --R------------------------------- Operations --------------------------------
 --R ?=? : (%,%) -> Boolean                allDegrees : Boolean -> %
---R checkOptions : List % -> Void         coerce : % -> OutputForm
+--R checkExtraValues : Boolean -> %       coerce : % -> OutputForm
 --R debug : Boolean -> %                  displayAsGF : Boolean -> %
 --R functionName : Symbol -> %            hash : % -> SingleInteger
---R homogeneous : Boolean -> %            indexName : Symbol -> %
---R latex : % -> String                   maxDegree : Integer -> %
---R maxDerivative : Integer -> %          maxLevel : Integer -> %
---R maxPower : Integer -> %               maxShift : Integer -> %
+--R indexName : Symbol -> %               latex : % -> String
 --R one : Boolean -> %                    safety : NonNegativeInteger -> %
 --R variableName : Symbol -> %            ?~=? : (%,%) -> Boolean
+--R Somos : Union(PositiveInteger,Boolean) -> %
+--R check : Union(skip,MonteCarlo,deterministic) -> %
+--R homogeneous : Union(PositiveInteger,Boolean) -> %
+--R maxDegree : Union(NonNegativeInteger,arbitrary) -> %
+--R maxDerivative : Union(NonNegativeInteger,arbitrary) -> %
+--R maxLevel : Union(NonNegativeInteger,arbitrary) -> %
+--R maxMixedDegree : NonNegativeInteger -> %
+--R maxPower : Union(PositiveInteger,arbitrary) -> %
+--R maxShift : Union(NonNegativeInteger,arbitrary) -> %
+--R maxSubst : Union(PositiveInteger,arbitrary) -> %
 --R option : (List %,Symbol) -> Union(Any,"failed")
---R option? : (List %,Symbol) -> Boolean
 --R
 --E 1
 
@@ -52073,78 +52079,96 @@ o )show GuessOption
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
+\cross{GOPT}{?=?} &
+\cross{GOPT}{?\~{}=?} &
+\cross{GOPT}{Somos} &
 \cross{GOPT}{allDegrees} &
-\cross{GOPT}{checkOptions} &
+\cross{GOPT}{check} \\
+\cross{GOPT}{checkExtraValues} &
 \cross{GOPT}{coerce} &
 \cross{GOPT}{debug} &
-\cross{GOPT}{displayAsGF} \\
-\cross{GOPT}{functionName} &
+\cross{GOPT}{displayAsGF} &
+\cross{GOPT}{functionName} \\
 \cross{GOPT}{hash} &
 \cross{GOPT}{homogeneous} &
 \cross{GOPT}{indexName} &
-\cross{GOPT}{latex} \\
-\cross{GOPT}{maxDegree} &
+\cross{GOPT}{latex} &
+\cross{GOPT}{maxDegree} \\
 \cross{GOPT}{maxDerivative} &
 \cross{GOPT}{maxLevel} &
+\cross{GOPT}{maxMixedDegree} &
 \cross{GOPT}{maxPower} &
 \cross{GOPT}{maxShift} \\
+\cross{GOPT}{maxSubst} &
 \cross{GOPT}{one} &
 \cross{GOPT}{option} &
-\cross{GOPT}{option?} &
 \cross{GOPT}{safety} &
-\cross{GOPT}{variableName} \\
-\cross{GOPT}{?\~{}=?} &
-\cross{GOPT}{?=?} &&&
+\cross{GOPT}{variableName} 
 \end{tabular}
 
 <<domain GOPT GuessOption>>=
 )abbrev domain GOPT GuessOption
 ++ Author: Martin Rubey
-++ Description:
-++ GuessOption is a domain whose elements are various options used
+++ Description: GuessOption is a domain whose elements are various options used
 ++ by \spadtype{Guess}.
-
-GuessOption(): Exports == Implementation where 
+GuessOption(): Exports == Implementation where
 
   Exports == SetCategory with
 
-    maxDerivative: Integer -> %
+    maxDerivative: Union(NonNegativeInteger, "arbitrary") -> %
       ++ maxDerivative(d) specifies the maximum derivative in an algebraic
-      ++ differential equation. maxDerivative(-1) specifies that the maximum
-      ++ derivative can be arbitrary. This option is expressed in the form
+      ++ differential equation.  This option is expressed in the form
       ++ \spad{maxDerivative == d}.
 
-    maxShift: Integer -> %
+    maxShift: Union(NonNegativeInteger, "arbitrary") -> %
       ++ maxShift(d) specifies the maximum shift in a recurrence
-      ++ equation. maxShift(-1) specifies that the maximum shift can be
-      ++ arbitrary. This option is expressed in the form \spad{maxShift == d}.
+      ++ equation.  This option is expressed in the form \spad{maxShift == d}.
+
+    maxSubst: Union(PositiveInteger, "arbitrary") -> %
+      ++ maxSubst(d) specifies the maximum degree of the monomial substituted
+      ++ into the function we are looking for.  That is, if \spad{maxSubst ==
+      ++ d}, we look for polynomials such that $p(f(x), f(x^2), ...,
+      ++ f(x^d))=0$.  equation.  This option is expressed in the form
+      ++ \spad{maxSubst == d}.
 
-    maxPower: Integer -> %
+    maxPower: Union(PositiveInteger, "arbitrary") -> %
       ++ maxPower(d) specifies the maximum degree in an algebraic differential
       ++ equation. For example, the degree of (f'')^3 f' is 4. maxPower(-1)
       ++ specifies that the maximum exponent can be arbitrary. This option is
       ++ expressed in the form \spad{maxPower == d}.
 
-    homogeneous: Boolean -> %
+    homogeneous: Union(PositiveInteger, Boolean) -> %
       ++ homogeneous(d) specifies whether we allow only homogeneous algebraic
-      ++ differential equations. This option is expressed in the form
-      ++ \spad{homogeneous == d}.
-
-    maxLevel: Integer -> %
+      ++ differential equations.  This option is expressed in the form
+      ++ \spad{homogeneous == d}.  If true, then maxPower must be
+      ++ set, too, and ADEs with constant total degree are allowed.
+      ++ If a PositiveInteger is given, only ADE's with this total degree are
+      ++ allowed.
+
+    Somos: Union(PositiveInteger, Boolean) -> %
+      ++ Somos(d) specifies whether we want that the total degree of the
+      ++ differential operators is constant, and equal to d, or maxDerivative
+      ++ if true. If true, maxDerivative must be set, too.
+
+    maxLevel: Union(NonNegativeInteger, "arbitrary") -> %
       ++ maxLevel(d) specifies the maximum number of recursion levels operators
-      ++ guessProduct and guessSum will be applied.  maxLevel(-1) specifies
-      ++ that all levels are tried. This option is expressed in the form
-      ++ \spad{maxLevel == d}.
+      ++ guessProduct and guessSum will be applied. This option is expressed in
+      ++ the form spad{maxLevel == d}.
 
-    maxDegree: Integer -> %
+    maxDegree: Union(NonNegativeInteger, "arbitrary") -> %
       ++ maxDegree(d) specifies the maximum degree of the coefficient
       ++ polynomials in an algebraic differential equation or a recursion with
       ++ polynomial coefficients. For rational functions with an exponential
       ++ term, \spad{maxDegree} bounds the degree of the denominator
-      ++ polynomial. 
-      ++ maxDegree(-1) specifies that the maximum
-      ++ degree can be arbitrary. This option is expressed in the form
-      ++ \spad{maxDegree == d}.
+      ++ polynomial.
+      ++ This option is expressed in the form \spad{maxDegree == d}.
+
+    maxMixedDegree: NonNegativeInteger -> %
+      ++ maxMixedDegree(d) specifies the maximum q-degree of the coefficient
+      ++ polynomials in a recurrence with polynomial coefficients, in the case
+      ++ of mixed shifts.  Although slightly inconsistent, maxMixedDegree(0)
+      ++ specifies that no mixed shifts are allowed. This option is expressed
+      ++ in the form \spad{maxMixedDegree == d}.
 
     allDegrees: Boolean -> %
       ++ allDegrees(d) specifies whether all possibilities of the degree vector
@@ -52157,6 +52181,18 @@ GuessOption(): Exports == Implementation where
       ++ solutions found. This option is expressed in the form \spad{safety ==
       ++ d}.
 
+    check: Union("skip", "MonteCarlo", "deterministic") -> %
+      ++ check(d) specifies how we want to check the solution.  If
+      ++ the value is "skip", we return the solutions found by the
+      ++ interpolation routine without checking.  If the value is
+      ++ "MonteCarlo", we use a probabilistic check.  This option is
+      ++ expressed in the form \spad{check == d}
+
+    checkExtraValues: Boolean -> %
+      ++ checkExtraValues(d) specifies whether we want to check the
+      ++ solution beyond the order given by the degree bounds. This
+      ++ option is expressed in the form \spad{checkExtraValues == d}
+
     one: Boolean -> %
       ++ one(d) specifies whether we are happy with one solution. This option
       ++ is expressed in the form \spad{one == d}.
@@ -52185,61 +52221,50 @@ GuessOption(): Exports == Implementation where
       ++ by the HP-specification.
 
     option : (List %, Symbol) -> Union(Any, "failed")
-      ++ option() is not to be used at the top level; 
-      ++ option determines internally which drawing options are indicated in 
-      ++ a draw command.
-
-    option?: (List %, Symbol) -> Boolean
-      ++ option?() is not to be used at the top level;
-      ++ option? internally returns true for drawing options which are 
-      ++ indicated in a draw command, or false for those which are not.
-
-    checkOptions: List % -> Void
-      ++ checkOptions checks whether an option is given twice
+      ++ option(l, option) returns which options are given.
 
   Implementation ==> add
     import AnyFunctions1(Boolean)
     import AnyFunctions1(Symbol)
-    import AnyFunctions1(Integer)
     import AnyFunctions1(NonNegativeInteger)
+    import AnyFunctions1(Union(NonNegativeInteger, "arbitrary"))
+    import AnyFunctions1(Union(PositiveInteger, "arbitrary"))
+    import AnyFunctions1(Union(PositiveInteger, Boolean))
+    import AnyFunctions1(Union("skip", "MonteCarlo", "deterministic"))
 
     Rep := Record(keyword: Symbol, value: Any)
 
-    maxLevel d      == ["maxLevel"::Symbol,      d::Any]
-    maxDerivative d == ["maxDerivative"::Symbol, d::Any]
-    maxShift d      == maxDerivative d
-    maxDegree d     == ["maxDegree"::Symbol,     d::Any]
-    allDegrees d    == ["allDegrees"::Symbol,    d::Any]
-    maxPower d      == ["maxPower"::Symbol,      d::Any]
-    safety d        == ["safety"::Symbol,        d::Any]
-    homogeneous d   == ["homogeneous"::Symbol,   d::Any]
-    debug d         == ["debug"::Symbol,         d::Any]
-    one d           == ["one"::Symbol,           d::Any]
-    functionName d  == ["functionName"::Symbol,  d::Any]
-    variableName d  == ["variableName"::Symbol,  d::Any]
-    indexName d     == ["indexName"::Symbol,     d::Any]
-    displayAsGF d   == ["displayAsGF"::Symbol,   d::Any]
+    maxLevel d       == ['maxLevel,       d::Any]
+    maxDerivative d  == ['maxDerivative,  d::Any]
+    maxShift d       == maxDerivative d
+    maxSubst d       ==
+        if d case PositiveInteger
+        then maxDerivative((d::Integer-1)::NonNegativeInteger)
+        else maxDerivative d
+    maxDegree d        == ['maxDegree,        d::Any]
+    maxMixedDegree d   == ['maxMixedDegree,   d::Any]
+    allDegrees d       == ['allDegrees,       d::Any]
+    maxPower d         == ['maxPower,         d::Any]
+    safety d           == ['safety,           d::Any]
+    homogeneous d      == ['homogeneous,      d::Any]
+    Somos d            == ['Somos,            d::Any]
+    debug d            == ['debug,            d::Any]
+    check d            == ['check,            d::Any]
+    checkExtraValues d == ['checkExtraValues, d::Any]
+    one d              == ['one,              d::Any]
+    functionName d     == ['functionName,     d::Any]
+    variableName d     == ['variableName,     d::Any]
+    indexName d        == ['indexName,        d::Any]
+    displayAsGF d      == ['displayAsGF,      d::Any]
 
     coerce(x:%):OutputForm == x.keyword::OutputForm = x.value::OutputForm
     x:% = y:%              == x.keyword = y.keyword and x.value = y.value
 
-    option?(l, s) ==
-      for x in l repeat
-        x.keyword = s => return true
-      false
-
     option(l, s) ==
       for x in l repeat
         x.keyword = s => return(x.value)
       "failed"
 
-    checkOptions l ==
-      if not empty? l then
-        if find((z1:%):Boolean +-> (first l).keyword = z1.keyword, rest l)_
-          case "failed"
-        then checkOptions rest l
-        else error "GuessOption: Option specified twice"
-
 @
 <<GOPT.dotabb>>=
 "GOPT" [color="#88FF44",href="bookvol10.3.pdf#nameddest=GOPT"]
@@ -52248,6 +52273,363 @@ GuessOption(): Exports == Implementation where
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain GOPT0 GuessOptionFunctions0}
+
+<<GuessOptionFunctions0.input>>=
+)set break resume
+)sys rm -f GuessOptionFunctions0.output
+)spool GuessOptionFunctions0.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show GuessOptionFunctions0
+--R GuessOptionFunctions0  is a domain constructor
+--R Abbreviation for GuessOptionFunctions0 is GOPT0 
+--R This constructor is not exposed in this frame.
+--R------------------------------- Operations --------------------------------
+--R ?=? : (%,%) -> Boolean                coerce : % -> OutputForm
+--R hash : % -> SingleInteger             latex : % -> String
+--R one : List(GuessOption) -> Boolean    ?~=? : (%,%) -> Boolean
+--R MonteCarlo : List(GuessOption) -> Boolean
+--R Somos : List(GuessOption) -> Union(PositiveInteger,Boolean)
+--R allDegrees : List(GuessOption) -> Boolean
+--R check : List(GuessOption) -> Boolean
+--R checkOptions : List(GuessOption) -> Void
+--R debug : List(GuessOption) -> Boolean
+--R displayAsGF : List(GuessOption) -> Boolean
+--R functionName : List(GuessOption) -> Symbol
+--R homogeneous : List(GuessOption) -> Union(PositiveInteger,Boolean)
+--R indexName : List(GuessOption) -> Symbol
+--R maxDegree : List(GuessOption) -> Union(NonNegativeInteger,arbitrary)
+--R maxDerivative : List(GuessOption) -> Union(NonNegativeInteger,arbitrary)
+--R maxLevel : List(GuessOption) -> Union(NonNegativeInteger,arbitrary)
+--R maxMixedDegree : List(GuessOption) -> NonNegativeInteger
+--R maxPower : List(GuessOption) -> Union(PositiveInteger,arbitrary)
+--R maxShift : List(GuessOption) -> Union(NonNegativeInteger,arbitrary)
+--R maxSubst : List(GuessOption) -> Union(PositiveInteger,arbitrary)
+--R safety : List(GuessOption) -> NonNegativeInteger
+--R variableName : List(GuessOption) -> Symbol
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<GuessOptionFunctions0.help>>=
+====================================================================
+GuessOptionFunctions0 examples
+====================================================================
+
+See Also:
+o )show GuessOptionFunctions0
+
+@
+\pagehead{GuessOptionFunctions0}{GOPT0}
+\pagepic{ps/v103guessoptionfunctions0.eps}{GOPT0}{1.00}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{GOPT0}{?=?} &
+\cross{GOPT0}{?\~{}=?} &
+\cross{GOPT0}{MonteCarlo} &
+\cross{GOPT0}{Somos} &
+\cross{GOPT0}{allDegrees} \\
+\cross{GOPT0}{check} &
+\cross{GOPT0}{checkOptions} &
+\cross{GOPT0}{coerce} &
+\cross{GOPT0}{debug} &
+\cross{GOPT0}{displayAsGF} \\
+\cross{GOPT0}{functionName} &
+\cross{GOPT0}{hash} &
+\cross{GOPT0}{homogeneous} &
+\cross{GOPT0}{indexName} &
+\cross{GOPT0}{latex} \\
+\cross{GOPT0}{maxDegree} &
+\cross{GOPT0}{maxDerivative} &
+\cross{GOPT0}{maxLevel} &
+\cross{GOPT0}{maxMixedDegree} &
+\cross{GOPT0}{maxPower} \\
+\cross{GOPT0}{maxShift} &
+\cross{GOPT0}{maxSubst} &
+\cross{GOPT0}{one} &
+\cross{GOPT0}{safety} &
+\cross{GOPT0}{variableName} 
+\end{tabular}
+
+<<domain GOPT0 GuessOptionFunctions0>>=
+)abbrev domain GOPT0 GuessOptionFunctions0
+++ Author: Martin Rubey
+++ Description: 
+++ GuessOptionFunctions0 provides operations that extract the
+++ values of options for Guess.
+GuessOptionFunctions0(): Exports == Implementation where
+
+  LGOPT ==> List GuessOption
+
+  Exports == SetCategory with
+
+    maxDerivative: LGOPT -> Union(NonNegativeInteger, "arbitrary")
+      ++ maxDerivative returns the specified maxDerivative.
+
+    maxShift: LGOPT -> Union(NonNegativeInteger, "arbitrary")
+      ++ maxShift returns the specified maxShift.
+
+    maxSubst: LGOPT -> Union(PositiveInteger, "arbitrary")
+      ++ maxSubst returns the specified maxSubst.
+
+    maxPower: LGOPT -> Union(PositiveInteger, "arbitrary")
+      ++ maxPower returns the specified maxPower.
+
+    homogeneous: LGOPT -> Union(PositiveInteger, Boolean)
+      ++ homogeneous returns whether we allow only homogeneous algebraic
+      ++ differential equations, default being false
+
+    Somos: LGOPT -> Union(PositiveInteger, Boolean)
+      ++ Somos returns whether we allow only Somos-like operators, default
+      ++ being false
+
+    maxLevel: LGOPT -> Union(NonNegativeInteger, "arbitrary")
+      ++ maxLevel returns the specified maxLevel.
+
+    maxDegree: LGOPT -> Union(NonNegativeInteger, "arbitrary")
+      ++ maxDegree returns the specified maxDegree.
+
+    maxMixedDegree: LGOPT -> NonNegativeInteger
+      ++ maxMixedDegree returns the specified maxMixedDegree.
+
+    allDegrees: LGOPT -> Boolean
+      ++ allDegrees returns whether all possibilities of the degree vector
+      ++ should be tried, the default being false.
+
+    safety: LGOPT -> NonNegativeInteger
+      ++ safety returns the specified safety or 1 as default.
+
+    check: LGOPT -> Union("skip", "MonteCarlo", "deterministic")
+      ++ check(d) specifies how we want to check the solution.  If
+      ++ the value is "skip", we return the solutions found by the
+      ++ interpolation routine without checking.  If the value is
+      ++ "MonteCarlo", we use a probabilistic check.  The default is
+      ++ "deterministic".
+
+    checkExtraValues: LGOPT -> Boolean
+      ++ checkExtraValues(d) specifies whether we want to check the
+      ++ solution beyond the order given by the degree bounds.  The
+      ++ default is true.
+
+    one: LGOPT -> Boolean
+      ++ one returns whether we need only one solution, default being true.
+
+    functionName: LGOPT -> Symbol
+      ++ functionName returns the name of the function given by the algebraic
+      ++ differential equation, default being f
+
+    variableName: LGOPT -> Symbol
+      ++ variableName returns the name of the variable used in by the
+      ++ algebraic differential equation, default being x
+
+    indexName: LGOPT -> Symbol
+      ++ indexName returns the name of the index variable used for the
+      ++ formulas, default being n
+
+    displayAsGF: LGOPT -> Boolean
+      ++ displayAsGF specifies whether the result is a generating function
+      ++ or a recurrence. This option should not be set by the user, but rather
+      ++ by the HP-specification, therefore, there is no default.
+
+    debug: LGOPT -> Boolean
+      ++ debug returns whether we want additional output on the progress,
+      ++ default being false
+
+    checkOptions: LGOPT -> Void
+      ++ checkOptions checks whether the given options are consistent, and
+      ++ yields an error otherwise
+
+  Implementation == add
+
+    maxLevel l ==
+      if (opt := option(l, 'maxLevel)) case "failed" then
+        "arbitrary"
+      else
+        retract(opt::Any)$AnyFunctions1(Union(NonNegativeInteger, "arbitrary"))
+
+    maxDerivative l ==
+      if (opt := option(l, 'maxDerivative)) case "failed" then
+        "arbitrary"
+      else
+        retract(opt::Any)$AnyFunctions1(Union(NonNegativeInteger, "arbitrary"))
+
+    maxShift l == maxDerivative l
+
+    maxSubst l ==
+        d := maxDerivative l
+        if d case NonNegativeInteger
+        then (d+1)::PositiveInteger
+        else d
+
+    maxDegree l ==
+      if (opt := option(l, 'maxDegree)) case "failed" then
+        "arbitrary"
+      else
+        retract(opt::Any)$AnyFunctions1(Union(NonNegativeInteger, "arbitrary"))
+
+    maxMixedDegree l ==
+      if (opt := option(l, 'maxMixedDegree)) case "failed" then
+        0
+      else
+        retract(opt :: Any)$AnyFunctions1(NonNegativeInteger)
+
+    allDegrees l ==
+      if (opt := option(l, 'allDegrees)) case "failed" then
+        false
+      else
+        retract(opt :: Any)$AnyFunctions1(Boolean)
+
+    maxPower l ==
+      if (opt := option(l, 'maxPower)) case "failed" then
+        "arbitrary"
+      else
+        retract(opt :: Any)$AnyFunctions1(Union(PositiveInteger, "arbitrary"))
+
+    safety l ==
+      if (opt := option(l, 'safety)) case "failed" then
+        1$NonNegativeInteger
+      else
+        retract(opt :: Any)$AnyFunctions1(NonNegativeInteger)
+
+    check l ==
+       if (opt := option(l, 'check)) case "failed" then
+           "deterministic"
+       else
+           retract(opt::Any)$AnyFunctions1(_
+                                 Union("skip", "MonteCarlo", "deterministic"))
+
+    checkExtraValues l ==
+       if (opt := option(l, 'checkExtraValues)) case "failed" then
+           true
+       else
+           retract(opt :: Any)$AnyFunctions1(Boolean)
+
+    one l ==
+      if (opt := option(l, 'one)) case "failed" then
+        true
+      else
+        retract(opt :: Any)$AnyFunctions1(Boolean)
+
+    debug l ==
+      if (opt := option(l, 'debug)) case "failed" then
+        false
+      else
+        retract(opt :: Any)$AnyFunctions1(Boolean)
+
+    homogeneous l ==
+      if (opt := option(l, 'homogeneous)) case "failed" then
+        false
+      else
+        retract(opt :: Any)$AnyFunctions1(Union(PositiveInteger, Boolean))
+
+    Somos l ==
+      if (opt := option(l, 'Somos)) case "failed" then
+        false
+      else
+        retract(opt :: Any)$AnyFunctions1(Union(PositiveInteger, Boolean))
+
+    variableName l ==
+      if (opt := option(l, 'variableName)) case "failed" then
+        'x
+      else
+        retract(opt :: Any)$AnyFunctions1(Symbol)
+
+    functionName l ==
+      if (opt := option(l, 'functionName)) case "failed" then
+        'f
+      else
+        retract(opt :: Any)$AnyFunctions1(Symbol)
+
+    indexName l ==
+      if (opt := option(l, 'indexName)) case "failed" then
+        'n
+      else
+        retract(opt :: Any)$AnyFunctions1(Symbol)
+
+    displayAsGF l ==
+      if (opt := option(l, 'displayAsGF)) case "failed" then
+        error "GuessOption: displayAsGF not set"
+      else
+        retract(opt :: Any)$AnyFunctions1(Boolean)
+
+    NNI ==> NonNegativeInteger
+    PI  ==> PositiveInteger
+
+    checkOptions l ==
+      maxD := maxDerivative l
+      maxP := maxPower l
+      homo := homogeneous l
+      Somo := Somos l
+
+      if Somo case PI then
+          if one? Somo then
+              error "Guess: Somos must be Boolean or at least two"
+
+          if maxP case PI and one? maxP then
+              error "Guess: Somos requires that maxPower is at least two"
+
+          if maxD case NNI and maxD > Somo then
+              err:String:=concat [_
+                "Guess: if Somos is an integer, it should be larger than ",_
+                "maxDerivative/maxShift or at least as big as maxSubst" ]
+              error err
+      else
+          if Somo then
+              if maxP case PI and one? maxP then
+                  error "Guess: Somos requires that maxPower is at least two"
+
+              if not (maxD case NNI) or zero? maxD or one? maxD then
+                  err:String:= concat [_
+                    "Guess: Somos==true requires that maxDerivative/maxShift",_
+                    " is an integer, at least two, or maxSubst is an ",_
+                    "integer, at least three" ]
+                  error err
+
+              if not (maxP case PI) and homo case Boolean and not homo then
+                  err:String:= concat [_
+                    "Guess: Somos requires that maxPower is set or ", _
+                    "homogeneous is not false" ]
+                  error err
+
+      if homo case PI then
+          if maxP case PI and maxP ~= homo then
+              err:String:= _
+                "Guess: only one of homogeneous and maxPower may be an integer"
+              error err
+
+          if maxD case NNI and zero? maxD then
+              err:String:= concat [_
+                "Guess: homogeneous requires that maxShift/maxDerivative ",_
+                "is at least one or maxSubst is at least two" ]
+              error err
+      else
+          if homo then
+              if not maxP case PI then
+                  err:String:= concat [_
+                    "Guess: homogeneous==true requires that maxPower is ", _
+                    "an integer" ]
+                  error err
+
+              if maxD case NNI and zero? maxD then
+                  err:String:= concat [_
+                    "Guess: homogeneous requires that maxShift/maxDerivative",_
+                    " is at least one or maxSubst is at least two" ]
+                  error err
+@
+<<GOPT0.dotabb>>=
+"GOPT0" [color="#88FF44",href="bookvol10.3.pdf#nameddest=GOPT0"]
+"STRING" [color="#88FF44",href="bookvol10.3.pdf#nameddest=STRING"]
+"GOPT0" -> "STRING"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Chapter H}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain HASHTBL HashTable}
@@ -139908,6 +140290,217 @@ UniversalSegment(S: Type): SegmentCategory(S) with
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{domain U32VEC U32Vector}
+
+<<U32Vector.input>>=
+)set break resume
+)sys rm -f U32Vector.output
+)spool U32Vector.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show U32Vector
+--R U32Vector  is a domain constructor
+--R Abbreviation for U32Vector is U32VEC 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.3.pamphlet to see algebra source code for U32VEC 
+--R
+--R------------------------------- Operations --------------------------------
+--R concat : List % -> %                  concat : (%,%) -> %
+--R concat : (Integer,%) -> %             concat : (%,Integer) -> %
+--R construct : List Integer -> %         copy : % -> %
+--R delete : (%,Integer) -> %             ?.? : (%,Integer) -> Integer
+--R empty : () -> %                       empty? : % -> Boolean
+--R entries : % -> List Integer           eq? : (%,%) -> Boolean
+--R index? : (Integer,%) -> Boolean       indices : % -> List Integer
+--R insert : (%,%,Integer) -> %           qelt : (%,Integer) -> Integer
+--R reverse : % -> %                      sample : () -> %
+--R #? : % -> NonNegativeInteger if $ has finiteAggregate
+--R ?<? : (%,%) -> Boolean if Integer has ORDSET
+--R ?<=? : (%,%) -> Boolean if Integer has ORDSET
+--R ?=? : (%,%) -> Boolean if Integer has SETCAT
+--R ?>? : (%,%) -> Boolean if Integer has ORDSET
+--R ?>=? : (%,%) -> Boolean if Integer has ORDSET
+--R any? : ((Integer -> Boolean),%) -> Boolean if $ has finiteAggregate
+--R coerce : % -> OutputForm if Integer has SETCAT
+--R convert : % -> InputForm if Integer has KONVERT INFORM
+--R copyInto! : (%,%,Integer) -> % if $ has shallowlyMutable
+--R count : (Integer,%) -> NonNegativeInteger if $ has finiteAggregate and Integer has SETCAT
+--R count : ((Integer -> Boolean),%) -> NonNegativeInteger if $ has finiteAggregate
+--R delete : (%,UniversalSegment Integer) -> %
+--R ?.? : (%,UniversalSegment Integer) -> %
+--R elt : (%,Integer,Integer) -> Integer
+--R entry? : (Integer,%) -> Boolean if $ has finiteAggregate and Integer has SETCAT
+--R eval : (%,List Integer,List Integer) -> % if Integer has EVALAB INT and Integer has SETCAT
+--R eval : (%,Integer,Integer) -> % if Integer has EVALAB INT and Integer has SETCAT
+--R eval : (%,Equation Integer) -> % if Integer has EVALAB INT and Integer has SETCAT
+--R eval : (%,List Equation Integer) -> % if Integer has EVALAB INT and Integer has SETCAT
+--R every? : ((Integer -> Boolean),%) -> Boolean if $ has finiteAggregate
+--R fill! : (%,Integer) -> % if $ has shallowlyMutable
+--R find : ((Integer -> Boolean),%) -> Union(Integer,"failed")
+--R first : % -> Integer if Integer has ORDSET
+--R hash : % -> SingleInteger if Integer has SETCAT
+--R insert : (Integer,%,Integer) -> %
+--R latex : % -> String if Integer has SETCAT
+--R less? : (%,NonNegativeInteger) -> Boolean
+--R map : (((Integer,Integer) -> Integer),%,%) -> %
+--R map : ((Integer -> Integer),%) -> %
+--R map! : ((Integer -> Integer),%) -> % if $ has shallowlyMutable
+--R max : (%,%) -> % if Integer has ORDSET
+--R maxIndex : % -> Integer if Integer has ORDSET
+--R member? : (Integer,%) -> Boolean if $ has finiteAggregate and Integer has SETCAT
+--R members : % -> List Integer if $ has finiteAggregate
+--R merge : (%,%) -> % if Integer has ORDSET
+--R merge : (((Integer,Integer) -> Boolean),%,%) -> %
+--R min : (%,%) -> % if Integer has ORDSET
+--R minIndex : % -> Integer if Integer has ORDSET
+--R more? : (%,NonNegativeInteger) -> Boolean
+--R new : (NonNegativeInteger,Integer) -> %
+--R parts : % -> List Integer if $ has finiteAggregate
+--R position : (Integer,%,Integer) -> Integer if Integer has SETCAT
+--R position : (Integer,%) -> Integer if Integer has SETCAT
+--R position : ((Integer -> Boolean),%) -> Integer
+--R qsetelt! : (%,Integer,Integer) -> Integer if $ has shallowlyMutable
+--R reduce : (((Integer,Integer) -> Integer),%) -> Integer if $ has finiteAggregate
+--R reduce : (((Integer,Integer) -> Integer),%,Integer) -> Integer if $ has finiteAggregate
+--R reduce : (((Integer,Integer) -> Integer),%,Integer,Integer) -> Integer if $ has finiteAggregate and Integer has SETCAT
+--R remove : ((Integer -> Boolean),%) -> % if $ has finiteAggregate
+--R remove : (Integer,%) -> % if $ has finiteAggregate and Integer has SETCAT
+--R removeDuplicates : % -> % if $ has finiteAggregate and Integer has SETCAT
+--R reverse! : % -> % if $ has shallowlyMutable
+--R select : ((Integer -> Boolean),%) -> % if $ has finiteAggregate
+--R setelt : (%,UniversalSegment Integer,Integer) -> Integer if $ has shallowlyMutable
+--R setelt : (%,Integer,Integer) -> Integer if $ has shallowlyMutable
+--R size? : (%,NonNegativeInteger) -> Boolean
+--R sort : % -> % if Integer has ORDSET
+--R sort : (((Integer,Integer) -> Boolean),%) -> %
+--R sort! : % -> % if $ has shallowlyMutable and Integer has ORDSET
+--R sort! : (((Integer,Integer) -> Boolean),%) -> % if $ has shallowlyMutable
+--R sorted? : % -> Boolean if Integer has ORDSET
+--R sorted? : (((Integer,Integer) -> Boolean),%) -> Boolean
+--R swap! : (%,Integer,Integer) -> Void if $ has shallowlyMutable
+--R ?~=? : (%,%) -> Boolean if Integer has SETCAT
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<U32Vector.help>>=
+====================================================================
+U32Vector examples
+====================================================================
+
+See Also:
+o )show U32Vector
+
+@
+\pagehead{U32Vector}{U32VEC}
+\pagepic{ps/v103u32vector.eps}{U32VEC}{1.00}
+{\bf See}\\
+\pageto{Segment}{SEG}
+\pageto{SegmentBinding}{SEGBIND}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{U32VEC}{\#{}?} &
+\cross{U32VEC}{?.?} &
+\cross{U32VEC}{?.?} &
+\cross{U32VEC}{?$<=$?} &
+\cross{U32VEC}{?$<$?} \\
+\cross{U32VEC}{?=?} &
+\cross{U32VEC}{?$>=$?} &
+\cross{U32VEC}{?$>$?} &
+\cross{U32VEC}{?\~{}=?} &
+\cross{U32VEC}{any?} \\
+\cross{U32VEC}{coerce} &
+\cross{U32VEC}{concat} &
+\cross{U32VEC}{construct} &
+\cross{U32VEC}{convert} &
+\cross{U32VEC}{copy} \\
+\cross{U32VEC}{copyInto!} &
+\cross{U32VEC}{count} &
+\cross{U32VEC}{delete} &
+\cross{U32VEC}{elt} &
+\cross{U32VEC}{empty} \\
+\cross{U32VEC}{empty?} &
+\cross{U32VEC}{entries} &
+\cross{U32VEC}{entry?} &
+\cross{U32VEC}{eq?} &
+\cross{U32VEC}{eval} \\
+\cross{U32VEC}{every?} &
+\cross{U32VEC}{fill!} &
+\cross{U32VEC}{find} &
+\cross{U32VEC}{first} &
+\cross{U32VEC}{hash} \\
+\cross{U32VEC}{index?} &
+\cross{U32VEC}{indices} &
+\cross{U32VEC}{insert} &
+\cross{U32VEC}{latex} &
+\cross{U32VEC}{less?} \\
+\cross{U32VEC}{map} &
+\cross{U32VEC}{map!} &
+\cross{U32VEC}{max} &
+\cross{U32VEC}{maxIndex} &
+\cross{U32VEC}{member?} \\
+\cross{U32VEC}{members} &
+\cross{U32VEC}{merge} &
+\cross{U32VEC}{min} &
+\cross{U32VEC}{minIndex} &
+\cross{U32VEC}{more?} \\
+\cross{U32VEC}{new} &
+\cross{U32VEC}{parts} &
+\cross{U32VEC}{position} &
+\cross{U32VEC}{qelt} &
+\cross{U32VEC}{qsetelt!} \\
+\cross{U32VEC}{reduce} &
+\cross{U32VEC}{remove} &
+\cross{U32VEC}{removeDuplicates} &
+\cross{U32VEC}{reverse} &
+\cross{U32VEC}{reverse!} \\
+\cross{U32VEC}{sample} &
+\cross{U32VEC}{select} &
+\cross{U32VEC}{setelt} &
+\cross{U32VEC}{size?} &
+\cross{U32VEC}{sort} \\
+\cross{U32VEC}{sort!} &
+\cross{U32VEC}{sorted?} &
+\cross{U32VEC}{swap!} &&
+\end{tabular}
+
+<<domain U32VEC U32Vector>>=
+)abbrev domain U32VEC U32Vector
+++ Author: Waldek Hebisch
+++ Description: This is a low-level domain which implements vectors
+++ (one dimensional arrays) of unsigned 32-bit numbers.  Indexing
+++ is 0 based, there is no bound checking (unless provided by
+++ lower level).
+U32Vector() : OneDimensionalArrayAggregate Integer == add
+   Qsize ==> QV32LEN$Lisp
+   Qelt ==> ELT32$Lisp
+   Qsetelt ==> SETELT32$Lisp
+   Qnew ==> GETREFV32$Lisp
+
+   #x                          == Qsize x
+   minIndex x                  == 0
+   empty()                     == Qnew(0$Lisp, 0$Lisp)
+   new(n, x)                   == Qnew (n, x)
+   qelt(x, i)                  == Qelt(x, i)
+   elt(x:%, i:Integer)         == Qelt(x, i)
+   qsetelt_!(x, i, s)          == Qsetelt(x, i, s)
+   setelt(x:%, i:Integer, s:Integer) == Qsetelt(x, i, s)
+   fill_!(x, s)       == (for i in 0..((Qsize x) - 1) repeat Qsetelt(x, i, s); x)
+
+@
+<<U32VEC.dotabb>>=
+"U32VEC" [color="#88FF44",href="bookvol10.3.pdf#nameddest=U32VEC"]
+"A1AGG" [color="#4488FF",href="bookvol10.2.pdf#nameddest=A1AGG"]
+"U32VEC" -> "A1AGG"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Chapter V}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{domain VARIABLE Variable}
@@ -150619,6 +151212,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<domain GSERIES GeneralUnivariatePowerSeries>>
 <<domain GRIMAGE GraphImage>>
 <<domain GOPT GuessOption>>
+<<domain GOPT0 GuessOptionFunctions0>>
 
 <<domain HASHTBL HashTable>>
 <<domain HEAP Heap>>
diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 873d2c4..c72984e 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -44053,186 +44053,6 @@ GuessInteger() == Guess(Fraction Integer, Integer, Expression Integer,
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{package GOPT0 GuessOptionFunctions0}
-\pagehead{GuessOptionFunctions0}{GOPT0}
-\pagepic{ps/v104guessoptionfunctions0.ps}{GOPT0}{1.00}
-
-{\bf Exports:}\\
-\begin{tabular}{lllll}
-\cross{GOPT0}{allDegrees} &
-\cross{GOPT0}{coerce} &
-\cross{GOPT0}{debug} &
-\cross{GOPT0}{displayAsGF} &
-\cross{GOPT0}{functionName} \\
-\cross{GOPT0}{hash} &
-\cross{GOPT0}{homogeneous} &
-\cross{GOPT0}{indexName} &
-\cross{GOPT0}{latex} &
-\cross{GOPT0}{maxDegree} \\
-\cross{GOPT0}{maxDerivative} &
-\cross{GOPT0}{maxLevel} &
-\cross{GOPT0}{maxPower} &
-\cross{GOPT0}{maxShift} &
-\cross{GOPT0}{one} \\
-\cross{GOPT0}{safety} &
-\cross{GOPT0}{variableName} &
-\cross{GOPT0}{?\~{}=?} &
-\cross{GOPT0}{?=?} &
-\end{tabular}
-
-<<package GOPT0 GuessOptionFunctions0>>=
-)abbrev package GOPT0 GuessOptionFunctions0
-++ Author: Martin Rubey 
-++ Description: 
-++ GuessOptionFunctions0 provides operations that extract the
-++ values of options for \spadtype{Guess}.
-
-GuessOptionFunctions0(): Exports == Implementation where 
-
-  LGOPT ==> List GuessOption
-
-  Exports == SetCategory with
-
-    maxLevel: LGOPT -> Integer
-      ++ maxLevel returns the specified maxLevel or -1 as default.
-
-    maxPower: LGOPT -> Integer
-      ++ maxPower returns the specified maxPower or -1 as default.
-
-    maxDerivative: LGOPT -> Integer
-      ++ maxDerivative returns the specified maxDerivative or -1 as default.
-
-    maxShift: LGOPT -> Integer
-      ++ maxShift returns the specified maxShift or -1 as default.
-
-    maxDegree: LGOPT -> Integer
-      ++ maxDegree returns the specified maxDegree or -1 as default.
-
-    allDegrees: LGOPT -> Boolean
-      ++ allDegrees returns whether all possibilities of the degree vector
-      ++ should be tried, the default being false.
-
-    safety: LGOPT -> NonNegativeInteger
-      ++ safety returns the specified safety or 1 as default.
-
-    one: LGOPT -> Boolean
-      ++ one returns whether we need only one solution, default being true.
-
-    homogeneous: LGOPT -> Boolean
-      ++ homogeneous returns whether we allow only homogeneous algebraic
-      ++ differential equations, default being false
-
-    functionName: LGOPT -> Symbol
-      ++ functionName returns the name of the function given by the algebraic
-      ++ differential equation, default being f
-
-    variableName: LGOPT -> Symbol
-      ++ variableName returns the name of the variable used in by the
-      ++ algebraic differential equation, default being x
-
-    indexName: LGOPT -> Symbol
-      ++ indexName returns the name of the index variable used for the
-      ++ formulas, default being n
-
-    displayAsGF: LGOPT -> Boolean
-      ++ displayAsGF specifies whether the result is a generating function
-      ++ or a recurrence. This option should not be set by the user, but rather
-      ++ by the HP-specification, therefore, there is no default.
-
-    debug: LGOPT -> Boolean
-      ++ debug returns whether we want additional output on the progress,
-      ++ default being false
-
-  Implementation == add
-
-    maxLevel l ==
-      if (opt := option(l, "maxLevel" :: Symbol)) case "failed" then
-        -1
-      else 
-        retract(opt :: Any)$AnyFunctions1(Integer)
-
-    maxDerivative l ==
-      if (opt := option(l, "maxDerivative" :: Symbol)) case "failed" then
-        -1
-      else 
-        retract(opt :: Any)$AnyFunctions1(Integer)
-
-    maxShift l == maxDerivative l
-
-    maxDegree l ==
-      if (opt := option(l, "maxDegree" :: Symbol)) case "failed" then
-        -1
-      else 
-        retract(opt :: Any)$AnyFunctions1(Integer)
-
-    allDegrees l ==
-      if (opt := option(l, "allDegrees" :: Symbol)) case "failed" then
-        false
-      else 
-        retract(opt :: Any)$AnyFunctions1(Boolean)
-
-    maxPower l ==
-      if (opt := option(l, "maxPower" :: Symbol)) case "failed" then
-        -1
-      else 
-        retract(opt :: Any)$AnyFunctions1(Integer)
-
-    safety l ==
-      if (opt := option(l, "safety" :: Symbol)) case "failed" then
-        1$NonNegativeInteger
-      else
-        retract(opt :: Any)$AnyFunctions1(Integer)::NonNegativeInteger
-
-    one l ==
-      if (opt := option(l, "one" :: Symbol)) case "failed" then
-        true
-      else 
-        retract(opt :: Any)$AnyFunctions1(Boolean)
-
-    debug l ==
-      if (opt := option(l, "debug" :: Symbol)) case "failed" then
-        false
-      else 
-        retract(opt :: Any)$AnyFunctions1(Boolean)
-
-    homogeneous l ==
-      if (opt := option(l, "homogeneous" :: Symbol)) case "failed" then
-        false
-      else 
-        retract(opt :: Any)$AnyFunctions1(Boolean)
-
-    variableName l ==
-      if (opt := option(l, "variableName" :: Symbol)) case "failed" then
-        "x" :: Symbol
-      else 
-        retract(opt :: Any)$AnyFunctions1(Symbol)
-
-    functionName l ==
-      if (opt := option(l, "functionName" :: Symbol)) case "failed" then
-        "f" :: Symbol
-      else 
-        retract(opt :: Any)$AnyFunctions1(Symbol)
-
-    indexName l ==
-      if (opt := option(l, "indexName" :: Symbol)) case "failed" then
-        "n" :: Symbol
-      else 
-        retract(opt :: Any)$AnyFunctions1(Symbol)
-
-    displayAsGF l ==
-      if (opt := option(l, "displayAsGF" :: Symbol)) case "failed" then
-        error "GuessOption: displayAsGF not set"
-      else 
-        retract(opt :: Any)$AnyFunctions1(Boolean)
-
-@
-<<GOPT0.dotabb>>=
-"GOPT0" [color="#FF4488",href="bookvol10.4.pdf#nameddest=GOPT0"]
-"ALIST" [color="#88FF44",href="bookvol10.3.pdf#nameddest=ALIST"]
-"GOPT0" -> "ALIST"
-
-@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{package GUESSP GuessPolynomial}
 \pagehead{GuessPolynomial}{GUESSP}
 \pagepic{ps/v104guesspolynomial.ps}{GUESSP}{1.00}
@@ -161245,7 +161065,6 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package GUESSF GuessFinite>>
 <<package GUESSF1 GuessFiniteFunctions>>
 <<package GUESSINT GuessInteger>>
-<<package GOPT0 GuessOptionFunctions0>>
 <<package GUESSP GuessPolynomial>>
 <<package GUESSUP GuessUnivariatePolynomial>>
 
@@ -161541,6 +161360,7 @@ ZeroDimensionalSolvePackage(R,ls,ls2): Exports == Implementation where
 <<package STREAM3 StreamFunctions3>>
 <<package STINPROD StreamInfiniteProduct>>
 <<package STTAYLOR StreamTaylorSeriesOperations>>
+<<package STNSR StreamTensor>>
 <<package STTF StreamTranscendentalFunctions>>
 <<package STTFNC StreamTranscendentalFunctionsNonCommutative>>
 <<package SCPKG StructuralConstantsPackage>>
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index bb9ba6c..cc22727 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -23749,7 +23749,6 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|GuessFiniteFunctions| . GUESSF1)
    (|GuessInteger| . GUESSINT)
    (|GuessOption| . GOPT)
-   (|GuessOptionFunctions0| . GOPT0)
    (|GuessPolynomial| . GUESSP)
    (|GuessUnivariatePolynomial| . GUESSUP)
    (|HallBasis| . HB)
@@ -24011,6 +24010,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|UniversalSegment| . UNISEG)
    (|UniversalSegmentFunctions2| . UNISEG2)
    (|UserDefinedVariableOrdering| . UDVO)
+   (|U32Vector| . U32VEC)
    (|Vector| . VECTOR)
    (|VectorFunctions2| . VECTOR2)
    (|ViewDefaultsPackage| . VIEWDEF)
@@ -24475,6 +24475,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|GrayCode| . GRAY)
    (|GroebnerInternalPackage| . GBINTERN)
    (|GroebnerSolve| . GROEBSOL)
+   (|GuessOptionFunctions0| . GOPT0)
    (|HashTable| . HASHTBL)
    (|Heap| . HEAP)
    (|HeuGcd| . HEUGCD)
diff --git a/books/ps/v103u32vector.eps b/books/ps/v103u32vector.eps
new file mode 100644
index 0000000..a6e3b3a
--- /dev/null
+++ b/books/ps/v103u32vector.eps
@@ -0,0 +1,266 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Graphviz version 2.20.2 (Mon Mar 30 10:09:11 UTC 2009)
+%%For: (root) root
+%%Title: pic
+%%Pages: 1
+%%BoundingBox: 36 36 116 152
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+       dup 1 exch div /InvScaleFactor exch def
+       scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw text fitted to its expected width
+/alignedtext {			% width text
+	/text exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			[] 0 setdash
+			text stringwidth pop width exch sub text length div 0 text ashow
+		} if
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+setupLatin1
+%%Page: 1 1
+%%PageBoundingBox: 36 36 116 152
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 80 116 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% U32VEC
+gsave
+[ /Rect [ 0 72 72 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.3.pdf#nameddest=U32VEC) >>
+  /Subtype /Link
+/ANN pdfmark
+0.273 0.733 1.000 nodecolor
+newpath 72 108 moveto
+0 108 lineto
+0 72 lineto
+72 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.273 0.733 1.000 nodecolor
+newpath 72 108 moveto
+0 108 lineto
+0 72 lineto
+72 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 85.9 moveto 57 (U32VEC) alignedtext
+grestore
+% A1AGG
+gsave
+[ /Rect [ 3 0 69 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (bookvol10.2.pdf#nameddest=A1AGG) >>
+  /Subtype /Link
+/ANN pdfmark
+0.606 0.733 1.000 nodecolor
+newpath 69 36 moveto
+3 36 lineto
+3 0 lineto
+69 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.606 0.733 1.000 nodecolor
+newpath 69 36 moveto
+3 36 lineto
+3 0 lineto
+69 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+10.5 13.9 moveto 51 (A1AGG) alignedtext
+grestore
+% U32VEC->A1AGG
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 36 72 moveto
+36 64 36 55 36 46 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 39.5 46 moveto
+36 36 lineto
+32.5 46 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 39.5 46 moveto
+36 36 lineto
+32.5 46 lineto
+closepath stroke
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index ad92bea..2628440 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100729 tpd src/axiom-website/patches.html 20100729.01.wxh.patch
+20100729 wxh src/algebra/Makefile help and test for U32Vector
+20100729 wxh books/bookvol5 expose U32Vector
+20100729 wxh books/bookvol10.3 add U32Vector, move GOPT0 from bookvol10.4
+20100729 wxh books/ps/v103u32vector.eps added
 20100728 tpd src/axiom-website/patches.html 20100728.04.tpd.patch
 20100728 tpd books/ps/v104streamtensor.eps added
 20100728 tpd src/axiom-website/patches.html 20100728.03.tpd.patch
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 554d480..48a5d9f 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -3726,7 +3726,8 @@ LAYER8=\
   ${OUT}/PROJSP.o   \
   ${OUT}/REDORDER.o ${OUT}/SRAGG.o    ${OUT}/SRAGG-.o   ${OUT}/STREAM.o   \
   ${OUT}/SYMPOLY.o  ${OUT}/TS.o       ${OUT}/TUPLE.o    ${OUT}/UPSCAT.o   \
-  ${OUT}/UPSCAT-.o  ${OUT}/VECTCAT.o  ${OUT}/VECTCAT-.o ${OUT}/XDPOLY.o   \
+  ${OUT}/UPSCAT-.o  ${OUT}/U32VEC.o   \
+  ${OUT}/VECTCAT.o  ${OUT}/VECTCAT-.o ${OUT}/XDPOLY.o   \
   ${OUT}/XEXPPKG.o  ${OUT}/XF.o       ${OUT}/XF-.o      ${OUT}/XPBWPOLY.o \
   ${OUT}/XPOLY.o    ${OUT}/XRPOLY.o \
   layer8done
@@ -4336,6 +4337,18 @@ LAYER8=\
 /*"UPSCAT-" -> {"ENTIRER"; "ELTAB"; "DIFRING"; "PDRING"; "OAMON"; "OASGP"}*/
 /*"UPSCAT-" -> {"ORDSET"; "INT"; "LIST"; "ILIST"; "LSAGG-"}*/
 
+"U32VEC" [color="#88FF44",href="bookvol10.3.pdf#nameddest=U32VEC"]
+"U32VEC" -> "A1AGG"
+/*"U32VEC" -> {"FLAGG"; "LNAGG"; "IXAGG"; "HOAGG"; "AGG"; "TYPE"; "SETCAT"}*/
+/*"U32VEC" -> {"BASTYPE"; "KOERCE"; "EVALAB"; "IEVALAB"; "ELTAGG"; "ELTAB"}*/
+/*"U32VEC" -> {"CLAGG"; "KONVERT"; "ORDSET"; "INT"; "SINT"; "NNI"; "INS"}*/
+/*"U32VEC" -> {"UFD"; "GCDDOM"; "INTDOM"; "COMRING"; "RING"; "RNG"}*/
+/*"U32VEC" -> {"ABELGRP"; "CABMON"; "ABELMON"; "ABELSG"; "SGROUP"}*/
+/*"U32VEC" -> {"MONOID"; "LMODULE"; "BMODULE"; "RMODULE"; "ALGEBRA"}*/
+/*"U32VEC" -> {"MODULE"; "ENTIRER"; "EUCDOM"; "PID"; "OINTDOM"; "ORDRING"}*/
+/*"U32VEC" -> {"OAGROUP"; "OCAMON"; "OAMON"; "OASGP"; "DIFRING"; "RETRACT"}*/
+/*"U32VEC" -> {"LINEXP"; "PATMAB"; "CFCAT"; "REAL"; "CHARZ"; "STEP"; "OM"}*/
+
 "VECTCAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=VECTCAT"]
 "VECTCAT" -> "A1AGG"
 /*"VECTCAT" -> {"FLAGG"; "LNAGG"; "IXAGG"; "HOAGG"; "AGG"; "TYPE"}*/
@@ -11277,12 +11290,12 @@ LAYER16=\
 /*"GOPT" -> {"IXAGG-"; "CLAGG-"; "HOAGG-"; "ORDSET-"; "AGG-"; "ELTAGG-"}*/
 /*"GOPT" -> {"SETCAT-"; "BASTYPE-"}*/
 
-"GOPT0" [color="#FF4488",href="bookvol10.4.pdf#nameddest=GOPT0"]
-/*"GOPT0" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "SYMBOL"; "INT"; "REF"}*/
-"GOPT0" -> "ALIST"
-/*"GOPT0" -> {"LIST"; "STRING"; "CHAR"; "SINT"; "OUTFORM"; "PRIMARR"}*/
-/*"GOPT0" -> {"A1AGG-"; "ISTRING"; "SRAGG-"; "FLAGG-"; "LNAGG-"; "BOOLEAN"}*/
-/*"GOPT0" -> "NNI"*/
+"GOPT0" [color="#88FF44",href="bookvol10.3.pdf#nameddest=GOPT0"]
+"GOPT0" -> "STRING"
+/*"GOPT0" -> {"SETCAT"; "BASTYPE"; "KOERCE"; "PI";"NNI"; "INT"; "BOOLEAN"}*/
+/*"GOPT0" -> {"CHAR"; "SINT"; "OUTFORM"; "LIST"; "PRIMARR"}*/
+/*"GOPT0" -> {"A1AGG-"; "ISTRING"; "MONOID-"; "ABELSG-"; "SGROUP-"; }*/
+/*"GOPT0" -> {"ORDSET-"; "SETCAT-"; "BASTYPE-"}*/
 
 "HACKPI" [color="#88FF44",href="bookvol10.3.pdf#nameddest=HACKPI"]
 /*"HACKPI" -> {"FIELD"; "EUCDOM"; "PID"; "GCDDOM"; "INTDOM"; "COMRING"}*/
@@ -17558,6 +17571,7 @@ SPADHELP=\
  ${HELP}/GroebnerPackage.help \
  ${HELP}/Group.help \
  ${HELP}/GuessOption.help \
+ ${HELP}/GuessOptionFunctions0.help \
  ${HELP}/HashTable.help \
  ${HELP}/Heap.help \
  ${HELP}/HexadecimalExpansion.help \
@@ -17952,6 +17966,7 @@ SPADHELP=\
  ${HELP}/UnivariateTaylorSeriesCZero.help \
  ${HELP}/UnivariateTaylorSeriesCategory.help \
  ${HELP}/UniversalSegment.help \
+ ${HELP}/U32Vector.help \
  ${HELP}/Variable.help \
  ${HELP}/Vector.help \
  ${HELP}/VectorCategory.help \
@@ -18252,6 +18267,7 @@ REGRESS= \
  GroebnerPackage.regress \
  Group.regress \
  GuessOption.regress \
+ GuessOptionFunctions0.regress \
  HashTable.regress \
  Heap.regress \
  HexadecimalExpansion.regress \
@@ -18630,6 +18646,7 @@ REGRESS= \
  UnivariateTaylorSeriesCZero.regress \
  UnivariateTaylorSeriesCategory.regress \
  UniversalSegment.regress \
+ U32Vector.regress \
  Variable.regress \
  Vector.regress \
  VectorCategory.regress \
@@ -21967,6 +21984,18 @@ ${HELP}/GuessOption.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/GuessOption.input
 	@echo "GuessOption (GOPT)" >>${HELPFILE}
 
+${HELP}/GuessOptionFunctions0.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 5000 create GuessOptionFunctions0.help from \
+           ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"GuessOptionFunctions0.help" \
+           ${BOOKS}/bookvol10.3.pamphlet \
+           >${HELP}/GuessOptionFunctions0.help
+	@cp -f ${HELP}/GuessOptionFunctions0.help ${HELP}/GOPT0.help
+	@${TANGLE} -R"GuessOptionFunctions0.input" \
+            ${BOOKS}/bookvol10.3.pamphlet \
+            >${INPUT}/GuessOptionFunctions0.input
+	@echo "GuessOptionFunctions0 (GOPT0)" >>${HELPFILE}
+
 ${HELP}/HashTable.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 5000 create HashTable.help from \
            ${BOOKS}/bookvol10.3.pamphlet
@@ -26701,6 +26730,16 @@ ${HELP}/UniversalSegment.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/UniversalSegment.input
 	@echo "UniversalSegment (UNISEG)" >>${HELPFILE}
 
+${HELP}/U32Vector.help: ${BOOKS}/bookvol10.3.pamphlet
+	@echo 8200 create U32Vector.help from \
+           ${BOOKS}/bookvol10.3.pamphlet
+	@${TANGLE} -R"U32Vector.help" ${BOOKS}/bookvol10.3.pamphlet \
+           >${HELP}/U32Vector.help
+	@cp -f ${HELP}/U32Vector.help ${HELP}/U32VEC.help
+	@${TANGLE} -R"U32Vector.input" ${BOOKS}/bookvol10.3.pamphlet \
+            >${INPUT}/U32Vector.input
+	@echo "U32Vector (U32VEC)" >>${HELPFILE}
+
 ${HELP}/Variable.help: ${BOOKS}/bookvol10.3.pamphlet
 	@echo 5000 create Variable.help from \
            ${BOOKS}/bookvol10.3.pamphlet
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 184ac7b..ffbe4d8 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -3039,5 +3039,7 @@ books/bookvol10.4 add StreamTensor<br/>
 books/bookvol10.4 fix ScriptTensor regression test<br/>
 <a href="patches/20100728.04.tpd.patch">20100728.04.tpd.patch</a>
 books/ps/v104streamtensor.eps added<br/>
+<a href="patches/20100729.01.wxh.patch">20100729.01.wxh.patch</a>
+books/bookvol10.3 add U32Vector, move GOPT0 from bookvol10.4<br/>
  </body>
 </html>
