diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+The WASH License
+
+Copyright 2001-2003, Peter Thiemann.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:  
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer. 
+   2. Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution. 
+   3. The name of the author may not be used to endorse or promote
+      products derived from this software without specific prior
+      written permission. 
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,5 @@
+#!/usr/bin/env runhaskell
+arch-tag: Main setup script
+
+> import Distribution.Simple
+> main = defaultMain
diff --git a/WASH/CGI/AbstractSelector.hs b/WASH/CGI/AbstractSelector.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/AbstractSelector.hs
@@ -0,0 +1,227 @@
+module WASH.CGI.AbstractSelector 
+  -- the public interface
+  -- ( as_rows, as_cols, table_io, getText, selectionGroup, selectionButton, selectionDisplay)
+where
+
+import WASH.CGI.BaseCombinators (unsafe_io, once)
+import WASH.CGI.CGIInternals (HTMLField, INVALID, ValidationError (..))
+import WASH.CGI.CGIMonad hiding (lift)
+import WASH.CGI.HTMLWrapper
+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..))
+import WASH.Utility.JavaScript
+
+import Char
+import List ((\\))
+import Maybe
+
+
+-- |abstract table (twodimensional)
+data AT =
+    AT { as_raw :: [[String]]
+       , as_rows :: Int
+       , as_cols :: Int
+       }
+
+instance Show AT where
+  showsPrec i as = showsPrec i (as_rows as, as_cols as)
+
+instance Read AT where
+  readsPrec i inp =
+    [ (AT { as_raw = [], as_rows = r, as_cols = c }, str')
+    | ((r,c), str') <- readsPrec i inp
+    ]
+
+-- |abstract row
+data AR = AR [String]
+  deriving (Eq, Show)
+
+instance Read AR where
+  readsPrec i inp =
+    case dropWhile isSpace inp of
+      'A':'R':xs ->
+	[(AR xss, rest) | (xss, rest) <- reads xs]
+      _ -> []
+  readList inp =
+    case dropWhile isSpace inp of
+      '+':xs ->
+	[ (ar:ars, xs2)| (ar, xs1) <- reads xs, (ars, xs2) <- readList xs1 ]
+      '-':xs ->
+	[ (ars\\[ar], xs2)| (ar, xs1) <- reads xs, (ars, xs2) <- readList xs1 ]
+      "" -> 
+	[([],[])]
+      _ -> []
+
+getAR :: AT -> Int -> AR
+getAR at r =
+  AR (getRow (as_raw at) r)
+
+unAR :: AR -> [String]
+unAR (AR x) = x
+
+-- |Transform an IO action that produces a table in list form into a CGI action
+-- that returns an abstract table. 
+table_io :: IO [[String]] -> CGI AT
+table_io io =
+  once $
+  do raw <- unsafe_io io
+     let r = length raw
+	 c = length (Prelude.head raw)
+     return (AT { as_raw = raw
+		, as_rows = r
+		, as_cols = c
+		})
+
+-- |Access abstract table by row and column. Produces a test node in the
+-- document monad.
+getText :: Monad m => AT -> Int -> Int -> WithHTML x m ()
+getText as r c =
+  text (getEntry (as_raw as) r c)
+
+getRow xss r 
+  | 0 <= r && r < length xss = xss !! r
+  | otherwise = []
+
+getCol xs c
+  | 0 <= c && c < length xs = xs !! c
+  | otherwise = ""
+
+getEntry xss r c =
+  getCol (getRow xss r) c
+  
+-- |a selection group is a virtual field that never appears on the screen, but
+-- gives rise to a hidden input field!
+data SelectionGroup a x =
+     SelectionGroup { selectionName   :: String
+		    , selectionToken  :: CGIFieldName
+		    , selectionString :: Maybe String
+		    , selectionValue  :: Maybe a
+		    , selectionBound  :: Bool
+		    }
+
+validateSelectionGroup rg =
+  case selectionValue rg of 
+    Nothing | selectionBound rg -> 
+      Left [ValidationError (selectionName rg) (selectionToken rg) (selectionString rg)]
+    _ ->
+      Right SelectionGroup  { selectionName = selectionName rg
+			, selectionToken = selectionToken rg
+			, selectionString = selectionString rg
+			, selectionValue = selectionValue rg
+			, selectionBound = selectionBound rg
+			}
+
+valueSelectionGroup rg =
+  case selectionValue rg of
+    Nothing -> error ("SelectionGroup { " ++
+		      "selectionName = " ++ show (selectionName rg) ++ ", " ++
+		      "selectionString = " ++ show (selectionString rg) ++ ", " ++
+		      "selectionBound = " ++ show (selectionBound rg) ++
+		      " }")
+    Just vl -> vl
+
+-- |Create a selection group for a table. Selects one row.
+selectionGroup :: (CGIMonad cgi) => WithHTML y cgi (SelectionGroup AR INVALID)
+selectionGroup =
+  do token <- lift nextName
+     let fieldName = show token
+     info <- lift getInfo
+     lift $ addField fieldName False
+     let bds = bindings info
+	 maybeString = bds >>= assocParm fieldName
+	 -- experimental
+	 isBound = fromMaybe False (do "UNSET" <- maybeString
+				       return True)
+	 maybeVal = maybeString >>= (g . reads)
+	 g ((a,""):_) = Just a
+	 g _ = Nothing
+     input (do attr "type" "hidden"
+	       attr "name" fieldName
+	       attr "value" "UNSET")
+     return $
+       SelectionGroup { selectionName = fieldName
+		      , selectionToken = token
+		      , selectionString = maybeString
+		      , selectionValue = maybeVal
+		      , selectionBound = isBound
+		      }
+
+-- |Create a selection button for an abstract table
+selectionButton :: (CGIMonad cgi) =>
+  SelectionGroup AR INVALID -> AT -> Int -> HTMLField cgi x y ()
+selectionButton sg at row buttonAttrs =
+  input (do attr "type" "radio"
+	    attr "name" (fieldName++"_")
+	    attr "onclick" ("var ff=this.form."++fieldName++
+			    ";ff.value=" ++ jsShow (show (getAR at row))++
+			    ";if(ff.getAttribute('onchange'))"++
+			    "{WASHSubmit(ff.name);"++
+			    "};")
+	    buttonAttrs)
+  where
+    fieldName = selectionName sg
+
+
+-- |Create a labelled selection display for an abstract table. The display
+-- function takes the button element and a list of text nodes corresponding to
+-- the selected row and is expected to perform the layout.
+selectionDisplay :: (CGIMonad cgi) =>
+  SelectionGroup AR INVALID -> AT -> Int ->
+  (WithHTML x cgi () -> [WithHTML x cgi ()] -> WithHTML x cgi a) ->
+  WithHTML x cgi a
+selectionDisplay sg at row displayFun =
+  displayFun (selectionButton sg at row empty)
+	     (Prelude.map text $ getRow (as_raw at) row)
+
+-- |Create a choice group for a table (0-*).
+choiceGroup :: (CGIMonad cgi) => WithHTML x cgi (SelectionGroup [AR] INVALID)
+choiceGroup =
+  do token <- lift nextName
+     let fieldName = show token
+     info <- lift getInfo
+     lift $ addField fieldName False
+     let bds = bindings info
+	 maybeString = bds >>= assocParm fieldName
+	 maybeVal = maybeString >>= (g . reads)
+	 g ((a,""):_) = Just a
+	 g _ = Nothing
+     input (do attr "type" "hidden"
+	       attr "name" fieldName
+	       attr "value" "")
+     return $
+       SelectionGroup { selectionName = fieldName
+		      , selectionToken = token
+		      , selectionString = maybeString
+		      , selectionValue = maybeVal
+		      , selectionBound = isJust bds
+		      }
+
+-- |Create one choice button for an abstract table
+choiceButton :: (CGIMonad cgi) =>
+  SelectionGroup [AR] INVALID -> AT -> Int -> HTMLField cgi x y ()
+choiceButton sg at row buttonAttrs =
+  do script_T (rawtext $
+	       "SubmitAction[SubmitAction.length]=" ++
+	       "function(){"++
+	       "var f=document.forms[0];" ++
+	       "if(f."++buttonFieldName++".checked){" ++ 
+		 "f."++fieldName++".value=" ++ jsShow ('+':show (getAR at row)) ++
+		   "+f."++fieldName++".value;" ++
+	       "};return true};")
+     input_T
+      (do attr "type" "checkbox"
+	  attr "name" buttonFieldName
+	  buttonAttrs)
+  where
+    fieldName = selectionName sg
+    buttonFieldName = fieldName++'_':show row
+
+-- |Create a labelled choice display for an abstract table. The display
+-- function takes the button element and a list of text nodes corresponding to
+-- the selected row and is expected to perform the layout.
+choiceDisplay :: (CGIMonad cgi) =>
+  SelectionGroup [AR] INVALID -> AT -> Int ->
+  (WithHTML x cgi () -> [WithHTML x cgi ()] -> WithHTML x cgi a) ->
+  WithHTML x cgi a
+choiceDisplay sg at row displayFun =
+  displayFun (choiceButton sg at row empty)
+	     (Prelude.map text $ getRow (as_raw at) row)
diff --git a/WASH/CGI/BaseCombinators.hs b/WASH/CGI/BaseCombinators.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/BaseCombinators.hs
@@ -0,0 +1,548 @@
+-- © 2001-2005 Peter Thiemann
+module WASH.CGI.BaseCombinators
+{-- interface
+  (ask		-- WithHTML x CGI a -> CGI ()
+  ,tell		-- CGIOutput a => a -> CGI ()
+  ,htell 	-- WithHTML x IO () -> CGI ()
+  ,run		-- CGI () -> IO ()
+  ,runWithHook 	-- ([String] -> CGI ()) -> CGI () -> IO ()
+  )
+--}
+where
+
+import qualified List
+import Maybe
+import Monad
+import System
+import IO
+
+import WASH.Utility.Auxiliary
+import qualified WASH.Utility.Base64 as Base64
+import WASH.CGI.CookieIO
+import WASH.CGI.CGIMonad
+import WASH.CGI.CGIOutput
+import WASH.CGI.CGITypes
+import WASH.CGI.EventHandlers
+import WASH.CGI.Fields
+import WASH.CGI.Frames
+import WASH.CGI.LogEntry
+import WASH.CGI.CGIHistory
+import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)
+import WASH.CGI.Images
+import WASH.Utility.JavaScript
+import qualified WASH.Utility.RFC2279 as RFC2279
+import qualified WASH.Utility.RFC2397 as RFC2397
+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..), getSessionMode)
+import qualified WASH.Utility.URLCoding as URLCoding
+
+import WASH.CGI.CGIConfig
+
+
+-- |Safe embedding of an 'IO' action into the 'CGI' monad. Intentionally not
+-- parameterized óver its monad to avoid its use inside of transactions.
+io :: (Read a, Show a) => IO a -> CGI a
+io ioa =
+  once (unsafe_io ioa)
+
+-- |Runs a 'CGI' state transformer forever. Its specification is just
+--
+-- > feedback f x = f x >>= feedback f
+-- 
+-- However, 'feedback' is more efficient because it avoids the 
+-- buildup of long interaction logs by cutting back every time just before 'f' 
+-- is invoked. Unfortunately, it's useless due to typing restrictions.
+feedback :: (CGIMonad cgi, Read a, Show a) => (a -> cgi a) -> a -> cgi a
+feedback f x = 
+  wrapCGI (\ cgistate ->
+  case inparm cgistate of
+    -- if we've got a value in the log,
+    -- ignore the parameter x and just use the logged value
+    PAR_MARK _ : PAR_RESULT code : rest ->
+      case reads code of
+	(result, ""):_ ->
+	  return (result
+	         ,cgistate { inparm = rest })
+	_ ->
+	  reportError "Result unreadable"
+	  	(H.text_S "Cannot read " >> H.text (show code)) cgistate
+    [] ->
+      let stid = stateID cgistate 
+	  newparm = PAR_MARK stid
+	  newvalue = PAR_RESULT (show x)
+	  in
+      do (nextx, cgistate') <- 
+	   unwrapCGI (f x) cgistate { outparm = newvalue : newparm : outparm cgistate
+				, stateID = nextstid (nextstid stid newparm) newvalue }
+	 let (oldstid, outparm') = popToMark $ outparm cgistate'
+	 unwrapCGI (feedback f nextx)
+	       cgistate { inparm =  inparm cgistate'
+			, outparm = outparm'
+			, stateID = oldstid
+			, cookieMap = cookieMap cgistate' 
+			, cookiesToSend = cookiesToSend cgistate' }
+    _ -> 
+      reportError "Out of sync" H.empty cgistate)
+
+-- |Control operator for the 'CGI' monad. Its specification is
+--
+-- > callWithCurrentHistory (\backto x -> action x >>= backto) x
+-- > ==
+-- > action x >>= callWithCurrentHistory (\backto x -> action x >>= backto)
+-- 
+-- However, 'callWithCurrentHistory' is more efficient because it avoids the 
+-- buildup of long interaction logs by cutting back every time just before
+-- 'action' gets executed. 
+callWithCurrentHistory :: (CGIMonad cgi, Read a, Show a) =>
+			  ((a -> cgi ()) -> a -> cgi ()) -> a -> cgi ()
+callWithCurrentHistory g x = 
+  wrapCGI (\ cgistate ->
+  let
+    prompt stid x =
+      wrapCGI (\ cgistate' ->
+	let outparm' = popTo stid (outparm cgistate') 
+	in
+	unwrapCGI (callWithCurrentHistory g x) 
+	      cgistate { inparm =  inparm cgistate'
+		       , outparm = outparm'
+		       , stateID = stid
+		       , cookieMap = cookieMap cgistate' 
+		       , cookiesToSend = cookiesToSend cgistate' } )
+    popTo stid [] = error "popTo did not find its mark"
+    popTo stid (PAR_MARK stid' : rest) | stid' == stid = rest
+    popTo stid (_ : rest) = popTo stid rest
+  in
+  case inparm cgistate of
+    -- if we've got a value in the log,
+    -- ignore the parameter x and just use the logged value
+    PAR_MARK stid : PAR_RESULT code : rest ->
+      case reads code of
+	(result, ""):_ ->
+	  unwrapCGI (g (prompt stid) result) cgistate { inparm = rest }
+	_ ->
+	  reportError "Result unreadable"
+	  	(H.text_S "Cannot read " >> H.text (show code)) cgistate
+    [] ->
+      let stid = stateID cgistate 
+	  newmark = PAR_MARK stid
+	  newvalue = PAR_RESULT (show x)
+	  in
+      unwrapCGI (g (prompt stid) x)
+	cgistate { outparm = newvalue : newmark : outparm cgistate
+		 , stateID = nextstid (nextstid stid newmark) newvalue }
+    _ -> 
+      reportError "Out of sync" H.empty cgistate)
+
+-- |Brackets a 'CGI' action so that only its result is visible. Improves
+-- efficiency by not executing the bracketed action after it has been performed
+-- once. Use this for avoiding the inefficient buildup of long interaction logs.
+once :: (CGIMonad cgi, Read a, Show a) => cgi a -> cgi a
+once cgi = 
+  wrapCGI (\ cgistate ->
+  case inparm cgistate of
+    PAR_RESULT code : rest ->
+      case reads code of
+	(result, ""):_ ->
+	  return (result
+	         ,cgistate { inparm = rest })
+	_ ->
+	  reportError "Result unreadable"
+	  	(H.text_S "Cannot read " >> H.text (show code)) cgistate
+    [] ->
+      let stid = stateID cgistate 
+	  newparm = PAR_MARK stid in
+      unwrapCGI cgi cgistate { outparm = newparm : outparm cgistate
+			 , stateID = nextstid stid newparm }
+      >>= finish cgistate
+    PAR_MARK _ : rest -> 
+      unwrapCGI cgi cgistate { inparm = rest } >>= finish cgistate
+    _ -> 
+      reportError "Out of sync" H.empty cgistate)
+  where finish cgistate (v, cgistate') =
+ 	  let (oldstid, outparm') = popToMark $ outparm cgistate'
+	      newparm = PAR_RESULT (show v)
+	  in
+	  return (v
+	      	 ,cgistate { inparm = inparm cgistate'
+			   , outparm = newparm : outparm'
+			   , stateID = nextstid oldstid newparm
+			   , cookieMap = cookieMap cgistate' 
+			   , cookiesToSend = cookiesToSend cgistate' })
+
+-- |Repeats a 'CGI' action without saving its state so that the size of the
+-- interaction log remains constant.
+forever :: (CGIMonad cgi) => cgi () -> cgi ()
+forever cgi = 
+  wrapCGI (\ cgistate ->
+  case inparm cgistate of
+    [] ->
+      let stid = stateID cgistate 
+	  newparm = PAR_MARK stid in
+      unwrapCGI cgi cgistate { outparm = newparm : outparm cgistate
+			 , stateID = nextstid stid newparm }
+      >>= 
+      const (reportError "Black hole" H.empty cgistate)
+    PAR_MARK _ : rest -> 
+      unwrapCGI cgi cgistate { inparm = rest } >>= finish (mcount cgistate)
+    _ -> 
+      reportError "Out of sync" H.empty cgistate)
+  where finish previousMcount (v, cgistate') =
+	  let (oldstid, outparm') = popToMark $ outparm cgistate'
+	      newparm_ignored = PAR_RESULT (show v)
+	      newparm = PAR_MARK oldstid
+	  in
+	  unwrapCGI cgi 
+	    cgistate' { inparm = []
+		      , outparm = newparm : outparm'
+		      , stateID = nextstid oldstid newparm
+		      , mcount = previousMcount }
+
+-- |Unsafe variant of 'once':  returns the computed value only the first time
+-- and returns a default value in all later invocations.
+-- [deprecated]
+onceAndThen :: (CGIMonad cgi, Read a, Show a) => a -> cgi a -> cgi a
+onceAndThen a cgi = 
+  wrapCGI (\ cgistate ->
+  case inparm cgistate of
+    PAR_IGNORED : rest ->
+      return (a
+	     ,cgistate { inparm = rest })
+    [] ->
+      unwrapCGI cgi cgistate { outparm = PAR_MARK (stateID cgistate) : outparm cgistate }
+      >>= finish
+    PAR_MARK _ : rest -> 
+      unwrapCGI cgi cgistate { inparm = rest } >>= finish
+    _ -> 
+      reportError "Out of sync" H.empty cgistate)
+  where popToMark [] = []
+	popToMark (PAR_MARK _: rest) = rest
+	popToMark (_: rest) = popToMark rest
+	finish (v, cgistate') =
+ 	  let out = outparm cgistate' in
+	  return (v
+	      	 ,cgistate' { outparm = PAR_IGNORED : popToMark out })
+
+-- internal helper function
+popToMark [] = error "popToMark did not find MARK"
+popToMark (PAR_MARK v: rest) = (v, rest)
+popToMark (_: rest) = popToMark rest
+
+-- |Directly lifts the 'IO' monad into the 'CGI' monad. This is generally unsafe
+-- and should be avoided. Use 'io' instead.
+unsafe_io :: IO a -> CGI a
+unsafe_io = lift
+
+-- |Takes a monadic value that constructs a HTML page and delivers this
+-- page to the browser. This page may contain forms and input widgets.
+ask :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()
+ask ma =
+  do sessionMode <- getSessionMode
+     case sessionMode of
+       LogOnly -> 
+	 askResumptive ma
+       _ ->
+	 askContinuously ma
+
+-- |Implementation of `ask` for the pure logged variant.
+askResumptive :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()
+askResumptive ma =
+  do wrapCGI (\cgistate -> 
+       return ((), cgistate { pageInfo = initialPageInfo cgistate }))
+     setAction tell
+     elem <- H.build_document ma 
+     wrapCGI $
+       \cgistate -> let
+	 pi = pageInfo cgistate
+	 atable = actionTable pi
+	 mbnds = bindings pi
+	 msubmitter = mbnds >>= assocParm subVar
+	 maction = msubmitter >>= \x -> lookup x atable
+	 nextState = nextCGIState cgistate
+	 defsubmission = liftM snd $ listToMaybe (reverse atable)
+	 defaction = maybe (rawTell) 
+			   (const (maybe (tellError "Unspecified action")
+					 id
+					 defsubmission))
+			   mbnds
+	 go = (maybe defaction id maction) elem nextState
+	 oldgo = (nextaction pi elem) nextState
+       in
+	 -- appendDebugFile "/tmp/ask" (show (List.map fst atable, msubmitter)) >>
+	 go
+
+-- |Experimental implementation of continuous version.
+askContinuously :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()
+askContinuously ma =
+  fromCGIstate id >>= \initialState -> 
+  let
+    scriptName = cgiScriptName (cgiInfo initialState)
+    parentID = (scriptName, stateID initialState)
+    askLoop = do 
+      wrapCGI (\cgistate -> 
+	   return ((), cgistate { pageInfo = initialPageInfo cgistate })) 
+      setAction tellContinuously			    -- is this still required?
+      elem <- H.build_document ma 
+      wrapCGI $
+       \cgistate -> let
+	 tellAction x = \ cst ->
+	   do rawTellContinuously x cst
+	      hClose (cgiHandle (cgiInfo cgistate))
+	      (decoded_parameters, hout) <- readParameters parentID
+	      -- newparm :: CGIParameters
+	      let newparm = PAR_VALUES $ dropSpecialParameters decoded_parameters
+		  newState = initialState { inparm = [newparm]
+					  , outparm = newparm : outparm initialState
+					  , cgiInfo = (cgiInfo initialState) { cgiHandle = hout}
+					  }
+	      unwrapCGI askLoop newState
+		    
+	 pi = pageInfo cgistate
+	 atable = actionTable pi
+	 mbnds = bindings pi
+	 msubmitter = mbnds >>= assocParm subVar
+	 maction = msubmitter >>= \x -> lookup x atable
+	 nextState = nextCGIState cgistate
+	 defsubmission = liftM snd $ listToMaybe (reverse atable)
+	 nextparam = head (inparm cgistate)
+	 myID = (scriptName, nextstid (snd parentID) nextparam)
+	 boost maction =
+	   maction >>= \ cgiact -> 
+	   return (\ elem -> 
+		     unwrapCGI (lift (createEntry myID (Just parentID) nextparam Nothing)
+				 >> wrapCGI (cgiact elem)))
+	 defaction = maybe tellAction
+			   (const (maybe (tellError "Unspecified action")
+					 id
+					 (boost defsubmission)))
+			   mbnds
+       in 
+	 (maybe defaction id (boost maction)) elem nextState
+  in askLoop
+
+
+-- |Like 'ask', but passes the constructed HTML page to the @elementAction@
+-- parameter. This function may send the page via Email or store it into a
+-- file. Anyone loading this page in a browser can resume the interaction.
+askOffline :: (CGIMonad cgi) => H.WithHTML x cgi a -> (H.Element -> IO ()) -> cgi ()
+askOffline ma elementAction =
+  do wrapCGI (\cgistate -> return ((), cgistate { pageInfo = initialPageInfo cgistate }))
+     setAction tell
+     elem <- H.build_document ma 
+     wrapCGI $
+       \cgistate ->
+       case bindings (pageInfo cgistate) of
+         Nothing ->
+	   elementAction elem >> return ((), cgistate)
+	 Just _ ->
+	   (nextaction (pageInfo cgistate) elem) (nextCGIState cgistate)
+
+-- |Turns a 'CGI' action into an 'IO' action. Used to turn the main 'CGI' action
+-- into the @main@ function of the program. Typical use:
+-- 
+-- > main = run mainCGI
+run :: CGI () -> IO ()
+run =
+  runWithOptions []
+
+-- |Turns a 'CGI' action into an 'IO' action. Used to turn the main 'CGI' action
+-- into the @main@ function of the program. Takes additional low-level
+-- options. Typical use: 
+-- 
+-- > main = runWithOptions [] mainCGI
+runWithOptions :: CGIOptions -> CGI () -> IO ()
+runWithOptions options =
+  runInternal options (fallbackTranslator Nothing)
+
+-- |Variant of 'run' where an additional argument @cgigen@ specifies an action
+-- taken when the script is invoked with a non-empty query string as in
+-- @script-name?query-string@ 
+runWithHook :: CGIOptions -> ([String] -> CGI ()) -> CGI () -> IO ()
+runWithHook options cgigen =
+  runInternal options (fallbackTranslator (Just cgigen))
+
+runInternal options cgigen cgiProg =
+  start options $ makeServletInternal cgigen cgiProg
+
+-- |Transform a CGI action into a servlet suitable for running from Marlow's web
+-- server.
+makeServlet :: CGI () -> CGIProgram
+makeServlet cgiProg = 
+  makeServletInternal (fallbackTranslator Nothing) cgiProg
+
+-- |Like 'makeServlet' with additional CGI generator as in 'runWithHook'.
+makeServletWithHook :: ([String] -> CGI ()) -> CGI () -> CGIProgram
+makeServletWithHook cgigen cgiProg =
+  makeServletInternal (fallbackTranslator $ Just cgigen) cgiProg
+
+makeServletInternal cgigen (CGI cgi) = \ info decoded_parameters ->
+  let maybecgiparm = assocParm "=CGI=parm=" decoded_parameters in
+  let maybecgistid = assocParm "=CGI=stid=" decoded_parameters in
+  let maybejsenabl = assocParm "js_enabled" decoded_parameters in
+  let clean_parameters = dropSpecialParameters decoded_parameters in
+  let no_parameters = null decoded_parameters in
+  do oldparm <- case maybecgiparm of
+       Just cgiparm ->
+         liftM read $ liftM RFC2279.decode $ decode $ Base64.decode' $ cgiparm
+       Nothing -> 
+         return []
+     key <- generateKey
+     let newparm 
+          | no_parameters = []
+	  | otherwise = (PAR_VALUES $ clean_parameters)
+	  		: oldparm
+	 oldstid
+	  | null decoded_parameters || isNothing maybecgistid = initialStateID
+	  | otherwise = Base64.decode' $ fromJust maybecgistid
+	 cgistate = CGIState { inparm = reverse newparm
+		             , outparm = newparm
+			     , stateID = oldstid
+			     , cgiInfo = info
+			     , mcount = 0
+			     , jsEnabled = liftM read maybejsenabl
+			     , pageInfo = (initialPageInfo cgistate) {inFrame = 0}
+			     , encoder = makeEncoder key
+			     , cookieMap = map decodeCookie (cgiCookies info)
+			     , cookiesToSend = []
+			     }
+	 args = cgiArgs info
+	 scriptName = cgiScriptName info
+	 sessionMode = cgiSessionMode info
+     -- writeDebugFile "/tmp/CGIOLDPARM" (show oldparm)
+     -- writeDebugFile "/tmp/CGINEWPARM" (show newparm)
+     
+     -- set b==False if replaying is required
+     b <- case sessionMode of
+       LogOnly ->
+	 return False
+       _ ->
+	 if no_parameters then
+	   do createEntry (scriptName, initialStateID) Nothing PAR_IGNORED Nothing
+	      return False
+	 else
+           notify (scriptName, oldstid) clean_parameters (cgiHandle info)
+	   -- if b is True at this point, we have found a thread to handle
+	   -- this request. However, we cannot terminate at this time because
+	   -- exiting will close the output handle for the other thread!
+     unless b $ do
+       if null args || null (head args)
+	 then cgi cgistate >> return ()
+	 else unCGI (cgigen $ args) cgistate >> return ()
+       exitWith ExitSuccess
+
+-- ======================================================================
+-- output routines
+
+-- |Terminates script by sending its argument to the browser.
+tell :: (CGIMonad cgi, CGIOutput a) => a -> cgi ()
+tell a =
+  wrapCGI (rawTell a)
+
+-- rawTell :: (CGIOutput a) => a -> CGIAction ()
+rawTell a cgistate =
+  -- appendFile "/tmp/CGIFRAME" ("tell/enter\n") >>
+  let frameno = inFrame $ pageInfo cgistate in
+  -- appendFile "/tmp/CGIFRAME" ("tell #" ++ show frameno ++ "\n") >>
+  if frameno == 0 then
+  do putCookies cgistate
+     cgiPut (cgiHandle $ cgiInfo cgistate) a
+     exitWith ExitSuccess
+  else
+  do let fname = frameFullPath (outparm cgistate) frameno
+     h <- openFile fname WriteMode
+     cgiPut h a
+     hClose h
+     return ((), cgistate)
+
+-- |(experimental: continuous version) send argument to the browser.
+tellContinuously :: (CGIMonad cgi, CGIOutput a) => a -> cgi ()
+tellContinuously a =
+  wrapCGI (rawTellContinuously a)
+
+rawTellContinuously :: (CGIOutput a) => a -> CGIAction ()
+rawTellContinuously a =
+  (\cgistate -> 
+  let h = cgiHandle $ cgiInfo cgistate in
+  do putCookies cgistate
+     cgiPut h a
+     -- hFlush h
+     return ((), cgistate))
+
+
+-- |Terminate script by sending a HTML page constructed by monadic argument. 
+htell :: (CGIMonad cgi) => H.WithHTML x IO () -> cgi a
+htell hma =
+  wrapCGI (\cgistate ->
+  do putCookies cgistate
+     itell (cgiHandle $ cgiInfo cgistate) hma)
+     -- never reached
+
+rawHtell hma = 
+  \cgistate ->
+  do putCookies cgistate
+     itell (cgiHandle $ cgiInfo cgistate) hma
+
+-- 
+tellError :: String -> H.Element -> CGIAction a
+tellError str elems = 
+  rawHtell message 
+  where message = 
+	  H.standardPage str (backLink H.empty)
+
+-- 
+reportError :: String -> H.WithHTML x IO () -> CGIState -> IO (a, CGIState)
+reportError ttl elems cgistate =
+  unCGI (htell message) cgistate
+  -- never reached
+  where message = 
+	  H.standardPage ttl (elems >> backLink H.empty)
+
+-- |Link to previous page in browser's history. Uses JavaScript.
+backLink :: Monad m => H.HTMLCons x y m ()
+backLink attrs =
+  hlink (URL "javascript:back()") (H.text_S "Try again..." >> attrs)
+
+-- |Plain Hyperlink from an URL string.
+hlink :: Monad m => URL -> H.HTMLCons x y m ()
+hlink url subs = 
+  H.a_T (H.attr_SD "href" (unURL url) >> subs)
+
+-- 
+fallbackTranslator mCgigen =
+  docTranslator [nothing, question] $
+  frameTranslator $
+  nextTranslator mCgigen
+
+-- 
+frameTranslator :: (CGIMonad cgi) => ([String] -> cgi ()) -> [String] -> cgi ()
+frameTranslator next (name@('F':'R':'A':'M':'E':':':_):_) =
+  tell (ResponseFileReference (frameDir ++ name))
+frameTranslator next strs =
+  next strs
+
+-- |A /translator/ is a function @[String] -> CGI ()@. It takes the query string
+-- of the URL (of type @[String]@) and translates it into a CGI
+-- action. @docTranslator docs next@ 
+-- takes a list of 'FreeForm' documents and a next translator. It tries to
+-- select a document by its 'ffName' and falls through to the
+-- @next@ translator if no document matches.
+docTranslator :: [FreeForm] -> ([String] -> CGI ()) -> [String] -> CGI ()
+docTranslator docs next [name] =
+  let f (doc : rest) =
+        if name == ffName doc then tell doc else f rest
+      f [] = next [name]
+  in  f docs
+docTranslator docs next strs =
+  next strs
+
+-- |Terminates a sequence of translators.
+lastTranslator :: [String] -> CGI ()
+lastTranslator =
+  nextTranslator Nothing
+
+nextTranslator Nothing _ =
+  tell (Status 404 "Not Found" Nothing)
+nextTranslator (Just cgigen) strs =
+  cgigen strs
+
+-- | Internal: name for the submission variable and form field
+subVar :: String
+subVar = "WASHsub"
diff --git a/WASH/CGI/CGI.hs b/WASH/CGI/CGI.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGI.hs
@@ -0,0 +1,125 @@
+-- © 2001-2003 Peter Thiemann
+{-|
+  One stop shop for the WASH\/CGI library. All high-level scripts should 
+  get along with importing just this module. Low-level scripts may have to 
+  import "RawCGI".
+  -} 
+module WASH.CGI.CGI (
+	-- * Basics
+	CGI, CGIMonad
+	, ask, tell, io, run, runWithOptions
+	, once, forever, callWithCurrentHistory, htell, askOffline
+	-- * Links and Images
+	, Image, internalImage, externalImage, makeImg, makeRef, makePopupRef, makeA
+	, backLink, hlink, popuplink, restart
+	-- * Page Templates
+	, H.standardPage, H.htmlHeader, H.html, H.cssPage, H.cssHeader
+	-- * Forms and Widgets
+	, HTMLField
+	-- ** Form Creation
+	, makeForm, standardQuery
+	-- ** Form Submission
+	, submit, submit0, defaultSubmit, resetField, activeInputField, activate
+	, submitLink, submitLink0, defaultSubmitLink
+	, submitx, DTree, dtleaf, dtnode
+	-- ** Textual Input 
+	, inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea
+	-- ** Checkbox
+	, checkboxInputField
+	-- ** Button
+	, makeButton, RadioGroup, radioGroup, radioButton, radioError
+	-- ** Image
+	, imageField
+	-- ** Selection Box
+	, selectMultiple, selectSingle, selectBounded
+	-- ** File
+	, fileInputField, checkedFileInputField
+	-- ** Abstract Selection
+	, as_rows, as_cols, table_io, getText, unAR
+	, selectionGroup, selectionButton, selectionDisplay
+	, choiceGroup, choiceButton, choiceDisplay
+	-- ** Handle Manipulation
+	, InputField, VALID, INVALID, value, InputHandle, HasValue
+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)
+	, FL (FL), FA (FA)
+	-- ** Handle Concatenation
+	, concatFields, concatFieldsWith
+	-- ** Attribute Shortcuts
+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE
+	-- * Advanced
+	-- ** Installing Translators
+	, runWithHook, docTranslator, lastTranslator
+	-- ** Outputable Stuff
+	, CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)
+	-- ** Predefined Types for Input Fields
+	, Text(..), NonEmpty(..), AllDigits(..), Phone(..)
+	, EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)
+	, Password(..), Optional(..)
+	-- ** Lowlevel Stuff
+	, CGIOption (..), CGIOptions, URL (..)
+	-- ** Servlets
+	, makeServlet, makeServletWithHook
+	-- * HTML and Style
+	, module WASH.CGI.HTMLWrapper
+	, module WASH.CGI.Style
+	-- * Experimental Stuff
+	, FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage
+	)
+where
+
+import WASH.CGI.CGIMonad (CGIMonad())
+-- import qualified Prelude
+import WASH.CGI.AbstractSelector
+  	( as_rows, as_cols, table_io, getText, unAR
+	, selectionGroup, selectionButton, selectionDisplay
+	, choiceGroup, choiceButton, choiceDisplay
+	)
+import WASH.CGI.BaseCombinators
+	( io, once, forever, callWithCurrentHistory, ask, askOffline
+	, run, runWithOptions, runWithHook
+	, tell, htell, backLink, hlink
+	, docTranslator, lastTranslator
+	, makeServlet, makeServletWithHook
+	)
+import WASH.CGI.CGITypes
+	( FileReference(..), CGIOption(..), CGIOptions, URL(..)
+	)
+import WASH.CGI.CGIMonad (CGI)
+import WASH.CGI.CGIInternals 
+	( makeRef, makeA, makePopupRef, popuplink
+	, InputField, VALID, INVALID
+	, makeForm, makeImg, Image, internalImage, externalImage
+	, HTMLField, resetField, activeInputField
+	, inputField, textInputField, checkedTextInputField, passwordInputField
+	, checkboxInputField, fileInputField, checkedFileInputField, imageField
+	, RadioGroup, radioGroup, radioButton, radioError, makeButton
+	, makeTextarea
+	, selectMultiple, selectSingle, selectBounded
+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE
+	, restart
+	, concatFields, concatFieldsWith
+	, standardQuery
+	)
+import WASH.CGI.Submit98 
+	( value, InputHandle, HasValue
+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)
+	, FL (FL), FA (FA)
+	, submit, submit0, defaultSubmit, DTree, submitx, dtleaf, dtnode
+	, submitLink, submitLink0, defaultSubmitLink
+	, activate
+	)
+import WASH.CGI.CGIOutput
+	( CGIOutput
+	)
+import WASH.CGI.CGITypes
+	( Status(..), Location(..), FreeForm(..)
+	)
+import WASH.CGI.Fields
+import WASH.CGI.Style 
+import WASH.CGI.HTMLWrapper
+  hiding (input, form, select, option, textarea, 
+          cssHeader, cssPage, html, htmlHeader, standardPage)
+import qualified WASH.CGI.HTMLWrapper as H
+
+import WASH.CGI.Frames 
+  (FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage)
diff --git a/WASH/CGI/CGIConfig.hs b/WASH/CGI/CGIConfig.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGIConfig.hs
@@ -0,0 +1,33 @@
+-- © 2002 Peter Thiemann
+module WASH.CGI.CGIConfig where
+
+import System.IO.Unsafe
+import System
+
+tmpDir, varDir, imageDir, emailTmpDir, frameDir, persistentDir, persistent2Dir, registryDir, keyFile, pbmPath, catProgram, sendmailProgram :: String
+
+-- |global root for WASH data
+globalRoot :: String
+globalRoot =
+  unsafePerformIO (catch (getEnv "HOME") (\ ioe -> return ""))
+
+-- temporary storage
+tmpDir = globalRoot ++ "/tmp/"
+-- persistent, mutable storage
+varDir = globalRoot ++ "/tmp/"
+
+imageDir 	= tmpDir ++ "Images/"
+emailTmpDir 	= tmpDir
+frameDir	= tmpDir ++ "Frames/"
+persistentDir 	= varDir ++ "Persistent/"
+persistent2Dir 	= varDir ++ "Persistent2/"
+transactionDir  = varDir ++ "Transactions/"
+registryDir	= tmpDir ++ "REGISTRY/"
+keyFile		= varDir ++ "KEYFILE"
+
+-- path to PBMplus programs
+pbmPath		= "/usr/X11R6/bin/"
+-- path of cat program
+catProgram	= "/bin/cat"
+-- path of sendmail program
+sendmailProgram	= "/usr/sbin/sendmail"
diff --git a/WASH/CGI/CGIGraphics.hs b/WASH/CGI/CGIGraphics.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGIGraphics.hs
@@ -0,0 +1,194 @@
+-- © 2001 Peter Thiemann
+module WASH.CGI.CGIGraphics 
+  (activeImage
+  ,newImage
+  ,drawOval, fillOval
+  ,drawRectangle, fillRectangle
+  ,drawLine, drawPoint
+  ,makeText
+  ,gifImage, xwdImage, xpmImage, bmpImage
+  ,activateImage, activateXY, activateColor
+  ,overlay
+  ,storeDirectory
+  ,Pixel, CGIImage, ActionFun) 
+  where
+
+import Maybe
+import Monad
+import System
+
+import WASH.Utility.Hex
+import qualified WASH.CGI.RawCGIInternal as RawCGI
+import WASH.CGI.CGITypes as CGITypes
+import WASH.CGI.BaseCombinators (unsafe_io)
+import WASH.CGI.CGIMonad hiding (lift)
+import WASH.CGI.PPM
+import WASH.HTML.HTMLMonad hiding (head, div, span, map)
+import WASH.Utility.Unique
+
+import WASH.CGI.CGIConfig
+
+storeDirectory = imageDir
+
+ppmtogif = pbmPath ++ "ppmtogif "
+pbmtext  = pbmPath ++ "pbmtext "
+pnmcrop  = pbmPath ++ "pnmcrop "
+pbmtopgm = pbmPath ++ "pbmtopgm 1 1 "
+pgmtoppm = pbmPath ++ "pgmtoppm "
+
+
+type CGIImage  = IO CGIImage'
+type ActionFun = Int -> Int -> Maybe (CGI ())
+data CGIImage' = 
+     CGIImage'{	pixmap    :: Pixmap
+              , actionFun :: ActionFun
+	      }
+
+
+activeImage :: CGIImage -> WithHTML x CGI ()
+activeImage img =
+  do fieldName <- liftM show $ lift nextName
+     (url, actFun) <- lift (flushImage img)
+     input (attr "type" "image" ##
+            attr "name" fieldName ##
+	    attr "src" (unURL url))
+     info <- lift getInfo
+     let maybeSetAction = 
+	    do bds <- bindings info
+	       x <- RawCGI.assocParm (fieldName ++ ".x") bds
+	       y <- RawCGI.assocParm (fieldName ++ ".y") bds
+	       act <- actFun (read x) (read y)
+	       return (lift $ setAction (const act))
+     fromMaybe (return ()) maybeSetAction
+
+-- internal
+flushImage :: CGIImage -> CGI (CGITypes.URL, ActionFun)
+flushImage img = 
+  do cgi_image <- unsafe_io img
+     pageInfo <- getInfo
+     baseUrl <- getUrl
+     case bindings pageInfo of
+       Nothing ->
+	 unsafe_io $ do
+	   key <- inventStdKey
+           let path = storeDirectory ++ key
+	       ppmPath = path ++ ".ppm"
+	       gifPath = path ++ ".gif"
+           writeFile ppmPath (show $ pixmap cgi_image)
+           system (ppmtogif ++ ppmPath ++ " > " ++ gifPath)
+           return (URL (baseUrl ++ '?' : key ++ ".gif"), actionFun cgi_image)
+       Just _ ->
+	 return (URL "", actionFun cgi_image)
+
+newImage :: (Int, Int) -> Pixel -> CGIImage
+newImage (w, h) bg =
+  return $ CGIImage' 
+  	{ pixmap = create w h 8 bg
+	, actionFun = const (const Nothing)
+	}
+
+makeOval :: Bool -> CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage
+drawOval :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage
+fillOval :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage
+drawOval = makeOval False
+fillOval = makeOval True
+makeOval fill img ul lr p =
+  do cgi_image <- img
+     return $ cgi_image { pixmap = oval (pixmap cgi_image) ul lr p fill }
+
+makeRectangle :: Bool -> CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage
+drawRectangle :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage
+fillRectangle :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage
+drawRectangle = makeRectangle False
+fillRectangle = makeRectangle True
+makeRectangle fill img ul lr p =
+  do cgi_image <- img
+     return $ cgi_image { pixmap = rectangle (pixmap cgi_image) ul lr p fill }
+
+drawLine :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage
+drawLine img ul lr p =
+  do cgi_image <- img
+     return $ cgi_image { pixmap = line (pixmap cgi_image) ul lr p }
+
+drawPoint :: CGIImage -> (Int, Int) -> Pixel -> CGIImage
+drawPoint img xy p =
+  do cgi_image <- img
+     return $ cgi_image { pixmap = point (pixmap cgi_image) xy p }
+
+makeText :: String -> Pixel -> CGIImage
+makeText str fg =
+  do key <- inventStdKey
+     let path = storeDirectory ++ key
+	 ppmPath = path ++ ".ppm"
+	 gifPath = path ++ ".gif"
+     system (pbmtext ++ "'" ++ str ++ "' | "
+          ++ pnmcrop ++ "| "
+	  ++ pbmtopgm ++ "| "
+	  ++ pgmtoppm ++ rgb fg ++ "-black > " ++ ppmPath)
+     pixmapStr <- readFile ppmPath
+     return $ CGIImage'
+        { pixmap = read pixmapStr
+	, actionFun = const (const Nothing)
+	}
+
+rgb (r, g, b) =
+  "rgb:" ++ showHex2 r ++ '/' : showHex2 g ++ '/' : showHex2 b
+
+gifImage, xwdImage, xpmImage, bmpImage :: String -> CGIImage
+gifImage gifPath =
+  anyImage "gif" gifPath
+xwdImage xwdPath =
+  anyImage "xwd" xwdPath
+xpmImage xpmPath =
+  anyImage "xpm" xpmPath
+bmpImage bmpPath =
+  anyImage "bmp" bmpPath
+
+-- internal
+anyImage :: String -> String -> CGIImage
+anyImage format anyPath =
+  do key <- inventStdKey
+     let path = storeDirectory ++ key
+	 ppmPath = path ++ ".ppm"
+     system (pbmPath ++ format ++ "toppm " ++ anyPath ++ " > " ++ ppmPath)
+     pixmapStr <- readFile ppmPath
+     return $ CGIImage'
+     	{ pixmap = read pixmapStr
+	, actionFun = const (const Nothing)
+	}
+
+activateImage :: CGIImage -> CGI () -> CGIImage
+activateImage img act =
+  activateXY img (const (const (Just act)))
+
+activateXY :: CGIImage -> ActionFun -> CGIImage
+activateXY img actFun =
+  do cgi_image <- img
+     return $ cgi_image { actionFun = actFun }
+
+activateColor :: CGIImage -> Pixel -> CGI () -> CGIImage
+activateColor img p act =
+  do cgi_image <- img
+     let fun x y = if pixelAt (pixmap cgi_image) x y == p 
+	 	   then Just act
+		   else actionFun cgi_image x y
+     return $ cgi_image { actionFun = fun }
+
+overlay :: CGIImage -> CGIImage -> (Int, Int) -> Pixel -> CGIImage
+overlay img1 img2 (xul, yul) p =
+  do cgi1 <- img1
+     cgi2 <- img2
+     return $ 
+       cgi1 { pixmap = comp (pixmap cgi1) (pixmap cgi2) (xul, yul) p
+       	    , actionFun = fun cgi1 cgi2
+	    }
+  where fun cgi1 cgi2 x1 y1 = 
+	  let x2 = x1 - xul
+	      y2 = y1 - yul
+	      w2 = width $ pixmap cgi2
+	      h2 = height $ pixmap cgi2
+	      maybeAction2 = actionFun cgi2 x2 y2
+	      maybeAction1 = actionFun cgi1 x1 y1
+	  in  if x2 >= 0 && y2 >= 0 && x2 < w2 && y2 < w2 && isJust maybeAction2 
+	      then maybeAction2
+	      else maybeAction1
diff --git a/WASH/CGI/CGIHistory.hs b/WASH/CGI/CGIHistory.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGIHistory.hs
@@ -0,0 +1,104 @@
+module WASH.CGI.CGIHistory where
+
+import System.IO.Unsafe (unsafePerformIO)
+
+import IO
+import Maybe
+import Monad
+import Control.Concurrent
+import Control.Concurrent.MVar
+import qualified Data.Map as Map
+-- 
+import WASH.Utility.SHA1
+import WASH.CGI.RawCGITypes
+import WASH.CGI.CGIMonad
+import WASH.CGI.LogEntry
+
+-- | standard value for timeout of interaction threads: one hundred seconds
+historyTimeout :: Int
+historyTimeout = 100000000
+
+-- | comprises the name of the application and a hash value.
+type StateID = (String, String)
+
+{-# NOINLINE history #-}
+history :: MVar (Map.Map StateID TableEntry)
+history = unsafePerformIO $ newMVar Map.empty
+
+data TableEntry =
+    TableEntry 
+      { myID :: StateID		    		    -- ^ script name and hash key
+      , parentID :: Maybe StateID		    -- ^ root has no parent
+      , nextparm :: PARAMETER
+      , timeout :: Int				    -- ^ timeout for this stage of interaction
+      , threads :: MVar [MVar (CGIParameters, Handle)]-- ^ next round of parameters and output handle
+      }
+
+-- | Takes the id of the current node, the id of the father node (if any), the
+-- current parameter, and (perhaps) a timeout value for the current interaction
+-- and enters a corresponding record into the history table.
+createEntry :: StateID -> Maybe StateID -> PARAMETER -> Maybe Int -> IO ()
+createEntry myID parentID nextparm mTimeout = do
+  -- putStrLn ("createEntry "++ show myID ++ " "++ show parentID ++ " " ++ show nextparm)
+  threadsvar <- newMVar []
+  let protoEntry = TableEntry { myID = myID
+			      , parentID = parentID
+			      , nextparm = nextparm
+			      , timeout = fromMaybe historyTimeout mTimeout
+			      , threads = threadsvar
+			      }
+  modifyMVar_ history (return . Map.insertWith (\ new old -> old) myID protoEntry)
+  -- putStrLn ("createEntry finished")
+
+-- | Suspends the current thread by waiting on an entry with the current node's
+-- id. Returns the parameters passed to this node.
+readParameters :: StateID -> IO (CGIParameters, Handle)
+readParameters stateID = do
+  -- putStrLn ("readParameters "++ show stateID)
+  (myVar, myTimeout) <- modifyMVar history update
+  myID <- myThreadId
+  killerID <- forkIO (killmeOnTimeout myID myVar myTimeout)
+  ch <- takeMVar myVar			    -- suspend until notify puts s.t.
+  killThread killerID
+  -- putStrLn ("readParameters "++ show stateID ++ " returns " ++ show ch)
+  return ch
+  where
+    update t = do 
+      let Just entry = Map.lookup stateID t
+      myVar <- newEmptyMVar
+      modifyMVar_ (threads entry) (\ ms -> return (myVar : ms))
+      return (t, (myVar, timeout entry))
+    remove v t = do
+      let Just entry = Map.lookup stateID t
+      modifyMVar (threads entry) (\ ms -> return (filter (/= v) ms, v `elem` ms))
+    killmeOnTimeout tid var timeout = do
+      threadDelay timeout
+      wasPresent <- withMVar history (remove var)
+      when wasPresent (killThread tid)
+      -- putStrLn ("killmeOnTimeout: had to kill = "++show wasPresent)
+      -- otherwise thread tid is on its way to kill me
+
+-- | Attempts to pass parameters and a handle to a thread waiting for the given
+-- stateID. Returns True if successful and False if no such thread was found.
+notify :: StateID -> CGIParameters -> Handle -> IO Bool
+notify stateID parms hout = do
+  -- putStrLn ("notify "++ show stateID ++ " "++ show parms ++ " " ++ show hout)
+  b <- withMVar history update
+  -- putStrLn ("notify returns "++ show b)
+  return b
+  where
+    update t = 
+      case Map.lookup stateID t of
+	Just entry ->
+	  do maybeVar <- modifyMVar (threads entry) (return . uncons)
+	     case maybeVar of
+	       Just myVar -> do
+		 putMVar myVar (parms, hout)
+		 return True
+	       Nothing ->
+		 return False
+	Nothing ->		   -- may happen after server restart
+	  return False
+
+uncons (x : xs) = (xs, Just x)
+uncons []       = ([], Nothing)
diff --git a/WASH/CGI/CGIInternals.hs b/WASH/CGI/CGIInternals.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGIInternals.hs
@@ -0,0 +1,882 @@
+-- © 2001-2005 Peter Thiemann
+module WASH.CGI.CGIInternals (module WASH.CGI.CGIInternals, getPathInfo)
+{-- interface
+  (ask		-- WithHTML x CGI a -> CGI ()
+  ,tell		-- CGIOutput a => a -> CGI ()
+  ,htell 	-- WithHTML x IO () -> CGI ()
+  ,run		-- CGI () -> IO ()
+  ,runWithHook 	-- ([String] -> CGI ()) -> CGI () -> IO ()
+  )
+--}
+where
+
+import Prelude hiding (head,div,span)
+import qualified Prelude
+import qualified List
+import Maybe
+import Monad
+import System
+import IO
+
+import WASH.Utility.Auxiliary
+import qualified WASH.Utility.Base64 as Base64
+import WASH.CGI.BaseCombinators
+import WASH.CGI.CookieIO
+import WASH.CGI.CGIMonad
+import WASH.CGI.CGIOutput
+import WASH.CGI.CGITypes
+import WASH.CGI.EventHandlers
+import WASH.CGI.Fields
+import WASH.CGI.Frames
+import WASH.CGI.CGIHistory
+import qualified WASH.CGI.HTMLWrapper as H hiding (map)
+import WASH.CGI.Images
+import WASH.Utility.JavaScript
+import qualified WASH.Utility.RFC2279 as RFC2279
+import qualified WASH.Utility.RFC2397 as RFC2397
+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..), getSessionMode)
+import qualified WASH.Utility.URLCoding as URLCoding
+
+import WASH.CGI.CGIConfig
+
+-- ======================================================================
+-- internal references
+
+-- |Create a hyperlink to internal entity.
+makeRef :: (CGIMonad cgi, Monad m)
+	=> String		-- ^internal name of entity
+	-> H.WithHTML x m ()	-- ^body of the reference
+	-> cgi (H.WithHTML y m ())
+makeRef fileName elems =
+  wrapCGI (\cgistate ->
+  let fileURL = url cgistate ++ '?' : fileName in
+  return (hlink (URL fileURL) elems, cgistate))
+
+-- |Create a popup hyperlink to internal entity.
+makePopupRef :: (CGIMonad cgi) =>
+           String		-- ^name of popup window
+	-> String		-- ^internal name of entity
+	-> H.HTMLCons x y cgi ()
+makePopupRef name fileName elems =
+  do baseUrl <- H.lift getUrl
+     let fileURL = baseUrl ++ '?' : fileName
+     popuplink name (URL fileURL) elems
+
+-- |Create hyperlink to internal entity @\/path?name@.
+makeA :: (CGIMonad cgi) => String -> String -> HTMLField cgi x y ()
+makeA path name elems =
+  do url <- H.lift getUrl
+     let querystring = if null name then "" else '?' : name
+	 pathstring = if null path then "" else '/' : path
+	 fullurl = url ++ pathstring ++ querystring
+     hlink (URL fullurl) elems
+
+-- ======================================================================
+-- input fields & forms
+-- 
+data VALID = VALID
+data INVALID = INVALID
+
+data InputField a x = 
+     InputField { ifName :: String
+		, ifToken :: CGIFieldName  
+     		, ifFty :: String
+		, ifString :: Maybe String
+		, ifValue :: Maybe a
+		, ifRaw :: CGIParameters
+		, ifBound :: Bool	    -- True if form submitted
+		}
+
+-- |create a virtual input field from the concatenation of two input fields
+concatFields :: (Reason c, Read c)
+	     => InputField c INVALID -> InputField Text INVALID
+  	     -> InputField c INVALID
+concatFields ifa ifb = 
+  concatFieldsWith g ifa [ifb]
+  where g sa [sb] = sa ++ sb
+
+-- |Create a virtual input field from the result of applying a function to two
+-- input fields. Parsing is applied to the result of the function call.
+concatFieldsWith :: (Reason c, Read c) 
+		 => (String -> [String] -> String)
+		 -> InputField c INVALID 
+		 -> [InputField Text INVALID]
+                 -> InputField c INVALID
+concatFieldsWith trans ifa ifbs =
+  let newString = do stra <- ifString ifa
+		     strbs <- mapM ifString ifbs
+		     return (trans stra strbs)
+      newValue  = do s <- newString
+		     maybeRead s
+  in 
+  InputField { ifName = ifName ifa	-- ++ '|' : ifName ifb
+	     , ifToken = ifToken ifa
+	     , ifFty = ifFty ifa
+	     , ifString = newString
+	     , ifValue = newValue
+	     , ifRaw = ifRaw ifa
+	     , ifBound = ifBound ifa && all ifBound ifbs
+	     }
+
+-- |Combine the values of separately parsed fields
+combineFieldsWith2 f2 if1 if2 =
+  InputField { ifName = ifName if1	-- ++ '|' : ifName if2
+	     , ifToken = ifToken if1
+	     , ifFty = ifFty if1
+	     , ifString = Nothing
+	     , ifValue = liftM2 f2 (ifValue if1) (ifValue if2)
+	     , ifRaw = ifRaw if1
+	     , ifBound = ifBound if1 && ifBound if2
+	     }
+
+-- transition code
+name = ifName
+string = ifString
+valueInputField inf =
+  case ifValue inf of
+    Nothing -> error ("InputField { " ++
+		      "ifName = " ++ show (ifName inf) ++ ", " ++
+		      "ifString = " ++ show (ifString inf) ++ ", " ++
+		      "ifBound = " ++ show (ifBound inf) ++
+		      " }")
+    Just vl -> vl
+-- raw = ifRaw
+-- transition code end
+
+feither :: (a -> b) -> (c -> d) -> Either a c -> Either b d
+feither f g (Left a) = Left (f a)
+feither f g (Right b) = Right (g b)
+
+-- to expose less of the implementation, the following type could be 
+-- propagate :: MonadPlus err => Either (err x) a -> .. Either (err x) (a, b)
+propagate :: Either [err] a -> Either [err] b -> Either [err] (a,b)
+propagate (Right a) (Right b) = Right (a, b)
+propagate (Right a) (Left bss) = Left bss
+propagate (Left ass) (Right b) = Left ass
+propagate (Left ass) (Left bss) = Left (mplus ass bss)
+
+data ValidationError =
+     ValidationError { veName :: String			    -- name of erroneous field
+		     , veToken :: CGIFieldName		    -- token of erroneous field
+		     , veString :: Maybe String		    -- value of erroneous field
+		     }
+
+validateInputField inf =
+    case ifValue inf of 
+      Nothing | ifBound inf -> 
+        Left [ValidationError (ifName inf) (ifToken inf) (ifString inf)]
+      _ ->
+        Right InputField{ ifName = ifName inf
+			, ifToken = ifToken inf
+			, ifFty  = ifFty inf
+			, ifString = ifString inf
+			, ifValue = ifValue inf
+			, ifRaw = ifRaw inf
+			, ifBound = ifBound inf
+			}
+
+-- internal
+data InputType = TEXT | PASSWORD | CHECKBOX |
+    RADIO | SUBMIT | RESET |
+    FILE | HIDDEN | IMAGE | BUTTON
+    deriving (Eq)
+
+instance Show InputType where
+  show TEXT = "text"
+  show PASSWORD = "password"
+  show CHECKBOX = "checkbox"
+  show RADIO = "radio"
+  show SUBMIT = "submit"
+  show RESET = "reset"
+  show FILE = "file"
+  show HIDDEN = "hidden"
+  show IMAGE = "image"
+  show BUTTON = "button"
+
+textual :: InputType -> Bool
+textual TEXT = True
+textual PASSWORD = True
+textual FILE = True
+textual _ = False
+
+-- |Every input widget maps the content generator for the widget (which may
+-- produce HTML elements or attributes) to the content generator of the widget. 
+type HTMLField cgi x y a = H.WithHTML x cgi () -> H.WithHTML y cgi a
+
+-- |Creates a reset button that clears all fields of a form.
+resetField :: (CGIMonad cgi) => HTMLField cgi x y (InputField () INVALID)
+resetField = 
+  genericField RESET (const (Just ()))
+
+-- |Creates a submit button. Unsafe. Internal use only.
+submitField :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()
+submitField action =
+  internalSubmitField False (Right action)
+
+defaultSubmitField :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()
+defaultSubmitField action =
+  internalSubmitField True (Right action)
+
+internalSubmitField isDefault what attrs =
+  do sf <- genericField SUBMIT (const (Just ())) attrs
+     attachAction (ifName sf) isDefault what
+
+attachAction fname isDefault what =
+  do pageInfo <- H.lift getInfo
+     let mbnds = bindings pageInfo
+	 localAction = 
+	   case what of
+	     Right action ->
+	       let act = resetFrame >> action in
+	       do H.lift (setAction (const act))
+		  H.lift (registerAction fname (const act))
+	     Left sts ->
+	       let names = map veName sts
+		   values = map (fromMaybe "" . veString) sts
+	       in
+	       do H.lift (setAction tell)			    -- CHANGE THIS
+		  H.lift (registerAction fname tell)
+		  H.lift (setFaulty $ zip names values)
+{-- 
+     lift (unsafe_io (do appendFile "/tmp/CGIMBNDS" ("\nlooking for "++name sf++"\n")
+			 appendFile "/tmp/CGIMBNDS" (show mbnds)))
+--}
+     case mbnds of
+       Nothing ->
+	 return ()
+       Just bnds ->
+	 case assocParm fname bnds of
+	   Just _ ->
+	     localAction
+	   Nothing ->
+	     case assocParm subVar bnds of
+	       Just submitter |
+		 submitter == fname || submitter == "" && isDefault 
+		 -> localAction
+	       _ -> return ()
+	 
+-- |Creates an input field that submits the field to the browser when data is
+-- entered into this field. 
+activeInputField :: (CGIMonad cgi, Reason a, Read a)
+	=> (a -> cgi ())	-- ^Function that maps input data to a CGI action.
+	-> HTMLField cgi x y ()
+activeInputField actionFun attrs =
+  activateI actionFun inputField attrs
+
+-- |Attach a CGI action to the value returned by the input field. Activation
+-- means that data is submitted as soon as it is entered.
+activateI :: (CGIMonad cgi) =>
+  (a -> cgi ()) -> HTMLField cgi x y (InputField a INVALID) -> HTMLField cgi x y ()
+activateI actionFun inputField attrs =
+  do js_enabled <- H.lift getJSEnabled
+     let use_js = maybe True id js_enabled
+     invalid_inf <- inputField (do attrs
+				   when use_js $ onChange $ "WASHSubmit(this.name);")
+     let r = validateInputField invalid_inf
+	 rv = either Left (Right . valueInputField) r
+     when (ifBound invalid_inf) $
+       activateInternal actionFun (ifName invalid_inf) rv
+
+activateInternal actionFun name what =
+  case what of
+    Right val -> 
+      let act = resetFrame >> actionFun val in
+      do H.lift (setAction (const act))
+	 H.lift (registerAction name (const act))
+    Left sts ->
+      let names = map veName sts
+	  values = map (fromMaybe "" . veString) sts
+      in
+      do H.lift (setAction tell)			    -- CHANGE THIS
+	 H.lift (setFaulty $ zip names values)
+	 H.lift (registerAction name tell)
+
+-- |Create a textual input field. Return type can be *anything* in class 'Reason'
+-- and 'Read'.
+inputField :: (CGIMonad cgi, Reason a, Read a) => HTMLField cgi x y (InputField a INVALID)
+inputField = 
+  genericField TEXT (maybeRead . fromMaybe "")
+
+maybeRead :: Read a => String -> Maybe a
+maybeRead s = g (reads s)
+  where g ((a,""):_) = Just a
+	g _ = Nothing
+
+-- |Create a textual input field that returns the string entered. (Avoids having
+-- to put quotes around a string.)
+textInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField String INVALID)
+textInputField =
+  genericField TEXT id
+
+-- |Creates a textual input field that takes a custom validation function.
+checkedTextInputField :: (CGIMonad cgi) => (Maybe String -> Maybe String)
+			 -> HTMLField cgi x y (InputField String INVALID)
+checkedTextInputField g attrs =
+  genericField TEXT g attrs
+
+-- |Like 'inputField' but the characters are not echoed on the screen.
+passwordInputField :: (CGIMonad cgi, Reason a, Read a) => HTMLField cgi x y (InputField a INVALID)
+passwordInputField =
+  genericField PASSWORD (maybeRead . fromMaybe "")
+
+-- |Creates a checkbox. Returns 'True' if box was checked.
+checkboxInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField Bool INVALID)
+checkboxInputField =
+  genericField CHECKBOX g
+  where g Nothing = Just False
+	g (Just _) = Just True
+
+-- |Creates a file input field. Returns a temporary 'FileReference'. The
+-- 'fileReferenceName' of the result is *not* guaranteed to be persistent. The
+-- application is responsible for filing it away at a safe place.
+fileInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField FileReference INVALID)
+fileInputField attrs =
+  H.lift (setEnctype "multipart/form-data") >>
+  genericField FILE (maybeRead . fromMaybe "") attrs
+
+-- |Creates a file input field. Like 'fileInputField' but has an additional
+-- parameter for additional validation of the input.
+checkedFileInputField :: (CGIMonad cgi) => (Maybe FileReference -> Maybe FileReference) 
+			  -> HTMLField cgi x y (InputField FileReference INVALID)
+checkedFileInputField filter attrs =
+  H.lift (setEnctype "multipart/form-data") >>
+  genericField FILE (filter . maybeRead . fromMaybe "") attrs
+
+instance Reason FileReference where
+  reason _ = "FileReference"
+
+genericField :: (Reason a, CGIMonad cgi) => InputType -> (Maybe String -> Maybe a) -> HTMLField cgi x y (InputField a INVALID)
+genericField inputType decode fieldAttrs =
+  let isSUBMIT = inputType == SUBMIT 
+      isFILE   = inputType == FILE
+  in
+  do fieldName'' <- H.lift nextName
+     let fieldName' = show fieldName''
+	 fieldName | isSUBMIT = 's' : tail fieldName' 
+	 	   | otherwise = fieldName'
+	 fieldType = show inputType
+	 isTextual = textual inputType
+     info <- H.lift getInfo
+     js_enabled <- H.lift getJSEnabled
+     let use_js = maybe True id js_enabled
+     (explanation, result) <-
+       H.input_T
+	     (do H.attr_SS "type" fieldType
+		 H.attr_SD "name" fieldName
+		 fieldAttrs
+		 -- unless isTextual $ H.attr_SD "name" fieldName
+		 when (use_js && isSUBMIT) $
+		   onClick ("this.form."++subVar++".value=this.name; return true")
+		 attrs <- H.get_attrs
+		 let [nameAttr] = [ H.attr_value a 
+				  | a <- attrs, H.attr_name a == "name" 
+				  ]
+		     bds = bindings info
+		     maybestring = bds >>= assocParm nameAttr
+		     rawvalues = maybeToList bds >>= assocParmR nameAttr
+		     mdecoded = decode maybestring
+		     decoded = fromJust mdecoded
+		     isBound = isJust bds
+		     theReason = reason decoded
+		     advice = "Enter " ++ prependArticle theReason
+		     explanation = theReason ++ " expected"
+		 -- H.attr_SD "washtype" (washtype decoded)
+		 when (use_js && isTextual) $ do
+		   onMouseOver ("self.status=" ++ jsShow advice ++ "; return true")
+		   onMouseOut  ("self.status=''; return true")
+		 unless (isFILE || isSUBMIT) $ case maybestring of 
+	           Nothing -> H.empty
+		   Just str -> H.attr_SD "value" str
+		 H.attr_SS "title" explanation
+		 return (explanation,
+		   InputField { ifName = nameAttr
+			      , ifToken = fieldName''
+     		  	      , ifFty = fieldType
+			      , ifString = maybestring
+			      , ifValue = mdecoded
+			      , ifRaw = rawvalues
+			      , ifBound = isBound
+			      }))
+     H.lift $ addField (ifName result) isTextual
+--     {- obsoleted by working css stuff -}
+--     when isTextual $ do
+--       nothingI <- internalImage nothing explanation
+--       makeImg nothingI 
+--         (do H.attr_SS "align" "center"
+--	     H.attr_SD "name" ('i' : ifName result))
+     return result
+
+-- |generates a hyperlink that submits the current form.
+internalSubmitLink :: (CGIMonad cgi) =>
+  Bool -> Either [ValidationError] (cgi ()) -> H.HTMLCons x y cgi ()
+internalSubmitLink isDefault what subs =
+  do fieldToken <- H.lift nextName
+     let fieldName = show fieldToken
+	 atv = "javascript:" ++ "WASHSubmit('"++fieldName++"'); void 0;"
+     H.a_T (H.attr_SS "href" atv >> subs)
+     attachAction fieldName isDefault what
+
+-- |Create an input field from an image. Returns (x,y)
+-- position clicked in the image.
+imageField :: (CGIMonad cgi) => Image -> HTMLField cgi x y (InputField (Int, Int) INVALID)
+imageField image fieldAttrs =
+  do fieldToken <- H.lift nextName
+     let fieldName = show fieldToken
+     H.input_T (do H.attr_SS "type" "image"
+		   H.attr_SD "name" fieldName
+		   H.attr_SD "src" (unURL $ imageSRC image)
+		   fieldAttrs)
+     H.lift $ addField fieldName False
+     info <- H.lift getInfo
+     return $
+       let maybe_xy = 
+	    do bds <- bindings info
+	       x <- assocParm (fieldName ++ ".x") bds
+	       y <- assocParm (fieldName ++ ".y") bds
+	       return (x, y)
+       in
+       InputField { ifName = fieldName
+		  , ifToken = fieldToken
+       		  , ifFty = "image"
+		  , ifString = do (x, y) <- maybe_xy
+				  return ("(" ++ x ++ "," ++ y ++ ")")
+		  , ifValue  = do (x, y) <- maybe_xy
+				  return (read x, read y)
+     		  , ifRaw = []
+		  , ifBound = isJust (bindings info)
+		  }
+
+-- a virtual field that never appears on the screen
+data RadioGroup a x =
+     RadioGroup { radioName   :: String
+		, radioToken  :: CGIFieldName
+                , radioString :: Maybe String
+		, radioValue  :: Maybe a
+		, radioBound  :: Bool
+		}
+
+validateRadioGroup rg =
+  case radioValue rg of 
+    Nothing | radioBound rg -> 
+      Left [ValidationError (radioName rg) (radioToken rg) (radioString rg)]
+    _ ->
+      Right RadioGroup  { radioName = radioName rg
+			, radioToken = radioToken rg
+			, radioString = radioString rg
+			, radioValue = radioValue rg
+			, radioBound = radioBound rg
+			}
+
+valueRadioGroup rg =
+  case radioValue rg of
+    Nothing -> error ("RadioGroup { " ++
+		      "radioName = " ++ show (radioName rg) ++ ", " ++
+		      "radioString = " ++ show (radioString rg) ++ ", " ++
+		      "radioBound = " ++ show (radioBound rg) ++
+		      " }")
+    Just vl -> vl
+
+-- |Create a handle for a new radio group. /This handle is invisible on the screen!/
+radioGroup :: (CGIMonad cgi, Read a) => H.WithHTML x cgi (RadioGroup a INVALID)
+radioGroup =
+  do token <- H.lift nextName
+     let fieldName = show token
+     info <- H.lift getInfo
+     H.lift $ addField fieldName False
+     let bds = bindings info
+	 maybeString = bds >>= assocParm fieldName
+	 maybeVal = maybeString >>= (g . reads . URLCoding.decode)
+	 g ((a,""):_) = Just a
+	 g _ = Nothing
+     return $
+       RadioGroup { radioName = fieldName
+		  , radioToken = token
+		  , radioString = maybeString
+		  , radioValue = maybeVal
+		  , radioBound = isJust bds
+		  }
+
+-- |Create a new radio button and attach it to an existing 'RadioGroup'.
+radioButton :: (Show a, Monad cgi) => RadioGroup a INVALID -> a -> HTMLField cgi x y ()
+radioButton rg val fieldAttrs =
+  H.input_T (do H.attr_SS "type" "radio"
+		H.attr_SD "name" (radioName rg)
+		H.attr_SD "value" (URLCoding.encode (show val)) 
+		fieldAttrs)
+
+-- |Create and place the error indicator for an existing 'RadioGroup'. Becomes
+-- visible only if no button of a radio group is pressed.
+radioError :: (CGIMonad cgi) => RadioGroup a INVALID -> H.WithHTML x cgi ()
+radioError rg = 
+  let name = radioName rg in
+  do im <- internalImage nothing "Select exactly one button"
+     makeImg im (H.attr "align" "center" >> H.attr "name" ('i' : name))
+
+-- buttons
+
+-- |Create a single button.
+makeButton :: (CGIMonad cgi) => HTMLField cgi x y (InputField Bool INVALID)
+makeButton fieldAttrs =
+  let fieldType = "button" in
+  do fieldToken <- H.lift nextName
+     let fieldName = show fieldToken
+     H.input_T (do H.attr_SS "type" fieldType
+		   H.attr_SD "name" fieldName 
+		   fieldAttrs)
+     H.lift $ addField fieldName False
+     info <- H.lift getInfo
+     let bds = bindings info
+	 maybeString = bds >>= assocParm fieldName
+	 maybeVal = 
+	   case bds of
+	     Nothing -> Nothing
+	     Just parms ->
+	       case maybeString of
+	         Nothing -> Just False
+		 Just _  -> Just True
+     return $
+       InputField { ifName = fieldName
+		  , ifToken = fieldToken
+     		  , ifFty = fieldType
+		  , ifString = maybeString
+		  , ifValue = maybeVal
+		  , ifRaw = []
+		  , ifBound = isJust bds
+		  }
+
+-- form
+-- multiple arguments formed according to CGI 1.1 rev 3 spec
+-- http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html#5.0
+
+constructQuery url [] =
+  url
+constructQuery url args =
+  url ++ '?' : concat (List.intersperse "+" (map URLCoding.encode args))
+
+-- |Wraps an HTML form around its arguments. All standard attributes are
+-- computed and need not be supplied explicitly.
+makeForm :: (CGIMonad cgi) => H.WithHTML x cgi a -> H.WithHTML y cgi ()
+makeForm attrs_elems = 
+  makeFormWithErrorMark
+    -- ["style.backgroundColor='red'", "style.borderColor='black'"]
+    ["className='faultyinput'"]
+    attrs_elems
+
+makeFormWithErrorMark errorMarks attrs_elems = do
+  url <- H.lift getUrl
+  args <- H.lift getCGIArgs
+  js_enabled <- H.lift getJSEnabled
+  let use_js = maybe True id js_enabled
+  when use_js $ H.script_S 
+    (do H.attr_SS "type" "text/javascript"
+	H.comment $
+	      "\n" ++
+	      "var SubmitAction=[];" ++ 
+	      "function OnSubmit(){" ++
+	      "var r=true;" ++
+	      "for(var i=0;i<SubmitAction.length;i++){r=r&&SubmitAction[i]();};" ++ 
+	      "return r;};"++
+	      "function WASHSubmit(fn){" ++
+	      "var ff = document.forms[0];" ++
+	      "ff."++subVar++".value=fn;" ++
+	      "ff.submit();" ++
+	      "}" ++
+	      "\n// "
+	     )
+  jsprog <- H.form_T $
+    do H.attr_SD "action" (constructQuery url args)
+       H.attr_SS "method" "post"
+       when use_js $ onSubmit ("return OnSubmit();")
+       attrs_elems
+       H.attr_SS "target" "_self"		    -- ensure target attr is present
+       -- formname <- liftM show $ H.lift nextName
+       info <- H.lift getInfo
+       parm <- H.lift getParm
+       stid <- H.lift getStateID
+       sessionMode <- H.lift getSessionMode
+       encoder <- H.lift getEncoder
+       fields <- H.lift getFields
+       let ff = faultyfields info
+	   realparm | null ff   = parm
+                  | otherwise = tail parm
+	   enabledString =
+	     case js_enabled of
+	       Just True -> "True"
+	       _ -> "False"
+       H.input_S
+	 (do H.attr_SS "type" "hidden"
+	     H.attr_SS "name" "js_enabled"
+	     H.attr_SS "value" enabledString)
+       H.input_S
+	 (do H.attr_SS "type" "hidden"
+	     H.attr_SS "name" subVar
+	     H.attr_SS "value" "")
+       when (sessionNeedsLog sessionMode) $
+	 H.input_S 
+	 (do H.attr_SS "type" "hidden"
+	     H.attr_SS "name" "=CGI=parm="
+	     H.attr_SD "value"
+	       (Base64.encode' $ encoder $ RFC2279.encode $ show $ realparm))
+       when (sessionNeedsState sessionMode) $
+	 H.input_S 
+	 (do H.attr_SS "type" "hidden"
+	     H.attr_SS "name" "=CGI=stid="
+	     H.attr_SD "value" (Base64.encode' stid))
+       let 
+	   checkForJS =
+	     case js_enabled of
+	       Nothing ->
+		 "document.forms[0].js_enabled.value='True';"
+	       _ -> ""
+           iFields = [iname | (iname@('f':_), True) <- fields]
+	   questionURL = url ++ '?' : ffName question
+	   hilight =
+	    case iFields of
+	     [] -> []
+	     name':_ ->  ["document.forms[0]." ++ name' ++ ".focus();"
+	 		 ,"document.forms[0]." ++ name' ++ ".select();"]
+	   markAsFaulty (fname, fvalue) | fname `elem` iFields =
+	     "if(document.i" ++ fname ++ ")" ++
+	     "document.i" ++ fname ++ ".src = " ++ jsShow questionURL ++ ";" ++
+	     "else{" ++
+	     (let f mark = "document.forms[0]." ++ fname ++ "." ++ mark ++ ";" in
+	     List.concatMap f errorMarks) ++
+	     "}"
+	    | otherwise =
+	     "popupstr += " 
+	     ++ jsShow ("In a previous form, the field " ++ fname ++ 
+			" had an unparsable input value: " ++ fvalue ++ "\n")
+	     ++ ";"
+	   jsprog | null ff = hilight
+		| otherwise =
+	    "popupstr = '';"
+	    : map markAsFaulty ff
+	    ++ "if (popupstr != '') alert(popupstr + 'Please go back and reenter!');"
+	    : hilight
+       when (not (null ff)) $ H.comment_T ("Faultyfields: " ++ show ff)
+       -- H.attr_SD "name" formname
+       H.attr_SD "enctype" (enctype info)
+       return (checkForJS : jsprog)
+  when (use_js && not (null jsprog)) $
+      H.script_T
+	 (do H.attr_SS "type" "text/javascript"
+	     H.rawtext_S "<!-- "
+	     H.rawtext ('\n' : unlines jsprog)
+	     H.rawtext_S "// -->")
+
+-- textarea
+
+-- |Create a text area with a preset string.
+makeTextarea :: (CGIMonad cgi) => String -> HTMLField cgi x y (InputField String INVALID)
+makeTextarea fieldValue fieldAttrs =
+  do token <- H.lift nextName
+     info <- H.lift getInfo
+     let bds = bindings info
+	 mvalue = bds >>= assocParm name
+	 name = show token
+	 displayValue = fromMaybe fieldValue mvalue
+     H.textarea_T (do H.attr_SD "name" name
+		      H.text_S displayValue
+		      fieldAttrs)
+     return $
+       InputField { ifName = name
+		  , ifToken = token
+       		  , ifFty = "textarea"
+		  , ifString = mvalue
+		  , ifValue = mvalue
+		  , ifRaw = maybeToList bds >>= assocParmR name
+		  , ifBound = isJust bds
+		  }
+
+-- select
+
+selectTags = map (('o':) . show) [(1::Int)..] 
+
+-- |Create a selection box where multiple entries can be selected.
+selectMultiple :: (CGIMonad cgi, Eq a)
+	=> (a -> String)	-- ^function to display values of type a
+	-> [a]			-- ^list of preselected entries
+	-> [a]			-- ^list of all possible entries
+	-> (Int, Int)		-- ^(min, max) number of fields that must be selected 
+	-> HTMLField cgi x y (InputField [a] INVALID)
+selectMultiple shw defs opts (minSel, maxSel) attrs =
+  do token <- H.lift nextName
+     let name = show token
+     info <- H.lift getInfo
+     let bds = bindings info
+	 rawvalues = maybeToList bds >>= assocParmR name
+	 g ('o':i:rest) = i /= '0' 
+	 g _ = False
+	 inputs = filter g $ map fieldContents rawvalues
+	 values = inputs >>=
+		  (maybeToList . flip List.elemIndex selectTags) >>=
+		  (\i -> [opts !! i])
+	 len = length inputs
+	 mvalue | minSel <= len && len <= maxSel = Just values
+	        | otherwise = Nothing
+	 revisedDefaults | isJust bds && not (null inputs) = values
+	 		 | otherwise = defs
+     let makeoption (opt, tag) = 
+	   H.option_T (do H.text (shw opt)
+			  H.attr_SD "value" tag
+			  when (opt `elem` revisedDefaults) $
+			       H.attr_SS "selected" "selected")
+	 makeChoice :: Int -> String
+	 makeChoice n | n == 0 = "no choice"
+                   | n == 1 = "1 choice"
+		   | n == maxBound = "arbitrary many choices"
+		   | otherwise = show n ++ " choices"
+	 makeRange :: Int -> Int -> String
+	 makeRange lo hi | lo == maxBound = "Arbitrary many choices"
+                      | lo == hi = "Exactly " ++ makeChoice lo
+                      | otherwise = "Minimum " ++ makeChoice lo ++
+		      		    "; maximum " ++ makeChoice hi
+     H.select_T
+       (do attrs
+	   H.attr_SD "name" name
+	   when (maxSel > 1) $
+		H.attr_SS "multiple" "multiple"
+	   when (null defs && minSel > 0) $
+		H.option_S (do H.text_S "--"
+			       H.attr_SS "value" "o0")
+	   mapM_ makeoption (zip opts selectTags))
+     im <- internalImage nothing (makeRange minSel maxSel)
+     makeImg im (do H.attr_SS "align" "center"
+		    H.attr_SD "name" ('i' : name))
+     return $ 
+       InputField { ifName = name
+		  , ifToken = token
+       		  , ifFty = "select"
+		  , ifString = Nothing -- fmap show value
+		  , ifValue = mvalue
+		  , ifRaw = rawvalues
+		  , ifBound = isJust bds
+		  }
+
+-- |Create a selection box where exactly one entry can be selected.
+selectSingle :: (CGIMonad cgi, Eq a)
+	=> (a -> String)	-- ^function to display values of type a
+	-> Maybe a		-- ^optional preselected value
+	-> [a]			-- ^list of all possible values
+	-> HTMLField cgi x y (InputField a INVALID)
+selectSingle shw mdef opts attrs =
+  do inf <- selectMultiple shw (maybeToList mdef) opts (1,1) attrs
+     return $
+       InputField { ifName = ifName inf
+		  , ifToken = ifToken inf
+       		  , ifFty = "select"
+		  , ifString = ifString inf
+		  , ifValue = fmap Prelude.head (ifValue inf)
+		  , ifRaw = ifRaw inf
+		  , ifBound = ifBound inf
+		  }
+
+-- |Selection box for elements of a "Bounded" type. Argument is the optional
+-- preselected value.
+selectBounded :: (CGIMonad cgi, Enum a, Bounded a, Read a, Show a, Eq a) =>
+		 Maybe a -> HTMLField cgi x y (InputField a INVALID)
+selectBounded def =
+  selectSingle show def [minBound..maxBound]
+     
+-- ======================================================================
+-- attributes
+
+-- |Create a 'SIZE' attribute from an 'Int'.
+fieldSIZE :: Monad m => Int -> H.WithHTML x m ()
+fieldSIZE i = H.attr_SD "size" (show i)
+
+-- |Create a 'MAXLENGTH' attribute from an 'Int'.
+fieldMAXLENGTH :: Monad m => Int -> H.WithHTML x m ()
+fieldMAXLENGTH i = H.attr_SD "maxlength" (show i)
+
+-- |Create a 'VALUE' attribute from any 'Show'able.
+fieldVALUE :: (Monad m, Show a) => a -> H.WithHTML x m ()
+fieldVALUE a = H.attr_SD "value" (show a)
+
+
+-- Images
+
+data Image =
+  Image { imageSRC :: URL
+  	, imageALT :: String
+	}
+
+-- |Reference to internal image.
+internalImage :: (CGIMonad cgi) =>
+	   FreeForm		-- ^the raw image
+	-> String		-- ^alternative text
+	-> H.WithHTML x cgi Image
+internalImage ff alttext =
+  do baseUrl <- H.lift getUrl
+     externalImage (URL (baseUrl ++ '?' : ffName ff)) alttext
+
+-- |Reference to internal image via data URL (small images, only).
+dataImage :: (CGIMonad cgi) =>
+	   FreeForm		-- ^the raw image
+	-> String		-- ^alternative text
+	-> H.WithHTML x cgi Image
+dataImage ff alttext =
+  let url = URL (RFC2397.encode (ffContentType ff, ffRawContents ff)) in
+  externalImage url alttext
+
+-- |Reference to internal image via javascript URL (does not seem to work).
+jsImage :: (CGIMonad cgi) =>
+	   FreeForm		-- ^the raw image
+	-> String		-- ^alternative text
+	-> H.WithHTML x cgi Image
+jsImage ff alttext =
+  let url = URL ("javascript:" ++ jsShow (ffRawContents ff)) in
+  externalImage url alttext
+
+-- |Reference to image by URL.
+externalImage :: (CGIMonad cgi) =>
+	   URL			-- ^URL of image
+	-> String		-- ^alternative text
+	-> H.WithHTML x cgi Image
+externalImage url alttext =
+     return $ Image { imageSRC = url
+     		    , imageALT = alttext
+		    }
+
+-- |Create an inline image.
+makeImg :: (Monad cgi) => Image -> HTMLField cgi x y ()
+makeImg image attrs = 
+     H.img_T (do H.attr_SD "src" (unURL $ imageSRC image)
+		 H.attr_SD "alt" (imageALT image)
+		 H.attr_SD "title" (imageALT image)
+		 attrs)
+
+
+-- |Hyperlink that creates a named popup window from an URL string.
+popuplink :: Monad m => String -> URL -> H.HTMLCons x y m ()
+popuplink name url subs = 
+  let atv = "javascript:window.open(" ++
+            jsShow (unURL url) ++ "," ++
+	    jsShow name ++
+	    "); void(0);" in
+  H.a_T (H.attr_SD "href" atv >> subs)
+
+-- |restart application.
+restart :: (CGIMonad cgi) => cgi ()
+restart = 
+  do myurl <- getUrl
+     tell (Location $ URL myurl)
+
+-- |Convenient workhorse. Takes the title of a page and a monadic HTML value for
+-- the contents of the page. Wraps the contents in a form so that input fields
+-- and buttons may be used inside.
+standardQuery :: (CGIMonad cgi) => String -> H.WithHTML x cgi a -> cgi ()
+standardQuery ttl elems =
+  ask (H.standardPage ttl (makeForm elems))
+
+-- 
+debug message = unsafe_io $
+  do putStrLn "content-type: text/plain"
+     putStrLn ""
+     putStrLn message
+     putStrLn "------------------------------------------------------------"
+-- 
+prependArticle "" = ""
+prependArticle xs@(x:_) =
+  if x `elem` "aeiouAEIOU" then "an " ++ xs else "a " ++ xs
+
diff --git a/WASH/CGI/CGIMonad.hs b/WASH/CGI/CGIMonad.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGIMonad.hs
@@ -0,0 +1,209 @@
+{-# OPTIONS_GHC -fno-monomorphism-restriction #-}
+-- © 2001- 2005 Peter Thiemann
+-- |Definition of the monad underlying the CGI library.
+module WASH.CGI.CGIMonad
+where
+
+import Maybe
+
+import Control.Monad.Fix
+
+import WASH.CGI.CGITypes
+import WASH.HTML.HTMLMonad hiding (span, map, div, head)
+import WASH.CGI.LogEntry
+import WASH.CGI.RawCGIInternal hiding (contentType)
+import qualified WASH.Utility.SHA1 as SHA1
+
+newtype CGI a = CGI { unCGI :: CGIAction a }
+type CGIAction a = CGIState -> IO (a, CGIState)
+data CGIState
+  = CGIState { inparm   :: [PARAMETER]
+	     , outparm  :: [PARAMETER]
+	     , stateID  :: String
+	     , mcount	:: Int
+	     , cgiInfo  :: CGIInfo
+	     , pageInfo :: PageInfo
+	     , jsEnabled :: Maybe Bool
+	     , encoder  :: String -> String
+	     , cookieMap     :: [(String, (Maybe String, Maybe String))]
+	     , cookiesToSend :: [String]
+	     }
+
+data PageInfo =
+     PageInfo { count      :: Int
+     	      , nextaction :: Element -> CGIAction ()
+	      , actionTable :: [(String, Element -> CGIAction ())]
+	      , bindings   :: Maybe CGIParameters
+	      , enctype    :: String
+	      , inFrame    :: Int
+	      , allFields  :: [(String, Bool)]
+	      , faultyfields :: [(String, String)]
+	      }
+
+data CGIFieldName =
+     CGIFieldName { fnMcount :: Int, fnCount :: Int }
+
+instance Show CGIFieldName where
+  showsPrec i cfn = showChar 'f' .
+                    shows (fnMcount cfn) .
+		    showChar 'x' .
+		    shows (fnCount cfn)
+
+args = cgiArgs . cgiInfo
+url = unURL . cgiUrl . cgiInfo
+contentType = cgiContentType . cgiInfo
+
+sessionMode = cgiSessionMode . cgiInfo
+
+fromCGIstate select =
+  wrapCGI $ \cgistate ->
+  return (select cgistate, cgistate)
+
+getCGIArgs = fromCGIstate args
+getUrl = fromCGIstate url
+getParm = fromCGIstate outparm
+getStateID = fromCGIstate stateID
+getInfo = fromCGIstate pageInfo
+getEncoder = fromCGIstate encoder
+getJSEnabled = fromCGIstate jsEnabled
+getScriptName = fromCGIstate (cgiScriptName . cgiInfo)
+getPathInfo = fromCGIstate (cgiPathInfo . cgiInfo)
+getHandle = fromCGIstate (cgiHandle . cgiInfo)
+getFields = fromCGIstate (reverse . allFields . pageInfo)
+getMcount = fromCGIstate mcount
+getSessionMode = fromCGIstate sessionMode
+
+-- | wrapper to transform IO computation to CGIAction
+wrapIO :: IO a -> CGIAction a
+wrapIO ioa = \ cgistate -> ioa >>= \ a -> return (a, cgistate)
+
+-- | lift IO monad to CGI monad
+lift :: IO a -> CGI a
+lift = CGI . wrapIO
+
+inc = 
+  wrapCGI $ \cgistate ->
+  let info = pageInfo cgistate in
+  return (info 
+         ,cgistate { pageInfo = info { count = count info + 1}})
+
+setAction :: (CGIMonad cgi) => (Element -> cgi ()) -> cgi ()
+setAction actionFun =
+  wrapCGI $ \cgistate ->
+  return (()
+         ,cgistate { pageInfo = (pageInfo cgistate) { nextaction = unwrapCGI . actionFun }})
+
+registerAction :: (CGIMonad cgi) => String -> (Element -> cgi ()) -> cgi ()
+registerAction submitter actionFun =
+  wrapCGI $ \cgistate ->
+  let pi = pageInfo cgistate
+      pi' = pi { actionTable = (submitter, unwrapCGI . actionFun) : actionTable pi }
+  in return ((), cgistate { pageInfo = pi'})
+
+incFrame :: (CGIMonad cgi) => cgi Int
+incFrame =
+  wrapCGI $ \cgistate ->
+  let info = pageInfo cgistate
+      lastFrame = inFrame info
+      nextFrame = lastFrame + 1
+  in
+  return (nextFrame
+         ,cgistate { pageInfo = info { inFrame = nextFrame }})
+
+resetFrame :: (CGIMonad cgi) => cgi ()
+resetFrame =
+  wrapCGI $ \cgistate ->
+  let info = pageInfo cgistate
+  in
+  return (()
+         ,cgistate { pageInfo = info { inFrame = 0 }})
+
+setEnctype :: (CGIMonad cgi) => String -> cgi ()
+setEnctype contentType =
+  wrapCGI $ \cgistate ->
+  return (()
+         ,cgistate { pageInfo = (pageInfo cgistate) { enctype = contentType } })
+
+setFaulty :: (CGIMonad cgi) => [(String, String)] -> cgi ()
+setFaulty ss =
+  wrapCGI $ \cgistate ->
+  return (()
+         ,cgistate { pageInfo = (pageInfo cgistate) { faultyfields = ss } })
+
+instance Monad CGI where
+  return a = 
+	CGI ( \cgistate -> return (a, cgistate))
+  CGI cgi >>= f = 
+	CGI ( \cgistate -> 
+	    cgi cgistate >>= \ (x, cgistate') ->
+	    unCGI (f x) cgistate')
+
+-- contributed by Frederik Eaton <frederik@ofb.net>
+instance MonadFix CGI where
+  mfix f = CGI (\s ->
+		mfix (\x -> (unCGI (f x)) s >>= (return.fst))
+		>>= (\x -> return (x,s)))
+
+
+class Monad cgi => CGIMonad cgi where
+  wrapCGI :: CGIAction a -> cgi a
+  unwrapCGI :: cgi a -> CGIAction a
+  chooser :: a -> a -> cgi a
+
+instance CGIMonad CGI where
+  wrapCGI = CGI
+  unwrapCGI = unCGI
+  chooser x y = return x
+
+
+nextName :: (CGIMonad cgi) => cgi CGIFieldName
+nextName =
+  do mc <- getMcount
+     pageInfo <- inc
+     return CGIFieldName { fnMcount = mc, fnCount = count pageInfo }
+
+addField :: (CGIMonad cgi) => String -> Bool -> cgi ()
+addField s f =
+  wrapCGI ( \cgistate ->
+  	let info = pageInfo cgistate in
+	return ((), cgistate { pageInfo = info { allFields = (s,f): allFields info }}))
+
+-- 
+initialPageInfo cgistate =
+  let bnds = listToMaybe [ parms | PAR_VALUES parms <- inparm cgistate ]
+  in  PageInfo
+  	{ count = 0
+	, nextaction = \ _ st -> return ((), st)
+	, actionTable = []
+	, bindings = bnds
+	, enctype = contentTypeUrlencoded
+	, inFrame = inFrame (pageInfo cgistate)
+	, allFields = []
+	, faultyfields = []
+	}
+
+dropFirstPARVALUES parms =
+  let f rps [] = error "dropFirstPARVALUES: no PAR_VALUES found"
+      f rps (p : ps) = 
+	case p of
+	  PAR_VALUES _ ->
+	    (p, reverse rps ++ ps)
+	  _ ->
+	    f (p : rps) ps
+  in  f [] parms
+
+nextCGIState cgistate = cgistate'
+  where 
+    (newparm, inparm') = dropFirstPARVALUES (inparm cgistate)
+    cgistate' = cgistate { inparm = inparm'
+			 , stateID = nextstid (stateID cgistate) newparm
+			 , mcount = mcount cgistate + 1
+			 , pageInfo = (initialPageInfo cgistate')
+			     	{ inFrame = inFrame (pageInfo cgistate) }
+			 }
+-- 
+initialStateID = "00000000000000000000"
+
+nextstid oldstid parm =
+  SHA1.sha1 (oldstid ++ show parm)
+
diff --git a/WASH/CGI/CGIOutput.hs b/WASH/CGI/CGIOutput.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGIOutput.hs
@@ -0,0 +1,132 @@
+-- © 2001, 2002 Peter Thiemann
+-- |Defines the class 'CGIOutput' of data types that can be output from a CGI
+-- program. 
+module WASH.CGI.CGIOutput where
+
+import IO
+import Maybe
+import Monad
+import System
+
+import WASH.Utility.Auxiliary
+import WASH.Utility.BulkIO (rawHandleCopy)
+import qualified WASH.CGI.Debug as Debug
+import qualified WASH.Utility.RFC2279 as RFC2279
+
+import qualified WASH.Utility.Shell as Shell
+
+import WASH.CGI.CGIConfig
+import WASH.CGI.CGITypes
+import WASH.CGI.HTMLWrapper hiding (head, div, span, map)
+import WASH.HTML.HTMLTemplates
+
+-- import qualified PostElementAction
+
+-- |(internal) takes an output handle and a document without forms and input
+-- widgets, displays the document with suitable mime type and encoding, and
+-- terminates the program
+itell :: Handle -> WithHTML x IO () -> IO a
+itell h hma = do elem <- build_document hma
+		 cgiPut h elem
+		 exitWith ExitSuccess
+
+-- 
+class CGIOutput a where
+  cgiPut' :: Handle -> a -> IO ()
+  cgiPutList :: Handle -> [a] -> IO ()
+  
+  cgiPutList h xs = cgiPutList h xs
+
+cgiPut :: CGIOutput a => Handle -> a -> IO ()
+cgiPut h x =
+  do cgiPut' h x
+
+instance CGIOutput a => CGIOutput [a] where
+  cgiPut' h xs = cgiPutList h xs
+
+-- instance CGIOutput Element where
+instance CGIOutput ELEMENT_ where
+  cgiPut' h x = hPutElement h x
+
+instance CGIOutput Char where
+  cgiPut' h ch = cgiPutList h [ch]
+  cgiPutList h x = hPutListChar h x
+
+instance CGIOutput FileReference where
+  cgiPut' h x = hPutFileReference h x
+
+instance CGIOutput ResponseFileReference where
+  cgiPut' h x = hPutResponseFileReference h x
+
+instance CGIOutput Status where
+  cgiPut' h x = hPutStatus h x
+	  
+instance CGIOutput Location where
+  cgiPut' h x = hPutLocation h x
+
+instance CGIOutput FreeForm where
+  cgiPut' h x = hPutFreeForm h x
+
+-- ------------------------------------------------------------
+
+hPutElement h elem =
+    do hPutStrLn h "Content-Type: text/html; charset=utf-8"
+       -- hPutStrLn h "Content-Type: application/xhtml+xml; charset=utf-8"
+       -- This MIME type does not work with Mozilla 1.6. It says
+       -- "This XML file does not appear to have any style information associated
+       -- with it. The document tree is shown below."
+       hPutStrLn h ""
+       hPutStr h $ RFC2279.encode $ show elem
+       -- PostElementAction.postElementAction h
+       let new h = hPutStrLn h (showTemplatified elem "")
+	   old h = hPutStrLn h $ RFC2279.encode $ show elem
+       Debug.logOutput "OLD" old
+       -- Debug.logOutput "NEW" new
+
+hPutListChar h str =
+    do hPutStrLn h "Content-Type: text/plain; charset=utf-8"
+       hPutStrLn h ""
+       hPutStr h $ RFC2279.encode str
+
+hPutFileReference h fr =
+    do hPutStr h "Content-Type: "
+       hPutStrLn h (fileReferenceContentType fr)
+       hPutStrLn h ""
+       hFlush h
+       hin <- openFile (fileReferenceName fr) ReadMode
+       rawHandleCopy hin h
+       hClose hin
+
+hPutResponseFileReference h (ResponseFileReference fname) =
+    do hFlush h
+       hin <- openFile fname ReadMode
+       rawHandleCopy hin h
+       hClose hin
+
+hPutStatus h (Status status reason_phrase elems) =
+    do hPutStr h "Status: "
+       hPutStr h status_str
+       hPutStr h " "
+       hPutStrLn h reason_phrase
+       case elems of
+         Nothing -> hPutStrLn h ""
+	 Just _  -> itell h message
+    where status_str = show status
+	  ttl = "Error: " ++ status_str ++ ' ' : reason_phrase
+	  message = standardPage ttl (fromJust elems)
+
+hPutLocation h (Location url) =
+    do hPutStr h "Location: "
+       hPutStrLn h (unURL url)
+       hPutStrLn h ""
+
+hPutFreeForm h (FreeForm fileName contentType rawContents) =
+    do hPutStr h "Content-Type: "
+       hPutStr h contentType
+       when (not (null fileName)) $
+         do hPutStr h " ;name=\""
+	    hPutStr h fileName
+	    hPutStr h "\""
+       hPutStrLn h ""
+       hPutStrLn h ""
+       hPutStr h rawContents
diff --git a/WASH/CGI/CGITypes.hs b/WASH/CGI/CGITypes.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGITypes.hs
@@ -0,0 +1,64 @@
+-- © 2001, 2002 Peter Thiemann
+-- |Types of outputable data.
+module WASH.CGI.CGITypes where
+
+import WASH.CGI.HTMLWrapper (WithHTML)
+
+newtype URL = URL { unURL :: String }
+
+data FileReference =
+     FileReference { fileReferenceName :: FilePath
+     		   -- ^ valid local filename where this file can be accessed
+     		   , fileReferenceContentType :: String
+		   , fileReferenceExternalName :: String
+		   }
+     deriving (Show, Read)
+
+-- |Assumes that file contains correctly formatted HTTP Response starting with
+-- Content-Type. Used internally to implement frames.
+data ResponseFileReference =
+     ResponseFileReference FilePath
+
+data Status = Status { statusCode :: Int		    -- ^ status code
+		     , statusReason :: String		    -- ^ reason phrase
+		     , statusContent :: Maybe (WithHTML () IO ())   -- ^ more explanation
+		     }
+
+newtype Location = Location URL				    -- ^ redirection
+
+data FreeForm =
+     FreeForm	{ ffName :: String			    -- ^ internal name
+		, ffContentType :: String		    -- ^ MIME type
+		, ffRawContents :: String		    -- ^ contents as octet stream
+		}
+
+data CGIOption
+  = NoPort	-- ^ do not include port number in generated URLs
+  | AutoPort	-- ^ include automatically generated port number in generated URLs (default)
+  | Port Int	-- ^ use this port number in generated URLs
+
+  | NoHttps     -- ^ do not attempt to detect Https
+  | AutoHttps   -- ^ autodetect Https by checking for port number 443 and env var HTTPS (default)
+
+  | FullURL     -- ^ generate full URL including scheme, host, and port
+  | PartialURL  -- ^ generate absolute path URL, only (default)
+
+  | SessionMode { unSessionMode :: SessionMode }
+  deriving (Eq, Show)
+type CGIOptions = [CGIOption]
+
+data SessionMode
+  = LogOnly	-- ^ generate log in hidden field, full server replay (default)
+  | StateIDOnly	-- ^ generate state id, server threads without replay (only with WSP)
+  | LogAndState -- ^ log and state id, server threads with replay as fallback (only with WSP)
+  deriving (Eq, Show, Read, Bounded, Enum)
+
+sessionNeedsLog :: SessionMode -> Bool
+sessionNeedsLog LogOnly = True
+sessionNeedsLog StateIDOnly = False
+sessionNeedsLog LogAndState = True
+
+sessionNeedsState :: SessionMode -> Bool
+sessionNeedsState LogOnly = False
+sessionNeedsState StateIDOnly = True
+sessionNeedsState LogAndState = True
diff --git a/WASH/CGI/CGIXX.hs b/WASH/CGI/CGIXX.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CGIXX.hs
@@ -0,0 +1,102 @@
+{-# OPTIONS -fglasgow-exts #-}
+-- © 2001, 2002 Peter Thiemann
+{-|
+  One stop shop for the WASH\/CGI library. All high-level scripts should 
+  get along with importing just this module. Low-level scripts may have to 
+  import "RawCGI". This version requires features beyond Haskell98, in particular 
+  multi parameter type classes and existential types.
+  -} 
+module WASH.CGI.CGIXX (
+	-- * Basics
+	CGI
+	, ask, tell, io, run
+	, once, forever, htell, askOffline
+	-- * Links and Images
+	, Image, internalImage, externalImage, makeImg, makeRef, makeA
+	, backLink, hlink
+	-- * Forms and Widgets
+	, HTMLField
+	-- ** Form Creation
+	, makeForm, standardQuery
+	-- ** Form Submission
+	, submit, submit0, defaultSubmit, resetField, activeInputField, activate
+        , submitx, DTree, dtleaf, dtnode
+	-- ** Textual Input 
+	, inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea
+	-- ** Checkbox
+	, checkboxInputField
+	-- ** Button
+	, makeButton, RadioGroup, radioGroup, radioButton, radioError
+	-- ** Image
+	, imageField
+	-- ** Selection Box
+	, selectMultiple, selectSingle, selectBounded
+	-- ** File
+	, fileInputField, checkedFileInputField
+	-- ** Handle Manipulation
+	, InputField, VALID, INVALID
+	-- ** Attribute Shortcuts
+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE
+	-- * Advanced
+	-- ** Installing Translators
+	, runWithHook, docTranslator, lastTranslator
+	-- ** Outputable Stuff
+	, CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)
+	-- ** Predefined Types for Input Fields
+	, Text(..), NonEmpty(..), AllDigits(..)
+	, EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)
+	-- ** Lowlevel Options
+	, CGIOption (..), CGIOptions
+	-- ** Servlets
+	, makeServlet, makeServletWithHook
+	-- * HTML and Style
+	, module WASH.CGI.HTMLWrapper
+	, module WASH.CGI.Style
+	-- * Experimental Stuff
+	, FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage
+	)
+where
+
+import qualified Prelude
+import WASH.CGI.BaseCombinators
+	( io, once, forever, callWithCurrentHistory, ask, askOffline
+	, run, runWithOptions, runWithHook
+	, tell, htell, backLink, hlink
+	, docTranslator, lastTranslator
+	, makeServlet, makeServletWithHook
+	)
+import WASH.CGI.CGITypes
+	( FileReference(..), CGIOption(..), CGIOptions
+	)
+import WASH.CGI.CGIMonad (CGI)
+import WASH.CGI.CGIInternals 
+	( makeRef, makeA, makePopupRef, popuplink
+	, InputField, VALID, INVALID
+	, makeForm, makeImg, Image, internalImage, externalImage
+	, HTMLField, resetField, activeInputField
+	, inputField, textInputField, checkedTextInputField, passwordInputField
+	, checkboxInputField, fileInputField, checkedFileInputField, imageField
+	, RadioGroup, radioGroup, radioButton, radioError, makeButton
+	, makeTextarea
+	, selectMultiple, selectSingle, selectBounded
+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE
+	, restart
+	, concatFields, concatFieldsWith
+	, standardQuery
+	)
+import WASH.CGI.SubmitXX 
+	( submit, submit0, defaultSubmit
+        , submitx, DTree, dtleaf, dtnode
+	, activate )
+import WASH.CGI.CGIOutput
+	( CGIOutput
+	)
+import WASH.CGI.CGITypes
+	( Status(..), Location(..), FreeForm(..)
+	)
+import WASH.CGI.Fields
+import WASH.CGI.Style 
+import WASH.CGI.HTMLWrapper
+  hiding (input, form, select, option, textarea)
+import WASH.CGI.Frames
+  (FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage)
diff --git a/WASH/CGI/ContentType.hs b/WASH/CGI/ContentType.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/ContentType.hs
@@ -0,0 +1,20 @@
+-- © 2001, 2002 Peter Thiemann
+module WASH.CGI.ContentType where
+
+import Char
+import List
+
+-- |tries to derive a MIME content type from a file name
+guessContentType :: String -> String
+guessContentType name = g (map toLower name) 
+ where
+ g name
+  | ".eps"	`isSuffixOf` name = "application/postscript"
+  | ".ps"	`isSuffixOf` name = "application/postscript"
+  | ".ps.gz"	`isSuffixOf` name = "application/postscript"   -- correct?
+  | ".pdf"	`isSuffixOf` name = "application/pdf"
+  | ".html"	`isSuffixOf` name = "text/html"
+  | ".gif"	`isSuffixOf` name = "image/gif"
+  | ".png"	`isSuffixOf` name = "image/png"
+  | ".jpg"	`isSuffixOf` name = "image/jpeg"
+  | otherwise = "application/octet-stream"
diff --git a/WASH/CGI/Cookie.hs b/WASH/CGI/Cookie.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Cookie.hs
@@ -0,0 +1,202 @@
+-- © 2001, 2002, 2003 Peter Thiemann
+-- |creating, setting, reading, and deleting cookies. Cookies are type-indexed,
+-- i.e., there is a different cookie for each name and type.
+module WASH.CGI.Cookie (T, check, create, createExpiring, init, initExpiring, get, set, current, delete) where
+
+import Locale
+import Maybe
+import Prelude hiding (init)
+import Random
+import Time
+
+import WASH.CGI.BaseCombinators
+import WASH.CGI.CGIMonad
+import WASH.HTML.HTMLMonad hiding (head, div, map, span)
+import WASH.CGI.Types
+
+import WASH.CGI.StateItem
+
+-- |@check name@ returns the current handle to cookie @name@ if that exists.
+check :: (Read a, Show a, Types a) => String -> CGI (Maybe (T a))
+-- |@create name initValue@ creates cookie @name@ with initial value @initValue@
+-- and returns its current handle. The cookie
+-- expires at the end of the current run of the browser.
+create  :: (Read a, Show a, Types a) => String -> a -> CGI (T a)
+-- |like 'create' with additional parameter specifying number of minutes until
+-- cookie expires.
+createExpiring  :: (Read a, Show a, Types a) => String -> Int -> a -> CGI (T a)
+-- |@init name initValue@ returns current handle to cookie @name@. If the
+-- cookie did not exist before, it is created and set to @initialValue@. The cookie
+-- expires at the end of the current run of the browser.
+init    :: (Read a, Show a, Types a) => String -> a -> CGI (T a)
+-- |@initExpiring name minutes initValue@ works like 'init' except that the
+-- expiration time is @minutes@ in the future.
+initExpiring :: (Read a, Show a, Types a) => String -> Int -> a -> CGI (T a)
+-- |@get handle@ returns the cookie's value if the handle is current, otherwise
+-- returns 'Nothing' 
+get     :: (Read a, Show a, Types a) => T a -> CGI (Maybe a)
+-- |@set handle newValue@ overwrites the cookie's value with @newValue@ if the
+-- handle is current. In that case it returns a handle which is current for
+-- @newValue@. Otherwise, the result is 'Nothing'.
+set     :: (Read a, Show a, Types a) => T a -> a -> CGI (Maybe (T a))
+-- |@current handle@ returns @Nothing@ if @handle@ is still current. Otherwise, it
+-- returns @Just newHandle@ where @newHandle@ is current for the cookie pointed to by
+-- @handle@.
+current :: (Read a, Show a, Types a) => T a -> CGI (Maybe (T a))
+-- |@delete handle@ removes the cookie determined by @handle@.
+delete  :: (Types a) => T a -> CGI ()
+-- 
+
+
+data P a = P { nr :: Int, vl :: a }
+  deriving (Read, Show)
+
+t :: String -> P a -> T a
+t name (P i a) = T name i
+
+check name =
+  once (unsafe_getHandle name)
+
+unsafe_getHandle name =
+  CGI (\cgistate ->
+    let mresult = fmap (t name) $ cookieLookup cgistate typedName
+	myTyspec = ty (tvirtual (fromJust mresult))
+	typedName = makeTypedName name myTyspec
+    in 
+    return (mresult, cgistate))   
+
+create name val = 
+  once (unsafe_init False name val Nothing)
+
+createExpiring name minutes val =
+  once $ do timestr <- unsafe_io $ getTimeString minutes
+	    unsafe_init False name val (Just timestr)
+
+initExpiring name minutes val =
+  once $ do timestr <- unsafe_io $ getTimeString minutes
+	    unsafe_init True name val (Just timestr)
+
+init name val = 
+  once (unsafe_init True name val Nothing)
+
+unsafe_init useExisting name val mexp =
+  CGI (\cgistate ->
+     case cookieLookup cgistate typedName of
+     -- if name present and existing value is to be used
+     -- then construct handle from map entry
+       Just pair | useExisting ->
+         return (t name pair, cgistate)
+       _ -> 
+     -- extend cookie map with name=val
+	 do nonce <- randomIO
+	    let p0val = P nonce val
+		cm' = (typedName, (Just (show p0val), mexp)) : cookieMap cgistate
+     -- register cookie for sending
+                cts' = typedName : cookiesToSend cgistate
+     -- construct handle
+	    return (t name p0val,
+		    cgistate { cookieMap = cm'
+			     , cookiesToSend = cts'
+			     }))
+  where myTyspec = ty val
+	typedName = makeTypedName name myTyspec
+  
+get handle =
+  once (do eitherTP <- unsafe_get_current handle
+	   return $ either (const Nothing) Just eitherTP)
+
+current handle =
+  once (do eitherTP <- unsafe_get_current handle
+	   return $ either Just (const Nothing) eitherTP)  
+
+unsafe_get_current :: (Types a, Read a, Show a) => T a -> CGI (Either (T a) a)
+unsafe_get_current t@(T name i) =
+  CGI (\cgistate ->
+     case cookieLookup cgistate typedName of
+     -- if name present and types match then construct handle from map entry
+       (Just pair)
+         | nr pair == i ->
+	   return (Right $ vl pair, cgistate)
+	 | otherwise ->
+	   return (Left $ T name (nr pair), cgistate)
+       _ -> 
+	 reportError "Cookie disappeared" 
+	   (do let cm = cookieMap cgistate
+		   mms = lookup typedName cm
+		   mmp = if True then fmap (fmap reads . fst) mms 
+		                 else Just (Just [(P 0 $ tvirtual t, "")])
+	       pre $ text $ ("  " ++ typedName)
+	       pre $ text $ show cm
+	       pre $ text $ show mms
+	       pre $ text $ show mmp)
+	   cgistate)
+  where myTyspec = ty (tvirtual t)
+	typedName = makeTypedName name myTyspec
+
+set handle val =
+  once (unsafe_set handle val)
+
+unsafe_set (T name i) val =
+  CGI (\cgistate ->
+    case cookieLookup cgistate typedName of
+      (Just pair) | nr pair == i ->
+        do nonce <- randomIO
+	   let pair' = if True then P nonce val else pair    -- to unify their types
+	       cts = cookiesToSend cgistate
+	       cts' = if typedName `elem` cts then cts else typedName : cts
+	       cm' = (typedName, (Just (show pair'), Nothing)) :
+		     [ entry | entry@(aName, _) <- cookieMap cgistate
+			     , aName /= typedName ]
+	   return (Just (t name pair'),
+		   cgistate { cookieMap = cm'
+			    , cookiesToSend = cts'
+			    })
+      _ -> return (Nothing, cgistate))
+  where myTyspec = ty val
+	typedName = makeTypedName name myTyspec
+
+delete t = 
+  once (unsafe_delete t)
+
+unsafe_delete t@(T name i) =
+  CGI (\cgistate ->
+       let  cts = cookiesToSend cgistate
+	    cts' = if typedName `elem` cts then cts else typedName : cts
+       in return ( ()
+	         , cgistate { cookieMap = (typedName, (Nothing, Nothing))
+		 			  : cookieMap cgistate
+		            , cookiesToSend = cts'
+			    }))
+  where myTyspec = ty (tvirtual t)
+	typedName = makeTypedName name myTyspec
+
+cookieLookup :: (Show a, Read a) => CGIState -> String -> Maybe (P a)
+cookieLookup cgistate typedName =
+  let cm = cookieMap cgistate
+      fn = lookup typedName cm		    -- Maybe (Maybe String, Maybe String)
+      cn = fmap (fmap reads . fst) fn	    -- Maybe (Maybe [(P a, String)])
+      checkType [] = 
+        Nothing
+      checkType ((pair,_):_) =
+        Just pair
+  in  cn >>= \mtp -> mtp >>= checkType
+
+makeTypedName :: String -> TySpec -> String
+makeTypedName s tys = s ++ '-' : tid tys ""
+
+-- 
+
+getTimeString :: Int -> IO String
+getTimeString minutes =
+  do now <- getClockTime
+     let expireAt = addToClockTime TimeDiff {tdYear = 0,
+	 				     tdMonth = 0,
+					     tdDay = 0,
+					     tdHour = 0,
+					     tdMin = minutes,
+					     tdSec = 0,
+					     tdPicosec = 0} now
+	 -- Wdy, DD-Mon-YYYY HH:MM:SS GMT
+	 fmt = "%a, %d-%b-%Y %H:%M:%S GMT"
+	 loc = defaultTimeLocale
+     return $ formatCalendarTime loc fmt (toUTCTime expireAt)
diff --git a/WASH/CGI/CookieIO.hs b/WASH/CGI/CookieIO.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/CookieIO.hs
@@ -0,0 +1,52 @@
+module WASH.CGI.CookieIO (decodeCookie, encodeCookie, putCookies) where
+
+import IO
+
+import WASH.CGI.CGIMonad
+import qualified WASH.CGI.Debug as Debug
+import WASH.CGI.RawCGITypes
+import qualified WASH.Utility.URLCoding as URLCoding
+
+decodeCookie :: (String, String) -> (String, (Maybe String, Maybe String))
+encodeCookie :: (String, (Maybe String, Maybe String)) -> (String, String)
+encodeCookie (k, (v, mexp)) =
+  (URLCoding.encode k, 
+   case v of 
+     Just v' -> URLCoding.encode v' ++
+       (case mexp of
+	  Nothing -> ""
+	  Just exp -> "; expires=" ++ exp)
+     Nothing -> "deleted; expires=Thu, 01-Jan-1970 00:00:00 GMT")
+decodeCookie (k, v) =  (URLCoding.decode k, (Just (URLCoding.decode v), Nothing))
+
+putCookies :: CGIState -> IO ()
+putCookies cgistate =
+  let cookies = cookiesToSend cgistate
+      cm = cookieMap cgistate
+      h = cgiHandle (cgiInfo cgistate)
+      sendCookie name = case lookup name cm of
+        Nothing -> 
+	  return ()
+	Just value -> 
+	  let (encName, encValue) = encodeCookie (name, value) in
+	  do hPutStr h "Set-Cookie: "
+	     hPutStr h encName
+	     hPutStr h "="
+	     hPutStr h encValue
+	     hPutStr h ";\n"
+  in do printCookies cm cookies h
+	Debug.logOutput "OLD" (printCookies cm cookies)
+
+printCookies :: [(String,(Maybe String, Maybe String))] -> [String] -> Handle -> IO ()
+printCookies cm cookies h =
+  let sendCookie name = case lookup name cm of
+        Nothing -> 
+	  return ()
+	Just value -> 
+	  let (encName, encValue) = encodeCookie (name, value) in
+	  do hPutStr h "Set-Cookie: "
+	     hPutStr h encName
+	     hPutStr h "="
+	     hPutStr h encValue
+	     hPutStr h ";\n"
+  in mapM_ sendCookie cookies
diff --git a/WASH/CGI/Debug.hs b/WASH/CGI/Debug.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Debug.hs
@@ -0,0 +1,116 @@
+module WASH.CGI.Debug where
+
+import Directory
+import IO
+import Monad
+import System
+import Time
+
+import System.IO.Unsafe
+
+import WASH.Utility.Auxiliary
+import WASH.CGI.RawCGITypes
+import WASH.CGI.HTTP
+import qualified WASH.Utility.Shell as Shell
+import qualified WASH.Utility.ISO8601 as ISO8601
+import qualified WASH.Utility.IntToString as IntToString
+
+-- |Turn this off for production use.
+debugging :: Bool
+debugging = False
+
+logDirNakalele = "/export/data/thiemann"
+
+dir :: String
+dir = 
+  unsafePerformIO $
+    do (ts, tps) <- timestamp
+       onNakalele <- doesDirectoryExist logDirNakalele
+       ra <- protectedGetEnv "REMOTE_ADDR" "0.0.0.0"
+       home <- protectedGetEnv "HOME" ""
+       let root | not (null home) = home ++ "/tmp"
+		| onNakalele      = logDirNakalele
+		| otherwise       = "/tmp"
+	   n = root ++ "/WASHLOGA/" ++ ra ++ 
+               '/' : IntToString.intToString 10 (toEnum ts) ++
+	       ':' : IntToString.intToString 10 tps
+       assertDirectoryExists n (return ())
+       return n
+
+timestamp :: IO (Int, Integer)
+timestamp =
+  do clkt <- getClockTime
+     let dc = diffClockTimes clkt ISO8601.epochClkT
+     return (tdSec dc, tdPicosec dc)
+
+withLogFile :: String -> (Handle -> IO ()) -> IO ()
+withLogFile path go =
+  do h <- openFile path AppendMode
+     go h
+     hClose h
+
+-- ------------------------------------------------------------
+
+hPutEnvVar h val var =
+  do hPutStr h var
+     hPutChar h '='
+     hPutStrLn h (Shell.quote val)
+     hPutStr h "export "
+     hPutStrLn h var
+
+makeArgList h [] =
+  return ()
+makeArgList h (x:xs) =
+  do hPutStr h (Shell.quote x)
+     hPutChar h ' '
+     makeArgList h xs
+makeCommand h args =
+  do hPutStr h "$1 "
+     makeArgList h args
+     hPutStrLn h "<< \\EOF"
+makeInput h str =
+  do hPutStrLn h str
+     hPutStrLn h "\\EOF"
+
+-- |Creates a shell script suitable for replaying the interactive submission.
+logInput :: CGIEnv -> IO ()
+logInput cgiEnv =
+  when debugging $
+  withLogFile (dir ++ "/IN.sh") $ \ h ->
+  do hPutStrLn h "#!/bin/sh"
+     hPutEnvVar h (serverName cgiEnv) "SERVER_NAME"
+     hPutEnvVar h (serverPort cgiEnv) "SERVER_PORT"
+     hPutEnvVar h (serverSoftware cgiEnv) "SERVER_SOFTWARE"
+     hPutEnvVar h (serverProtocol cgiEnv) "SERVER_PROTOCOL"
+     hPutEnvVar h (gatewayInterface cgiEnv) "GATEWAY_INTERFACE"
+     hPutEnvVar h (scriptName cgiEnv) "SCRIPT_NAME"
+     hPutEnvVar h (show $ requestMethod cgiEnv) "REQUEST_METHOD"
+     hPutEnvVar h (contentLength cgiEnv) "CONTENT_LENGTH"
+     hPutEnvVar h (contentType cgiEnv) "CONTENT_TYPE"
+     hPutEnvVar h (httpCookie cgiEnv) "HTTP_COOKIE"
+     hPutEnvVar h (httpAccept cgiEnv) "HTTP_ACCEPT"
+     hPutEnvVar h (pathInfo cgiEnv) "PATH_INFO"
+     hPutEnvVar h (pathTranslated cgiEnv) "PATH_TRANSLATED"
+     hPutEnvVar h (remoteHost cgiEnv) "REMOTE_HOST"
+     hPutEnvVar h (remoteAddr cgiEnv) "REMOTE_ADDR"
+     hPutEnvVar h (remoteUser cgiEnv) "REMOTE_USER"
+     hPutEnvVar h (authType cgiEnv) "AUTH_TYPE"
+     if httpsEnabled cgiEnv 
+	then hPutEnvVar h "on"  "HTTPS"
+	else hPutEnvVar h "off" "HTTPS"
+     makeCommand h (rawArgs cgiEnv)
+     makeInput h (rawContents cgiEnv)
+     
+logOutput :: String -> (Handle -> IO ()) -> IO ()
+logOutput name f =
+  let basename = dir ++ '/' : name in
+  when debugging $ do
+    before <- getClockTime
+    withLogFile basename f
+    after <- getClockTime
+    let dc = diffClockTimes after before
+	dSec = toInteger $ tdSec dc
+	dPic = tdPicosec dc
+    withLogFile (basename ++ ".time")
+      (\h -> do hPutStrLn h (IntToString.intToString 10 dSec)
+                hPutStrLn h (IntToString.intToString 10 dPic))
diff --git a/WASH/CGI/EventHandlers.hs b/WASH/CGI/EventHandlers.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/EventHandlers.hs
@@ -0,0 +1,130 @@
+-- © 2002 Peter Thiemann
+module WASH.CGI.EventHandlers where
+
+import WASH.CGI.HTMLWrapper
+
+--abort
+onAbort :: Monad m => String -> WithHTML x m ()
+onAbort = attr_SS "onabort"
+-- ^The user aborts the loading of an image (for example by clicking a link or
+-- clicking the Stop button). 
+
+--blur
+onBlur :: Monad m => String -> WithHTML x m ()
+onBlur = attr_SS "onblur"
+-- ^A form element loses focus or when a window or frame loses focus.
+
+--change
+onChange :: Monad m => String -> WithHTML x m ()
+onChange = attr_SS "onchange"
+-- ^A select, text, or textarea field loses focus and its value has been modified.
+
+--click
+onClick :: Monad m => String -> WithHTML x m ()
+onClick = attr_SS "onclick"
+-- ^An object on a form is clicked.
+
+--dblclick
+onDblClick :: Monad m => String -> WithHTML x m ()
+onDblClick = attr_SS "ondblclick"
+-- ^The user double-clicks a form element or a link.
+
+--dragdrop
+onDragDrop :: Monad m => String -> WithHTML x m ()
+onDragDrop = attr_SS "ondragdrop"
+-- ^The user drops an object onto the browser window, such as dropping a file on
+-- the browser window. 
+
+--error
+onError :: Monad m => String -> WithHTML x m ()
+onError = attr_SS "onerror"
+-- ^The loading of a document or image causes an error.
+
+--focus
+onFocus :: Monad m => String -> WithHTML x m ()
+onFocus = attr_SS "onfocus"
+-- ^A window, frame, or frameset receives focus or when a form element receives
+-- input focus. 
+
+--keydown
+onKeyDown :: Monad m => String -> WithHTML x m ()
+onKeyDown = attr_SS "onkeydown"
+-- ^The user depresses a key.
+
+--keypress
+onKeyPress :: Monad m => String -> WithHTML x m ()
+onKeyPress = attr_SS "onkeypress"
+-- ^The user presses or holds down a key.
+
+--keyup
+onKeyUp :: Monad m => String -> WithHTML x m ()
+onKeyUp = attr_SS "onkeyup"
+-- ^The user releases a key.
+
+--load
+onLoad :: Monad m => String -> WithHTML x m ()
+onLoad = attr_SS "onload"
+-- ^The browser finishes loading a window or all of the frames within a FRAMESET tag.
+
+--mousedown
+onMouseDown :: Monad m => String -> WithHTML x m ()
+onMouseDown = attr_SS "onmousedown"
+-- ^The user depresses a mouse button.
+
+--mousemove
+onMouseMove :: Monad m => String -> WithHTML x m ()
+onMouseMove = attr_SS "onmousemove"
+-- ^The user moves the cursor.
+
+--mouseout
+onMouseOut :: Monad m => String -> WithHTML x m ()
+onMouseOut = attr_SS "onmouseout"
+-- ^The cursor leaves an area (client-side image map) or link from inside that
+-- area or link. 
+
+--mouseover
+onMouseOver :: Monad m => String -> WithHTML x m ()
+onMouseOver = attr_SS "onmouseover"
+-- ^The cursor moves over an object or area from outside that object or area.
+
+--mouseup
+onMouseUp :: Monad m => String -> WithHTML x m ()
+onMouseUp = attr_SS "onmouseup"
+-- ^The user releases a mouse button.
+
+--move
+onMove :: Monad m => String -> WithHTML x m ()
+onMove = attr_SS "onmove"
+-- ^The user or script moves a window or frame.
+
+--reset
+onReset :: Monad m => String -> WithHTML x m ()
+onReset = attr_SS "onreset"
+-- ^The user resets a form (clicks a Reset button).
+
+--resize
+onResize :: Monad m => String -> WithHTML x m ()
+onResize = attr_SS "onresize"
+-- ^The user or script resizes a window or frame.
+
+--select
+onSelect :: Monad m => String -> WithHTML x m ()
+onSelect = attr_SS "onselect"
+-- ^The user selects some of the text within a text or textarea field.
+
+--submit
+onSubmit :: Monad m => String -> WithHTML x m ()
+onSubmit = attr_SS "onsubmit"
+-- ^The user submits a form. Event handler must return true to continue
+-- submission. Returning false concels submission.
+
+--unload
+onUnload :: Monad m => String -> WithHTML x m ()
+onUnload = attr_SS "onunload"
+-- ^The user exits a document.
+
+-- specialized event handlers
+-- |Redirect result of form submission to specific target. Attach to submission
+-- button. 
+toTarget :: Monad m => String -> WithHTML x m ()
+toTarget t = onClick ("this.form.target='" ++ t ++ "'; this.form.submit(); return true")
diff --git a/WASH/CGI/Fields.hs b/WASH/CGI/Fields.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Fields.hs
@@ -0,0 +1,282 @@
+-- © 2002 Peter Thiemann
+module WASH.CGI.Fields where
+
+import Char
+import List
+import WASH.Utility.ISO8601
+import WASH.Utility.SimpleParser as SimpleParser
+import WASH.CGI.CGITypes
+
+-- |method 'reason' of this class maps a value of type /a/ to an explanation of
+-- the input syntax for a value of type /a/
+class Reason a where
+  reason :: a -> String
+  washtype :: a -> String
+  reason _ = ""
+  washtype x = reason x
+
+instance Reason Int where
+  reason _ = "Int"
+
+instance Reason Integer where
+  reason _ = "Integer"
+
+instance Reason Double where
+  reason _ = "Double"
+
+instance Reason Float where
+  reason _ = "Float"
+
+instance Reason Bool where
+  reason _ = "Bool"
+
+instance Reason () where
+  reason _ = "()"
+
+instance Reason Char where
+  reason _ = "Char"
+
+instance Reason a => Reason [a] where
+  reason ~(x:xs) = "[" ++ reason x ++ "]"
+
+instance (Reason a, Reason b) => Reason (a, b) where
+  reason ~(x,y) = "(" ++ reason x ++ "," ++ reason y ++ ")"
+
+instance (Reason a, Reason b, Reason c) => Reason (a, b, c) where
+  reason ~(x,y,z) = "(" ++ reason x ++ "," ++ reason y ++ "," ++ reason z ++ ")"
+
+-- |Reads an email address according to RFC 2822
+newtype EmailAddress = EmailAddress { unEmailAddress :: String }
+
+instance Read EmailAddress where
+  readsPrec i str = 
+    let isAddressChar c = isAlpha c || isDigit c || c `elem` ".-_"
+        (name, atDomain) = span isAddressChar (dropWhile isSpace str)
+    in  case atDomain of
+          '@' : domainPart ->
+	    let (domain, rest) = span isAddressChar domainPart in
+	    let fulladdress = name ++ '@' : domain in
+	    if null name || null domain 
+	    || "." `isPrefixOf` name || "." `isSuffixOf` name || "." `isPrefixOf` domain
+	    || any (isPrefixOf "..") (tails name) 
+	    || any (isPrefixOf "..") (tails domain)
+	    then []
+	    else [(EmailAddress fulladdress, dropWhile isSpace rest)]
+	  _ -> []
+  readList str = 
+    case reads str of
+      (em1, str'): _ ->
+        case str' of
+	  ',': str'' ->
+	    case readList str'' of
+	      (ems, str'''): _ ->
+	        [(em1:ems, str''')]
+	      _ ->
+	        [([em1], str')]
+	  _ -> 
+	    [([em1], str')]
+      _ -> []
+	
+
+instance Show EmailAddress where
+  showsPrec i (EmailAddress str) = showString str
+
+instance Reason EmailAddress where
+  reason _ = "email address {must contain @ and no special characters except . - _}"
+  washtype _ = "EmailAddress"
+ 
+-- |Reads a credit card number and performs Luhn check on it.
+newtype CreditCardNumber = CreditCardNumber { unCreditCardNumber :: String }
+
+instance Read CreditCardNumber where
+  readsPrec i str = 
+    let str' = dropWhile isSpace str
+	str'' =  take 16 str'
+	str''' = dropWhile isSpace (drop 16 str'')
+    in	if length str'' == 16 && all isDigit str && luhnCheck str
+        then [(CreditCardNumber str, str''')]
+	else []
+
+luhnCheck str = 
+  checkEven (reverse str) 0
+  where digitval d = ord d - ord '0'
+	checkEven [] n = n `mod` 10 == 0
+	checkEven (d:ds) n = checkOdd ds (n + digitval d)
+	checkOdd [] n = n `mod` 10 == 0
+	checkOdd (d:ds) n = checkEven ds (n + doubleval (digitval d))
+	doubleval d = let d2 = 2*d in if d2 > 9 then d2 - 9 else d2
+
+instance Show CreditCardNumber where
+  showsPrec i (CreditCardNumber str) = showString str
+
+instance Reason CreditCardNumber where
+  reason _ = "credit card number"
+  washtype _ = "CreditCardNumber"
+
+-- |Reads credit card expiration dates in format ##\/##.
+data CreditCardExp = CreditCardExp { cceMonth :: Int, cceYear :: Int }
+
+instance Read CreditCardExp where
+  readsPrec i str = 
+    g $ dropWhile isSpace str
+    where
+    g str@(mh: ml: '/': yh: yl:cces) =
+      let mo, yr :: Int
+	  mo = read [mh, ml]
+	  yr = read [yh, yl]
+      in if isDigit mh && isDigit ml && isDigit yh && isDigit yl && mo >= 1 && mo <= 12
+      then [(CreditCardExp mo yr, cces)]
+      else []
+    g _ = []
+
+instance Show CreditCardExp where
+  showsPrec i cce = shows (cceMonth cce) . showChar '/' . shows (cceYear cce)
+
+instance Reason CreditCardExp where
+  reason _ = "credit card expiration date: MM/YY"
+  washtype _ = "CreditCardExp"
+
+-- |Non-empty strings.
+newtype NonEmpty = NonEmpty { unNonEmpty :: String }
+
+instance Read NonEmpty where
+  readsPrec i [] = []
+  readsPrec i str = [(NonEmpty str, "")]
+
+instance Show NonEmpty where
+  showsPrec i (NonEmpty str) = showString str
+
+instance Reason NonEmpty where
+  reason _ = "non empty string"
+  washtype _ = "NonEmpty"
+
+-- |Phone numbers.
+newtype Phone = Phone { unPhone :: String }
+
+phoneChars = "0123456789 +-/()"
+
+instance Read Phone where
+  readsPrec i =
+    parserToRead $
+    (many1 (oneOf phoneChars) >>= (return . Phone))
+
+instance Show Phone where
+  showsPrec i (Phone str) = showString str
+
+instance Reason Phone where
+  reason _ = "non empty string of " ++ show phoneChars
+  washtype _ = "Phone"
+
+-- |Non-empty strings of digits.
+newtype AllDigits = AllDigits { unAllDigits :: String }
+
+instance Read AllDigits where
+  readsPrec i str =
+    let (digits, str') = span isDigit $ dropWhile isSpace str in 
+    if null digits then [] else [(AllDigits digits, str')]
+
+instance Show AllDigits where
+  showsPrec i (AllDigits str) = showString str
+
+instance Reason AllDigits where
+  reason _ = "non empty string of digits"
+  washtype _ = "AllDigits"
+
+-- |Arbitrary string data. No quotes required.
+newtype Text = Text { unText :: String }
+
+instance Read Text where
+  readsPrec i str = [(Text str, "")]
+  
+instance Show Text where
+  showsPrec i (Text str) = showString str
+
+instance Reason Text where
+  reason _ = "arbitrary string"
+  washtype _ = "Text"
+
+-- |Date and time in ISO8601 format
+instance Reason ISODate where
+  reason _ = "date in ISO8601 format"
+  washtype _ = "ISODate"
+
+instance Reason ISOTime where
+  reason _ = "time in ISO8601 format"
+  washtype _ = "ISOTime"
+
+instance Reason ISODateAndTime where
+  reason _ = "date and time in ISO8601 format"
+  washtype _ = "ISODateAndTime"
+
+-- |String in URL format
+instance Read URL where
+  readsPrec i = parserToRead parseURL
+
+parseURL = 
+  do scheme <- parseScheme
+     colon <- char ':'
+     rest <- many1 ascii
+     return $ URL (scheme ++ colon : rest)
+
+parseScheme =
+  do c <- alpha
+     cs <- many SimpleParser.print
+     return (c:cs)
+
+instance Show URL where
+  showsPrec i (URL str) = showString str
+
+instance Reason URL where
+  reason _ = "URL"
+
+-- |A Password is a string of length >= 8 with characters taken from at least
+-- three of the four sets: lower case characters, upper case characters, digits,
+-- and special characters.
+newtype Password = Password { unPassword :: String }
+
+instance Reason Password where
+  reason _ = "Password string of length >= 8 with characters taken from at \
+             \least three of the four sets: lower case characters, upper case \
+	     \characters, digits, and special characters"
+
+instance Read Password where
+  readsPrec i str =
+    let lower = any isLower str
+	upper = any isUpper str
+	digit = any isDigit str
+	specl = any isSpecl str
+	isSpecl c = isPrint c && not (isAlphaNum c)
+	nclasses = sum (map fromEnum [lower, upper, digit, specl])
+    in 
+    if   length str >= 8 && nclasses >= 3
+    then [(Password str, "")]
+    else []
+
+instance Show Password where
+  showsPrec i (Password pw) = showString pw
+
+-- |Data type for transforming a field into an optional one. The 'Read' syntax of
+-- @Absent@ is the empty string, whereas the 'Read' syntax of @Present a@ is just the
+-- 'Read' syntax of @a@. Analogously for 'Show'.
+data Optional a = Absent | Present a
+
+-- |Analogous to Maybe.fromJust
+fromPresent :: Optional a -> a
+fromPresent ~(Present x) = x
+-- |Analogous to Maybe.fromMaybe
+fromOptional :: a -> Optional a -> a
+fromOptional x Absent      = x
+fromOptional _ (Present x) = x
+
+instance Show a => Show (Optional a) where
+  showsPrec i Absent = id
+  showsPrec i (Present x) = showsPrec i x
+
+-- |Optional items are either empty or just the item
+instance (Read a) => Read (Optional a) where
+  readsPrec i "" = [(Absent, "")]
+  readsPrec i xs = [(Present v, rest) | (v, rest) <- readsPrec i xs]
+
+instance (Reason a) => Reason (Optional a) where
+  reason x = "optional " ++ reason (fromPresent x)
+
diff --git a/WASH/CGI/Frames.hs b/WASH/CGI/Frames.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Frames.hs
@@ -0,0 +1,90 @@
+module WASH.CGI.Frames where
+
+import WASH.Utility.Auxiliary
+import qualified WASH.CGI.HTMLWrapper as H hiding (map)
+import WASH.CGI.CookieIO
+import WASH.CGI.CGIConfig
+import WASH.CGI.CGIMonad
+import WASH.CGI.CGIOutput
+import WASH.CGI.CGITypes
+import WASH.CGI.EventHandlers
+import WASH.CGI.Fields
+import WASH.CGI.Images
+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..))
+import qualified WASH.Utility.URLCoding as URLCoding
+import WASH.Utility.JavaScript
+
+
+-- ======================================================================
+-- frames
+
+-- |Overall layout of a frame set: row-wise or column-wise.
+data FrameLayout = ROWS | COLS
+  deriving Show
+
+-- |Division of space between elements of a frameset. See
+-- <http://wp.netscape.com/assist/net_sites/frame_syntax.html>
+data FrameSpacing = FrameAbsolute Int			    -- ^in pixels
+		  | FrameRelative Int			    -- ^the @*@ format
+		  | FramePercent  Int			    -- ^the @%@ format
+
+instance Show FrameSpacing where
+  showsPrec _ (FrameAbsolute n) = shows n
+  showsPrec _ (FrameRelative n) = shows n . showChar '*'
+  showsPrec _ (FramePercent  n) = shows n . showChar '%'
+  showList [] = id
+  showList [ffmt] = shows ffmt
+  showList (ffmt:ffmts) = shows ffmt . showChar ',' . showList ffmts
+
+-- |Abstract data type of frame set generators.
+data FrameSet = FrameSet { unFrameSet :: H.WithHTML () IO () }
+
+-- |Create a frameset, given a layout, its spacing, and its subframe(set)s.
+makeFrameset :: (CGIMonad cgi) =>
+        FrameLayout
+	-> [(FrameSpacing, cgi FrameSet)]
+	-> cgi FrameSet
+makeFrameset layout subframes =
+  do nested <- mapM snd subframes
+     return $ FrameSet $
+       H.frameset_S (foldr (( >> ) . unFrameSet) 
+			   (H.attr_SD (show layout) (show (map fst subframes)))
+			   nested)
+
+-- |Create a single frame. Returns the assigned name of the frame.
+makeFrame :: (CGIMonad cgi) =>
+	H.WithHTML x IO ()		-- ^additional attributes to <frame>
+	-> cgi ()			-- ^contents of the frame
+	-> cgi FrameSet			-- ^returns HTML generator for the frame
+makeFrame attrs subAction =
+  do n <- incFrame
+     -- unsafe_io (appendFile "/tmp/CGIFRAME" $ ("makeFrame #" ++ show n ++ "\n"))
+     subAction
+     baseUrl <- getUrl
+     parm <- getParm
+     let url = baseUrl ++ '?' : URLCoding.encode (frameFileName parm n)
+	 name = ("FRAME"++show n)
+     -- unsafe_io (appendFile "/tmp/CGIFRAME" $ ("makeFrame finished\n"))
+     return $ FrameSet $
+       H.frame_S (do attrs
+		     H.attr_SD "SRC" url
+		     H.attr_SD "NAME" name)
+
+frameFileName parm frameno =
+  "FRAME:" ++ show frameno ++ ":" ++ (URLCoding.encode $ show $ parm)
+
+frameFullPath parm frameno = 
+  frameDir ++ frameFileName parm frameno
+
+-- |Required wrapper for pages with frames. Takes a title and a FrameSet
+-- generator and displays the page.
+framesetPage :: (CGIMonad cgi) => String -> cgi FrameSet -> cgi ()
+framesetPage ttl framesetgen =
+  do resetFrame
+     FrameSet pagegen <- framesetgen
+     let ma = H.htmlHeader ttl pagegen
+     resetFrame
+     wrapCGI $ \ cgistate ->
+       do elem <- H.build_document ma
+	  (nextaction (pageInfo cgistate) elem) (nextCGIState cgistate)
+
diff --git a/WASH/CGI/GuaranteedCGI.hs b/WASH/CGI/GuaranteedCGI.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/GuaranteedCGI.hs
@@ -0,0 +1,189 @@
+module WASH.CGI.GuaranteedCGI (
+	-- * Basics
+	CGI, CGIMonad
+	, ask, tell, io, run
+	, once, forever, callWithCurrentHistory, htell, askOffline
+	-- * Links and Images
+	, Image, internalImage, externalImage, makeImg, makeRef, makePopupRef, makeA
+	, backLink, hlink, popuplink, restart
+	-- * Page Templates
+	, standardPage, htmlHeader, WASH.CGI.GuaranteedCGI.html, cssPage, cssHeader
+	-- * Forms and Widgets
+	, HTMLField
+	-- ** Form Creation
+	, makeForm, standardQuery
+	-- ** Form Submission
+	, submit, submit0, defaultSubmit, resetField, activeInputField, activate
+	, submitLink, submitLink0, defaultSubmitLink
+        , submitx, DTree, dtleaf, dtnode
+	-- ** Textual Input 
+	, inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea
+	-- ** Checkbox
+	, checkboxInputField
+	-- ** Button
+	, makeButton, RadioGroup, radioGroup, radioButton, radioError
+	-- ** Image
+	, imageField
+	-- ** Selection Box
+	, selectMultiple, selectSingle, selectBounded
+	-- ** File
+	, fileInputField, checkedFileInputField
+	-- ** Handle Manipulation
+	, InputField, VALID, INVALID, value, InputHandle, HasValue
+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F8 (F8)
+	, FL (FL), FA (FA)
+	-- ** Attribute Shortcuts
+	, fieldSIZE, fieldMAXLENGTH, fieldVALUE
+	-- * Advanced
+	-- ** Installing Translators
+	, runWithHook, docTranslator, lastTranslator
+	-- ** Outputable Stuff
+	, CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)
+	-- ** Predefined Types for Input Fields
+	, Text(..), NonEmpty(..), AllDigits(..), Phone(..)
+	, EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)
+	, Password(..), Optional(..)
+	-- ** Lowlevel Options
+	, CGIOption (..), CGIOptions, URL (..)
+	-- ** Servlets
+	, makeServlet, makeServletWithHook
+	-- * HTML and Style
+	, module WASH.HTML.HTMLMonad98
+	, module WASH.CGI.Style
+	-- * Experimental Stuff
+	, FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage
+	) where
+
+import WASH.CGI.CGIMonad (CGIMonad())
+import WASH.CGI.CGITypes
+import WASH.CGI.Fields
+import WASH.CGI.Style
+import qualified WASH.CGI.CGIInternals as CGIInternals
+import WASH.CGI.CGI (
+  	CGI
+	, tell, io, run, once, forever, callWithCurrentHistory
+	, Image, internalImage, externalImage
+	, HTMLField, RadioGroup, radioGroup, InputField, VALID, INVALID, value
+	, InputHandle, HasValue
+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F8 (F8)
+	, FL (FL), FA (FA)
+	, DTree, dtleaf, dtnode
+	, runWithHook, docTranslator, lastTranslator
+	, CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)
+	, Text(..), NonEmpty(..), AllDigits(..)
+	, EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)
+	, CGIOption(..), CGIOptions
+	, makeServlet, makeServletWithHook
+	, FrameSet, FrameLayout(..), FrameSpacing(..)
+	, makeFrameset, framesetPage
+	, Style(..)
+	)
+
+import WASH.HTML.HTMLMonad98 hiding (html)
+import qualified WASH.CGI.CGI as CGI
+
+ask :: (CGIMonad cgi) => WithHTML DOCUMENT cgi a -> cgi ()
+ask = CGI.ask
+htell :: (CGIMonad cgi) => WithHTML HTML IO () -> cgi a
+htell = CGI.htell
+askOffline :: (CGIMonad cgi) => WithHTML HTML cgi a -> (Element -> IO ()) -> cgi ()
+askOffline = CGI.askOffline
+makeImg :: (Monad cgi, AdmitChildIMG y) => Image -> HTMLField cgi IMG y ()
+makeImg = CGI.makeImg
+makeRef :: (CGIMonad cgi, AdmitChildA y, Monad m) => String -> WithHTML A m () -> cgi (WithHTML y m ())
+makeRef = CGI.makeRef
+makeA :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y ()
+makeA = CGI.makeA
+makePopupRef :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y ()
+makePopupRef = CGI.makePopupRef
+backLink :: (AdmitChildA x, Monad m) => HTMLCons A x m ()
+backLink = CGI.backLink
+hlink :: (AdmitChildA y, Monad m) => URL -> HTMLCons A y m ()
+hlink = CGI.hlink
+popuplink :: (AdmitChildA y, Monad m) => String -> URL -> HTMLCons A y m ()
+popuplink = CGI.popuplink
+restart :: CGI ()
+restart = CGI.restart
+makeForm :: (AdmitChildFORM y) => WithHTML FORM CGI a -> WithHTML y CGI ()
+makeForm = CGI.makeForm
+standardQuery :: String -> WithHTML FORM CGI a -> CGI ()
+standardQuery = CGI.standardQuery
+submit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y ()
+submit = CGI.submit
+submit0 :: (CGIMonad cgi, AdmitChildINPUT y) => cgi () -> HTMLField cgi INPUT y ()
+submit0 = CGI.submit0
+defaultSubmit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y ()
+defaultSubmit = CGI.defaultSubmit
+submitLink :: (CGIMonad cgi, AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLCons A y cgi ()
+submitLink = CGI.submitLink
+submitLink0 :: (AdmitChildA y) => CGI () -> HTMLCons A y CGI ()
+submitLink0 = CGI.submitLink0
+defaultSubmitLink :: (AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLCons A y CGI ()
+defaultSubmitLink = CGI.defaultSubmitLink
+submitx :: (AdmitChildINPUT y) => DTree cgi INPUT y -> HTMLField cgi INPUT y ()
+submitx = CGI.submitx
+resetField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField () INVALID)
+resetField = CGI.resetField
+activeInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => (a -> cgi ()) -> HTMLField cgi INPUT y ()
+activeInputField = CGI.activeInputField
+activate :: (CGIMonad cgi, InputHandle (i a), HasValue i, AdmitChildINPUT y) => (a -> cgi ()) -> HTMLField cgi INPUT y (i a INVALID) -> HTMLField cgi INPUT y (i a INVALID)
+activate = CGI.activate
+inputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID)
+inputField = CGI.inputField
+checkedTextInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe String -> Maybe String) -> HTMLField cgi INPUT y (InputField String INVALID)
+checkedTextInputField = CGI.checkedTextInputField
+textInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField String INVALID)
+textInputField = CGI.textInputField
+passwordInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID)
+passwordInputField = CGI.passwordInputField
+makeTextarea :: (CGIMonad cgi, AdmitChildTEXTAREA y) => String -> HTMLField cgi TEXTAREA y (InputField String INVALID)
+makeTextarea = CGI.makeTextarea
+checkboxInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID)
+checkboxInputField = CGI.checkboxInputField
+makeButton :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID)
+makeButton = CGI.makeButton
+radioButton :: (CGIMonad cgi, AdmitChildINPUT y, Show a) => RadioGroup a INVALID -> a -> HTMLField cgi INPUT y ()
+radioButton = CGI.radioButton
+radioError :: (CGIMonad cgi, AdmitChildIMG x) => RadioGroup a INVALID -> WithHTML x cgi ()
+radioError = CGI.radioError
+imageField :: (CGIMonad cgi, AdmitChildINPUT y) => Image -> HTMLField cgi INPUT y (InputField (Int, Int) INVALID)
+imageField = CGI.imageField
+selectMultiple :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> [a] -> [a] -> (Int, Int) -> HTMLField cgi SELECT y (InputField [a] INVALID)
+selectMultiple = CGI.selectMultiple
+selectSingle :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> Maybe a -> [a] -> HTMLField cgi SELECT y (InputField a INVALID)
+selectSingle = CGI.selectSingle
+selectBounded :: (CGIMonad cgi, AdmitChildSELECT y, Enum a, Bounded a, Read a, Show a, Eq a) => Maybe a -> HTMLField cgi SELECT y (InputField a INVALID)
+selectBounded = CGI.selectBounded
+checkedFileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe FileReference -> Maybe FileReference) -> HTMLField cgi INPUT y (InputField FileReference INVALID)
+checkedFileInputField = CGI.checkedFileInputField
+fileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField FileReference INVALID)
+fileInputField = CGI.fileInputField
+
+fieldSIZE :: (Monad m, AdmitAttrSIZE e, AttrValueSIZE v) => v -> WithHTML e m ()
+fieldSIZE = WASH.HTML.HTMLMonad98.atSIZE
+fieldMAXLENGTH :: (Monad m, AdmitAttrMAXLENGTH e, AttrValueMAXLENGTH v) => v -> WithHTML e m ()
+fieldMAXLENGTH = WASH.HTML.HTMLMonad98.atMAXLENGTH
+fieldVALUE :: (Monad m, AdmitAttrVALUE e, AttrValueVALUE v) => v -> WithHTML e m ()
+fieldVALUE = WASH.HTML.HTMLMonad98.atVALUE
+
+-- module HTMLWrapper
+standardPage :: (AdmitChildHTML y, Monad m) => String -> WithHTML BODY m a -> WithHTML y m ()
+standardPage = CGI.standardPage
+htmlHeader :: (AdmitChildHTML y, Monad m) => String -> WithHTML HTML m a -> WithHTML y m ()
+htmlHeader = CGI.htmlHeader
+html :: (Monad m, AdmitChildHTML y) => WithHTML HTML m a -> WithHTML y m ()
+html = CGI.html
+cssHeader :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML HTML m a -> WithHTML y m ()
+cssHeader = CGI.cssHeader
+cssPage :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML BODY m a -> WithHTML y m ()
+cssPage = CGI.cssPage
+
+-- module Style
+using :: (AdmitAttrSTYLE x, Monad m)
+	=> Style
+	-> (WithHTML x m b -> c)	-- ^a field constructor, typically 'HTMLField'
+	-> WithHTML x m b -> c		-- ^styled version of this constructor
+using = CGI.using
+
+makeFrame :: WithHTML FRAME IO () -> CGI () -> CGI FrameSet
+makeFrame = CGI.makeFrame
diff --git a/WASH/CGI/HTMLMail.hs b/WASH/CGI/HTMLMail.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/HTMLMail.hs
@@ -0,0 +1,10 @@
+module WASH.CGI.HTMLMail where
+
+import Prelude hiding (head,div,span)
+import WASH.HTML.HTMLMonad hiding (map)
+import WASH.Mail.MIME 
+
+-- |transform HTML Element into document suitable for sending as email.
+htmlDOC :: Element -> DOC
+htmlDOC el = 
+  binaryDOC "text" "html" (show el)
diff --git a/WASH/CGI/HTMLWrapper.hs b/WASH/CGI/HTMLWrapper.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/HTMLWrapper.hs
@@ -0,0 +1,44 @@
+module WASH.CGI.HTMLWrapper
+  (module H, module WASH.CGI.HTMLWrapper) where
+
+import qualified Prelude
+import WASH.HTML.HTMLMonad as H hiding (html)
+
+-- |create a standard XHTML page from a title string and body elements
+standardPage :: (Prelude.Monad m) => 
+		Prelude.String -> WithHTML x m a -> WithHTML y m ()
+standardPage ttl elems =
+  htmlHeader ttl (body_S (h1_S (text ttl) ## elems))
+
+-- |create a standard XHTML page without heading from a title string and body elements
+htmlHeader :: (Prelude.Monad m) =>
+	      Prelude.String -> WithHTML x m a -> WithHTML y m ()
+htmlHeader ttl elems =
+  html (head_S (title_S (text ttl))
+     ## elems)
+
+-- |create a standard XHTML page from a title string, a stylesheet URL and body
+-- elements 
+cssPage :: (Prelude.Monad m) =>
+	   Prelude.String -> Prelude.String -> WithHTML x m a -> WithHTML y m ()
+cssPage ttl cssurl elems =
+  cssHeader ttl cssurl (body_S (h1_S (text ttl) ## elems))
+
+-- |create an XHTML page with CSS reference but without heading from a title
+-- string, the URL of the stylesheet and body elements
+cssHeader :: (Prelude.Monad m) =>
+	     Prelude.String -> Prelude.String -> WithHTML x m a -> WithHTML y m ()
+cssHeader ttl cssurl elems =
+  html (head_S (do title_S (text ttl)
+		   link_S (do attr_SS "rel" "stylesheet"
+			      attr_SS "type" "text/css" 
+			      attr_SD "href" cssurl))
+     ## elems)
+
+-- |create a bare XHTML root tag with proper namespace attribute
+html :: (Prelude.Monad m) =>
+	WithHTML x m a -> WithHTML y m ()
+html elems =
+  html_T (do elems
+	     attr_SS "xmlns" "http://www.w3.org/1999/xhtml")
+
diff --git a/WASH/CGI/HTTP.hs b/WASH/CGI/HTTP.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/HTTP.hs
@@ -0,0 +1,42 @@
+module WASH.CGI.HTTP where
+
+import Char
+
+data Method =
+    OPTIONS
+  | GET
+  | HEAD
+  | POST
+  | PUT
+  | DELETE
+  | TRACE
+  | CONNECT
+  | Extension String
+  deriving Eq
+
+instance Show Method where
+  showsPrec _ OPTIONS = showString "OPTIONS"
+  showsPrec _ GET     = showString "GET"
+  showsPrec _ HEAD    = showString "HEAD"
+  showsPrec _ POST    = showString "POST"
+  showsPrec _ PUT     = showString "PUT"
+  showsPrec _ DELETE  = showString "DELETE"
+  showsPrec _ TRACE   = showString "TRACE"
+  showsPrec _ CONNECT = showString "CONNECT"
+  showsPrec _ (Extension s) = showString s
+
+instance Read Method where
+  readsPrec _ s =
+    let (token, rest) = span isAlphaNum s in
+    [(
+     case token of
+       "OPTIONS" -> OPTIONS
+       "GET" -> GET
+       "HEAD" -> HEAD
+       "POST" -> POST
+       "PUT" -> PUT
+       "DELETE" -> DELETE
+       "TRACE" -> TRACE
+       "CONNECT" -> CONNECT
+       other -> Extension other
+     , dropWhile isSpace rest)]
diff --git a/WASH/CGI/Images.hs b/WASH/CGI/Images.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Images.hs
@@ -0,0 +1,20 @@
+module WASH.CGI.Images (nothing, question, nothingURL, questionURL) where
+
+import WASH.CGI.CGITypes
+import WASH.Utility.RFC2397
+import WASH.Utility.JavaScript
+
+rawNothing1 = "GIF89a\SOH\NUL\SOH\NUL\128\NUL\NUL\NUL\NUL\NUL\NUL\NUL\216!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\SOH\NUL\SOH\NUL\NUL\STX\STXD\SOH\NUL;"
+rawNothing = "GIF89a\DLE\NUL\DLE\NUL\128\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\DLE\NUL\DLE\NUL\NUL\STX\SO\132\143\169\203\237\SI\163\156\180\218\139\179>\ENQ\NUL;"
+
+rawQuestion = "GIF89a\DLE\NUL\DLE\NUL\128\NUL\NUL\NUL\NUL\NUL\255\NUL\NUL!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\DLE\NUL\DLE\NUL\NUL\STX#\132\GS\EM\199\167\191\SUBP\140\182$\177\204\250\194\238\129\155\181Ub9E\136\SUB~\229\199\162\242\140\146\178}\DC4\NUL;"
+
+nothing = FreeForm "nothing.gif" "image/gif" rawNothing
+question = FreeForm "question.gif" "image/gif" rawQuestion
+
+nothingURL = "javascript:" ++ jsShow rawNothing
+questionURL = "javascript:" ++ jsShow rawQuestion
+
+-- data URL not universally supported
+nothingURLdata  = encode ("image/gif", rawNothing)
+questionURLdata = encode ("image/gif", rawQuestion)
diff --git a/WASH/CGI/InputHandle.hs b/WASH/CGI/InputHandle.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/InputHandle.hs
@@ -0,0 +1,20 @@
+-- © 2005 Peter Thiemann
+{-|
+  Internal use only.
+  Provides access to class "InputHandle" and thus enables the construction 
+  new instances of this class, which requires knowledge about programming of
+  validations. 
+  -} 
+module WASH.CGI.InputHandle where
+
+import WASH.CGI.CGIInternals
+
+class HasValue i where
+  -- | extract a value from various kinds of input handles
+  value :: i a VALID -> a
+
+class InputHandle h where
+  -- | transforms an unvalidated input handle into either an error or a valid handle
+  validate :: h INVALID -> Either [ValidationError] (h VALID)
+  isBound  :: h INVALID -> Bool
+  ihNames  :: h INVALID -> [String]
diff --git a/WASH/CGI/LogEntry.hs b/WASH/CGI/LogEntry.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/LogEntry.hs
@@ -0,0 +1,53 @@
+-- © 2001- 2006 Peter Thiemann
+-- |Definition of the type of the redo log entries
+module WASH.CGI.LogEntry where
+
+import WASH.CGI.RawCGITypes
+
+data PARAMETER 
+  = PAR_RESULT String		-- ^ result of an IO operation shown as a string
+  | PAR_VALUES CGIParameters	-- ^ record of a form input
+  | PAR_MARK   String		-- ^ recorded stateID before the mark
+  | PAR_IGNORED
+  | PAR_TRANS  String		-- ^ recorded stateID at start of transaction
+  | PAR_CRE_TV String String    -- ^ record of a @create@ or @init@ operation
+  | PAR_REM_TV String	        -- ^ record of a @remove@ operation
+  | PAR_GET_TV String String    -- ^ record of a @get@ operation
+  | PAR_SET_TV String String	-- ^ record of a @set@ operation
+  | PAR_DB     String		-- ^ record entry for all DB operations.
+                                -- the string is already the result of a 
+                                -- show operation for DB tuples, so it is
+			        -- doubly encoded :-(
+
+instance Show PARAMETER where
+  showsPrec i par = case par of
+    PAR_RESULT str -> showString ":R" . shows str
+    PAR_VALUES cps -> showString ":V" . shows cps
+    PAR_MARK   str -> showString ":M" . shows str
+    PAR_IGNORED    -> showString ":I"
+    PAR_TRANS  str -> showString ":T" . shows str
+    PAR_CRE_TV n v -> showString ":C" . shows n . shows v
+    PAR_REM_TV n   -> showString ":E" . shows n
+    PAR_GET_TV n v -> showString ":G" . shows n . shows v
+    PAR_SET_TV n v -> showString ":S" . shows n . shows v
+    PAR_DB     str -> showString ":D" . shows str
+
+instance Read PARAMETER where
+  readsPrec i str = case str of
+    ':' : rest -> g rest
+    _  -> []
+    where g ('R' : str) = [(PAR_RESULT v, rest) | (v, rest) <- reads str]
+	  g ('V' : str) = [(PAR_VALUES v, rest) | (v, rest) <- reads str]
+	  g ('M' : str) = [(PAR_MARK   v, rest) | (v, rest) <- reads str]
+	  g ('I' : str) = [(PAR_IGNORED, str)]
+	  g ('T' : str) = [(PAR_TRANS  v, rest) | (v, rest) <- reads str]
+	  g ('C' : str) = [(PAR_CRE_TV n v, rest)
+			  |(n, str1) <- reads str, (v, rest) <- reads str1]
+	  g ('E' : str) = [(PAR_REM_TV n, rest)
+			  |(n, rest) <- reads str]
+	  g ('G' : str) = [(PAR_GET_TV n v, rest)
+			  |(n, str1) <- reads str, (v, rest) <- reads str1]
+	  g ('S' : str) = [(PAR_SET_TV n v, rest)
+			  |(n, str1) <- reads str, (v, rest) <- reads str1]
+	  g ('D' : str) = [(PAR_DB v, rest)     | (v, rest) <- reads str]
+	  g _           = []
diff --git a/WASH/CGI/MakeTypedName.hs b/WASH/CGI/MakeTypedName.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/MakeTypedName.hs
@@ -0,0 +1,17 @@
+module WASH.CGI.MakeTypedName where
+
+import WASH.CGI.Types
+
+import WASH.Utility.SHA1
+import qualified WASH.Utility.Base32 as Base32
+
+-- |Create a probabilistically unique filename from a name and a type
+-- descriptor. 
+makeTypedName :: String -> TySpec -> String
+makeTypedName s tys = 
+  Base32.encode (sha1 s) ++ '-' : Base32.encode (sha1 (tid tys ""))
+
+-- |Create a probabilistically unique filename from a name and the type of a given value. 
+makeTypedNameFromVal :: Types a => String -> a -> String
+makeTypedNameFromVal name val =
+  makeTypedName name (ty val)
diff --git a/WASH/CGI/PPM.hs b/WASH/CGI/PPM.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/PPM.hs
@@ -0,0 +1,285 @@
+-- © 2001 Peter Thiemann
+module WASH.CGI.PPM where
+
+import Char
+
+data Pixmap =
+     Pixmap	{ width :: Int
+     		, height :: Int
+		, maximumColorValue :: Int
+		, pixelFun :: Int -> Int -> Pixel
+		}
+
+type Pixel = (Int, Int, Int)
+
+instance Show Pixmap where
+  show pm = if maximumColorValue pm > 255
+  	    then showPixmap pm "P3" showAsciiPixel
+	    else showPixmap pm "P6" showBinaryPixel
+	    
+showPixmap pm code showPixel =
+  let w = width pm
+      h = height pm
+  in
+  code ++
+  '\n' : (show w) ++
+  '\n' : (show h) ++
+  '\n' : (show $ maximumColorValue pm) ++
+  '\n' : [ ch | y <- [1..h], x <- [1..w], ch <- showPixel (pixelAt pm x y)]
+
+showAsciiPixel (r, g, b) =
+  show r ++ ' ' : show g ++ ' ' : show b ++ "\n"
+
+showBinaryPixel (r, g, b) =
+  [chr r, chr g, chr b]
+
+instance Read Pixmap where
+  readsPrec i = readsPixmap
+
+readsPixmap ('P':'3':rest) = readsPixmap1 readsAsciiPixel (dropWhile isSpace rest)
+readsPixmap ('P':'6':rest) = readsPixmap1 readsBinaryPixel (dropWhile isSpace rest)
+readsPixmap str = []
+
+readsPixmap1 readsPixel str = 
+  do (w, rest1) <- reads str
+     (h, rest2) <- reads (dropWhile isSpace rest1)
+     (m, rest3) <- reads (dropWhile isSpace rest2)
+     (pixs, rest4) <- readsPixels w h readsPixel (dropWhile isSpace rest3)
+     return (Pixmap { width = w, 
+                      height = h, 
+		      maximumColorValue = m, 
+		      pixelFun = \x y -> (pixs !! y) !! x }
+     	    ,dropWhile isSpace rest4)
+
+readsPixels w h readsPixel str =
+  if h > 0 
+  then do (sl1, rest1) <- readsScanline w readsPixel str
+	  (sls, rest2) <- readsPixels w (h-1) readsPixel rest1
+	  return (sl1 : sls, rest2)
+  else return ([], str)
+
+readsScanline w readsPixel str =
+  if w > 0 
+  then do (pix1, rest1) <- readsPixel str
+	  (pixs, rest2) <- readsScanline (w-1) readsPixel rest1
+	  return (pix1 : pixs, rest2)
+  else return ([], str)
+
+readsAsciiPixel str =
+  do (r, rest1) <- reads (dropWhile isSpace str)
+     (g, rest2) <- reads (dropWhile isSpace rest1)
+     (b, rest3) <- reads (dropWhile isSpace rest2)
+     return ((r,g,b), rest3)
+
+readsBinaryPixel (cr:cg:cb:rest) =
+  return ((ord cr, ord cg, ord cb), rest)
+readsBinaryPixel _ =
+  []
+  
+  
+
+
+-- ======================================================================
+
+create :: Int -> Int -> Int -> Pixel -> Pixmap
+create w h m p = 
+  Pixmap w h m (const (const p))
+
+oval :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Bool -> Pixmap
+line :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Pixmap
+rectangle :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Bool -> Pixmap
+-- arc
+-- poly
+-- text
+-- bitmap
+-- image 
+
+oval pm (xul,yul) (xlr,ylr) p fill =
+  pm { pixelFun = fun }
+  where w2 = (xlr - xul) `div` 2
+	h2 = (ylr - yul) `div` 2
+	xm = xul + w2
+	ym = yul + h2
+	lastfun = pixelFun pm
+	fun x y | y < yul || y > ylr || x < xul || x > xlr = lastfun x y
+	        | d <= 1.0 && (fill || d >= 0.9) = p
+	        | otherwise = lastfun x y
+	  where d = fromIntegral ((x - xm) ^ 2) / fromIntegral (w2 ^ 2) +
+		    fromIntegral ((y - ym) ^ 2) / fromIntegral (h2 ^ 2)
+
+rectangle pm (xul,yul) (xlr,ylr) p fill =
+  pm { pixelFun = fun }
+  where lastfun = pixelFun pm
+	fun x y | y < yul || y > ylr || x < xul || x > xlr = lastfun x y
+	        | x == xul || x == xlr || y == yul || y == ylr || fill = p
+		| otherwise = lastfun x y
+-- 
+line = line2
+
+line1 pm (xul,yul) (xlr,ylr) p =
+  pm { pixelFun = fun }
+  where lastfun = pixelFun pm
+	fun x y | x < xul && x < xlr || x > xul && x > xlr || y < yul && y < ylr || y > yul && y > ylr = lastfun x y
+	        | (x,y) `elem` points = p
+	        | otherwise = lastfun x y
+	-- suppose abs dx >= abs dy
+	dx = xlr - xul
+	dy = ylr - yul
+	adx = abs dx
+	ady = abs dy
+	sdx = signum dx
+	sdy = signum dy
+	points | adx >= ady = k adx ady sdx sdy xlr ylr (adx `div` 2) (xul,yul)
+	       | otherwise  = 
+       		 [(x,y) | (y,x) <- k ady adx sdy sdx ylr xlr (ady `div` 2) (yul,xul)]
+	k adx ady sdx sdy xlr ylr = m
+	  where m v (x, y) | x == xlr && y == ylr = [(x,y)]
+		           | otherwise = (x, y) : m nv' (nx, ny)
+		  where
+			nv = v - ady
+			nv' | nv > 0 = nv
+			    | otherwise = nv + adx
+			nx  = x + sdx
+			ny  | nv > 0 = y
+			    | otherwise = y + sdy
+
+line2 pm (xul,yul) (xlr,ylr) p =
+  pm { pixelFun = fun }
+  where lastfun = pixelFun pm
+	dx = fromIntegral (xlr - xul)
+	dy = fromIntegral (ylr - yul)
+	xul' = fromIntegral xul
+	yul' = fromIntegral yul
+-- solve: dx1 * dx + dy1 * dy = 0
+	dx1 = - dy
+	dy1 = dx
+	divisor = dy1 * dx - dy
+		
+	fun x y | x < xul && x < xlr ||
+	          x > xul && x > xlr || 
+		  y < yul && y < ylr ||
+		  y > yul && y > ylr = lastfun x y
+		| dx == 0 && x == xul ||
+		  dy == 0 && y == yul = p
+		| d <= lineWidth = p
+		| otherwise = lastfun x y
+	  where x' = fromIntegral x
+		y' = fromIntegral y
+-- solve: x0 = x + t * dx1 
+--     && y0 = y + t * dy1
+--     && x0 = xul + s * dx 
+--     && y0 = yul + s * dy
+-- for x0, y0, s, t
+		s = ((x' - xul') * dy1 + yul' - y') / divisor
+		x0 = xul' + s * dx
+		y0 = yul' + s * dy
+		d = (x0 - x')^2 + (y0 - y')^2
+		lineWidth = 1.0
+
+point pm (x0,y0) p =
+  pm { pixelFun = fun }
+  where lastfun = pixelFun pm
+	fun x y | x == x0 && y == y0 = p
+	        | otherwise = lastfun x y
+
+comp pm1 pm2 (xul,yul) p =
+  pm1 { pixelFun = fun }
+  where 
+    w2 = width pm2
+    h2 = height pm2
+    lastfun = pixelFun pm1
+    fun x y | x2 >= 0 && y2 >= 0 && x2 < w2 && y2 < h2 && p2 /= p = p2
+            | otherwise = lastfun x y
+      where x2 = x - xul
+	    y2 = y - yul
+	    p2 = pixelFun pm2 x2 y2
+
+-- for efficiency and versatility rely on external programs:
+
+-- ppmmake : create a canvas
+-- pbmtext : create a text image (pbmtopgm; pgmtoppm)
+-- pnmcomp : compose two images
+-- giftopnm : image to portable anymap
+
+-- missing: ppmline ppmoval
+
+pixelAt :: Pixmap -> Int -> Int -> Pixel
+pixelAt =
+  pixelFun
+
+-- ======================================================================
+-- a picture data type
+-- ======================================================================
+type Color = (Int, Int, Int)
+data Picture = 
+    Circle Bool		-- radius 1 around origin (filled?)
+  | Square Bool		-- unit square, origin= lower left (filled?)
+  | Line	-- from origin to (1,0)
+  | Colored Color Picture
+  | Translate (Double, Double) Picture
+  | Rotate Double Picture	-- around origin
+  | Scale (Double, Double) Picture
+  | Invert Picture
+  | And [Picture]
+  | Or [Picture]
+
+maxcv (Circle _) = 0
+maxcv (Square _) = 0
+maxcv (Line) = 0
+maxcv (Colored (r,g,b) pic) = maximum [r,g,b,maxcv pic]
+maxcv (Translate _ pic) = maxcv pic
+maxcv (Rotate _ pic) = maxcv pic
+maxcv (Scale _ pic) = maxcv pic
+maxcv (Invert pic) = maxcv pic
+maxcv (And pics) = maximum (0 : map maxcv pics)
+maxcv (Or pics) = maximum (0 : map maxcv pics)
+
+render :: Picture -> Int -> Int -> Color -> Pixmap
+render pic w h bg =
+  Pixmap { width = w, height = h, maximumColorValue = maxcv pic, pixelFun = pixelAt }
+  where pixelAt x y =
+	  case renderPix pic bg (fromIntegral x) (fromIntegral y) (sqrt 2) of
+	    Nothing -> (0,0,0)
+	    Just cl -> cl
+
+renderPix pic bg fx fy fr =
+  case pic of
+    Circle filled ->		-- radius 1 around origin (filled?)
+      let ra = fx * fx + fy * fy in
+      if filled then
+        if ra <= 1 + fr then Just bg else Nothing
+      else
+        if abs (ra - 1) <= fr then Just bg else Nothing
+    Square filled ->		-- unit square, origin= lower left (filled?)
+      if filled then
+        if fx + fr >= 0 && fx - fr <= 1 && fy + fr >= 0 && fy - fr <= 1 
+	then Just bg else Nothing
+      else
+        if abs fx <= fr && fy + fr >= 0 && fy - fr <= 1 
+	|| abs fy <= fr && fx + fr >= 0 && fx - fr <= 1 
+        || abs (fx - 1) <= fr && fy + fr >= 0 && fy - fr <= 1 
+	|| abs (fy - 1) <= fr && fx + fr >= 0 && fx - fr <= 1 
+	then Just bg else Nothing
+    Line ->	-- from origin
+      if abs fx <= fr && fy + fr >= 0 && fy - fr <= 1 
+      then Just bg else Nothing      
+    Colored clr pic ->
+      renderPix pic bg fx fy fr >> Just clr
+    Translate (dx, dy) pic ->
+      renderPix pic bg (fx - dx) (fy - dy) fr
+    Rotate phi pic ->	-- around origin
+      renderPix pic bg (fx * cos (- phi) - fy * sin (- phi)) 
+                       (fx * sin (- phi) + fy * cos (- phi)) fr
+    Scale (sx, sy) pic ->
+      renderPix pic bg (fx / sx) (fy / sy) (max (abs (fr / sx)) (abs (fr / sy)))
+    Invert pic ->
+      case renderPix pic bg fx fy fr of
+        Just _ -> Nothing
+	Nothing -> Just bg
+    And pics ->
+      foldl (\ j pic -> j >> renderPix pic bg fx fy fr) (Just bg) pics
+    Or pics ->
+      foldl (\ j pic -> case j of 
+			  Nothing -> renderPix pic bg fx fy fr
+			  Just clr -> Just clr
+	    ) Nothing pics
diff --git a/WASH/CGI/Persistent2.hs b/WASH/CGI/Persistent2.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Persistent2.hs
@@ -0,0 +1,170 @@
+-- © 2001, 2002, 2003 Peter Thiemann
+{-|This is the preferred, type-indexed implementation of server-side state.
+
+Glossary
+
+A persistent entity (PE) is a time-indexed, named global value.
+The current value of a PE is the value that the PE has now.
+A handle gives access to a snapshot of a persistent entity at a particular time, potentially in the past.
+A handle is /current/ if the value of the PE has not been @set@ or @add@ed to after the creation of the handle.
+-}
+
+module WASH.CGI.Persistent2 (T, init, get, set, add, current) where
+
+import WASH.CGI.CGIConfig
+
+import System
+import Prelude hiding (init)
+import qualified Prelude (init)
+import List hiding (init)
+import qualified List (init)
+import Maybe
+import IO
+import Directory
+import Monad
+import Random
+
+import WASH.Utility.Auxiliary
+import WASH.CGI.CGI hiding (head, div, span, map)
+import WASH.CGI.BaseCombinators (unsafe_io)
+import WASH.CGI.Types
+import qualified WASH.Utility.Locking as L
+
+import WASH.CGI.StateItem
+import WASH.CGI.MakeTypedName
+
+
+-- |@init name initialValue@ creates a new PE with name @name@ with initial
+-- value @initialValue@ and returns the handle to the initial value. If the PE
+-- already exists, then @init@ returns the handle to the current value.
+init    :: (Read a, Show a, Types a) => String -> a -> CGI (T a)
+-- |@get handle@ retrieves the value of @handle@. This value may not be current
+-- because the handle may point to a snapshot from the past.
+get     :: (Read a, Types a) => T a -> CGI a
+-- |@set handle newValue@ tries to overwrite the value of the pe pointed to by
+-- @handle@ with @newValue@. Succeeds @Just handle1@ if @handle@ is current, in
+-- this case it returns a handle to the new value. Fails @Nothing@ if the handle
+-- is not current. 
+set     :: (Read a, Show a, Types a) => T a -> a -> CGI (Maybe (T a))
+-- |@add handle addValue@ conceptually, this operation adds @addValue@ to the
+-- set of values stored in @handle@. Since this set is represented as a list,
+-- @handle@ must point to a value of type @[a]@. Since the PE is assumed to
+-- contain a set, it does not matter if @handle@ is current. However, the
+-- returned handle is guaranteed to be current with a value that contains
+-- @addValue@.
+add     :: (Read a, Show a, Types a) => T [a] -> a -> CGI (T [a])
+-- |@current handle@ returns a handle to the PE pointed to by
+-- @handle@. It returns @Nothing@ if @handle@ is still /current/. Otherwise, it
+-- returns @Just newHandle@ where @newHandle@ is /current/ in the sense defined
+-- above. Using the @newHandle@ obtained from @current@ explicitly discards the
+-- value pointed to by @handle@ in favor of a value that may have been stored
+-- by a concurrently executing script. Use with caution!
+current :: (Read a, Types a) => T a -> CGI (Maybe (T a))
+-- 
+
+
+data P a = P { nr :: Int, vl :: a }
+  deriving (Read, Show)
+
+t :: String -> P a -> T a
+t name (P i a) = T name i
+
+traceInit =
+  -- writeDebugFile (persistent2Dir ++ "TRACE") "" >>
+  return ()
+trace s = 
+  -- appendFile (persistent2Dir ++ "TRACE") (s ++ "\n") >>
+  return ()
+
+init name val = do
+  unsafe_io $
+     assertDirectoryExists (List.init persistent2Dir) (return ())
+  io $ catch (
+     do traceInit
+	trace ("P2: init " ++  name ++ " " ++ show val)
+	trace ("P2: ty = " ++ show myTyspec)
+	trace ("P2: tid ty = " ++ tid myTyspec "")
+	trace ("P2: typedName = " ++ typedName)
+	trace ("P2: fileName = " ++ show fileName)
+	L.obtainLock fileName
+	trace ("P2.init: after obtainLock ")
+	contents <- readFileStrictly fileName
+	trace ("P2.init: after readFileStrictly " ++ contents)
+	L.releaseLock fileName
+	trace ("P2.init: after releaseLock[1] " ++ contents)
+	pairs <- return $ read contents
+	return $ t name $ head $ pairs
+     )
+     $ \ ioError ->
+     do trace ("P2.init: ioError caught")
+	nonce <- randomIO
+	let initialP = P nonce val
+	writeFile fileName (show [initialP])
+	trace ("P2.init: writing " ++ show [initialP])
+	L.releaseLock fileName
+	return (t name initialP)
+  where
+    fileName = persistent2Dir ++ typedName
+    myTyspec = ty val
+    typedName = makeTypedName name myTyspec
+
+get tn@(T name i) =
+  unsafe_io $
+  do trace ("P2: get " ++ name ++ " " ++ show i)
+     L.obtainLock fileName
+     contents <- readFileStrictly fileName
+     L.releaseLock fileName
+     trace ("P2.get: fileName = " ++ show fileName)
+     pairs <- return $ read contents
+     return $ vl $ fromJust $ find ((== i) . nr) pairs
+  where
+    typedName = makeTypedNameFromVal name (tvirtual tn)
+    fileName = persistent2Dir ++ typedName
+
+set (T name i) val =
+  io $
+  do trace ("P2: set " ++ name ++ " " ++ show i ++ " " ++ show val)
+     L.obtainLock fileName
+     contents <- readFileStrictly fileName
+     pairs <- return $ read contents
+     i' <- randomIO
+     if nr (head pairs) == i
+       then do writeFile fileName (show (P i' val : take 15 pairs))
+	       L.releaseLock fileName
+	       return (Just (T name i'))
+       else do L.releaseLock fileName
+	       return Nothing
+  where
+    typedName = makeTypedNameFromVal name val
+    fileName = persistent2Dir ++ typedName
+
+add (T name _) val =
+  io $
+  do trace ("P2: add " ++ name ++ " " ++ show val)
+     L.obtainLock fileName
+     contents <- readFileStrictly fileName
+     pairs <- return $ read contents
+     let P i vals = head pairs
+     i' <- randomIO
+     writeFile fileName (show (P i' (val : vals) : take 15 pairs))
+     L.releaseLock fileName
+     return (T name i')
+  where
+    typedName = makeTypedNameFromVal name [val]
+    fileName = persistent2Dir ++ typedName
+
+current tn@(T name i) =
+  io $
+  do trace ("P2: current " ++ name ++ " " ++ show i)
+     L.obtainLock fileName
+     contents <- readFileStrictly fileName
+     L.releaseLock fileName
+     pairs <- return $ read contents
+     let P i' vals = head pairs
+     if i==i'
+       then return Nothing
+       else return (Just (t name (head pairs)))
+  where
+    typedName = makeTypedNameFromVal name (tvirtual tn)
+    fileName = persistent2Dir ++ typedName
+
diff --git a/WASH/CGI/RawCGI.hs b/WASH/CGI/RawCGI.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/RawCGI.hs
@@ -0,0 +1,10 @@
+-- © 2001, 2002 Peter Thiemann
+module WASH.CGI.RawCGI
+	( CGIProgram
+	, CGIOption(..), CGIOptions
+	, start
+	) where
+
+import WASH.CGI.CGITypes
+import WASH.CGI.RawCGIInternal
+
diff --git a/WASH/CGI/RawCGIInternal.hs b/WASH/CGI/RawCGIInternal.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/RawCGIInternal.hs
@@ -0,0 +1,385 @@
+-- © 2001, 2002 Peter Thiemann
+-- |Low-level interface to CGI scripting.
+module WASH.CGI.RawCGIInternal 
+  (module WASH.CGI.RawCGITypes, module WASH.CGI.RawCGIInternal) 
+  where
+-- (CGIParameter, CGIParameters, start, assocParm, assoc)
+
+import Array
+import Char
+import IO
+import List
+import Maybe
+import Random
+import System
+import WASH.Utility.Auxiliary
+import WASH.Utility.Unique
+import qualified WASH.Utility.URLCoding as URLCoding
+import qualified WASH.Utility.RFC2279 as RFC2279
+
+import WASH.CGI.CGIConfig
+import WASH.CGI.CGITypes
+import WASH.CGI.HTTP
+import WASH.CGI.RawCGITypes
+import WASH.Utility.BulkIO (rawGetBytes)
+
+import WASH.Utility.Hex
+
+import qualified WASH.CGI.Debug as Debug
+
+getGenericOption isOption defaultOption options =
+  fromJust (find isOption (reverse (defaultOption:options)))
+
+-- | Decoding of 'CGIOption'.
+isPortOption NoPort = True
+isPortOption AutoPort = True
+isPortOption (Port _) = True
+isPortOption _ = False
+
+getPortOption =
+  getGenericOption isPortOption AutoPort
+
+-- | Decoding of 'CGIOption'.
+isHttpsOption NoHttps = True
+isHttpsOption AutoHttps = True
+isHttpsOption _ = False
+
+getHttpsOption =
+  getGenericOption isHttpsOption AutoHttps
+
+-- | Decoding of 'CGIOption'.
+isURLOption FullURL = True
+isURLOption PartialURL = True
+isURLOption _ = False
+
+getURLOption =
+  getGenericOption isURLOption PartialURL
+
+-- | Decoding of 'CGIOption'.
+isSessionOption (SessionMode _) = True
+isSessionOption _ = False
+
+getSessionMode =
+  unSessionMode . getGenericOption isSessionOption (SessionMode LogOnly)
+
+fieldName = fst
+fieldContents = snd
+
+-- |Initial and default content type of a link submission
+contentTypeUrlencoded = "application/x-www-form-urlencoded"
+
+-- |Construct a CGI environment from the input and output handle of the current
+-- connection and the CGI variables in the environment.
+initEnv :: Handle -> Handle -> IO CGIEnv
+initEnv hIn hOut =
+  do server_name <- protectedGetEnv "SERVER_NAME" "localhost"
+     server_port <- protectedGetEnv "SERVER_PORT" "80"
+     server_software <- protectedGetEnv "SERVER_SOFTWARE" ""
+     server_protocol <- protectedGetEnv "SERVER_PROTOCOL" ""
+     gateway_interface <- protectedGetEnv "GATEWAY_INTERFACE" ""
+     script_name <- protectedGetEnv "SCRIPT_NAME" ""
+     request_method <- protectedGetEnv "REQUEST_METHOD" "GET"
+     content_length <- protectedGetEnv "CONTENT_LENGTH" "0"
+     content_type <- protectedGetEnv "CONTENT_TYPE" contentTypeUrlencoded
+     http_cookie <- protectedGetEnv "HTTP_COOKIE" ""
+     http_accept <- protectedGetEnv "HTTP_ACCEPT" ""
+     path_info <- protectedGetEnv "PATH_INFO" ""
+     path_translated <- protectedGetEnv "PATH_TRANSLATED" ""
+     remote_host <- protectedGetEnv "REMOTE_HOST" ""
+     remote_addr <- protectedGetEnv "REMOTE_ADDR" ""
+     remote_user <- protectedGetEnv "REMOTE_USER" ""
+     auth_type <- protectedGetEnv "AUTH_TYPE" ""
+     https <- protectedGetEnv "HTTPS" "off"
+     raw_args <- getArgs
+     let byteCount :: Int
+	 byteCount = read ('0':content_length)
+	 httpMethod :: Method
+	 httpMethod = read request_method
+     raw_contents <- case httpMethod of
+		       GET -> return ""
+		       _   -> rawGetBytes hIn byteCount
+     return
+       CGIEnv	{ serverName = server_name
+		, serverPort = server_port
+		, serverSoftware= server_software
+		, serverProtocol = server_protocol
+		, scriptName = script_name
+		, gatewayInterface = gateway_interface
+		, requestMethod = httpMethod
+		, contentLength = content_length
+		, contentType = content_type
+		, httpCookie = http_cookie
+		, httpAccept = http_accept
+		, pathInfo = path_info
+		, pathTranslated = path_translated
+		, remoteHost = remote_host
+		, remoteAddr = remote_addr
+		, remoteUser = remote_user
+		, authType = auth_type
+		, rawContents = raw_contents
+		, rawArgs = raw_args
+		, handle = hOut
+		, httpsEnabled = (https == "on" || server_port == "443")
+		}
+
+-- |Main entry point for low-level CGI scripts. Takes a list of 'CGIOption' and
+-- a 'CGIProgram' and runs it as a CGI script.
+start :: CGIOptions -> (CGIInfo -> CGIParameters -> IO ()) -> IO ()
+start options f = 
+  do env <- initEnv stdin stdout
+     Debug.logInput env
+     -- use from a CGI program forces standard replay implementation
+     startEnv env (SessionMode LogOnly : options) f 
+
+startEnv :: CGIEnv -> CGIOptions -> (CGIInfo -> CGIParameters -> IO ()) -> IO ()
+startEnv env options f =
+  do let portString = 
+	   case getPortOption options of
+	     AutoPort -> ':' : serverPort env
+	     NoPort   -> ""
+	     Port num -> ':' : show num
+	 schemeString =
+	   case getHttpsOption options of
+	     AutoHttps -> if httpsEnabled env then "https" else "http"
+	     NoHttps -> "http"
+	 myurl = 
+	   case getURLOption options of
+	     FullURL ->
+	       schemeString ++ "://" ++ serverName env ++ portString ++
+	 	 scriptName env ++ pathInfo env
+	     PartialURL ->
+	       scriptName env ++ pathInfo env
+	 sessionMode =
+	   getSessionMode options
+	 methodIsGet 
+	   = requestMethod env == GET
+	 contentIsURLEncoded
+	   = contentTypeUrlencoded == map toLower (contentType env)
+	 contents = rawContents env
+	 rawDecodedParameters 
+	   | methodIsGet = []
+	   | contentIsURLEncoded = map decodeLine $ parameterLines contents
+	   | otherwise = decodeMultiPart (contentType env) contents
+	 parsed_cookies = parseCookies $ httpCookie env
+	 info = CGIInfo { cgiUrl = URL myurl
+	 		, cgiPathInfo = pathInfo env
+			, cgiScriptName = scriptName env
+	 		, cgiContentType = contentType env
+			, cgiContents = contents
+			, cgiCookies = parsed_cookies
+			, cgiArgs = rawArgs env
+			, cgiHandle = handle env
+			, cgiSessionMode = sessionMode
+			}
+     decodedParameters <- resolveFiles rawDecodedParameters
+     -- appendDebugFile "/tmp/CGIDECODED" (show decodedParameters)
+     f info decodedParameters
+
+resolveFiles :: [(String, CGIRawValue)] -> IO CGIParameters
+resolveFiles =
+  let resolveOne (key, rv) =
+        case rv of
+          CGIRawString s -> 
+	    return (key, s)
+	  CGIRawFile fileName contentType fileContents ->
+	    do localName <- inventFilePath
+	       writeFile localName fileContents
+	       let fileRef = FileReference
+		           { fileReferenceName = localName
+			   , fileReferenceContentType = contentType
+			   , fileReferenceExternalName = fileName
+			   }
+	       return (key, show fileRef)
+  in mapM resolveOne
+
+parseCookies :: String -> [(String, String)]
+parseCookies str = 
+  let s0 = dropWhile isSpace str in
+  if null s0 then [] else
+  let (item, rest) = span (/= ';') s0 in
+  case span (/= '=') item of
+    (key, '=':value) ->
+      (key, value) : parseCookies (dropWhile (== ';') rest)
+    _ -> 
+      error ("Trying to parse cookie: " ++ str)
+
+dropSpecialParameters :: [(String,a)] -> [(String,a)]
+dropSpecialParameters = filter (f . fieldName)
+	where f ('=':_) = False
+	      f _ = True
+
+decodeMultiPart :: String -> String -> [(String, CGIRawValue)]
+decodeMultiPart contentType contents
+  = let Just boundary = extractBoundary contentType 
+	startBoundary = '-':'-':boundary
+	g source = case 
+	  (
+	  advanceIC startBoundary source >>= \afterBoundary ->
+	  case afterBoundary of 
+	   '-':_ -> Nothing
+	   '\13':'\10':body ->
+		advanceIC "content-disposition: form-data; name=\"" body
+		>>= \fieldNameRest ->
+		let (fieldName, rest) = span (/= '\"') fieldNameRest in
+		advanceIC "\"" rest
+		>>= \mayBeFileNameRest ->
+		(case mayBeFileNameRest of
+		  ';':_ -> advanceIC "; filename=\"" mayBeFileNameRest
+		           >>= \fileNameRest ->
+		           let (fileName, rest) = span (/= '\"') fileNameRest in
+		           advanceIC "\"" rest
+		           >>= \mayBeContentTypeRest ->
+		           return (Just fileName, mayBeContentTypeRest)
+		  _ -> return (Nothing, mayBeFileNameRest))
+		>>= \ (mFileName, fileNameRest) ->
+		let (contentType, rest) =
+		      case advanceIC "\ncontent-type: " fileNameRest of
+		        Just contentTypeRest -> span (/= '\13') contentTypeRest
+		        Nothing -> ("text/plain", fileNameRest) in
+		advanceIC "\n\n" rest
+		>>= \contentRest ->
+		extractContents startBoundary contentRest
+		>>= \ (fieldContents, rest) ->
+		-- fieldName must be rfc1522decoded (?)
+		let moreParms = g rest 
+		    rawvalue = case mFileName of
+				 Nothing ->
+				   CGIRawString $ RFC2279.decode fieldContents
+				 Just fileName ->
+				   CGIRawFile fileName contentType fieldContents
+		in  return ((RFC2279.decode fieldName, rawvalue) : moreParms)
+	   )
+	  of
+	    Just parameters -> parameters
+	    Nothing -> []
+    in g contents
+
+extractContents :: String -> String -> Maybe (String, String)
+extractContents boundary source
+  = g "" source
+  where g rev "" = Nothing
+	g rev ('\r':'\n':xs) = case advanceIC boundary xs of
+				Just _  -> Just (reverse rev, xs)
+				Nothing -> g ('\n':'\r':rev) xs
+	g rev (x:xs) = g (x:rev) xs
+
+
+extractBoundary :: String -> Maybe String
+extractBoundary contentType = advanceIC "multipart/form-data; boundary=" contentType 
+
+advanceIC :: String -> String -> Maybe String
+advanceIC [] ys = Just ys
+advanceIC xs [] = Nothing
+advanceIC (' ':xs) (y:ys)
+	| isSpace y = advanceIC xs (dropWhile isSpace ys)
+advanceIC ('\n':xs) ('\13':'\10':ys)
+	= advanceIC xs ys
+advanceIC (x:xs) (y:ys) 
+	| toUpper x == toUpper y = advanceIC xs ys
+	| otherwise = Nothing
+
+parameterLines :: String -> [String]
+parameterLines "" = []
+parameterLines xs = let (firstPar, restPar) = span (/= '&') xs in
+		    case restPar of
+		      '&' : moreParameters -> firstPar : parameterLines moreParameters
+		      _ -> [firstPar]
+
+decodeLine :: String -> (String, CGIRawValue)
+decodeLine str = 
+  let (name, '=':value) = span (/= '=') str in
+  ( RFC2279.decode $ URLCoding.decode name
+  , CGIRawString $ RFC2279.decode $ URLCoding.decode value)
+
+assocParm :: String -> CGIParameters -> Maybe CGIValue
+assocParm key =
+  listToMaybe . assocParmL key
+
+assocParmL :: String -> CGIParameters -> [CGIValue]
+assocParmL key =
+  map fieldContents . assocParmR key
+
+assocParmR :: String -> CGIParameters -> CGIParameters
+assocParmR key =
+  filter (\parm -> fieldName parm == key) 
+
+assoc :: (Eq a) => a -> [(a,b)] -> Maybe b
+assoc key alist =
+  ass alist 
+  where ass ((a,b):rest) = if a == key then Just b else ass rest
+	ass [] = Nothing -- error ("assoc ("++show key++") "++show alist)
+
+-- update :: [(a,b)] -> a -> b -> [(a,b)]
+-- update alist a b = (a,b) : alist
+
+fieldNames :: CGIParameters -> [String]
+fieldNames = map fieldName
+
+-- encryption
+
+generateKey :: IO (Maybe (Integer, String, String))
+generateKey =
+  try (openFile keyFile ReadMode) >>= g
+  where
+    g (Left ioerror) =
+      return Nothing
+    g (Right h) =
+      do size <- hFileSize h
+	 let size2 = size `div` 2
+	 pos <- randomRIO (0, size2)
+	 if pos < 0
+	    then return Nothing 
+	    else do hSeek h AbsoluteSeek pos
+		    xs <- hGetContents h
+		    g <- getStdGen
+		    return (Just (pos
+		    		 ,randomRs (minBound, maxBound) g
+				 ,extendRandomly xs))
+
+extendRandomly :: [Char] -> [Char]
+extendRandomly xs = h 0 xs
+  where h n (x:xs) = x : h (n + ord x) xs
+	h n []     = randoms (mkStdGen n)
+
+nrNonces :: Int
+nrNonces = 16
+
+makeEncoder :: Maybe (Integer, String, String) -> String -> String
+makeEncoder Nothing xs = xs
+makeEncoder (Just (i, nonces, keys)) xs = 
+  show i ++ ';' : encrypt1 (take nrNonces nonces ++ xs) keys
+
+decode :: String -> IO String
+decode inp = g (reads inp)
+  where
+    g :: [(Integer, String)] -> IO String
+    g ((pos, ';':encrypted) : _) = 
+      do h <- openFile keyFile ReadMode
+	 hSeek h AbsoluteSeek pos
+	 xs <- hGetContents h
+	 return (drop nrNonces $ decrypt1 encrypted (extendRandomly xs))
+    g _ = return inp
+
+encrypt1 inp keys = map chr (enc 0 (map ord inp) (map ord keys))
+  where enc acc [] okeys = []
+	enc acc (oinp : oinps) (okey : okeys) =
+	  let out = (oinp + okey + acc) `mod` 256 in
+	  out : enc ((acc + oinp) `mod` 256) oinps okeys
+
+decrypt1 einp keys = map chr (dec 0 (map ord einp) (map ord keys))
+  where dec acc [] okeys = []
+	dec acc (oeinp : oeinps) (okey : okeys) =
+	  let oinp = (512 + oeinp - okey - acc) `mod` 256 in
+	  oinp : dec ((acc + oinp) `mod` 256) oeinps okeys
+
+encrypt, decrypt :: String -> String -> String
+encrypt = zipWith cadd
+cadd c1 c2 = chr (ord c1 + ord c2 `mod` 256)
+decrypt = zipWith csub
+csub c1 c2 = chr ((ord c1 + 256 - ord c2) `mod` 256)
+{-- 
+import Bits						    -- ghc specific
+encrypt = zipWith cxor
+decrypt = zipWith cxor
+cxor c1 c2 = chr (ord c1 `xor` ord c2)
+--}
diff --git a/WASH/CGI/RawCGITypes.hs b/WASH/CGI/RawCGITypes.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/RawCGITypes.hs
@@ -0,0 +1,61 @@
+-- © 2001-2006 Peter Thiemann
+-- | Low-level types for raw CGI programming.
+
+module WASH.CGI.RawCGITypes where
+
+import IO
+
+import WASH.CGI.CGITypes
+import WASH.CGI.HTTP
+
+type CGIProgram = (CGIInfo -> CGIParameters -> IO ())
+
+type CGIParameter = (String, CGIValue)
+type CGIParameters = [CGIParameter]
+
+type CGIValue = String
+
+-- | internal representation of a CGI parameter value
+data CGIRawValue =
+     CGIRawString String
+   | CGIRawFile String String String		    -- ^ name, contentType, content
+
+data CGIInfo = 
+     CGIInfo    { cgiUrl :: URL
+     		, cgiPathInfo :: String
+		, cgiScriptName :: String
+	       	, cgiContentType :: String
+		, cgiContents :: String
+		, cgiCookies :: [(String, String)]
+		, cgiArgs :: [String]
+		, cgiHandle :: Handle
+		, cgiSessionMode :: SessionMode
+		}
+
+-- | corresponding to CGI environment variables
+data CGIEnv =
+     CGIEnv	{ serverName :: String
+		, serverPort :: String
+		, serverSoftware :: String
+		, serverProtocol :: String
+		, gatewayInterface :: String
+		, scriptName :: String
+		, requestMethod :: Method
+		, contentLength :: String
+		, contentType :: String
+		, httpAccept :: String
+		, httpCookie :: String
+		, pathInfo :: String
+		, pathTranslated :: String
+		, remoteHost :: String
+		, remoteAddr :: String
+		, remoteUser :: String
+		, authType :: String
+		
+		, rawContents :: String
+		, rawArgs :: [String]
+		
+		, handle :: Handle
+		, httpsEnabled :: Bool
+		}
+
diff --git a/WASH/CGI/StateItem.hs b/WASH/CGI/StateItem.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/StateItem.hs
@@ -0,0 +1,19 @@
+-- © 2002 Peter Thiemann
+module WASH.CGI.StateItem where
+
+import Char
+
+-- 
+-- |type of handles to a PE of type @a@
+data T a = T String Int | Tvirtual { tvirtual :: a }
+instance Show (T a) where
+  showsPrec _ (T s i) = showChar 'T' . shows s . shows i
+  showsPrec _ (Tvirtual _) = showChar 'V'
+instance Read (T a) where
+  readsPrec i str = 
+    case dropWhile isSpace str of
+      'T' : str' ->
+        [(T s i, str''') | (s, str'') <- reads str', (i, str''') <- reads str'']
+      'V' : str' ->
+        [(Tvirtual (error "uninitialized tvirtual"), str')]
+      _ -> []
diff --git a/WASH/CGI/Style.hs b/WASH/CGI/Style.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Style.hs
@@ -0,0 +1,46 @@
+-- © 2002 Peter Thiemann
+module WASH.CGI.Style (Style(..), using) where
+
+import WASH.HTML.HTMLMonad hiding (map, div, head, span)
+import List
+
+infixl 5 :^:
+infix 9 :=:
+
+-- |First class style elements. Intended for CSS2.
+data Style 
+  = NoStyle
+  | String :=: String	    -- ^primitive style @name :=: value@
+  | Style  :^: Style	    -- ^combine two styles
+  | Named String	    -- ^reference to style sheet
+
+instance Show Style where
+  showsPrec n NoStyle = id
+  showsPrec n (s1 :=: s2) = showString s1 . showString ": " . showString s2
+  showsPrec n (s1 :^: s2) = shows s1 . showString "; " . shows s2
+  showsPrec n (Named s) = id
+
+-- |collects a style into a list of class names and primitive styles
+collect :: Style -> ([String], Style)
+collect st = g ([],NoStyle) st
+  where
+    g acc NoStyle = acc
+    g (cls, sts) st@(n :=: v) = (cls, st :^: sts)
+    g acc (st1 :^: st2) = g (g acc st2) st1
+    g (cls, sts) (Named n) = (n : cls, st)
+
+attach :: (Monad m) => Style -> WithHTML x m ()
+attach sty = 
+  let (cls, st) = collect sty in
+  do case cls of
+       [] -> empty
+       _  -> attr "class" (concat $ intersperse " " cls)
+     case st of NoStyle -> empty
+		_       -> attr "style" (show st)
+     
+-- |Attaches a style to a field constructor.
+using :: (Monad m)
+	=> Style
+	-> (WithHTML x m b -> c)	-- ^a field constructor, typically 'HTMLField'
+	-> WithHTML x m b -> c		-- ^styled version of this constructor
+using style elem x = elem (x ## attach style)
diff --git a/WASH/CGI/Submit98.hs b/WASH/CGI/Submit98.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Submit98.hs
@@ -0,0 +1,322 @@
+-- © 2002-2005 Peter Thiemann
+-- |Haskell98 version of the submission functions.
+module WASH.CGI.Submit98
+	( InputHandle, HasValue (value)
+	, F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)
+	, FL (FL), FA (FA)
+	, deF0, deF1, deF2, deF3, deF4, deF5, deF6, deF7, deF8
+	, deFL, deFA
+	, deValueF0, deValueF1, deValueF2, deValueF3, deValueF4, deValueF5, deValueF6, deValueF7, deValueF8
+	, deValueFL, deValueFA
+	, submit, submit0, defaultSubmit, DTree, submitx, dtleaf, dtnode
+	, submitLink, submitLink0, defaultSubmitLink
+	, activate
+	)
+	where
+
+import WASH.CGI.AbstractSelector
+import WASH.CGI.CGIInternals
+import WASH.CGI.CGIMonad
+import WASH.CGI.EventHandlers
+import qualified WASH.CGI.HTMLWrapper as H
+import WASH.CGI.InputHandle
+
+import Monad
+
+instance HasValue InputField where
+  value inf = valueInputField inf
+
+instance InputHandle (InputField a) where
+  validate inf = validateInputField inf
+  isBound  inf = ifBound inf
+  ihNames  inf = [ifName inf]
+
+data F0 x = F0
+deF0 :: r -> (F0 x -> r)
+deF0 r F0 = r
+
+deValueF0 r F0 = r
+
+instance InputHandle F0 where
+  validate F0 = Right F0
+  isBound  F0 = True
+  ihNames  F0 = []
+
+data F1 a x = F1 (a x)
+deF1 :: (a x -> r) -> (F1 a x -> r)
+deF1 g (F1 ax) = g ax
+
+deValueF1 g (F1 ax) = g (value ax)
+
+instance InputHandle a => InputHandle (F1 a) where
+  validate (F1 ainv) =
+    feither id F1 (validate ainv)
+  isBound (F1 ainv) = isBound ainv
+  ihNames (F1 ainv) = ihNames ainv
+
+data F2 a b x = F2 (a x) (b x)
+deF2 :: (a x -> b x -> r) -> (F2 a b x -> r)
+deF2 g (F2 ax bx) = g ax bx
+
+deValueF2 g (F2 ax bx) = g (value ax) (value bx)
+
+instance (InputHandle a, InputHandle b) => InputHandle (F2 a b) where
+  validate (F2 ainv binv) =
+    feither id (uncurry F2)
+    (propagate (validate ainv) (validate binv))
+  isBound (F2 ainv binv) =
+    isBound ainv && isBound binv
+  ihNames (F2 ainv binv) =
+    ihNames ainv ++ ihNames binv
+
+data F3 a b c x = F3 (a x) (b x) (c x)
+deF3 :: (a x -> b x -> c x -> r) -> (F3 a b c x -> r)
+deF3 g (F3 ax bx cx) = g ax bx cx
+
+deValueF3 g (F3 ax bx cx) = g (value ax) (value bx) (value cx)
+
+instance (InputHandle a, InputHandle b, InputHandle c) => InputHandle (F3 a b c) where
+  validate (F3 ainv binv cinv) =
+    feither id (\ (aval,(bval,cval)) -> F3 aval bval cval)
+    (propagate (validate ainv)
+     (propagate (validate binv) (validate cinv)))
+  isBound (F3 ainv binv cinv) =
+    isBound ainv && isBound binv && isBound cinv
+  ihNames (F3 ainv binv cinv) =
+    ihNames ainv ++ ihNames binv ++ ihNames cinv
+
+data F4 a b c d x = F4 (a x) (b x) (c x) (d x)
+deF4 :: (a x -> b x -> c x -> d x -> r) -> (F4 a b c d x -> r)
+deF4 g (F4 ax bx cx dx) = g ax bx cx dx
+
+deValueF4 g (F4 ax bx cx dx) = g (value ax) (value bx) (value cx) (value dx)
+
+instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d)
+       => InputHandle (F4 a b c d) where
+  validate (F4 ainv binv cinv dinv) =
+    feither id (\ (aval,(bval,(cval,dval))) -> F4 aval bval cval dval)
+    (propagate (validate ainv) 
+     (propagate (validate binv)
+      (propagate (validate cinv) (validate dinv))))
+  isBound (F4 ainv binv cinv dinv) =
+    isBound ainv && isBound binv && isBound cinv && isBound dinv
+  ihNames (F4 ainv binv cinv dinv) =
+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv
+
+data F5 a b c d e x = F5 (a x) (b x) (c x) (d x) (e x)
+deF5 :: (a x -> b x -> c x -> d x -> e x -> r) -> (F5 a b c d e x -> r)
+deF5 g (F5 ax bx cx dx ex) = g ax bx cx dx ex
+
+deValueF5 g (F5 ax bx cx dx ex) = g (value ax) (value bx) (value cx) (value dx) (value ex)
+
+instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e)
+       => InputHandle (F5 a b c d e) where
+  validate (F5 ainv binv cinv dinv einv) =
+    feither id (\ (aval,(bval,(cval,(dval,eval)))) -> F5 aval bval cval dval eval)
+    (propagate (validate ainv) 
+     (propagate (validate binv)
+      (propagate (validate cinv)
+       (propagate (validate dinv) (validate einv)))))
+  isBound (F5 ainv binv cinv dinv einv) =
+    isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv
+  ihNames (F5 ainv binv cinv dinv einv) =
+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv
+
+data F6 a b c d e f x = F6 (a x) (b x) (c x) (d x) (e x) (f x)
+deF6 :: (a x -> b x -> c x -> d x -> e x -> f x -> r) -> (F6 a b c d e f x -> r)
+deF6 g (F6 ax bx cx dx ex fx) = g ax bx cx dx ex fx
+
+deValueF6 g (F6 ax bx cx dx ex fx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx)
+
+instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f)
+       => InputHandle (F6 a b c d e f) where
+  validate (F6 ainv binv cinv dinv einv finv) =
+    feither id (\ (aval,(bval,(cval,(dval,(eval, fval))))) -> F6 aval bval cval dval eval fval)
+    (propagate (validate ainv) 
+     (propagate (validate binv)
+      (propagate (validate cinv)
+       (propagate (validate dinv) 
+        (propagate (validate einv) (validate finv))))))
+  isBound (F6 ainv binv cinv dinv einv finv) =
+    isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv
+  ihNames (F6 ainv binv cinv dinv einv finv) =
+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv
+
+data F7 a b c d e f g x = F7 (a x) (b x) (c x) (d x) (e x) (f x) (g x)
+deF7 :: (a x -> b x -> c x -> d x -> e x -> f x -> g x -> r) -> (F7 a b c d e f g x -> r)
+deF7 g (F7 ax bx cx dx ex fx gx) = g ax bx cx dx ex fx gx
+
+deValueF7 g (F7 ax bx cx dx ex fx gx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx) (value gx)
+
+instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g)
+       => InputHandle (F7 a b c d e f g) where
+  validate (F7 ainv binv cinv dinv einv finv ginv) =
+    feither id (\ (aval,(bval,(cval,(dval,(eval, (fval, gval)))))) -> F7 aval bval cval dval eval fval gval)
+    (propagate (validate ainv) 
+     (propagate (validate binv)
+      (propagate (validate cinv)
+       (propagate (validate dinv) 
+        (propagate (validate einv)
+	 (propagate (validate finv) (validate ginv)))))))
+  isBound (F7 ainv binv cinv dinv einv finv ginv) =
+    isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv && isBound ginv
+  ihNames (F7 ainv binv cinv dinv einv finv ginv) =
+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv ++ ihNames ginv
+
+data F8 a b c d e f g h x = F8 (a x) (b x) (c x) (d x) (e x) (f x) (g x) (h x)
+deF8 :: (a x -> b x -> c x -> d x -> e x -> f x -> g x -> h x -> r) -> (F8 a b c d e f g h x -> r)
+deF8 g (F8 ax bx cx dx ex fx gx hx) = g ax bx cx dx ex fx gx hx
+
+deValueF8 g (F8 ax bx cx dx ex fx gx hx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx) (value gx) (value hx)
+
+instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g, InputHandle h)
+       => InputHandle (F8 a b c d e f g h) where
+  validate (F8 ainv binv cinv dinv einv finv ginv hinv) =
+    feither id (\ (aval,(bval,(cval,(dval,(eval, (fval, (gval, hval))))))) -> F8 aval bval cval dval eval fval gval hval)
+    (propagate (validate ainv) 
+     (propagate (validate binv)
+      (propagate (validate cinv)
+       (propagate (validate dinv) 
+        (propagate (validate einv) 
+	 (propagate (validate finv)
+	  (propagate (validate ginv) (validate hinv))))))))
+  isBound (F8 ainv binv cinv dinv einv finv ginv hinv) =
+    isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv && isBound ginv && isBound hinv
+  ihNames (F8 ainv binv cinv dinv einv finv ginv hinv) =
+    ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv ++ ihNames ginv ++ ihNames hinv
+
+-- |'FL' is required to pass an unknown number of handles of the same
+-- type need to the callback function in a form submission. The
+-- handles need to be collected in a list and then wrapped in the 'FL' data constructor
+data FL a x = FL [a x]
+deFL :: ([a x] -> r) -> (FL a x -> r)
+deFL g (FL axs) = g axs
+
+deValueFL g (FL axs) = g (map value axs)
+
+instance InputHandle a => InputHandle (FL a) where
+  validate (FL ainvs) =
+    g (map validate ainvs)		 -- [Either [ValidationError] (h VALID)]
+    where 
+    g = foldr h (Right (FL []))
+    h ev evs = feither id (\ (v, FL vs) -> FL (v : vs)) (propagate ev evs)
+  isBound (FL ainvs) =
+    all isBound ainvs
+  ihNames (FL ainvs) =
+    concatMap ihNames ainvs
+
+-- |'FA' comes handy when you want to tag an input handle with some extra
+-- information, which is not itsefl an input handle and which is not validated
+-- by a form submission. The tag is the first argument and the handle is the
+-- second argument of the data constructor.
+data FA a b x = FA a (b x)
+deFA :: (a -> b x -> r) -> (FA a b x -> r)
+deFA g (FA a bx) = g a bx
+
+deValueFA g (FA a bx) = g a (value bx)
+
+instance InputHandle b => InputHandle (FA a b) where
+  validate (FA a binv) =
+    feither id (FA a) (validate binv)
+  isBound (FA a binv) =
+    isBound binv
+  ihNames (FA a binv) =
+    ihNames binv
+
+-- |Create a submission button with attached action.
+submit :: (CGIMonad cgi, InputHandle h)
+	=> h INVALID		-- ^input field handles to be validated and passed to callback action 
+	-> (h VALID -> cgi ())	-- ^callback maps valid input handles to a CGI action
+	-> HTMLField cgi x y ()	-- ^returns a field so that attributes can be attached
+submit = submitInternal False
+
+-- |Create a continuation button that takes no parameters.
+submit0 :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()
+submit0 cont = submit F0 (\F0 -> cont)
+
+-- |Create a submission button whose attached action is fired whenever the form
+-- is submitted without explicitly clicking any submit button. This can happen if
+-- an input field has an attached onclick="submit()" action.
+defaultSubmit :: (CGIMonad cgi, InputHandle h) =>
+  h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi x y ()
+defaultSubmit = submitInternal True
+
+-- |Create an ordinary link serving as a submission button.
+submitLink :: (CGIMonad cgi, InputHandle h) =>
+  h INVALID -> (h VALID -> cgi ()) -> H.HTMLCons x y cgi ()
+submitLink = submitInternalLink False
+
+-- |Create a continuation link.
+submitLink0 :: (CGIMonad cgi) => cgi () -> H.HTMLCons x y cgi ()
+submitLink0 cont = submitLink F0 (const cont)
+
+defaultSubmitLink :: (CGIMonad cgi, InputHandle h) =>
+  h INVALID -> (h VALID -> cgi ()) -> H.HTMLCons x y cgi ()
+defaultSubmitLink = submitInternalLink True
+
+-- |Abstract type of decisions trees. These trees provide structured validation.
+newtype DTree cgi x y = DTree { unDTree :: HTMLField cgi x y () }
+
+-- |Create a submission button whose validation proceeds according to a decision
+-- tree. Trees are built using 'dtleaf' and 'dtnode'.
+submitx :: DTree cgi x y -> HTMLField cgi x y ()
+submitx = unDTree
+
+-- |Create a leaf in a decision tree from a CGI action. 
+dtleaf :: (CGIMonad cgi) => cgi () -> DTree cgi x y
+dtleaf action = DTree $ submit0 action
+
+-- |Create a node in a decision tree. Takes an invalid input field and a
+-- continuation. Validates the input field and passes it to the continuation if
+-- the validation was successful. The continuation can dispatch on the value of
+-- the input field and produces a new decision tree.
+dtnode :: (CGIMonad cgi, InputHandle h) =>
+  h INVALID -> (h VALID -> DTree cgi x y) -> DTree cgi x y
+dtnode hinv next =
+  if isBound hinv then
+  case validate hinv of
+    Right hval ->
+      next hval
+    Left ss ->
+      DTree $ internalSubmitField False (Left ss)
+  else 
+    DTree $ internalSubmitField False (Left [])
+
+submitInternal isDefault hinv g =
+  internalSubmitField isDefault (validator hinv g)
+
+validator hinv g =
+  either Left (Right . g) (validate hinv)
+
+submitInternalLink isDefault hinv g =
+  internalSubmitLink isDefault (validator hinv g)
+    
+
+instance HasValue RadioGroup where
+  value rg = valueRadioGroup rg
+
+instance InputHandle (RadioGroup a) where
+  validate rg = validateRadioGroup rg
+  isBound rg = radioBound rg
+  ihNames rg = [radioName rg]
+
+instance HasValue SelectionGroup where
+  value sg = valueSelectionGroup sg
+
+instance InputHandle (SelectionGroup a) where
+  validate sg = validateSelectionGroup sg
+  isBound sg = selectionBound sg
+  ihNames sg = [selectionName sg]
+
+-- |Attach a CGI action to the value returned by the input field. Activation
+-- means that data is submitted as soon as it is entered.
+activate :: (CGIMonad cgi, InputHandle (i a), HasValue i) =>
+  (a -> cgi ()) -> HTMLField cgi x y (i a INVALID) -> HTMLField cgi x y (i a INVALID)
+activate actionFun inputField attrs =
+  do invalid_inf <- inputField (do attrs
+				   onChange $ "WASHSubmit(this.name);")
+     let r = validate invalid_inf
+	 rv = either Left (Right . value) r
+     when (isBound invalid_inf) $
+       activateInternal actionFun (head $ ihNames invalid_inf) rv
+     return invalid_inf
diff --git a/WASH/CGI/SubmitXX.hs b/WASH/CGI/SubmitXX.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/SubmitXX.hs
@@ -0,0 +1,191 @@
+{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}
+-- © 2002-2005 Peter Thiemann
+-- |Extended-Haskell version of the submission functions.
+module WASH.CGI.SubmitXX where
+
+import WASH.CGI.CGIInternals
+import WASH.CGI.CGIMonad
+import WASH.CGI.EventHandlers
+
+import Monad
+
+class StripHandle hx x | hx -> x where
+  validate :: hx -> Either [ValidationError] x
+  isBound :: hx -> Bool
+  ihNames :: hx -> [String]
+
+instance StripHandle (InputField a x) a where
+  validate inf =
+    case validateInputField inf of
+      Left ss ->
+        Left ss
+      Right _ ->
+        Right $ valueInputField inf
+  isBound inf =
+    ifBound inf
+  ihNames inf =
+    [ifName inf]
+
+instance StripHandle (RadioGroup a x) a where
+  validate rg =
+    case validateRadioGroup rg of
+      Left ss ->
+        Left ss
+      Right _ ->
+        Right $ valueRadioGroup rg
+  isBound rg =
+    radioBound rg
+  ihNames rg =
+    [radioName rg]
+
+instance StripHandle () () where
+  validate () = Right ()
+  isBound () = True
+  ihNames () = []
+
+instance (StripHandle hx x, StripHandle hy y) => StripHandle (hx, hy) (x, y) where
+  validate (hx, hy) =
+    propagate (validate hx) (validate hy)
+  isBound (hx, hy) =
+    isBound hx && isBound hy
+  ihNames (hx, hy) =
+    ihNames hx ++ ihNames hy
+
+instance (StripHandle hx x, StripHandle hy y, StripHandle hz z) 
+	=> StripHandle (hx, hy, hz) (x, y, z) where
+  validate (hx, hy, hz) =
+    feither id (\ (x, (y, z)) -> (x, y, z)) $
+    propagate (validate hx) (propagate (validate hy) (validate hz))
+  isBound (hx, hy, hz) =
+    isBound hx && isBound (hy, hz)
+  ihNames (hx, hy, hz) =
+    ihNames hx ++ ihNames (hy, hz)
+
+instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a)
+	=> StripHandle (hx, hy, hz, ha) (x, y, z, a) where
+  validate (hx, hy, hz, ha) =
+    feither id (\ ((x, y), (z, a)) -> (x, y, z, a)) $
+    propagate
+      (propagate (validate hx) (validate hy))
+      (propagate (validate hz) (validate ha))
+  isBound (hx, hy, hz, ha) =
+    isBound (hx, hy) && isBound (hz, ha)
+  ihNames (hx, hy, hz, ha) =
+    ihNames (hx, hy) ++ ihNames (hz, ha)
+
+instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b)
+	=> StripHandle (hx, hy, hz, ha, hb) (x, y, z, a, b) where
+  validate (hx, hy, hz, ha, hb) =
+    feither id (\ ((x, y), (z, (a, b))) -> (x, y, z, a, b)) $
+    propagate
+      (propagate (validate hx) (validate hy))
+      (propagate (validate hz) (propagate (validate ha) (validate hb)))
+  isBound (hx, hy, hz, ha, hb) =
+    isBound (hx, hy) && isBound (hz, (ha, hb))
+  ihNames (hx, hy, hz, ha, hb) =
+    ihNames (hx, hy) ++ ihNames (hz, (ha, hb))
+
+instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c)
+	=> StripHandle (hx, hy, hz, ha, hb, hc) (x, y, z, a, b, c) where
+  validate (hx, hy, hz, ha, hb, hc) =
+    feither id (\ ((x, y, z), (a, b, c)) -> (x, y, z, a, b, c)) $
+    propagate
+      (validate (hx, hy, hz)) (validate (ha, hb, hc))
+  isBound (hx, hy, hz, ha, hb, hc) =
+    isBound (hx, hy, hz) && isBound (ha, hb, hc)
+  ihNames (hx, hy, hz, ha, hb, hc) =
+    ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc)
+
+instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d)
+	=> StripHandle (hx, hy, hz, ha, hb, hc, hd) (x, y, z, a, b, c, d) where
+  validate (hx, hy, hz, ha, hb, hc, hd) =
+    feither id (\ ((x, y, z), (a, b, c, d)) -> (x, y, z, a, b, c, d)) $
+    propagate
+      (validate (hx, hy, hz)) (validate (ha, hb, hc, hd))
+  isBound (hx, hy, hz, ha, hb, hc, hd) =
+    isBound (hx, hy, hz) && isBound (ha, hb, hc, hd)
+  ihNames (hx, hy, hz, ha, hb, hc, hd) =
+    ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc, hd)
+
+instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d, StripHandle he e)
+	=> StripHandle (hx, hy, hz, ha, hb, hc, hd, he) (x, y, z, a, b, c, d, e) where
+  validate (hx, hy, hz, ha, hb, hc, hd, he) =
+    feither id (\ ((x, y, z), (a, b, c, d, e)) -> (x, y, z, a, b, c, d, e)) $
+    propagate
+      (validate (hx, hy, hz)) (validate (ha, hb, hc, hd, he))
+  isBound (hx, hy, hz, ha, hb, hc, hd, he) =
+    isBound (hx, hy, hz) && isBound (ha, hb, hc, hd, he)
+  ihNames (hx, hy, hz, ha, hb, hc, hd, he) =
+    ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc, hd, he)
+
+instance (StripHandle hw w, StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d, StripHandle he e)
+	=> StripHandle (hw, hx, hy, hz, ha, hb, hc, hd, he) (w, x, y, z, a, b, c, d, e) where
+  validate (hw, hx, hy, hz, ha, hb, hc, hd, he) =
+    feither id (\ ((w, x, y, z), (a, b, c, d, e)) -> (w, x, y, z, a, b, c, d, e)) $
+    propagate
+      (validate (hw, hx, hy, hz)) (validate (ha, hb, hc, hd, he))
+  isBound (hw, hx, hy, hz, ha, hb, hc, hd, he) =
+    isBound (hw, hx, hy, hz) && isBound (ha, hb, hc, hd, he)
+  ihNames (hw, hx, hy, hz, ha, hb, hc, hd, he) =
+    ihNames (hw, hx, hy, hz) ++ ihNames (ha, hb, hc, hd, he)
+
+instance (StripHandle hx x) => StripHandle [hx] [x] where
+  validate hxs =
+    foldr (\ hx xs -> feither id (uncurry (:)) $ propagate (validate hx) xs)
+          (Right []) hxs
+  isBound hxs =
+    all isBound hxs
+  ihNames hxs =
+    concatMap ihNames hxs
+
+-- |create a submission button with attached action
+submit, defaultSubmit :: (CGIMonad cgi, StripHandle handle_a a)
+	=> handle_a
+	-> (a -> cgi ())
+	-> HTMLField cgi x y ()
+submit = submitInternal False
+defaultSubmit = submitInternal True
+
+-- |create a continuation button with parameters
+submit0 :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()
+submit0 cont = submit () (const cont)
+
+submitInternal isDefault hinv g =
+  case validate hinv of
+    Right hval ->
+      internalSubmitField isDefault (Right (g hval))
+    Left ss ->
+      internalSubmitField isDefault (Left ss)
+
+newtype DTree cgi x y = DTree { unDTree :: HTMLField cgi x y () }
+
+-- |submission with staged validation
+submitx :: DTree cgi x y -> HTMLField cgi x y ()
+submitx = unDTree
+
+dtleaf :: (CGIMonad cgi) => cgi () -> DTree cgi x y
+dtleaf action = DTree $ submit0 action
+
+dtnode :: (CGIMonad cgi, StripHandle handle_a a) =>
+  handle_a -> (a -> DTree cgi x y) -> DTree cgi x y
+dtnode hinv next =
+  if isBound hinv then
+  case validate hinv of
+    Right hval ->
+      next hval
+    Left ss ->
+      DTree $ internalSubmitField False (Left ss)
+  else 
+    DTree $ internalSubmitField False (Left [])
+  
+-- |Attach a CGI action to the value returned by the input field. Activation
+-- means that data is submitted as soon as it is entered.
+activate :: (CGIMonad cgi, StripHandle ha a) =>
+  (a -> cgi ()) -> HTMLField cgi x y ha -> HTMLField cgi x y ha
+activate actionFun inputField attrs =
+  do invalid_inf <- inputField (do attrs
+				   onChange $ "WASHSubmit(this.name);")
+     let rv = validate invalid_inf
+     when (isBound invalid_inf) $
+       activateInternal actionFun (head $ ihNames invalid_inf) rv
+     return invalid_inf
diff --git a/WASH/CGI/TCGI.hs b/WASH/CGI/TCGI.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/TCGI.hs
@@ -0,0 +1,31 @@
+-- © 2006 Peter Thiemann
+{- | Wrapper for the WASH.CGI.CGI monad type. Internal use only. Intended for
+-- wrapping transactions. 
+-}
+
+module WASH.CGI.TCGI where
+
+import WASH.CGI.CGIMonad
+
+-- |Type of a 'CGI' action in a transactional scope with a result variable of
+-- type @a@.
+newtype TCGI b a =
+  TCGI { unTCGI :: CGIAction a }
+
+outof :: TCGI b a -> CGI a
+outof = CGI . unTCGI
+
+into :: CGI a -> TCGI b a
+into = TCGI . unCGI 
+
+instance Monad (TCGI b) where
+  return x = 
+    into (return x)
+  m >>=  f = 
+    into (outof m >>= (outof . f))
+
+instance CGIMonad (TCGI b) where
+  wrapCGI = TCGI
+  unwrapCGI = unTCGI
+  chooser x y = return y
+
diff --git a/WASH/CGI/Transaction.hs b/WASH/CGI/Transaction.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Transaction.hs
@@ -0,0 +1,393 @@
+-- © 2006 Peter Thiemann
+{- | Transactional, type-indexed implementation of server-side state.
+
+Glossary
+
+A transactional entity (TE) is a named multi-versioned global variable.
+-}
+
+module WASH.CGI.Transaction (
+  T (), init, create, remove, get, set,
+  with, Control (..),
+  TCGI ()
+  ) where
+
+import qualified WASH.CGI.BaseCombinators as B
+import qualified WASH.CGI.CGIConfig as Conf
+import WASH.CGI.CGIMonad
+import WASH.CGI.CGI hiding (head, div, span, map)
+
+import WASH.CGI.TCGI (TCGI)
+import qualified WASH.CGI.TransactionUtil as TU
+import WASH.CGI.TransactionUtil (Control (..))
+import WASH.CGI.LogEntry
+import WASH.CGI.MakeTypedName
+import WASH.CGI.Types
+
+import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)
+
+import qualified WASH.Utility.Auxiliary as Aux
+import qualified WASH.Utility.Locking as L
+import qualified WASH.Utility.Unique as Unique
+
+import Directory
+import IO
+import qualified List
+import Maybe
+import Monad
+import Prelude hiding (init)
+
+transactionLock = Conf.transactionDir
+
+-- |Handle of a transactional variable
+newtype T a = 
+  T String
+  deriving (Read, Show)
+
+-- |Attempt to create a new tv @n@ and set its initial value. Returns handle to
+-- the variable. If the variable already exists, then just returns the handle.
+init :: (Types a, Read a, Show a) => String -> a -> TCGI b (T a)
+init name val =
+  let v = show val 
+      typedName = makeTypedNameFromVal name val
+      h = T typedName 
+  in
+  wrapCGI (\ cgistate ->
+    case inparm cgistate of
+      [] ->			    -- first time here
+        do Aux.assertDirectoryExists (List.init Conf.transactionDir) (return ())
+	   -- must try to read the variable at this point 
+	   -- because it may only exist in the log
+	   let out = outparm cgistate
+	   ev <- try (readValue out typedName)
+	   let newparm =
+	         case ev of
+		   Left _ ->
+		     -- value did not exist (but don't write it now)
+		     PAR_CRE_TV typedName v
+		   Right (v', cached) ->
+		     -- value did exist (although we have not read its value)
+		     PAR_GET_TV typedName v'
+	   return (h, cgistate { outparm = newparm : out })
+      PAR_CRE_TV _ _ : rest ->      -- created the variable
+	return (h, cgistate { inparm = rest })
+      PAR_GET_TV _ _ : rest ->      -- touched existing variable
+	return (h, cgistate { inparm = rest })
+      le : rest ->
+	error ("Transaction.init: got log entry "
+	       ++ show le ++
+	       ". This should not happen")
+  )
+
+
+-- |Read transactional variable through a typed handle.
+get :: (Read a, Show a) => T a -> TCGI b a
+get (T typedName) =
+  wrapCGI (\ cgistate ->
+    case inparm cgistate of
+      [] ->
+        -- check the log for preceding reads and  writes;
+        --  then fall back to physical read
+        let out = outparm cgistate in
+        do (v, cached) <- readValue out typedName
+	   let newparm | cached    = PAR_RESULT v
+		       | otherwise = PAR_GET_TV typedName v
+	   return (read v, cgistate { outparm = newparm : out })
+      PAR_GET_TV _ v : rest ->
+	return (read v, cgistate { inparm = rest })
+      PAR_RESULT v : rest ->
+	return (read v, cgistate { inparm = rest })
+      _ ->
+	error "Transaction.get: this should not happen"
+  )
+
+-- |Write to a transactional variable through typed handle. Only affects the
+-- log, no /physical/ write happens. Checks physically for existence of the
+-- variable (but tries the log first). Raises exception if it does not exist.
+set :: (Read a, Show a) => T a -> a -> TCGI b ()
+set (T typedName) val =
+  let v = show val
+  in
+  wrapCGI (\ cgistate ->
+    case inparm cgistate of
+      [] ->
+        do let newparm = PAR_SET_TV typedName v 
+	       out = outparm cgistate
+	   readValue out typedName -- must not fail
+	   return ((), cgistate { outparm = newparm : outparm cgistate })
+      PAR_SET_TV _ _ : rest ->
+	return ((), cgistate { inparm = rest })
+      _ ->
+	error "Transaction.set: this should not happen"
+  )
+
+-- |Create a fresh transactional variable with an initial value and return its
+-- handle. Performs a physical write to ensure that the variable's name is
+-- unique. Locks the transaction directory during the write operation.
+create :: (Read a, Show a, Types a) => a -> TCGI b (T a)
+create val =
+  let v = show val
+      obtainUniqueHandle =
+	do name <- Unique.inventStdKey
+	   let typedName = makeTypedNameFromVal name val
+	       h = T typedName
+	   L.obtainLock transactionLock
+	   conflict <- reallyExists typedName
+	   unless conflict $ reallyWrite typedName v
+	   L.releaseLock transactionLock
+	   if conflict then obtainUniqueHandle else return h
+  in
+  do wrapCGI $ \ cgistate ->
+       case inparm cgistate of
+	 [] ->
+           do Aux.assertDirectoryExists (List.init Conf.transactionDir) (return ())
+	      h@(T typedName) <- obtainUniqueHandle
+	      return (h, cgistate { outparm = PAR_CRE_TV typedName v : outparm cgistate })
+	 PAR_CRE_TV typedName _ : rest ->
+	   return (T typedName, cgistate { inparm = rest })
+	 _ ->
+	   error "Transaction.create: this should not happen"
+
+
+-- |Remove a transactional variable. Subsequent read accesses to this variable
+-- will make the transaction fail. May throw an exception if the variable is not
+-- present.
+remove :: (Types a) => T a -> TCGI b ()
+remove (T typedName) =
+     wrapCGI (\ cgistate ->
+       case inparm cgistate of
+	 [] ->
+	   -- check that the variable exists
+           -- will raise an exception otherwise
+	   let out = outparm cgistate in
+           do readValue out typedName
+	      return ((), cgistate { outparm = PAR_REM_TV typedName : out })
+	 PAR_REM_TV _ : rest ->
+	   return ((), cgistate { inparm = rest })
+	 _ ->
+	   error "Transaction.remove: this should not happen"
+       )
+
+
+-- | @with@ creates a transactional scope in which transactional variables can
+-- be manipulated. Transactions may be nested to an arbitrary depth, although a
+-- check with the current state of the world only occurs at the point where the
+-- top-level transaction tries to commit. 
+-- 
+-- @with@ takes three parameters, a default value of type @result@, a
+-- continuation, and a body function that maps a @Control@ record to a
+-- transactional computation. There are three ways in which a
+-- transaction may be completed. First, the transaction may be abandoned
+-- explicitly by a call to the @abandon@ function supplied as part of the
+-- @Control@ record. In this case, the continuation is invoked on a pre-set
+-- failure return value. Second, the transaction body runs to completion but
+-- fails to commit. In this case, the continuation is also invoked on the
+-- pre-set failure return value. Third, the transaction body runs to completion
+-- and commits successfully. In this case, the continuation is invoked, but on
+-- the pre-set success value. 
+-- The @result@-type argument initializes the default return value for both, the
+-- success and the failure case. The body function implements the body of the
+-- transaction. 
+-- 
+class CGIMonad cgi => WithMonad cgi where
+  with :: (Read result, Show result) =>
+	  result 
+	  -> (result -> cgi ())
+	  -> (TU.Control (TCGI result) result -> (TCGI result) ())
+	  -> cgi ()
+
+instance WithMonad CGI where
+  with result onResult fun =
+     TU.withCGI commitFromLog result onResult fun
+
+instance WithMonad (TCGI x) where
+-- !!! needs to be checked !!!
+  with result onResult fun =
+     TU.withTCGI (const $ return True) result onResult fun
+
+-- |Read value of a variable first from log prefix. Return value @True@
+-- indicates a value from the log, @False@ indicates a value read from file. May
+-- raise an exception if the variable has been removed.
+readValue :: [PARAMETER] -> String -> IO (String, Bool)
+readValue [] n =
+  do v' <- reallyRead n
+     return (v', False)
+readValue (PAR_SET_TV n' v':rest) n =
+  if n==n' 
+  then return (v', True)		    -- has been overwritten 
+  else readValue rest n
+readValue (PAR_GET_TV n' v':rest) n =
+  if n==n' 
+  then return (v', True)		    -- read before
+  else readValue rest n
+readValue (PAR_CRE_TV n' v':rest) n =
+  if n==n'
+  then return (v', True)
+  else readValue rest n
+readValue (PAR_REM_TV n':rest) n =
+  if n==n'
+  then fail ("Transactional variable " ++ n ++ " has vanished")
+  else readValue rest n
+readValue (PAR_TRANS stid:rest) n =
+  do v' <- reallyRead n
+     return (v', False)
+readValue (_:rest) n =
+  readValue rest n
+
+-- |Descriptor of a transactional variable.
+data TV_DESC 
+  = TV_DESC { tv_name :: String
+	      -- ^ variable name 
+	    , tv_old :: Maybe (Maybe String)
+	      -- ^ value on first read
+              --   @Nothing@ if not read
+              --   @Just Nothing@ if created
+	      --   @Just (Just val)@ first value
+	    , tv_new :: Maybe (Maybe String)
+	      -- ^ value after last write
+	      --   @Nothing@ if not written to
+	      --   @Just Nothing@ if removed
+	      --   @Just (Just val)@ if @val@ was written
+	    }
+  deriving Show
+
+-- |Obtain list of descriptors of transaction variables from a list of log
+-- entries. Each variable has at most one descriptor. Input list is in reverse
+-- chronological order, /e.g./, the earliest entries come last.
+getDescriptors :: [PARAMETER] -> [TV_DESC]
+getDescriptors logEntries =
+  foldr f [] logEntries
+  where
+    f (PAR_GET_TV n v) r = doRead n v r
+    f (PAR_SET_TV n v) r = doWrite n v r
+    f (PAR_CRE_TV n v) r = doCreate n v r
+    f (PAR_REM_TV n)   r = doRemove n r
+    f _ r = r
+
+    doCreate n v ds =
+      TV_DESC {tv_name = n, tv_old = Just Nothing, tv_new = Just (Just v)}
+	: ds
+    doRemove n ds =
+      doProcess g n ds
+	where
+	  g (TV_DESC { tv_old = Just Nothing } : rest) = 
+	    rest
+	  g (tvd : rest) =
+	    tvd { tv_new = Just Nothing } : rest
+	  g [] =
+	    [TV_DESC {tv_name = n, tv_old = Nothing, tv_new = Just Nothing}]
+    doProcess g n ds =
+      f ds
+      where
+	f [] =
+	  g []
+	f ds@(d':ds') =
+	  if tv_name d' == n then g ds else d' : f ds'
+    doRead n v ds =
+      doProcess h n ds
+      where 
+        h [] = 
+	  [TV_DESC {tv_name = n, tv_old = Just (Just v), tv_new = Nothing }]
+	h (tvd : rest) =
+	  tvd : rest					    -- not first read
+    doWrite n v ds = 
+      doProcess h n ds
+      where
+        h [] = 
+	  [TV_DESC {tv_name = n, tv_old = Nothing, tv_new = Just (Just v) }]
+	h (tvd : rest) =
+	  tvd { tv_new = Just (Just v) } : rest		    -- do write
+    
+-- | Get the descriptors and try to commit
+commitFromLog :: [PARAMETER] -> IO Bool
+commitFromLog =
+  tryToCommit . getDescriptors
+
+-- |Attempt to commit a list of descriptors by checking for the old values to
+-- match and then overwriting with the new values. A read-only transaction
+-- always succeeds, even if the values have changed after they have been
+-- read. Returns @True@ if commit succeeded.
+tryToCommit :: [TV_DESC] -> IO Bool
+tryToCommit ds =
+  if checkOnlyReads ds then return True else
+  do L.obtainLock transactionLock
+     oldValuesPreserved <- checkOldValuesPreserved ds
+     when oldValuesPreserved (writeNewValues ds)
+     L.releaseLock transactionLock
+     return oldValuesPreserved
+
+-- |Check if the values of all transactional variable in a list of descriptors
+-- match the current values. Called with all variables locked.
+checkOldValuesPreserved :: [TV_DESC] -> IO Bool
+checkOldValuesPreserved [] = 
+  return True
+checkOldValuesPreserved (d:ds) =
+  do b <- checkOldValuePreserved d
+     if b then checkOldValuesPreserved ds
+	  else return False
+
+checkOldValuePreserved :: TV_DESC -> IO Bool
+checkOldValuePreserved d =
+  do 
+  let n = tv_name d
+  varExists <- reallyExists n
+  case tv_old d of
+    Nothing ->		-- not read, check for presence
+      return varExists
+    Just Nothing ->	-- created, check that it does *not* exist now
+      return (not varExists)
+    Just (Just ov) ->	-- read old value @ov@
+      if varExists
+	 then  -- value is still present; check if equal
+	   do cv <- reallyRead n
+	      return (cv == ov)
+	 else -- value has disappeared: fail
+	   return False
+
+-- |Overwrite transactional variables from a list of descriptors with new values.
+writeNewValues :: [TV_DESC] -> IO ()
+writeNewValues ds = 
+  mapM_ g ds
+  where
+    g d = 
+      let n = tv_name d in
+      case tv_new d of
+	Nothing -> 		-- not written
+	  return ()
+	Just Nothing -> 	-- removed
+	  reallyRemove n
+	Just (Just nv) ->	-- new value
+	  reallyWrite n nv
+
+-- |Check that no variable has been written to.
+checkOnlyReads :: [TV_DESC] -> Bool
+checkOnlyReads ds = 
+  and (map wasNotWritten ds)
+  where
+    wasNotWritten d =
+      isNothing (tv_new d)
+	 
+-- |Physically access current shared value of transactional variable. Internal
+-- use only.
+reallyRead :: String -> IO String
+reallyRead n =
+  let fileName = Conf.transactionDir ++ n in
+  Aux.readFileStrictly fileName
+
+-- |Physically overwrite current shared value of transactional variable.
+reallyWrite :: String -> String -> IO ()
+reallyWrite n v =
+  let fileName = Conf.transactionDir ++ n in
+  writeFile fileName v
+
+-- |Physically checks the existence of a transactional variable.
+reallyExists :: String -> IO Bool
+reallyExists n =
+  let fileName = Conf.transactionDir ++ n in
+  doesFileExist fileName
+
+-- |Physically remove transactional variable.
+reallyRemove :: String -> IO ()
+reallyRemove n =
+  let fileName = Conf.transactionDir ++ n in
+  removeFile fileName
diff --git a/WASH/CGI/TransactionUtil.hs b/WASH/CGI/TransactionUtil.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/TransactionUtil.hs
@@ -0,0 +1,353 @@
+-- © 2006 Peter Thiemann
+{- | Generic utilities for implementing transactionsal memories
+-}
+module WASH.CGI.TransactionUtil 
+  (withCGI, withTCGI, Control (..))
+  where
+
+import qualified WASH.CGI.BaseCombinators as B
+import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)
+
+import WASH.CGI.CGIMonad
+import WASH.CGI.LogEntry
+
+import IO
+
+import WASH.CGI.TCGI
+
+-- | Checks presence of a transaction mark on the stack
+onStack :: String -> [PARAMETER] -> Bool
+onStack stid parms =
+  any h parms
+  where
+    h (PAR_TRANS stid') = stid' == stid
+    h _ = False
+
+-- | Pops log entries up to and including the transaction mark with given state
+-- ID. 
+popTo :: String -> [PARAMETER] -> [PARAMETER]
+popTo stid parms =
+  g parms
+  where
+    g [] = error "popTo did not find its transaction mark"
+    g (PAR_TRANS stid' : rest) | stid' == stid = rest
+    g (_ : rest) = popTo stid rest
+
+-- | Splits the log at the transaction mark with given state ID.
+splitTo :: String -> [PARAMETER] -> ([PARAMETER], [PARAMETER])
+splitTo stid parms =
+  g parms
+  where
+    g [] = error "splitTo did not find its transaction mark"
+    g (mark@(PAR_TRANS stid') : rest) | stid' == stid =
+      ([mark], rest)
+    g (entry : rest) =
+      let (prefix, rest') = splitTo stid rest in
+      (entry : prefix, rest')
+
+-- | Applies a function to a transaction mark with given state ID.
+applyTo :: String -> ([PARAMETER] -> [PARAMETER]) -> ([PARAMETER] -> [PARAMETER])
+applyTo stid trafo parms =
+  g parms []
+  where
+    g [] _ = error "applyTo did not find its transaction mark"
+    g (mark@(PAR_TRANS stid') : rest) acc | stid' == stid =
+      reverse (trafo (mark : acc)) ++rest
+    g (entry : rest) acc =
+      g rest (entry : acc)
+
+data Control cgi result =
+    Control { abandon   :: result -> cgi ()	-- ^ abandon with result (rollback)
+	    , setFail   :: result -> cgi ()	-- ^ set result on failure
+	    , setCommit :: result -> cgi ()	-- ^ set result on successful commit
+	    }
+
+with :: (CGIMonad cgi, Read result, Show result) =>
+	  ([PARAMETER] -> IO Bool)	    -- committer function
+	  -> result				-- default result
+	  -> (result -> cgi ()) 		-- result continuation
+	  -> (Control (TCGI result) result -> (TCGI result) ())
+	  -> cgi ()
+with commitFromLog result onResult fun =
+  wrapCGI (\cgistate -> 
+    let abandon stid res =
+	  wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))
+	setFail stid res = 
+	  B.once $
+	  wrapCGI (\cgistate ->
+	       let out = outparm cgistate 
+		   out' = applyTo stid onFail out
+		   onFail (pmark : pfail : psucc : rest) =
+			  (pmark : PAR_RESULT (show res) : psucc : rest)
+	       in
+	       return ((), cgistate { outparm = out' })
+	       )
+	setCommit stid res = 
+	  B.once $
+	  wrapCGI (\cgistate ->
+	       let out = outparm cgistate 
+		   out' = applyTo stid onSucc out
+		   onSucc (pmark : pfail : psucc : rest) =
+			  (pmark : pfail : PAR_RESULT (show res) : rest)
+	       in
+	       return ((), cgistate { outparm = out' })
+	       )
+	control stid =
+	  Control { abandon = abandon stid
+		  , setFail = setFail stid
+		  , setCommit = setCommit stid
+		  }
+	run stid cgistate =
+	  do lr <- try (unwrapCGI (fun (control stid)) cgistate)
+	     case lr of
+	       Right (v, cgistate') ->
+		 -- body of transaction finished successfully; now commit
+		 let out = outparm cgistate'
+		     (prefix, outparm') = splitTo stid out
+		     PAR_TRANS _ :
+		       failp@(PAR_RESULT failString) :
+		       succp@(PAR_RESULT succString) : _ = reverse prefix
+		 in
+		 do committed <- commitFromLog prefix
+		    if committed then
+		       unwrapCGI (onResult (read succString))
+			 cgistate' { outparm = succp : outparm' }
+		     else
+		       unwrapCGI (onResult (read failString))
+			 cgistate' { outparm = failp : outparm' }
+		 
+	       Left err ->
+		 -- Caught an exception; might be due to an @anbandon@ operation
+		 case reads (ioeGetErrorString err) of
+		   (stid', rest) : _ | stid' == stid ->
+		     let result = read rest
+			 newvalue = PAR_RESULT rest
+			 out' = popTo stid (outparm cgistate)
+		     in
+		       unwrapCGI (onResult result)
+			 cgistate { inparm = []
+				  , outparm = newvalue : out'
+				  , stateID = nextstid stid newvalue 
+				  }
+		   _ ->
+		     ioError err
+    in
+    case inparm cgistate of
+      [] ->
+        let stid = stateID cgistate
+	    newmark = PAR_TRANS stid
+	    newvalue = PAR_RESULT (show result)
+	in
+	run stid cgistate 
+	  { outparm = newvalue : newvalue : newmark : outparm cgistate
+	  , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }
+      -- ongoing transaction
+      PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->
+	run stid cgistate { inparm = rest }
+	       
+      -- finished transaction, go on with result continuation
+      PAR_RESULT str : rest ->
+	unwrapCGI (onResult (read str)) cgistate { inparm = rest }
+      _ -> 
+	B.reportError "Out of sync" H.empty cgistate
+  )  
+
+
+-- |Unnested transaction
+withCGI :: (Read result, Show result) =>
+	  ([PARAMETER] -> IO Bool)	    -- committer function
+	  -> result				-- default result
+	  -> (result -> CGI ()) 		-- result continuation
+	  -> (Control (TCGI result) result -> (TCGI result) ())
+	  -> CGI ()
+withCGI commitFromLog result onResult fun =
+  wrapCGI (\cgistate -> 
+    let abandon stid res =
+	  wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))
+	setFail stid res = 
+	  B.once $
+	  wrapCGI (\cgistate ->
+	       let out = outparm cgistate 
+		   out' = applyTo stid onFail out
+		   onFail (pmark : pfail : psucc : rest) =
+			  (pmark : PAR_RESULT (show res) : psucc : rest)
+	       in
+	       return ((), cgistate { outparm = out' })
+	       )
+	setCommit stid res = 
+	  B.once $
+	  wrapCGI (\cgistate ->
+	       let out = outparm cgistate 
+		   out' = applyTo stid onSucc out
+		   onSucc (pmark : pfail : psucc : rest) =
+			  (pmark : pfail : PAR_RESULT (show res) : rest)
+	       in
+	       return ((), cgistate { outparm = out' })
+	       )
+	control stid =
+	  Control { abandon = abandon stid
+		  , setFail = setFail stid
+		  , setCommit = setCommit stid
+		  }
+	run stid cgistate =
+	  do lr <- try (unwrapCGI (fun (control stid)) cgistate)
+	     case lr of
+	       Right (v, cgistate') ->
+		 -- body of transaction finished successfully; now commit
+		 let out = outparm cgistate'
+		     (prefix, outparm') = splitTo stid out
+		     PAR_TRANS _ :
+		       failp@(PAR_RESULT failString) :
+		       succp@(PAR_RESULT succString) : _ = reverse prefix
+		 in
+		 do committed <- commitFromLog prefix
+		    if committed then
+		       unwrapCGI (onResult (read succString))
+			 cgistate' { outparm = succp : outparm' }
+		     else
+		       unwrapCGI (onResult (read failString))
+			 cgistate' { outparm = failp : outparm' }
+		 
+	       Left err ->
+		 -- Caught an exception; might be due to an @anbandon@ operation
+		 case reads (ioeGetErrorString err) of
+		   (stid', rest) : _ | stid' == stid ->
+		     let result = read rest
+			 newvalue = PAR_RESULT rest
+			 out' = popTo stid (outparm cgistate)
+		     in
+		       unwrapCGI (onResult result)
+			 cgistate { inparm = []
+				  , outparm = newvalue : out'
+				  , stateID = nextstid stid newvalue 
+				  }
+		   _ ->
+		     ioError err
+    in
+    case inparm cgistate of
+      [] ->
+        let stid = stateID cgistate
+	    newmark = PAR_TRANS stid
+	    newvalue = PAR_RESULT (show result)
+	in
+	run stid cgistate 
+	  { outparm = newvalue : newvalue : newmark : outparm cgistate
+	  , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }
+      -- ongoing transaction
+      PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->
+	run stid cgistate { inparm = rest }
+	       
+      -- finished transaction, go on with result continuation
+      PAR_RESULT str : rest ->
+	unwrapCGI (onResult (read str)) cgistate { inparm = rest }
+      _ -> 
+	B.reportError "Out of sync" H.empty cgistate
+  )  
+
+
+-- | nested transaction
+withTCGI :: (Read result, Show result) =>
+	  ([PARAMETER] -> IO Bool)	    -- committer function
+	  -> result				-- default result
+	  -> (result -> TCGI result1 ()) 		-- result continuation
+	  -> (Control (TCGI result) result -> (TCGI result) ())
+	  -> TCGI result1 ()
+withTCGI checkIfCommittable result onResult fun =
+  wrapCGI (\cgistate -> 
+    let abandon stid res =
+	  wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))
+	setFail stid res = 
+	  B.once $
+	  wrapCGI (\cgistate ->
+	       let out = outparm cgistate 
+		   out' = applyTo stid onFail out
+		   onFail (pmark : pfail : psucc : rest) =
+			  (pmark : PAR_RESULT (show res) : psucc : rest)
+	       in
+	       return ((), cgistate { outparm = out' })
+	       )
+	setCommit stid res = 
+	  B.once $
+	  wrapCGI (\cgistate ->
+	       let out = outparm cgistate 
+		   out' = applyTo stid onSucc out
+		   onSucc (pmark : pfail : psucc : rest) =
+			  (pmark : pfail : PAR_RESULT (show res) : rest)
+	       in
+	       return ((), cgistate { outparm = out' })
+	       )
+	control stid =
+	  Control { abandon = abandon stid
+		  , setFail = setFail stid
+		  , setCommit = setCommit stid
+		  }
+	run stid cgistate =
+	  do lr <- try (unwrapCGI (fun (control stid)) cgistate)
+	     case lr of
+	       Right (v, cgistate') ->
+		 -- body of transaction finished successfully; now commit
+		 let out = outparm cgistate'
+		     (prefix, outparm') = splitTo stid out
+		     PAR_TRANS _ :
+		       failp@(PAR_RESULT failString) :
+		       succp@(PAR_RESULT succString) : _ = reverse prefix
+		 in
+		 do committed <- checkIfCommittable prefix
+		    if committed then
+		       -- if commit can succeed, then its reads and writes
+		       -- must not be lost! 
+		       let marker = PAR_RESULT ""
+			   logentries = [ x | x@(PAR_DB _) <- prefix]
+		       in
+		       unwrapCGI (onResult (read succString))
+			 cgistate' { outparm = succp : logentries ++ 
+				               marker : outparm' }
+		     else
+		       unwrapCGI (onResult (read failString))
+			 cgistate' { outparm = failp : outparm' }
+		 
+	       Left err ->
+		 -- Caught an exception; might be due to an @anbandon@ operation
+		 case reads (ioeGetErrorString err) of
+		   (stid', rest) : _ | stid' == stid ->
+		     let result = read rest
+			 newvalue = PAR_RESULT rest
+			 out' = popTo stid (outparm cgistate)
+		     in
+		       unwrapCGI (onResult result)
+			 cgistate { inparm = []
+				  , outparm = newvalue : out'
+				  , stateID = nextstid stid newvalue 
+				  }
+		   _ ->
+		     ioError err
+    in
+    case inparm cgistate of
+      [] ->
+        let stid = stateID cgistate
+	    newmark = PAR_TRANS stid
+	    newvalue = PAR_RESULT (show result)
+	in
+	run stid cgistate 
+	  { outparm = newvalue : newvalue : newmark : outparm cgistate
+	  , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }
+      -- ongoing transaction
+      PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->
+	run stid cgistate { inparm = rest }
+	       
+      -- finished nested transaction successfully
+      PAR_RESULT "" : rest ->
+	let loop (PAR_RESULT str : rest) =
+	      unwrapCGI (onResult (read str)) cgistate { inparm = rest }
+	    loop (PAR_DB _ : rest) =
+	      loop rest
+	    loop _ =
+	      B.reportError "Format error in nested transaction log" H.empty cgistate
+	in  loop rest
+      -- finished transaction, go on with result continuation
+      PAR_RESULT str : rest ->
+	unwrapCGI (onResult (read str)) cgistate { inparm = rest }
+      _ -> 
+	B.reportError "Out of sync" H.empty cgistate
+  )  
+
diff --git a/WASH/CGI/Types.hs b/WASH/CGI/Types.hs
new file mode 100644
--- /dev/null
+++ b/WASH/CGI/Types.hs
@@ -0,0 +1,184 @@
+-- © 2001, 2002, 2003 Peter Thiemann
+{-| The Types module aims at providing a representation for (first-order)
+monomorphic Haskell types. Two type representations are equal if and
+only if the represented types have identical definitions. Thus a type
+representation consists of a type term and the smallest list of all
+(data or newtype) definitions needed either in the type term or in
+another definition. The list of definitions is sorted to make
+representations unique.
+
+The main use of type representations is to provide a type index for
+storing Haskell values externally and for reading them back into a
+running program without sacrificing type safety. Just reading them
+back with the @Read@ class is not sufficient because
+
+ * @Read@ does not distinguish between @Int@ and @Integer@, @Float@ and @Double@y
+
+ * @Read@ cannot avoid accidental matches of constructor names
+
+Meanwhile, the 'Data.Typeable' class of GHC provides an encoding with similar
+goals.
+-}
+module WASH.CGI.Types where
+
+import Maybe
+
+-- | A type specification consists of a type representation 'TyRep' and a list of
+-- type declarations.
+data TySpec = 
+     TS TyRep [TyDecl]					    -- declarations sorted!
+  deriving (Read, Show, Eq)
+
+-- | A type representation is built from base types, type variables, tuples, and
+-- references to data-defined types.
+data TyRep =
+     TRBase  String
+   | TRVar   String
+   | TRTuple [TyRep]
+   | TRData  String [TyRep]
+  deriving (Read, Show, Eq)
+
+-- | A data declaration consists of the name of the data type, a list of type
+-- variables, and a list of constructor representations.
+data TyDecl =
+     TD String [String] [ConRep]
+  deriving (Read, Show, Eq)
+
+-- | A constructor is represented by its name, a list of field names (if defined
+-- using record notation), and the list of its argument types
+data ConRep =
+     CR String						    -- ctor name
+       	(Maybe [String])				    -- field names
+	[TyRep]						    -- field types
+  deriving (Read, Show, Eq)
+
+class Types a where
+  ty :: a -> TySpec
+
+instance Types () where
+  ty i = TS (TRBase "()") []
+
+instance Types Bool where
+  ty i = TS (TRBase "Bool") []
+  
+instance Types Int where
+  ty i = TS (TRBase "Int") []
+  
+instance Types Integer where
+  ty i = TS (TRBase "Integer") []
+  
+--instance Types Rational where
+--  ty i = TS (TRBase "Rational") []
+
+instance Types Double where
+  ty d = TS (TRBase "Double") []
+
+instance Types Float where
+  ty d = TS (TRBase "Float") []
+
+instance Types Char where
+  ty c = TS (TRBase "Char") []
+
+instance (Types a, Types b) => Types (a,b) where
+  ty xy = TS (TRTuple [tra, trb]) (merge defsa defsb)
+    where TS tra defsa = ty (fst xy)
+	  TS trb defsb = ty (snd xy)
+
+instance (Types a, Types b, Types c) => Types (a,b,c) where
+  ty ~(xa,xb,xc) = TS (TRTuple [tra, trb, trc]) (merge (merge defsa defsb) defsc)
+    where TS tra defsa = ty xa
+	  TS trb defsb = ty xb
+	  TS trc defsc = ty xc
+
+instance (Types a, Types b, Types c, Types d) => Types (a,b,c,d) where
+  ty ~(xa,xb,xc,xd) = TS (TRTuple [tra, trb, trc, trd]) 
+			 (merge (merge defsa defsb) (merge defsc defsd))
+    where TS tra defsa = ty xa
+	  TS trb defsb = ty xb
+	  TS trc defsc = ty xc
+	  TS trd defsd = ty xd
+
+instance (Types a, Types b, Types c, Types d, Types e) => Types (a,b,c,d,e) where
+  ty ~(xa,xb,xc,xd,xe) = TS (TRTuple [tra, trb, trc, trd, tre]) 
+			    (merges [defsa, defsb, defsc, defsd, defse])
+    where TS tra defsa = ty xa
+	  TS trb defsb = ty xb
+	  TS trc defsc = ty xc
+	  TS trd defsd = ty xd
+	  TS tre defse = ty xe
+
+instance (Types a) => Types [a] where
+  ty xs = TS (TRData (tdName listDef) [tr]) (merge defs [listDef])
+    where TS tr defs = ty (head xs)
+
+listDef :: TyDecl
+listDef = TD "[]" ["a"]	[CR "[]" Nothing []
+			,CR ":"  Nothing [TRVar "a"
+					 ,TRData (tdName listDef) [TRVar "a"]]]
+
+instance (Types a) => Types (Maybe a) where
+  ty mx = TS (TRData (tdName maybeDef) [tr]) (merge defs [maybeDef])
+    where TS tr defs = ty (fromJust mx)
+
+-- fromJust (Just x) = x -- in Module Maybe
+
+maybeDef :: TyDecl
+maybeDef = 
+	TD "Maybe" ["a"][CR "Nothing" Nothing []
+			,CR "Just"    Nothing [TRVar "a"]]
+
+instance (Types a, Types b) => Types (Either a b) where
+  ty xy = TS (TRData (tdName eitherDef) [tra, trb]) 
+  	     (merge (merge defsa defsb) [eitherDef])
+    where TS tra defsa = ty (fromLeft xy)
+	  TS trb defsb = ty (fromRight xy)
+
+fromLeft  (Left x)  = x
+fromRight (Right y) = y
+
+eitherDef :: TyDecl
+eitherDef =
+	TD 	"Either"
+		["a", "b"]
+		[CR "Left"  Nothing [TRVar "a"]
+		,CR "Right" Nothing [TRVar "b"]]
+
+tdName (TD name _ _) = name
+
+merge :: [TyDecl] -> [TyDecl] -> [TyDecl]
+merge [] ys = ys
+merge xs [] = xs
+merge (x:xs) (y:ys) 
+  | x == y               = x : merge xs ys
+  | tdName x == tdName y = error ("Different types with identical name: " ++ tdName x)
+  | tdName x <= tdName y = x : merge xs (y:ys)
+  | otherwise            = y : merge (x:xs) ys
+
+merges :: [[TyDecl]] -> [TyDecl]
+merges tss = foldr merge [] tss
+
+class TID a where
+  tid :: a -> ShowS
+  
+instance TID TySpec where
+  tid (TS tyRep tyDecls) =
+    tid tyRep . tid tyDecls
+
+instance TID a => TID [a] where
+  tid [] = showChar '.'
+  tid (x : xs) = showChar ',' . tid x . tid xs
+
+instance TID TyRep where
+  tid (TRBase str) = showChar 'B' . shows str
+  tid (TRVar  str) = showChar 'V' . shows str
+  tid (TRTuple tyReps) = showChar 'T' . tid tyReps
+  tid (TRData  str tyReps) = showChar 'D' . shows str . tid tyReps
+
+instance TID TyDecl where
+  tid (TD name tyvars conreps) =
+    shows name . shows tyvars . tid conreps
+
+instance TID ConRep where
+  tid (CR ctorname mFields tyReps) =
+    shows ctorname . shows mFields . tid tyReps
+
diff --git a/WASH/HTML/HTMLBase.hs b/WASH/HTML/HTMLBase.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLBase.hs
@@ -0,0 +1,180 @@
+-- © 2001-2003 Peter Thiemann
+module WASH.HTML.HTMLBase 
+{- 
+  (ATTR_(), attr_, attr_name, attr_value
+  ,ELEMENT_(), element_, empty_, cdata_, comment_, doctype_
+  ,CDATA_OPTIONS(..)
+  ,add_, add_attr_
+  ,get_attrs_
+  ,BT(..)
+  ,element_S, empty_S, cdata_S, comment_S, doctype_S
+  ,element_T, empty_T, cdata_T, comment_T, doctype_T
+  ,attr_SS, attr_SD, attr_TS, attr_TD
+  ,showTemplatified)
+-}
+where
+
+import Char
+
+data BT = STATIC | DYNAMIC | TOPLEVEL
+
+-- untyped layer
+-- attributes
+
+data ATTR_ =
+  ATTR_ { attr_BT :: BT
+	, attr_value_BT :: BT
+	, attr_name :: String
+        , attr_value :: String
+	}
+
+attr_   = ATTR_ DYNAMIC  DYNAMIC
+attr_SS = ATTR_ STATIC   STATIC
+attr_SD = ATTR_ STATIC   DYNAMIC
+attr_TS = ATTR_ TOPLEVEL STATIC
+attr_TD = ATTR_ TOPLEVEL DYNAMIC
+
+-- elements
+
+data ELEMENT_ =
+    ELEMENT_ { elem_BT :: BT
+	     , tag :: String
+    	     , attrs :: [ATTR_]
+	     , elems :: [ELEMENT_]
+	     }
+  | EMPTY_   { elem_BT :: BT
+	     , tag :: String
+  	     , attrs :: [ATTR_]
+	     }
+  | CDATA_   { elem_BT :: BT
+	     , elem_cdata :: String
+	     }
+  | COMMENT_ { elem_BT :: BT
+	     , elem_comment :: String
+	     }
+  | DOCTYPE_ { elem_BT :: BT
+	     , doctype :: [String]
+  	     , elems :: [ELEMENT_]
+	     }
+
+data CDATA_OPTIONS = CDATA_ENCODED | CDATA_FORMATTED
+  deriving (Eq)
+
+element_  = ELEMENT_ DYNAMIC
+element_S = ELEMENT_ STATIC
+element_T = ELEMENT_ TOPLEVEL
+empty_    = EMPTY_ DYNAMIC
+empty_S   = EMPTY_ STATIC
+empty_T   = EMPTY_ TOPLEVEL
+makeEncoder opt = format . encode
+  where format | CDATA_FORMATTED `elem` opt = id
+	       | otherwise = htmlFormat
+	encode | CDATA_ENCODED `elem` opt = id
+	       | otherwise = htmlEncode
+cdata_  opt = CDATA_ DYNAMIC . makeEncoder opt
+cdata_S opt = CDATA_ STATIC . makeEncoder opt
+cdata_T opt = CDATA_ TOPLEVEL . makeEncoder opt
+comment_  = COMMENT_ DYNAMIC
+comment_S = COMMENT_ STATIC
+comment_T = COMMENT_ TOPLEVEL
+doctype_  = DOCTYPE_ DYNAMIC
+doctype_S = DOCTYPE_ STATIC
+doctype_T = DOCTYPE_ TOPLEVEL
+
+add_ e_ e'_ = e_ { elems = e'_ : elems e_}
+-- | Takes element and attribute. Attaches attribute to the element. Replaces
+-- prior attribute with same name.
+add_attr_ e_ att = 
+  let nameOfAtt = attr_name att
+      all_attrs = attrs e_
+      f [] = Nothing
+      f (att' : attrs) = if attr_name att' == nameOfAtt 
+      			 then return (att : attrs)
+			 else f attrs >>= \ attrs' -> return (att' : attrs')
+      new_attrs = case f all_attrs of
+		    Nothing -> att : all_attrs
+		    Just attrs -> attrs
+  in  e_ { attrs = new_attrs }
+
+get_attrs_ = attrs
+
+-- show functions
+
+instance Show ATTR_ where
+  showsPrec i = shows_attribute
+  showList    = shows_attributes
+
+shows_attributes :: [ATTR_] -> ShowS
+shows_attributes atts = foldr (.) id (map shows_attribute atts)
+
+shows_attribute :: ATTR_ -> ShowS
+shows_attribute a =
+  showChar ' ' . showString (attr_name a) .
+  case attr_value a of
+    "()" ->
+      id
+    str@('\"':_) ->
+      showString "=\"" . htmlAttr (read str) . showString "\""
+    str ->
+      showString "=\"" . htmlAttr str . showString "\""
+
+instance Show ELEMENT_ where
+  showsPrec i = shows_element
+  showList = shows_elements
+
+shows_elements :: [ELEMENT_] -> ShowS
+shows_elements elts = foldr (.) id (reverse (map shows_element elts))
+
+shows_element :: ELEMENT_ -> ShowS
+shows_element (EMPTY_ bt tag atts) =
+  showChar '<' . showString tag . shows atts . showString "\n/>"
+shows_element (ELEMENT_ bt tag atts elts) =
+  showChar '<' . showString tag . shows atts . showChar '>'
+  . shows_elements elts
+  . showString "</" . showString tag . showString "\n>"
+shows_element (DOCTYPE_ bt strs elems) =
+  showString "<!DOCTYPE" . 
+  foldr (\str f -> showChar ' ' . showString str . f) id strs . showString "\n>" .
+  showString "<!-- generated by WASH/HTML 0.11\n-->" .
+  shows_elements elems .
+  showChar '\n'
+shows_element (CDATA_ bt str) =
+  showString str
+shows_element (COMMENT_ bt str) =
+  showString "<!-- " . commentEncode str . showString "\n-->"
+
+-- |removes illegal characters and sequences of -- from comment
+commentEncode :: String -> ShowS
+commentEncode "" ys = ys
+commentEncode ('-':xs@('-':_)) ys = '-':' ': commentEncode xs ys
+commentEncode (x:xs) ys = 
+  if x == chr 0x9 ||
+     x == chr 0xa ||
+     x == chr 0xd ||
+     x >= chr 0x20 && x <= chr 0xd7ff ||
+     x >= chr 0xe000 && x <= chr 0xfffd ||
+     x >= chr 0x10000 && x <= chr 0x10ffff
+  then x: commentEncode xs ys
+  else '?': commentEncode xs ys
+
+htmlForbiddenChars = "<&\""
+
+htmlEncode :: String -> String
+htmlEncode s = htmlAttr s ""
+
+htmlFormat s = s
+
+htmlAttr :: String -> ShowS
+htmlAttr "" = id
+htmlAttr (x:xs) =
+  (if x `elem` htmlForbiddenChars
+  then showString "&#" . shows (ord x) . showChar ';'
+  else showChar x) . htmlAttr xs
+
+{--htmlFormat "" = ""
+htmlFormat (x:xs) =
+	if isSpace x then
+	  "\n " ++ htmlFormat (dropWhile isSpace xs)
+	else
+	  x : htmlFormat xs	  
+--}
diff --git a/WASH/HTML/HTMLMonad.hs b/WASH/HTML/HTMLMonad.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLMonad.hs
@@ -0,0 +1,372 @@
+-- © 2001-2003 Peter Thiemann
+-- this file is generated -- do not edit
+module WASH.HTML.HTMLMonad 
+  (module WASH.HTML.HTMLMonad,module WASH.HTML.HTMLMonadBase) 
+  where
+import Prelude hiding (div,head,map,span)
+import WASH.HTML.HTMLMonadBase
+-- end fixed prologue
+a   = mkElement   "a"
+a, a_S, a_T :: Monad m => HTMLCons x y m a
+a_S = mkElement_S "a"
+a_T = mkElement_T "a"
+abbr   = mkElement   "abbr"
+abbr, abbr_S, abbr_T :: Monad m => HTMLCons x y m a
+abbr_S = mkElement_S "abbr"
+abbr_T = mkElement_T "abbr"
+acronym   = mkElement   "acronym"
+acronym, acronym_S, acronym_T :: Monad m => HTMLCons x y m a
+acronym_S = mkElement_S "acronym"
+acronym_T = mkElement_T "acronym"
+address   = mkElement   "address"
+address, address_S, address_T :: Monad m => HTMLCons x y m a
+address_S = mkElement_S "address"
+address_T = mkElement_T "address"
+applet   = mkElement   "applet"
+applet, applet_S, applet_T :: Monad m => HTMLCons x y m a
+applet_S = mkElement_S "applet"
+applet_T = mkElement_T "applet"
+area   = mkEmpty   "area"
+area, area_S, area_T :: Monad m => HTMLCons x y m a
+area_S = mkEmpty_S "area"
+area_T = mkEmpty_T "area"
+b   = mkElement   "b"
+b, b_S, b_T :: Monad m => HTMLCons x y m a
+b_S = mkElement_S "b"
+b_T = mkElement_T "b"
+base   = mkEmpty   "base"
+base, base_S, base_T :: Monad m => HTMLCons x y m a
+base_S = mkEmpty_S "base"
+base_T = mkEmpty_T "base"
+basefont   = mkEmpty   "basefont"
+basefont, basefont_S, basefont_T :: Monad m => HTMLCons x y m a
+basefont_S = mkEmpty_S "basefont"
+basefont_T = mkEmpty_T "basefont"
+bdo   = mkElement   "bdo"
+bdo, bdo_S, bdo_T :: Monad m => HTMLCons x y m a
+bdo_S = mkElement_S "bdo"
+bdo_T = mkElement_T "bdo"
+big   = mkElement   "big"
+big, big_S, big_T :: Monad m => HTMLCons x y m a
+big_S = mkElement_S "big"
+big_T = mkElement_T "big"
+blockquote   = mkElement   "blockquote"
+blockquote, blockquote_S, blockquote_T :: Monad m => HTMLCons x y m a
+blockquote_S = mkElement_S "blockquote"
+blockquote_T = mkElement_T "blockquote"
+body   = mkElement   "body"
+body, body_S, body_T :: Monad m => HTMLCons x y m a
+body_S = mkElement_S "body"
+body_T = mkElement_T "body"
+br   = mkEmpty   "br"
+br, br_S, br_T :: Monad m => HTMLCons x y m a
+br_S = mkEmpty_S "br"
+br_T = mkEmpty_T "br"
+button   = mkElement   "button"
+button, button_S, button_T :: Monad m => HTMLCons x y m a
+button_S = mkElement_S "button"
+button_T = mkElement_T "button"
+caption   = mkElement   "caption"
+caption, caption_S, caption_T :: Monad m => HTMLCons x y m a
+caption_S = mkElement_S "caption"
+caption_T = mkElement_T "caption"
+center   = mkElement   "center"
+center, center_S, center_T :: Monad m => HTMLCons x y m a
+center_S = mkElement_S "center"
+center_T = mkElement_T "center"
+cite   = mkElement   "cite"
+cite, cite_S, cite_T :: Monad m => HTMLCons x y m a
+cite_S = mkElement_S "cite"
+cite_T = mkElement_T "cite"
+code   = mkElement   "code"
+code, code_S, code_T :: Monad m => HTMLCons x y m a
+code_S = mkElement_S "code"
+code_T = mkElement_T "code"
+col   = mkEmpty   "col"
+col, col_S, col_T :: Monad m => HTMLCons x y m a
+col_S = mkEmpty_S "col"
+col_T = mkEmpty_T "col"
+colgroup   = mkElement   "colgroup"
+colgroup, colgroup_S, colgroup_T :: Monad m => HTMLCons x y m a
+colgroup_S = mkElement_S "colgroup"
+colgroup_T = mkElement_T "colgroup"
+dd   = mkElement   "dd"
+dd, dd_S, dd_T :: Monad m => HTMLCons x y m a
+dd_S = mkElement_S "dd"
+dd_T = mkElement_T "dd"
+del   = mkElement   "del"
+del, del_S, del_T :: Monad m => HTMLCons x y m a
+del_S = mkElement_S "del"
+del_T = mkElement_T "del"
+dfn   = mkElement   "dfn"
+dfn, dfn_S, dfn_T :: Monad m => HTMLCons x y m a
+dfn_S = mkElement_S "dfn"
+dfn_T = mkElement_T "dfn"
+dir   = mkElement   "dir"
+dir, dir_S, dir_T :: Monad m => HTMLCons x y m a
+dir_S = mkElement_S "dir"
+dir_T = mkElement_T "dir"
+div   = mkElement   "div"
+div, div_S, div_T :: Monad m => HTMLCons x y m a
+div_S = mkElement_S "div"
+div_T = mkElement_T "div"
+dl   = mkElement   "dl"
+dl, dl_S, dl_T :: Monad m => HTMLCons x y m a
+dl_S = mkElement_S "dl"
+dl_T = mkElement_T "dl"
+dt   = mkElement   "dt"
+dt, dt_S, dt_T :: Monad m => HTMLCons x y m a
+dt_S = mkElement_S "dt"
+dt_T = mkElement_T "dt"
+em   = mkElement   "em"
+em, em_S, em_T :: Monad m => HTMLCons x y m a
+em_S = mkElement_S "em"
+em_T = mkElement_T "em"
+fieldset   = mkElement   "fieldset"
+fieldset, fieldset_S, fieldset_T :: Monad m => HTMLCons x y m a
+fieldset_S = mkElement_S "fieldset"
+fieldset_T = mkElement_T "fieldset"
+font   = mkElement   "font"
+font, font_S, font_T :: Monad m => HTMLCons x y m a
+font_S = mkElement_S "font"
+font_T = mkElement_T "font"
+form   = mkElement   "form"
+form, form_S, form_T :: Monad m => HTMLCons x y m a
+form_S = mkElement_S "form"
+form_T = mkElement_T "form"
+frame   = mkEmpty   "frame"
+frame, frame_S, frame_T :: Monad m => HTMLCons x y m a
+frame_S = mkEmpty_S "frame"
+frame_T = mkEmpty_T "frame"
+frameset   = mkElement   "frameset"
+frameset, frameset_S, frameset_T :: Monad m => HTMLCons x y m a
+frameset_S = mkElement_S "frameset"
+frameset_T = mkElement_T "frameset"
+h1   = mkElement   "h1"
+h1, h1_S, h1_T :: Monad m => HTMLCons x y m a
+h1_S = mkElement_S "h1"
+h1_T = mkElement_T "h1"
+h2   = mkElement   "h2"
+h2, h2_S, h2_T :: Monad m => HTMLCons x y m a
+h2_S = mkElement_S "h2"
+h2_T = mkElement_T "h2"
+h3   = mkElement   "h3"
+h3, h3_S, h3_T :: Monad m => HTMLCons x y m a
+h3_S = mkElement_S "h3"
+h3_T = mkElement_T "h3"
+h4   = mkElement   "h4"
+h4, h4_S, h4_T :: Monad m => HTMLCons x y m a
+h4_S = mkElement_S "h4"
+h4_T = mkElement_T "h4"
+h5   = mkElement   "h5"
+h5, h5_S, h5_T :: Monad m => HTMLCons x y m a
+h5_S = mkElement_S "h5"
+h5_T = mkElement_T "h5"
+h6   = mkElement   "h6"
+h6, h6_S, h6_T :: Monad m => HTMLCons x y m a
+h6_S = mkElement_S "h6"
+h6_T = mkElement_T "h6"
+head   = mkElement   "head"
+head, head_S, head_T :: Monad m => HTMLCons x y m a
+head_S = mkElement_S "head"
+head_T = mkElement_T "head"
+hr   = mkEmpty   "hr"
+hr, hr_S, hr_T :: Monad m => HTMLCons x y m a
+hr_S = mkEmpty_S "hr"
+hr_T = mkEmpty_T "hr"
+html   = mkElement   "html"
+html, html_S, html_T :: Monad m => HTMLCons x y m a
+html_S = mkElement_S "html"
+html_T = mkElement_T "html"
+i   = mkElement   "i"
+i, i_S, i_T :: Monad m => HTMLCons x y m a
+i_S = mkElement_S "i"
+i_T = mkElement_T "i"
+iframe   = mkElement   "iframe"
+iframe, iframe_S, iframe_T :: Monad m => HTMLCons x y m a
+iframe_S = mkElement_S "iframe"
+iframe_T = mkElement_T "iframe"
+img   = mkEmpty   "img"
+img, img_S, img_T :: Monad m => HTMLCons x y m a
+img_S = mkEmpty_S "img"
+img_T = mkEmpty_T "img"
+input   = mkEmpty   "input"
+input, input_S, input_T :: Monad m => HTMLCons x y m a
+input_S = mkEmpty_S "input"
+input_T = mkEmpty_T "input"
+ins   = mkElement   "ins"
+ins, ins_S, ins_T :: Monad m => HTMLCons x y m a
+ins_S = mkElement_S "ins"
+ins_T = mkElement_T "ins"
+isindex   = mkEmpty   "isindex"
+isindex, isindex_S, isindex_T :: Monad m => HTMLCons x y m a
+isindex_S = mkEmpty_S "isindex"
+isindex_T = mkEmpty_T "isindex"
+kbd   = mkElement   "kbd"
+kbd, kbd_S, kbd_T :: Monad m => HTMLCons x y m a
+kbd_S = mkElement_S "kbd"
+kbd_T = mkElement_T "kbd"
+label   = mkElement   "label"
+label, label_S, label_T :: Monad m => HTMLCons x y m a
+label_S = mkElement_S "label"
+label_T = mkElement_T "label"
+legend   = mkElement   "legend"
+legend, legend_S, legend_T :: Monad m => HTMLCons x y m a
+legend_S = mkElement_S "legend"
+legend_T = mkElement_T "legend"
+li   = mkElement   "li"
+li, li_S, li_T :: Monad m => HTMLCons x y m a
+li_S = mkElement_S "li"
+li_T = mkElement_T "li"
+link   = mkEmpty   "link"
+link, link_S, link_T :: Monad m => HTMLCons x y m a
+link_S = mkEmpty_S "link"
+link_T = mkEmpty_T "link"
+map   = mkElement   "map"
+map, map_S, map_T :: Monad m => HTMLCons x y m a
+map_S = mkElement_S "map"
+map_T = mkElement_T "map"
+menu   = mkElement   "menu"
+menu, menu_S, menu_T :: Monad m => HTMLCons x y m a
+menu_S = mkElement_S "menu"
+menu_T = mkElement_T "menu"
+meta   = mkEmpty   "meta"
+meta, meta_S, meta_T :: Monad m => HTMLCons x y m a
+meta_S = mkEmpty_S "meta"
+meta_T = mkEmpty_T "meta"
+noframes   = mkElement   "noframes"
+noframes, noframes_S, noframes_T :: Monad m => HTMLCons x y m a
+noframes_S = mkElement_S "noframes"
+noframes_T = mkElement_T "noframes"
+noscript   = mkElement   "noscript"
+noscript, noscript_S, noscript_T :: Monad m => HTMLCons x y m a
+noscript_S = mkElement_S "noscript"
+noscript_T = mkElement_T "noscript"
+object   = mkElement   "object"
+object, object_S, object_T :: Monad m => HTMLCons x y m a
+object_S = mkElement_S "object"
+object_T = mkElement_T "object"
+ol   = mkElement   "ol"
+ol, ol_S, ol_T :: Monad m => HTMLCons x y m a
+ol_S = mkElement_S "ol"
+ol_T = mkElement_T "ol"
+optgroup   = mkElement   "optgroup"
+optgroup, optgroup_S, optgroup_T :: Monad m => HTMLCons x y m a
+optgroup_S = mkElement_S "optgroup"
+optgroup_T = mkElement_T "optgroup"
+option   = mkElement   "option"
+option, option_S, option_T :: Monad m => HTMLCons x y m a
+option_S = mkElement_S "option"
+option_T = mkElement_T "option"
+p   = mkElement   "p"
+p, p_S, p_T :: Monad m => HTMLCons x y m a
+p_S = mkElement_S "p"
+p_T = mkElement_T "p"
+param   = mkEmpty   "param"
+param, param_S, param_T :: Monad m => HTMLCons x y m a
+param_S = mkEmpty_S "param"
+param_T = mkEmpty_T "param"
+pre   = mkElement   "pre"
+pre, pre_S, pre_T :: Monad m => HTMLCons x y m a
+pre_S = mkElement_S "pre"
+pre_T = mkElement_T "pre"
+q   = mkElement   "q"
+q, q_S, q_T :: Monad m => HTMLCons x y m a
+q_S = mkElement_S "q"
+q_T = mkElement_T "q"
+s   = mkElement   "s"
+s, s_S, s_T :: Monad m => HTMLCons x y m a
+s_S = mkElement_S "s"
+s_T = mkElement_T "s"
+samp   = mkElement   "samp"
+samp, samp_S, samp_T :: Monad m => HTMLCons x y m a
+samp_S = mkElement_S "samp"
+samp_T = mkElement_T "samp"
+script   = mkElement   "script"
+script, script_S, script_T :: Monad m => HTMLCons x y m a
+script_S = mkElement_S "script"
+script_T = mkElement_T "script"
+select   = mkElement   "select"
+select, select_S, select_T :: Monad m => HTMLCons x y m a
+select_S = mkElement_S "select"
+select_T = mkElement_T "select"
+small   = mkElement   "small"
+small, small_S, small_T :: Monad m => HTMLCons x y m a
+small_S = mkElement_S "small"
+small_T = mkElement_T "small"
+span   = mkElement   "span"
+span, span_S, span_T :: Monad m => HTMLCons x y m a
+span_S = mkElement_S "span"
+span_T = mkElement_T "span"
+strike   = mkElement   "strike"
+strike, strike_S, strike_T :: Monad m => HTMLCons x y m a
+strike_S = mkElement_S "strike"
+strike_T = mkElement_T "strike"
+strong   = mkElement   "strong"
+strong, strong_S, strong_T :: Monad m => HTMLCons x y m a
+strong_S = mkElement_S "strong"
+strong_T = mkElement_T "strong"
+style   = mkElement   "style"
+style, style_S, style_T :: Monad m => HTMLCons x y m a
+style_S = mkElement_S "style"
+style_T = mkElement_T "style"
+sub   = mkElement   "sub"
+sub, sub_S, sub_T :: Monad m => HTMLCons x y m a
+sub_S = mkElement_S "sub"
+sub_T = mkElement_T "sub"
+sup   = mkElement   "sup"
+sup, sup_S, sup_T :: Monad m => HTMLCons x y m a
+sup_S = mkElement_S "sup"
+sup_T = mkElement_T "sup"
+table   = mkElement   "table"
+table, table_S, table_T :: Monad m => HTMLCons x y m a
+table_S = mkElement_S "table"
+table_T = mkElement_T "table"
+tbody   = mkElement   "tbody"
+tbody, tbody_S, tbody_T :: Monad m => HTMLCons x y m a
+tbody_S = mkElement_S "tbody"
+tbody_T = mkElement_T "tbody"
+td   = mkElement   "td"
+td, td_S, td_T :: Monad m => HTMLCons x y m a
+td_S = mkElement_S "td"
+td_T = mkElement_T "td"
+textarea   = mkElement   "textarea"
+textarea, textarea_S, textarea_T :: Monad m => HTMLCons x y m a
+textarea_S = mkElement_S "textarea"
+textarea_T = mkElement_T "textarea"
+tfoot   = mkElement   "tfoot"
+tfoot, tfoot_S, tfoot_T :: Monad m => HTMLCons x y m a
+tfoot_S = mkElement_S "tfoot"
+tfoot_T = mkElement_T "tfoot"
+th   = mkElement   "th"
+th, th_S, th_T :: Monad m => HTMLCons x y m a
+th_S = mkElement_S "th"
+th_T = mkElement_T "th"
+thead   = mkElement   "thead"
+thead, thead_S, thead_T :: Monad m => HTMLCons x y m a
+thead_S = mkElement_S "thead"
+thead_T = mkElement_T "thead"
+title   = mkElement   "title"
+title, title_S, title_T :: Monad m => HTMLCons x y m a
+title_S = mkElement_S "title"
+title_T = mkElement_T "title"
+tr   = mkElement   "tr"
+tr, tr_S, tr_T :: Monad m => HTMLCons x y m a
+tr_S = mkElement_S "tr"
+tr_T = mkElement_T "tr"
+tt   = mkElement   "tt"
+tt, tt_S, tt_T :: Monad m => HTMLCons x y m a
+tt_S = mkElement_S "tt"
+tt_T = mkElement_T "tt"
+u   = mkElement   "u"
+u, u_S, u_T :: Monad m => HTMLCons x y m a
+u_S = mkElement_S "u"
+u_T = mkElement_T "u"
+ul   = mkElement   "ul"
+ul, ul_S, ul_T :: Monad m => HTMLCons x y m a
+ul_S = mkElement_S "ul"
+ul_T = mkElement_T "ul"
+var   = mkElement   "var"
+var, var_S, var_T :: Monad m => HTMLCons x y m a
+var_S = mkElement_S "var"
+var_T = mkElement_T "var"
diff --git a/WASH/HTML/HTMLMonad98.hs b/WASH/HTML/HTMLMonad98.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLMonad98.hs
@@ -0,0 +1,5852 @@
+-- © 2001, 2002 Peter Thiemann
+-- this file is generated -- do not edit
+module WASH.HTML.HTMLMonad98
+  (module WASH.HTML.HTMLMonad98,
+   Element,Attributes,Attribute,WithHTML,lift,get_attrs,empty,( ## ),HTMLCons,attr)
+  where
+import Prelude hiding (div,head,map,span)
+import qualified WASH.HTML.HTMLMonad as HTMLMonad
+-- fixed top level code
+import WASH.HTML.HTMLMonad
+	( Element, Attributes, Attribute
+	, WithHTML, lift, get_attrs
+	, empty, ( ## )
+	, HTMLCons, attr, av, addMaker)
+data DOCUMENT = DOCUMENT
+instance AdmitChildHTML DOCUMENT
+build_document :: (Monad m) => WithHTML DOCUMENT m a -> m Element
+build_document = HTMLMonad.build_document
+class AdmitChildCDATA e where
+  text, rawtext, formattedtext :: Monad m => String -> WithHTML e m ()
+  text = HTMLMonad.text
+  rawtext = HTMLMonad.rawtext
+  formattedtext = HTMLMonad.formattedtext
+-- end fixed prologue
+class AdmitAttrVERSION e where
+  uaVERSION :: (Monad m) => String -> WithHTML e m ()
+  uaVERSION str = attr "VERSION" str
+  atVERSION :: (Monad m, AttrValueVERSION v) => v -> WithHTML e m ()
+  atVERSION v = attr "VERSION" (av $ show v)
+class AdmitAttrDIR e where
+  uaDIR :: (Monad m) => String -> WithHTML e m ()
+  uaDIR str = attr "DIR" str
+  atDIR :: (Monad m, AttrValueDIR v) => v -> WithHTML e m ()
+  atDIR v = attr "DIR" (av $ show v)
+class AdmitAttrLANG e where
+  uaLANG :: (Monad m) => String -> WithHTML e m ()
+  uaLANG str = attr "LANG" str
+  atLANG :: (Monad m, AttrValueLANG v) => v -> WithHTML e m ()
+  atLANG v = attr "LANG" (av $ show v)
+class AdmitAttrONKEYUP e where
+  uaONKEYUP :: (Monad m) => String -> WithHTML e m ()
+  uaONKEYUP str = attr "ONKEYUP" str
+  atONKEYUP :: (Monad m, AttrValueONKEYUP v) => v -> WithHTML e m ()
+  atONKEYUP v = attr "ONKEYUP" (av $ show v)
+class AdmitAttrONKEYDOWN e where
+  uaONKEYDOWN :: (Monad m) => String -> WithHTML e m ()
+  uaONKEYDOWN str = attr "ONKEYDOWN" str
+  atONKEYDOWN :: (Monad m, AttrValueONKEYDOWN v) => v -> WithHTML e m ()
+  atONKEYDOWN v = attr "ONKEYDOWN" (av $ show v)
+class AdmitAttrONKEYPRESS e where
+  uaONKEYPRESS :: (Monad m) => String -> WithHTML e m ()
+  uaONKEYPRESS str = attr "ONKEYPRESS" str
+  atONKEYPRESS :: (Monad m, AttrValueONKEYPRESS v) => v -> WithHTML e m ()
+  atONKEYPRESS v = attr "ONKEYPRESS" (av $ show v)
+class AdmitAttrONMOUSEOUT e where
+  uaONMOUSEOUT :: (Monad m) => String -> WithHTML e m ()
+  uaONMOUSEOUT str = attr "ONMOUSEOUT" str
+  atONMOUSEOUT :: (Monad m, AttrValueONMOUSEOUT v) => v -> WithHTML e m ()
+  atONMOUSEOUT v = attr "ONMOUSEOUT" (av $ show v)
+class AdmitAttrONMOUSEMOVE e where
+  uaONMOUSEMOVE :: (Monad m) => String -> WithHTML e m ()
+  uaONMOUSEMOVE str = attr "ONMOUSEMOVE" str
+  atONMOUSEMOVE :: (Monad m, AttrValueONMOUSEMOVE v) => v -> WithHTML e m ()
+  atONMOUSEMOVE v = attr "ONMOUSEMOVE" (av $ show v)
+class AdmitAttrONMOUSEOVER e where
+  uaONMOUSEOVER :: (Monad m) => String -> WithHTML e m ()
+  uaONMOUSEOVER str = attr "ONMOUSEOVER" str
+  atONMOUSEOVER :: (Monad m, AttrValueONMOUSEOVER v) => v -> WithHTML e m ()
+  atONMOUSEOVER v = attr "ONMOUSEOVER" (av $ show v)
+class AdmitAttrONMOUSEUP e where
+  uaONMOUSEUP :: (Monad m) => String -> WithHTML e m ()
+  uaONMOUSEUP str = attr "ONMOUSEUP" str
+  atONMOUSEUP :: (Monad m, AttrValueONMOUSEUP v) => v -> WithHTML e m ()
+  atONMOUSEUP v = attr "ONMOUSEUP" (av $ show v)
+class AdmitAttrONMOUSEDOWN e where
+  uaONMOUSEDOWN :: (Monad m) => String -> WithHTML e m ()
+  uaONMOUSEDOWN str = attr "ONMOUSEDOWN" str
+  atONMOUSEDOWN :: (Monad m, AttrValueONMOUSEDOWN v) => v -> WithHTML e m ()
+  atONMOUSEDOWN v = attr "ONMOUSEDOWN" (av $ show v)
+class AdmitAttrONDBLCLICK e where
+  uaONDBLCLICK :: (Monad m) => String -> WithHTML e m ()
+  uaONDBLCLICK str = attr "ONDBLCLICK" str
+  atONDBLCLICK :: (Monad m, AttrValueONDBLCLICK v) => v -> WithHTML e m ()
+  atONDBLCLICK v = attr "ONDBLCLICK" (av $ show v)
+class AdmitAttrONCLICK e where
+  uaONCLICK :: (Monad m) => String -> WithHTML e m ()
+  uaONCLICK str = attr "ONCLICK" str
+  atONCLICK :: (Monad m, AttrValueONCLICK v) => v -> WithHTML e m ()
+  atONCLICK v = attr "ONCLICK" (av $ show v)
+class AdmitAttrTITLE e where
+  uaTITLE :: (Monad m) => String -> WithHTML e m ()
+  uaTITLE str = attr "TITLE" str
+  atTITLE :: (Monad m, AttrValueTITLE v) => v -> WithHTML e m ()
+  atTITLE v = attr "TITLE" (av $ show v)
+class AdmitAttrSTYLE e where
+  uaSTYLE :: (Monad m) => String -> WithHTML e m ()
+  uaSTYLE str = attr "STYLE" str
+  atSTYLE :: (Monad m, AttrValueSTYLE v) => v -> WithHTML e m ()
+  atSTYLE v = attr "STYLE" (av $ show v)
+class AdmitAttrCLASS e where
+  uaCLASS :: (Monad m) => String -> WithHTML e m ()
+  uaCLASS str = attr "CLASS" str
+  atCLASS :: (Monad m, AttrValueCLASS v) => v -> WithHTML e m ()
+  atCLASS v = attr "CLASS" (av $ show v)
+class AdmitAttrID e where
+  uaID :: (Monad m) => String -> WithHTML e m ()
+  uaID str = attr "ID" str
+  atID :: (Monad m, AttrValueID v) => v -> WithHTML e m ()
+  atID v = attr "ID" (av $ show v)
+class AdmitAttrFOR e where
+  uaFOR :: (Monad m) => String -> WithHTML e m ()
+  uaFOR str = attr "FOR" str
+  atFOR :: (Monad m, AttrValueFOR v) => v -> WithHTML e m ()
+  atFOR v = attr "FOR" (av $ show v)
+class AdmitAttrEVENT e where
+  uaEVENT :: (Monad m) => String -> WithHTML e m ()
+  uaEVENT str = attr "EVENT" str
+  atEVENT :: (Monad m, AttrValueEVENT v) => v -> WithHTML e m ()
+  atEVENT v = attr "EVENT" (av $ show v)
+class AdmitAttrDEFER e where
+  uaDEFER :: (Monad m) => String -> WithHTML e m ()
+  uaDEFER str = attr "DEFER" str
+  atDEFER :: (Monad m, AttrValueDEFER v) => v -> WithHTML e m ()
+  atDEFER v = attr "DEFER" (av $ show v)
+class AdmitAttrSRC e where
+  uaSRC :: (Monad m) => String -> WithHTML e m ()
+  uaSRC str = attr "SRC" str
+  atSRC :: (Monad m, AttrValueSRC v) => v -> WithHTML e m ()
+  atSRC v = attr "SRC" (av $ show v)
+class AdmitAttrLANGUAGE e where
+  uaLANGUAGE :: (Monad m) => String -> WithHTML e m ()
+  uaLANGUAGE str = attr "LANGUAGE" str
+  atLANGUAGE :: (Monad m, AttrValueLANGUAGE v) => v -> WithHTML e m ()
+  atLANGUAGE v = attr "LANGUAGE" (av $ show v)
+class AdmitAttrTYPE e where
+  uaTYPE :: (Monad m) => String -> WithHTML e m ()
+  uaTYPE str = attr "TYPE" str
+  atTYPE :: (Monad m, AttrValueTYPE v) => v -> WithHTML e m ()
+  atTYPE v = attr "TYPE" (av $ show v)
+class AdmitAttrCHARSET e where
+  uaCHARSET :: (Monad m) => String -> WithHTML e m ()
+  uaCHARSET str = attr "CHARSET" str
+  atCHARSET :: (Monad m, AttrValueCHARSET v) => v -> WithHTML e m ()
+  atCHARSET v = attr "CHARSET" (av $ show v)
+class AdmitAttrMEDIA e where
+  uaMEDIA :: (Monad m) => String -> WithHTML e m ()
+  uaMEDIA str = attr "MEDIA" str
+  atMEDIA :: (Monad m, AttrValueMEDIA v) => v -> WithHTML e m ()
+  atMEDIA v = attr "MEDIA" (av $ show v)
+class AdmitAttrSCHEME e where
+  uaSCHEME :: (Monad m) => String -> WithHTML e m ()
+  uaSCHEME str = attr "SCHEME" str
+  atSCHEME :: (Monad m, AttrValueSCHEME v) => v -> WithHTML e m ()
+  atSCHEME v = attr "SCHEME" (av $ show v)
+class AdmitAttrCONTENT e where
+  uaCONTENT :: (Monad m) => String -> WithHTML e m ()
+  uaCONTENT str = attr "CONTENT" str
+  atCONTENT :: (Monad m, AttrValueCONTENT v) => v -> WithHTML e m ()
+  atCONTENT v = attr "CONTENT" (av $ show v)
+class AdmitAttrNAME e where
+  uaNAME :: (Monad m) => String -> WithHTML e m ()
+  uaNAME str = attr "NAME" str
+  atNAME :: (Monad m, AttrValueNAME v) => v -> WithHTML e m ()
+  atNAME v = attr "NAME" (av $ show v)
+class AdmitAttrHTTP_EQUIV e where
+  uaHTTP_EQUIV :: (Monad m) => String -> WithHTML e m ()
+  uaHTTP_EQUIV str = attr "HTTP_EQUIV" str
+  atHTTP_EQUIV :: (Monad m, AttrValueHTTP_EQUIV v) => v -> WithHTML e m ()
+  atHTTP_EQUIV v = attr "HTTP_EQUIV" (av $ show v)
+class AdmitAttrTARGET e where
+  uaTARGET :: (Monad m) => String -> WithHTML e m ()
+  uaTARGET str = attr "TARGET" str
+  atTARGET :: (Monad m, AttrValueTARGET v) => v -> WithHTML e m ()
+  atTARGET v = attr "TARGET" (av $ show v)
+class AdmitAttrHREF e where
+  uaHREF :: (Monad m) => String -> WithHTML e m ()
+  uaHREF str = attr "HREF" str
+  atHREF :: (Monad m, AttrValueHREF v) => v -> WithHTML e m ()
+  atHREF v = attr "HREF" (av $ show v)
+class AdmitAttrPROMPT e where
+  uaPROMPT :: (Monad m) => String -> WithHTML e m ()
+  uaPROMPT str = attr "PROMPT" str
+  atPROMPT :: (Monad m, AttrValuePROMPT v) => v -> WithHTML e m ()
+  atPROMPT v = attr "PROMPT" (av $ show v)
+class AdmitAttrPROFILE e where
+  uaPROFILE :: (Monad m) => String -> WithHTML e m ()
+  uaPROFILE str = attr "PROFILE" str
+  atPROFILE :: (Monad m, AttrValuePROFILE v) => v -> WithHTML e m ()
+  atPROFILE v = attr "PROFILE" (av $ show v)
+class AdmitAttrWIDTH e where
+  uaWIDTH :: (Monad m) => String -> WithHTML e m ()
+  uaWIDTH str = attr "WIDTH" str
+  atWIDTH :: (Monad m, AttrValueWIDTH v) => v -> WithHTML e m ()
+  atWIDTH v = attr "WIDTH" (av $ show v)
+class AdmitAttrHEIGHT e where
+  uaHEIGHT :: (Monad m) => String -> WithHTML e m ()
+  uaHEIGHT str = attr "HEIGHT" str
+  atHEIGHT :: (Monad m, AttrValueHEIGHT v) => v -> WithHTML e m ()
+  atHEIGHT v = attr "HEIGHT" (av $ show v)
+class AdmitAttrALIGN e where
+  uaALIGN :: (Monad m) => String -> WithHTML e m ()
+  uaALIGN str = attr "ALIGN" str
+  atALIGN :: (Monad m, AttrValueALIGN v) => v -> WithHTML e m ()
+  atALIGN v = attr "ALIGN" (av $ show v)
+class AdmitAttrSCROLLING e where
+  uaSCROLLING :: (Monad m) => String -> WithHTML e m ()
+  uaSCROLLING str = attr "SCROLLING" str
+  atSCROLLING :: (Monad m, AttrValueSCROLLING v) => v -> WithHTML e m ()
+  atSCROLLING v = attr "SCROLLING" (av $ show v)
+class AdmitAttrMARGINHEIGHT e where
+  uaMARGINHEIGHT :: (Monad m) => String -> WithHTML e m ()
+  uaMARGINHEIGHT str = attr "MARGINHEIGHT" str
+  atMARGINHEIGHT :: (Monad m, AttrValueMARGINHEIGHT v) => v -> WithHTML e m ()
+  atMARGINHEIGHT v = attr "MARGINHEIGHT" (av $ show v)
+class AdmitAttrMARGINWIDTH e where
+  uaMARGINWIDTH :: (Monad m) => String -> WithHTML e m ()
+  uaMARGINWIDTH str = attr "MARGINWIDTH" str
+  atMARGINWIDTH :: (Monad m, AttrValueMARGINWIDTH v) => v -> WithHTML e m ()
+  atMARGINWIDTH v = attr "MARGINWIDTH" (av $ show v)
+class AdmitAttrFRAMEBORDER e where
+  uaFRAMEBORDER :: (Monad m) => String -> WithHTML e m ()
+  uaFRAMEBORDER str = attr "FRAMEBORDER" str
+  atFRAMEBORDER :: (Monad m, AttrValueFRAMEBORDER v) => v -> WithHTML e m ()
+  atFRAMEBORDER v = attr "FRAMEBORDER" (av $ show v)
+class AdmitAttrLONGDESC e where
+  uaLONGDESC :: (Monad m) => String -> WithHTML e m ()
+  uaLONGDESC str = attr "LONGDESC" str
+  atLONGDESC :: (Monad m, AttrValueLONGDESC v) => v -> WithHTML e m ()
+  atLONGDESC v = attr "LONGDESC" (av $ show v)
+class AdmitAttrNORESIZE e where
+  uaNORESIZE :: (Monad m) => String -> WithHTML e m ()
+  uaNORESIZE str = attr "NORESIZE" str
+  atNORESIZE :: (Monad m, AttrValueNORESIZE v) => v -> WithHTML e m ()
+  atNORESIZE v = attr "NORESIZE" (av $ show v)
+class AdmitAttrONUNLOAD e where
+  uaONUNLOAD :: (Monad m) => String -> WithHTML e m ()
+  uaONUNLOAD str = attr "ONUNLOAD" str
+  atONUNLOAD :: (Monad m, AttrValueONUNLOAD v) => v -> WithHTML e m ()
+  atONUNLOAD v = attr "ONUNLOAD" (av $ show v)
+class AdmitAttrONLOAD e where
+  uaONLOAD :: (Monad m) => String -> WithHTML e m ()
+  uaONLOAD str = attr "ONLOAD" str
+  atONLOAD :: (Monad m, AttrValueONLOAD v) => v -> WithHTML e m ()
+  atONLOAD v = attr "ONLOAD" (av $ show v)
+class AdmitAttrCOLS e where
+  uaCOLS :: (Monad m) => String -> WithHTML e m ()
+  uaCOLS str = attr "COLS" str
+  atCOLS :: (Monad m, AttrValueCOLS v) => v -> WithHTML e m ()
+  atCOLS v = attr "COLS" (av $ show v)
+class AdmitAttrROWS e where
+  uaROWS :: (Monad m) => String -> WithHTML e m ()
+  uaROWS str = attr "ROWS" str
+  atROWS :: (Monad m, AttrValueROWS v) => v -> WithHTML e m ()
+  atROWS v = attr "ROWS" (av $ show v)
+class AdmitAttrBGCOLOR e where
+  uaBGCOLOR :: (Monad m) => String -> WithHTML e m ()
+  uaBGCOLOR str = attr "BGCOLOR" str
+  atBGCOLOR :: (Monad m, AttrValueBGCOLOR v) => v -> WithHTML e m ()
+  atBGCOLOR v = attr "BGCOLOR" (av $ show v)
+class AdmitAttrNOWRAP e where
+  uaNOWRAP :: (Monad m) => String -> WithHTML e m ()
+  uaNOWRAP str = attr "NOWRAP" str
+  atNOWRAP :: (Monad m, AttrValueNOWRAP v) => v -> WithHTML e m ()
+  atNOWRAP v = attr "NOWRAP" (av $ show v)
+class AdmitAttrVALIGN e where
+  uaVALIGN :: (Monad m) => String -> WithHTML e m ()
+  uaVALIGN str = attr "VALIGN" str
+  atVALIGN :: (Monad m, AttrValueVALIGN v) => v -> WithHTML e m ()
+  atVALIGN v = attr "VALIGN" (av $ show v)
+class AdmitAttrCHAROFF e where
+  uaCHAROFF :: (Monad m) => String -> WithHTML e m ()
+  uaCHAROFF str = attr "CHAROFF" str
+  atCHAROFF :: (Monad m, AttrValueCHAROFF v) => v -> WithHTML e m ()
+  atCHAROFF v = attr "CHAROFF" (av $ show v)
+class AdmitAttrCHAR e where
+  uaCHAR :: (Monad m) => String -> WithHTML e m ()
+  uaCHAR str = attr "CHAR" str
+  atCHAR :: (Monad m, AttrValueCHAR v) => v -> WithHTML e m ()
+  atCHAR v = attr "CHAR" (av $ show v)
+class AdmitAttrCOLSPAN e where
+  uaCOLSPAN :: (Monad m) => String -> WithHTML e m ()
+  uaCOLSPAN str = attr "COLSPAN" str
+  atCOLSPAN :: (Monad m, AttrValueCOLSPAN v) => v -> WithHTML e m ()
+  atCOLSPAN v = attr "COLSPAN" (av $ show v)
+class AdmitAttrROWSPAN e where
+  uaROWSPAN :: (Monad m) => String -> WithHTML e m ()
+  uaROWSPAN str = attr "ROWSPAN" str
+  atROWSPAN :: (Monad m, AttrValueROWSPAN v) => v -> WithHTML e m ()
+  atROWSPAN v = attr "ROWSPAN" (av $ show v)
+class AdmitAttrSCOPE e where
+  uaSCOPE :: (Monad m) => String -> WithHTML e m ()
+  uaSCOPE str = attr "SCOPE" str
+  atSCOPE :: (Monad m, AttrValueSCOPE v) => v -> WithHTML e m ()
+  atSCOPE v = attr "SCOPE" (av $ show v)
+class AdmitAttrHEADERS e where
+  uaHEADERS :: (Monad m) => String -> WithHTML e m ()
+  uaHEADERS str = attr "HEADERS" str
+  atHEADERS :: (Monad m, AttrValueHEADERS v) => v -> WithHTML e m ()
+  atHEADERS v = attr "HEADERS" (av $ show v)
+class AdmitAttrAXIS e where
+  uaAXIS :: (Monad m) => String -> WithHTML e m ()
+  uaAXIS str = attr "AXIS" str
+  atAXIS :: (Monad m, AttrValueAXIS v) => v -> WithHTML e m ()
+  atAXIS v = attr "AXIS" (av $ show v)
+class AdmitAttrABBR e where
+  uaABBR :: (Monad m) => String -> WithHTML e m ()
+  uaABBR str = attr "ABBR" str
+  atABBR :: (Monad m, AttrValueABBR v) => v -> WithHTML e m ()
+  atABBR v = attr "ABBR" (av $ show v)
+class AdmitAttrSPAN e where
+  uaSPAN :: (Monad m) => String -> WithHTML e m ()
+  uaSPAN str = attr "SPAN" str
+  atSPAN :: (Monad m, AttrValueSPAN v) => v -> WithHTML e m ()
+  atSPAN v = attr "SPAN" (av $ show v)
+class AdmitAttrDATAPAGESIZE e where
+  uaDATAPAGESIZE :: (Monad m) => String -> WithHTML e m ()
+  uaDATAPAGESIZE str = attr "DATAPAGESIZE" str
+  atDATAPAGESIZE :: (Monad m, AttrValueDATAPAGESIZE v) => v -> WithHTML e m ()
+  atDATAPAGESIZE v = attr "DATAPAGESIZE" (av $ show v)
+class AdmitAttrCELLPADDING e where
+  uaCELLPADDING :: (Monad m) => String -> WithHTML e m ()
+  uaCELLPADDING str = attr "CELLPADDING" str
+  atCELLPADDING :: (Monad m, AttrValueCELLPADDING v) => v -> WithHTML e m ()
+  atCELLPADDING v = attr "CELLPADDING" (av $ show v)
+class AdmitAttrCELLSPACING e where
+  uaCELLSPACING :: (Monad m) => String -> WithHTML e m ()
+  uaCELLSPACING str = attr "CELLSPACING" str
+  atCELLSPACING :: (Monad m, AttrValueCELLSPACING v) => v -> WithHTML e m ()
+  atCELLSPACING v = attr "CELLSPACING" (av $ show v)
+class AdmitAttrRULES e where
+  uaRULES :: (Monad m) => String -> WithHTML e m ()
+  uaRULES str = attr "RULES" str
+  atRULES :: (Monad m, AttrValueRULES v) => v -> WithHTML e m ()
+  atRULES v = attr "RULES" (av $ show v)
+class AdmitAttrFRAME e where
+  uaFRAME :: (Monad m) => String -> WithHTML e m ()
+  uaFRAME str = attr "FRAME" str
+  atFRAME :: (Monad m, AttrValueFRAME v) => v -> WithHTML e m ()
+  atFRAME v = attr "FRAME" (av $ show v)
+class AdmitAttrBORDER e where
+  uaBORDER :: (Monad m) => String -> WithHTML e m ()
+  uaBORDER str = attr "BORDER" str
+  atBORDER :: (Monad m, AttrValueBORDER v) => v -> WithHTML e m ()
+  atBORDER v = attr "BORDER" (av $ show v)
+class AdmitAttrSUMMARY e where
+  uaSUMMARY :: (Monad m) => String -> WithHTML e m ()
+  uaSUMMARY str = attr "SUMMARY" str
+  atSUMMARY :: (Monad m, AttrValueSUMMARY v) => v -> WithHTML e m ()
+  atSUMMARY v = attr "SUMMARY" (av $ show v)
+class AdmitAttrONBLUR e where
+  uaONBLUR :: (Monad m) => String -> WithHTML e m ()
+  uaONBLUR str = attr "ONBLUR" str
+  atONBLUR :: (Monad m, AttrValueONBLUR v) => v -> WithHTML e m ()
+  atONBLUR v = attr "ONBLUR" (av $ show v)
+class AdmitAttrONFOCUS e where
+  uaONFOCUS :: (Monad m) => String -> WithHTML e m ()
+  uaONFOCUS str = attr "ONFOCUS" str
+  atONFOCUS :: (Monad m, AttrValueONFOCUS v) => v -> WithHTML e m ()
+  atONFOCUS v = attr "ONFOCUS" (av $ show v)
+class AdmitAttrACCESSKEY e where
+  uaACCESSKEY :: (Monad m) => String -> WithHTML e m ()
+  uaACCESSKEY str = attr "ACCESSKEY" str
+  atACCESSKEY :: (Monad m, AttrValueACCESSKEY v) => v -> WithHTML e m ()
+  atACCESSKEY v = attr "ACCESSKEY" (av $ show v)
+class AdmitAttrTABINDEX e where
+  uaTABINDEX :: (Monad m) => String -> WithHTML e m ()
+  uaTABINDEX str = attr "TABINDEX" str
+  atTABINDEX :: (Monad m, AttrValueTABINDEX v) => v -> WithHTML e m ()
+  atTABINDEX v = attr "TABINDEX" (av $ show v)
+class AdmitAttrDISABLED e where
+  uaDISABLED :: (Monad m) => String -> WithHTML e m ()
+  uaDISABLED str = attr "DISABLED" str
+  atDISABLED :: (Monad m, AttrValueDISABLED v) => v -> WithHTML e m ()
+  atDISABLED v = attr "DISABLED" (av $ show v)
+class AdmitAttrVALUE e where
+  uaVALUE :: (Monad m) => String -> WithHTML e m ()
+  uaVALUE str = attr "VALUE" str
+  atVALUE :: (Monad m, AttrValueVALUE v) => v -> WithHTML e m ()
+  atVALUE v = attr "VALUE" (av $ show v)
+class AdmitAttrONCHANGE e where
+  uaONCHANGE :: (Monad m) => String -> WithHTML e m ()
+  uaONCHANGE str = attr "ONCHANGE" str
+  atONCHANGE :: (Monad m, AttrValueONCHANGE v) => v -> WithHTML e m ()
+  atONCHANGE v = attr "ONCHANGE" (av $ show v)
+class AdmitAttrONSELECT e where
+  uaONSELECT :: (Monad m) => String -> WithHTML e m ()
+  uaONSELECT str = attr "ONSELECT" str
+  atONSELECT :: (Monad m, AttrValueONSELECT v) => v -> WithHTML e m ()
+  atONSELECT v = attr "ONSELECT" (av $ show v)
+class AdmitAttrREADONLY e where
+  uaREADONLY :: (Monad m) => String -> WithHTML e m ()
+  uaREADONLY str = attr "READONLY" str
+  atREADONLY :: (Monad m, AttrValueREADONLY v) => v -> WithHTML e m ()
+  atREADONLY v = attr "READONLY" (av $ show v)
+class AdmitAttrLABEL e where
+  uaLABEL :: (Monad m) => String -> WithHTML e m ()
+  uaLABEL str = attr "LABEL" str
+  atLABEL :: (Monad m, AttrValueLABEL v) => v -> WithHTML e m ()
+  atLABEL v = attr "LABEL" (av $ show v)
+class AdmitAttrSELECTED e where
+  uaSELECTED :: (Monad m) => String -> WithHTML e m ()
+  uaSELECTED str = attr "SELECTED" str
+  atSELECTED :: (Monad m, AttrValueSELECTED v) => v -> WithHTML e m ()
+  atSELECTED v = attr "SELECTED" (av $ show v)
+class AdmitAttrMULTIPLE e where
+  uaMULTIPLE :: (Monad m) => String -> WithHTML e m ()
+  uaMULTIPLE str = attr "MULTIPLE" str
+  atMULTIPLE :: (Monad m, AttrValueMULTIPLE v) => v -> WithHTML e m ()
+  atMULTIPLE v = attr "MULTIPLE" (av $ show v)
+class AdmitAttrSIZE e where
+  uaSIZE :: (Monad m) => String -> WithHTML e m ()
+  uaSIZE str = attr "SIZE" str
+  atSIZE :: (Monad m, AttrValueSIZE v) => v -> WithHTML e m ()
+  atSIZE v = attr "SIZE" (av $ show v)
+class AdmitAttrACCEPT e where
+  uaACCEPT :: (Monad m) => String -> WithHTML e m ()
+  uaACCEPT str = attr "ACCEPT" str
+  atACCEPT :: (Monad m, AttrValueACCEPT v) => v -> WithHTML e m ()
+  atACCEPT v = attr "ACCEPT" (av $ show v)
+class AdmitAttrISMAP e where
+  uaISMAP :: (Monad m) => String -> WithHTML e m ()
+  uaISMAP str = attr "ISMAP" str
+  atISMAP :: (Monad m, AttrValueISMAP v) => v -> WithHTML e m ()
+  atISMAP v = attr "ISMAP" (av $ show v)
+class AdmitAttrUSEMAP e where
+  uaUSEMAP :: (Monad m) => String -> WithHTML e m ()
+  uaUSEMAP str = attr "USEMAP" str
+  atUSEMAP :: (Monad m, AttrValueUSEMAP v) => v -> WithHTML e m ()
+  atUSEMAP v = attr "USEMAP" (av $ show v)
+class AdmitAttrALT e where
+  uaALT :: (Monad m) => String -> WithHTML e m ()
+  uaALT str = attr "ALT" str
+  atALT :: (Monad m, AttrValueALT v) => v -> WithHTML e m ()
+  atALT v = attr "ALT" (av $ show v)
+class AdmitAttrMAXLENGTH e where
+  uaMAXLENGTH :: (Monad m) => String -> WithHTML e m ()
+  uaMAXLENGTH str = attr "MAXLENGTH" str
+  atMAXLENGTH :: (Monad m, AttrValueMAXLENGTH v) => v -> WithHTML e m ()
+  atMAXLENGTH v = attr "MAXLENGTH" (av $ show v)
+class AdmitAttrCHECKED e where
+  uaCHECKED :: (Monad m) => String -> WithHTML e m ()
+  uaCHECKED str = attr "CHECKED" str
+  atCHECKED :: (Monad m, AttrValueCHECKED v) => v -> WithHTML e m ()
+  atCHECKED v = attr "CHECKED" (av $ show v)
+class AdmitAttrACCEPT_CHARSET e where
+  uaACCEPT_CHARSET :: (Monad m) => String -> WithHTML e m ()
+  uaACCEPT_CHARSET str = attr "ACCEPT_CHARSET" str
+  atACCEPT_CHARSET :: (Monad m, AttrValueACCEPT_CHARSET v) => v -> WithHTML e m ()
+  atACCEPT_CHARSET v = attr "ACCEPT_CHARSET" (av $ show v)
+class AdmitAttrONRESET e where
+  uaONRESET :: (Monad m) => String -> WithHTML e m ()
+  uaONRESET str = attr "ONRESET" str
+  atONRESET :: (Monad m, AttrValueONRESET v) => v -> WithHTML e m ()
+  atONRESET v = attr "ONRESET" (av $ show v)
+class AdmitAttrONSUBMIT e where
+  uaONSUBMIT :: (Monad m) => String -> WithHTML e m ()
+  uaONSUBMIT str = attr "ONSUBMIT" str
+  atONSUBMIT :: (Monad m, AttrValueONSUBMIT v) => v -> WithHTML e m ()
+  atONSUBMIT v = attr "ONSUBMIT" (av $ show v)
+class AdmitAttrENCTYPE e where
+  uaENCTYPE :: (Monad m) => String -> WithHTML e m ()
+  uaENCTYPE str = attr "ENCTYPE" str
+  atENCTYPE :: (Monad m, AttrValueENCTYPE v) => v -> WithHTML e m ()
+  atENCTYPE v = attr "ENCTYPE" (av $ show v)
+class AdmitAttrMETHOD e where
+  uaMETHOD :: (Monad m) => String -> WithHTML e m ()
+  uaMETHOD str = attr "METHOD" str
+  atMETHOD :: (Monad m, AttrValueMETHOD v) => v -> WithHTML e m ()
+  atMETHOD v = attr "METHOD" (av $ show v)
+class AdmitAttrACTION e where
+  uaACTION :: (Monad m) => String -> WithHTML e m ()
+  uaACTION str = attr "ACTION" str
+  atACTION :: (Monad m, AttrValueACTION v) => v -> WithHTML e m ()
+  atACTION v = attr "ACTION" (av $ show v)
+class AdmitAttrCOMPACT e where
+  uaCOMPACT :: (Monad m) => String -> WithHTML e m ()
+  uaCOMPACT str = attr "COMPACT" str
+  atCOMPACT :: (Monad m, AttrValueCOMPACT v) => v -> WithHTML e m ()
+  atCOMPACT v = attr "COMPACT" (av $ show v)
+class AdmitAttrSTART e where
+  uaSTART :: (Monad m) => String -> WithHTML e m ()
+  uaSTART str = attr "START" str
+  atSTART :: (Monad m, AttrValueSTART v) => v -> WithHTML e m ()
+  atSTART v = attr "START" (av $ show v)
+class AdmitAttrDATETIME e where
+  uaDATETIME :: (Monad m) => String -> WithHTML e m ()
+  uaDATETIME str = attr "DATETIME" str
+  atDATETIME :: (Monad m, AttrValueDATETIME v) => v -> WithHTML e m ()
+  atDATETIME v = attr "DATETIME" (av $ show v)
+class AdmitAttrCITE e where
+  uaCITE :: (Monad m) => String -> WithHTML e m ()
+  uaCITE str = attr "CITE" str
+  atCITE :: (Monad m, AttrValueCITE v) => v -> WithHTML e m ()
+  atCITE v = attr "CITE" (av $ show v)
+class AdmitAttrNOSHADE e where
+  uaNOSHADE :: (Monad m) => String -> WithHTML e m ()
+  uaNOSHADE str = attr "NOSHADE" str
+  atNOSHADE :: (Monad m, AttrValueNOSHADE v) => v -> WithHTML e m ()
+  atNOSHADE v = attr "NOSHADE" (av $ show v)
+class AdmitAttrVSPACE e where
+  uaVSPACE :: (Monad m) => String -> WithHTML e m ()
+  uaVSPACE str = attr "VSPACE" str
+  atVSPACE :: (Monad m, AttrValueVSPACE v) => v -> WithHTML e m ()
+  atVSPACE v = attr "VSPACE" (av $ show v)
+class AdmitAttrHSPACE e where
+  uaHSPACE :: (Monad m) => String -> WithHTML e m ()
+  uaHSPACE str = attr "HSPACE" str
+  atHSPACE :: (Monad m, AttrValueHSPACE v) => v -> WithHTML e m ()
+  atHSPACE v = attr "HSPACE" (av $ show v)
+class AdmitAttrOBJECT e where
+  uaOBJECT :: (Monad m) => String -> WithHTML e m ()
+  uaOBJECT str = attr "OBJECT" str
+  atOBJECT :: (Monad m, AttrValueOBJECT v) => v -> WithHTML e m ()
+  atOBJECT v = attr "OBJECT" (av $ show v)
+class AdmitAttrCODE e where
+  uaCODE :: (Monad m) => String -> WithHTML e m ()
+  uaCODE str = attr "CODE" str
+  atCODE :: (Monad m, AttrValueCODE v) => v -> WithHTML e m ()
+  atCODE v = attr "CODE" (av $ show v)
+class AdmitAttrARCHIVE e where
+  uaARCHIVE :: (Monad m) => String -> WithHTML e m ()
+  uaARCHIVE str = attr "ARCHIVE" str
+  atARCHIVE :: (Monad m, AttrValueARCHIVE v) => v -> WithHTML e m ()
+  atARCHIVE v = attr "ARCHIVE" (av $ show v)
+class AdmitAttrCODEBASE e where
+  uaCODEBASE :: (Monad m) => String -> WithHTML e m ()
+  uaCODEBASE str = attr "CODEBASE" str
+  atCODEBASE :: (Monad m, AttrValueCODEBASE v) => v -> WithHTML e m ()
+  atCODEBASE v = attr "CODEBASE" (av $ show v)
+class AdmitAttrVALUETYPE e where
+  uaVALUETYPE :: (Monad m) => String -> WithHTML e m ()
+  uaVALUETYPE str = attr "VALUETYPE" str
+  atVALUETYPE :: (Monad m, AttrValueVALUETYPE v) => v -> WithHTML e m ()
+  atVALUETYPE v = attr "VALUETYPE" (av $ show v)
+class AdmitAttrSTANDBY e where
+  uaSTANDBY :: (Monad m) => String -> WithHTML e m ()
+  uaSTANDBY str = attr "STANDBY" str
+  atSTANDBY :: (Monad m, AttrValueSTANDBY v) => v -> WithHTML e m ()
+  atSTANDBY v = attr "STANDBY" (av $ show v)
+class AdmitAttrCODETYPE e where
+  uaCODETYPE :: (Monad m) => String -> WithHTML e m ()
+  uaCODETYPE str = attr "CODETYPE" str
+  atCODETYPE :: (Monad m, AttrValueCODETYPE v) => v -> WithHTML e m ()
+  atCODETYPE v = attr "CODETYPE" (av $ show v)
+class AdmitAttrDATA e where
+  uaDATA :: (Monad m) => String -> WithHTML e m ()
+  uaDATA str = attr "DATA" str
+  atDATA :: (Monad m, AttrValueDATA v) => v -> WithHTML e m ()
+  atDATA v = attr "DATA" (av $ show v)
+class AdmitAttrCLASSID e where
+  uaCLASSID :: (Monad m) => String -> WithHTML e m ()
+  uaCLASSID str = attr "CLASSID" str
+  atCLASSID :: (Monad m, AttrValueCLASSID v) => v -> WithHTML e m ()
+  atCLASSID v = attr "CLASSID" (av $ show v)
+class AdmitAttrDECLARE e where
+  uaDECLARE :: (Monad m) => String -> WithHTML e m ()
+  uaDECLARE str = attr "DECLARE" str
+  atDECLARE :: (Monad m, AttrValueDECLARE v) => v -> WithHTML e m ()
+  atDECLARE v = attr "DECLARE" (av $ show v)
+class AdmitAttrREV e where
+  uaREV :: (Monad m) => String -> WithHTML e m ()
+  uaREV str = attr "REV" str
+  atREV :: (Monad m, AttrValueREV v) => v -> WithHTML e m ()
+  atREV v = attr "REV" (av $ show v)
+class AdmitAttrREL e where
+  uaREL :: (Monad m) => String -> WithHTML e m ()
+  uaREL str = attr "REL" str
+  atREL :: (Monad m, AttrValueREL v) => v -> WithHTML e m ()
+  atREL v = attr "REL" (av $ show v)
+class AdmitAttrHREFLANG e where
+  uaHREFLANG :: (Monad m) => String -> WithHTML e m ()
+  uaHREFLANG str = attr "HREFLANG" str
+  atHREFLANG :: (Monad m, AttrValueHREFLANG v) => v -> WithHTML e m ()
+  atHREFLANG v = attr "HREFLANG" (av $ show v)
+class AdmitAttrNOHREF e where
+  uaNOHREF :: (Monad m) => String -> WithHTML e m ()
+  uaNOHREF str = attr "NOHREF" str
+  atNOHREF :: (Monad m, AttrValueNOHREF v) => v -> WithHTML e m ()
+  atNOHREF v = attr "NOHREF" (av $ show v)
+class AdmitAttrCOORDS e where
+  uaCOORDS :: (Monad m) => String -> WithHTML e m ()
+  uaCOORDS str = attr "COORDS" str
+  atCOORDS :: (Monad m, AttrValueCOORDS v) => v -> WithHTML e m ()
+  atCOORDS v = attr "COORDS" (av $ show v)
+class AdmitAttrSHAPE e where
+  uaSHAPE :: (Monad m) => String -> WithHTML e m ()
+  uaSHAPE str = attr "SHAPE" str
+  atSHAPE :: (Monad m, AttrValueSHAPE v) => v -> WithHTML e m ()
+  atSHAPE v = attr "SHAPE" (av $ show v)
+class AdmitAttrALINK e where
+  uaALINK :: (Monad m) => String -> WithHTML e m ()
+  uaALINK str = attr "ALINK" str
+  atALINK :: (Monad m, AttrValueALINK v) => v -> WithHTML e m ()
+  atALINK v = attr "ALINK" (av $ show v)
+class AdmitAttrVLINK e where
+  uaVLINK :: (Monad m) => String -> WithHTML e m ()
+  uaVLINK str = attr "VLINK" str
+  atVLINK :: (Monad m, AttrValueVLINK v) => v -> WithHTML e m ()
+  atVLINK v = attr "VLINK" (av $ show v)
+class AdmitAttrLINK e where
+  uaLINK :: (Monad m) => String -> WithHTML e m ()
+  uaLINK str = attr "LINK" str
+  atLINK :: (Monad m, AttrValueLINK v) => v -> WithHTML e m ()
+  atLINK v = attr "LINK" (av $ show v)
+class AdmitAttrTEXT e where
+  uaTEXT :: (Monad m) => String -> WithHTML e m ()
+  uaTEXT str = attr "TEXT" str
+  atTEXT :: (Monad m, AttrValueTEXT v) => v -> WithHTML e m ()
+  atTEXT v = attr "TEXT" (av $ show v)
+class AdmitAttrBACKGROUND e where
+  uaBACKGROUND :: (Monad m) => String -> WithHTML e m ()
+  uaBACKGROUND str = attr "BACKGROUND" str
+  atBACKGROUND :: (Monad m, AttrValueBACKGROUND v) => v -> WithHTML e m ()
+  atBACKGROUND v = attr "BACKGROUND" (av $ show v)
+class AdmitAttrCLEAR e where
+  uaCLEAR :: (Monad m) => String -> WithHTML e m ()
+  uaCLEAR str = attr "CLEAR" str
+  atCLEAR :: (Monad m, AttrValueCLEAR v) => v -> WithHTML e m ()
+  atCLEAR v = attr "CLEAR" (av $ show v)
+class AdmitAttrFACE e where
+  uaFACE :: (Monad m) => String -> WithHTML e m ()
+  uaFACE str = attr "FACE" str
+  atFACE :: (Monad m, AttrValueFACE v) => v -> WithHTML e m ()
+  atFACE v = attr "FACE" (av $ show v)
+class AdmitAttrCOLOR e where
+  uaCOLOR :: (Monad m) => String -> WithHTML e m ()
+  uaCOLOR str = attr "COLOR" str
+  atCOLOR :: (Monad m, AttrValueCOLOR v) => v -> WithHTML e m ()
+  atCOLOR v = attr "COLOR" (av $ show v)
+class Show v => AttrValueABBR v
+class Show v => AttrValueACCEPT v
+class Show v => AttrValueACCEPT_CHARSET v
+class Show v => AttrValueACCESSKEY v
+class Show v => AttrValueACTION v
+class Show v => AttrValueALIGN v
+class Show v => AttrValueALINK v
+class Show v => AttrValueALT v
+class Show v => AttrValueARCHIVE v
+class Show v => AttrValueAXIS v
+class Show v => AttrValueBACKGROUND v
+class Show v => AttrValueBGCOLOR v
+class Show v => AttrValueBORDER v
+class Show v => AttrValueCELLPADDING v
+class Show v => AttrValueCELLSPACING v
+class Show v => AttrValueCHAR v
+class Show v => AttrValueCHAROFF v
+class Show v => AttrValueCHARSET v
+class Show v => AttrValueCHECKED v
+class Show v => AttrValueCITE v
+class Show v => AttrValueCLASS v
+class Show v => AttrValueCLASSID v
+class Show v => AttrValueCLEAR v
+class Show v => AttrValueCODE v
+class Show v => AttrValueCODEBASE v
+class Show v => AttrValueCODETYPE v
+class Show v => AttrValueCOLOR v
+class Show v => AttrValueCOLS v
+class Show v => AttrValueCOLSPAN v
+class Show v => AttrValueCOMPACT v
+class Show v => AttrValueCONTENT v
+class Show v => AttrValueCOORDS v
+class Show v => AttrValueDATA v
+class Show v => AttrValueDATAPAGESIZE v
+class Show v => AttrValueDATETIME v
+class Show v => AttrValueDECLARE v
+class Show v => AttrValueDEFER v
+class Show v => AttrValueDIR v
+class Show v => AttrValueDISABLED v
+class Show v => AttrValueENCTYPE v
+class Show v => AttrValueEVENT v
+class Show v => AttrValueFACE v
+class Show v => AttrValueFOR v
+class Show v => AttrValueFRAME v
+class Show v => AttrValueFRAMEBORDER v
+class Show v => AttrValueHEADERS v
+class Show v => AttrValueHEIGHT v
+class Show v => AttrValueHREF v
+class Show v => AttrValueHREFLANG v
+class Show v => AttrValueHSPACE v
+class Show v => AttrValueHTTP_EQUIV v
+class Show v => AttrValueID v
+class Show v => AttrValueISMAP v
+class Show v => AttrValueLABEL v
+class Show v => AttrValueLANG v
+class Show v => AttrValueLANGUAGE v
+class Show v => AttrValueLINK v
+class Show v => AttrValueLONGDESC v
+class Show v => AttrValueMARGINHEIGHT v
+class Show v => AttrValueMARGINWIDTH v
+class Show v => AttrValueMAXLENGTH v
+class Show v => AttrValueMEDIA v
+class Show v => AttrValueMETHOD v
+class Show v => AttrValueMULTIPLE v
+class Show v => AttrValueNAME v
+class Show v => AttrValueNOHREF v
+class Show v => AttrValueNORESIZE v
+class Show v => AttrValueNOSHADE v
+class Show v => AttrValueNOWRAP v
+class Show v => AttrValueOBJECT v
+class Show v => AttrValueONBLUR v
+class Show v => AttrValueONCHANGE v
+class Show v => AttrValueONCLICK v
+class Show v => AttrValueONDBLCLICK v
+class Show v => AttrValueONFOCUS v
+class Show v => AttrValueONKEYDOWN v
+class Show v => AttrValueONKEYPRESS v
+class Show v => AttrValueONKEYUP v
+class Show v => AttrValueONLOAD v
+class Show v => AttrValueONMOUSEDOWN v
+class Show v => AttrValueONMOUSEMOVE v
+class Show v => AttrValueONMOUSEOUT v
+class Show v => AttrValueONMOUSEOVER v
+class Show v => AttrValueONMOUSEUP v
+class Show v => AttrValueONRESET v
+class Show v => AttrValueONSELECT v
+class Show v => AttrValueONSUBMIT v
+class Show v => AttrValueONUNLOAD v
+class Show v => AttrValuePROFILE v
+class Show v => AttrValuePROMPT v
+class Show v => AttrValueREADONLY v
+class Show v => AttrValueREL v
+class Show v => AttrValueREV v
+class Show v => AttrValueROWS v
+class Show v => AttrValueROWSPAN v
+class Show v => AttrValueRULES v
+class Show v => AttrValueSCHEME v
+class Show v => AttrValueSCOPE v
+class Show v => AttrValueSCROLLING v
+class Show v => AttrValueSELECTED v
+class Show v => AttrValueSHAPE v
+class Show v => AttrValueSIZE v
+class Show v => AttrValueSPAN v
+class Show v => AttrValueSRC v
+class Show v => AttrValueSTANDBY v
+class Show v => AttrValueSTART v
+class Show v => AttrValueSTYLE v
+class Show v => AttrValueSUMMARY v
+class Show v => AttrValueTABINDEX v
+class Show v => AttrValueTARGET v
+class Show v => AttrValueTEXT v
+class Show v => AttrValueTITLE v
+class Show v => AttrValueTYPE v
+class Show v => AttrValueUSEMAP v
+class Show v => AttrValueVALIGN v
+class Show v => AttrValueVALUE v
+class Show v => AttrValueVALUETYPE v
+class Show v => AttrValueVERSION v
+class Show v => AttrValueVLINK v
+class Show v => AttrValueVSPACE v
+class Show v => AttrValueWIDTH v
+class AdmitChildA e where
+  a :: (Monad m) => WithHTML A m a -> WithHTML e m a
+  a = HTMLMonad.a
+class AdmitChildABBR e where
+  abbr :: (Monad m) => WithHTML ABBR m a -> WithHTML e m a
+  abbr = HTMLMonad.abbr
+class AdmitChildACRONYM e where
+  acronym :: (Monad m) => WithHTML ACRONYM m a -> WithHTML e m a
+  acronym = HTMLMonad.acronym
+class AdmitChildADDRESS e where
+  address :: (Monad m) => WithHTML ADDRESS m a -> WithHTML e m a
+  address = HTMLMonad.address
+class AdmitChildAPPLET e where
+  applet :: (Monad m) => WithHTML APPLET m a -> WithHTML e m a
+  applet = HTMLMonad.applet
+class AdmitChildAREA e where
+  area :: (Monad m) => WithHTML AREA m a -> WithHTML e m a
+  area = HTMLMonad.area
+class AdmitChildB e where
+  b :: (Monad m) => WithHTML B m a -> WithHTML e m a
+  b = HTMLMonad.b
+class AdmitChildBASE e where
+  base :: (Monad m) => WithHTML BASE m a -> WithHTML e m a
+  base = HTMLMonad.base
+class AdmitChildBASEFONT e where
+  basefont :: (Monad m) => WithHTML BASEFONT m a -> WithHTML e m a
+  basefont = HTMLMonad.basefont
+class AdmitChildBDO e where
+  bdo :: (Monad m) => WithHTML BDO m a -> WithHTML e m a
+  bdo = HTMLMonad.bdo
+class AdmitChildBIG e where
+  big :: (Monad m) => WithHTML BIG m a -> WithHTML e m a
+  big = HTMLMonad.big
+class AdmitChildBLOCKQUOTE e where
+  blockquote :: (Monad m) => WithHTML BLOCKQUOTE m a -> WithHTML e m a
+  blockquote = HTMLMonad.blockquote
+class AdmitChildBODY e where
+  body :: (Monad m) => WithHTML BODY m a -> WithHTML e m a
+  body = HTMLMonad.body
+class AdmitChildBR e where
+  br :: (Monad m) => WithHTML BR m a -> WithHTML e m a
+  br = HTMLMonad.br
+class AdmitChildBUTTON e where
+  button :: (Monad m) => WithHTML BUTTON m a -> WithHTML e m a
+  button = HTMLMonad.button
+class AdmitChildCAPTION e where
+  caption :: (Monad m) => WithHTML CAPTION m a -> WithHTML e m a
+  caption = HTMLMonad.caption
+class AdmitChildCENTER e where
+  center :: (Monad m) => WithHTML CENTER m a -> WithHTML e m a
+  center = HTMLMonad.center
+class AdmitChildCITE e where
+  cite :: (Monad m) => WithHTML CITE m a -> WithHTML e m a
+  cite = HTMLMonad.cite
+class AdmitChildCODE e where
+  code :: (Monad m) => WithHTML CODE m a -> WithHTML e m a
+  code = HTMLMonad.code
+class AdmitChildCOL e where
+  col :: (Monad m) => WithHTML COL m a -> WithHTML e m a
+  col = HTMLMonad.col
+class AdmitChildCOLGROUP e where
+  colgroup :: (Monad m) => WithHTML COLGROUP m a -> WithHTML e m a
+  colgroup = HTMLMonad.colgroup
+class AdmitChildDD e where
+  dd :: (Monad m) => WithHTML DD m a -> WithHTML e m a
+  dd = HTMLMonad.dd
+class AdmitChildDEL e where
+  del :: (Monad m) => WithHTML DEL m a -> WithHTML e m a
+  del = HTMLMonad.del
+class AdmitChildDFN e where
+  dfn :: (Monad m) => WithHTML DFN m a -> WithHTML e m a
+  dfn = HTMLMonad.dfn
+class AdmitChildDIR e where
+  dir :: (Monad m) => WithHTML DIR m a -> WithHTML e m a
+  dir = HTMLMonad.dir
+class AdmitChildDIV e where
+  div :: (Monad m) => WithHTML DIV m a -> WithHTML e m a
+  div = HTMLMonad.div
+class AdmitChildDL e where
+  dl :: (Monad m) => WithHTML DL m a -> WithHTML e m a
+  dl = HTMLMonad.dl
+class AdmitChildDT e where
+  dt :: (Monad m) => WithHTML DT m a -> WithHTML e m a
+  dt = HTMLMonad.dt
+class AdmitChildEM e where
+  em :: (Monad m) => WithHTML EM m a -> WithHTML e m a
+  em = HTMLMonad.em
+class AdmitChildFIELDSET e where
+  fieldset :: (Monad m) => WithHTML FIELDSET m a -> WithHTML e m a
+  fieldset = HTMLMonad.fieldset
+class AdmitChildFONT e where
+  font :: (Monad m) => WithHTML FONT m a -> WithHTML e m a
+  font = HTMLMonad.font
+class AdmitChildFORM e where
+  form :: (Monad m) => WithHTML FORM m a -> WithHTML e m a
+  form = HTMLMonad.form
+class AdmitChildFRAME e where
+  frame :: (Monad m) => WithHTML FRAME m a -> WithHTML e m a
+  frame = HTMLMonad.frame
+class AdmitChildFRAMESET e where
+  frameset :: (Monad m) => WithHTML FRAMESET m a -> WithHTML e m a
+  frameset = HTMLMonad.frameset
+class AdmitChildH1 e where
+  h1 :: (Monad m) => WithHTML H1 m a -> WithHTML e m a
+  h1 = HTMLMonad.h1
+class AdmitChildH2 e where
+  h2 :: (Monad m) => WithHTML H2 m a -> WithHTML e m a
+  h2 = HTMLMonad.h2
+class AdmitChildH3 e where
+  h3 :: (Monad m) => WithHTML H3 m a -> WithHTML e m a
+  h3 = HTMLMonad.h3
+class AdmitChildH4 e where
+  h4 :: (Monad m) => WithHTML H4 m a -> WithHTML e m a
+  h4 = HTMLMonad.h4
+class AdmitChildH5 e where
+  h5 :: (Monad m) => WithHTML H5 m a -> WithHTML e m a
+  h5 = HTMLMonad.h5
+class AdmitChildH6 e where
+  h6 :: (Monad m) => WithHTML H6 m a -> WithHTML e m a
+  h6 = HTMLMonad.h6
+class AdmitChildHEAD e where
+  head :: (Monad m) => WithHTML HEAD m a -> WithHTML e m a
+  head = HTMLMonad.head
+class AdmitChildHR e where
+  hr :: (Monad m) => WithHTML HR m a -> WithHTML e m a
+  hr = HTMLMonad.hr
+class AdmitChildHTML e where
+  html :: (Monad m) => WithHTML HTML m a -> WithHTML e m a
+  html = HTMLMonad.html
+class AdmitChildI e where
+  i :: (Monad m) => WithHTML I m a -> WithHTML e m a
+  i = HTMLMonad.i
+class AdmitChildIFRAME e where
+  iframe :: (Monad m) => WithHTML IFRAME m a -> WithHTML e m a
+  iframe = HTMLMonad.iframe
+class AdmitChildIMG e where
+  img :: (Monad m) => WithHTML IMG m a -> WithHTML e m a
+  img = HTMLMonad.img
+class AdmitChildINPUT e where
+  input :: (Monad m) => WithHTML INPUT m a -> WithHTML e m a
+  input = HTMLMonad.input
+class AdmitChildINS e where
+  ins :: (Monad m) => WithHTML INS m a -> WithHTML e m a
+  ins = HTMLMonad.ins
+class AdmitChildISINDEX e where
+  isindex :: (Monad m) => WithHTML ISINDEX m a -> WithHTML e m a
+  isindex = HTMLMonad.isindex
+class AdmitChildKBD e where
+  kbd :: (Monad m) => WithHTML KBD m a -> WithHTML e m a
+  kbd = HTMLMonad.kbd
+class AdmitChildLABEL e where
+  label :: (Monad m) => WithHTML LABEL m a -> WithHTML e m a
+  label = HTMLMonad.label
+class AdmitChildLEGEND e where
+  legend :: (Monad m) => WithHTML LEGEND m a -> WithHTML e m a
+  legend = HTMLMonad.legend
+class AdmitChildLI e where
+  li :: (Monad m) => WithHTML LI m a -> WithHTML e m a
+  li = HTMLMonad.li
+class AdmitChildLINK e where
+  link :: (Monad m) => WithHTML LINK m a -> WithHTML e m a
+  link = HTMLMonad.link
+class AdmitChildMAP e where
+  map :: (Monad m) => WithHTML MAP m a -> WithHTML e m a
+  map = HTMLMonad.map
+class AdmitChildMENU e where
+  menu :: (Monad m) => WithHTML MENU m a -> WithHTML e m a
+  menu = HTMLMonad.menu
+class AdmitChildMETA e where
+  meta :: (Monad m) => WithHTML META m a -> WithHTML e m a
+  meta = HTMLMonad.meta
+class AdmitChildNOFRAMES e where
+  noframes :: (Monad m) => WithHTML NOFRAMES m a -> WithHTML e m a
+  noframes = HTMLMonad.noframes
+class AdmitChildNOSCRIPT e where
+  noscript :: (Monad m) => WithHTML NOSCRIPT m a -> WithHTML e m a
+  noscript = HTMLMonad.noscript
+class AdmitChildOBJECT e where
+  object :: (Monad m) => WithHTML OBJECT m a -> WithHTML e m a
+  object = HTMLMonad.object
+class AdmitChildOL e where
+  ol :: (Monad m) => WithHTML OL m a -> WithHTML e m a
+  ol = HTMLMonad.ol
+class AdmitChildOPTGROUP e where
+  optgroup :: (Monad m) => WithHTML OPTGROUP m a -> WithHTML e m a
+  optgroup = HTMLMonad.optgroup
+class AdmitChildOPTION e where
+  option :: (Monad m) => WithHTML OPTION m a -> WithHTML e m a
+  option = HTMLMonad.option
+class AdmitChildP e where
+  p :: (Monad m) => WithHTML P m a -> WithHTML e m a
+  p = HTMLMonad.p
+class AdmitChildPARAM e where
+  param :: (Monad m) => WithHTML PARAM m a -> WithHTML e m a
+  param = HTMLMonad.param
+class AdmitChildPRE e where
+  pre :: (Monad m) => WithHTML PRE m a -> WithHTML e m a
+  pre = HTMLMonad.pre
+class AdmitChildQ e where
+  q :: (Monad m) => WithHTML Q m a -> WithHTML e m a
+  q = HTMLMonad.q
+class AdmitChildS e where
+  s :: (Monad m) => WithHTML S m a -> WithHTML e m a
+  s = HTMLMonad.s
+class AdmitChildSAMP e where
+  samp :: (Monad m) => WithHTML SAMP m a -> WithHTML e m a
+  samp = HTMLMonad.samp
+class AdmitChildSCRIPT e where
+  script :: (Monad m) => WithHTML SCRIPT m a -> WithHTML e m a
+  script = HTMLMonad.script
+class AdmitChildSELECT e where
+  select :: (Monad m) => WithHTML SELECT m a -> WithHTML e m a
+  select = HTMLMonad.select
+class AdmitChildSMALL e where
+  small :: (Monad m) => WithHTML SMALL m a -> WithHTML e m a
+  small = HTMLMonad.small
+class AdmitChildSPAN e where
+  span :: (Monad m) => WithHTML SPAN m a -> WithHTML e m a
+  span = HTMLMonad.span
+class AdmitChildSTRIKE e where
+  strike :: (Monad m) => WithHTML STRIKE m a -> WithHTML e m a
+  strike = HTMLMonad.strike
+class AdmitChildSTRONG e where
+  strong :: (Monad m) => WithHTML STRONG m a -> WithHTML e m a
+  strong = HTMLMonad.strong
+class AdmitChildSTYLE e where
+  style :: (Monad m) => WithHTML STYLE m a -> WithHTML e m a
+  style = HTMLMonad.style
+class AdmitChildSUB e where
+  sub :: (Monad m) => WithHTML SUB m a -> WithHTML e m a
+  sub = HTMLMonad.sub
+class AdmitChildSUP e where
+  sup :: (Monad m) => WithHTML SUP m a -> WithHTML e m a
+  sup = HTMLMonad.sup
+class AdmitChildTABLE e where
+  table :: (Monad m) => WithHTML TABLE m a -> WithHTML e m a
+  table = HTMLMonad.table
+class AdmitChildTBODY e where
+  tbody :: (Monad m) => WithHTML TBODY m a -> WithHTML e m a
+  tbody = HTMLMonad.tbody
+class AdmitChildTD e where
+  td :: (Monad m) => WithHTML TD m a -> WithHTML e m a
+  td = HTMLMonad.td
+class AdmitChildTEXTAREA e where
+  textarea :: (Monad m) => WithHTML TEXTAREA m a -> WithHTML e m a
+  textarea = HTMLMonad.textarea
+class AdmitChildTFOOT e where
+  tfoot :: (Monad m) => WithHTML TFOOT m a -> WithHTML e m a
+  tfoot = HTMLMonad.tfoot
+class AdmitChildTH e where
+  th :: (Monad m) => WithHTML TH m a -> WithHTML e m a
+  th = HTMLMonad.th
+class AdmitChildTHEAD e where
+  thead :: (Monad m) => WithHTML THEAD m a -> WithHTML e m a
+  thead = HTMLMonad.thead
+class AdmitChildTITLE e where
+  title :: (Monad m) => WithHTML TITLE m a -> WithHTML e m a
+  title = HTMLMonad.title
+class AdmitChildTR e where
+  tr :: (Monad m) => WithHTML TR m a -> WithHTML e m a
+  tr = HTMLMonad.tr
+class AdmitChildTT e where
+  tt :: (Monad m) => WithHTML TT m a -> WithHTML e m a
+  tt = HTMLMonad.tt
+class AdmitChildU e where
+  u :: (Monad m) => WithHTML U m a -> WithHTML e m a
+  u = HTMLMonad.u
+class AdmitChildUL e where
+  ul :: (Monad m) => WithHTML UL m a -> WithHTML e m a
+  ul = HTMLMonad.ul
+class AdmitChildVAR e where
+  var :: (Monad m) => WithHTML VAR m a -> WithHTML e m a
+  var = HTMLMonad.var
+data A = A
+instance Show A where show A = "A"
+data ABBR = ABBR
+instance Show ABBR where show ABBR = "ABBR"
+data ACRONYM = ACRONYM
+instance Show ACRONYM where show ACRONYM = "ACRONYM"
+data ADDRESS = ADDRESS
+instance Show ADDRESS where show ADDRESS = "ADDRESS"
+data APPLET = APPLET
+instance Show APPLET where show APPLET = "APPLET"
+data AREA = AREA
+instance Show AREA where show AREA = "AREA"
+data B = B
+instance Show B where show B = "B"
+data BASE = BASE
+instance Show BASE where show BASE = "BASE"
+data BASEFONT = BASEFONT
+instance Show BASEFONT where show BASEFONT = "BASEFONT"
+data BDO = BDO
+instance Show BDO where show BDO = "BDO"
+data BIG = BIG
+instance Show BIG where show BIG = "BIG"
+data BLOCKQUOTE = BLOCKQUOTE
+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"
+data BODY = BODY
+instance Show BODY where show BODY = "BODY"
+data BR = BR
+instance Show BR where show BR = "BR"
+data BUTTON = BUTTON
+instance Show BUTTON where show BUTTON = "BUTTON"
+data CAPTION = CAPTION
+instance Show CAPTION where show CAPTION = "CAPTION"
+data CENTER = CENTER
+instance Show CENTER where show CENTER = "CENTER"
+data CITE = CITE
+instance Show CITE where show CITE = "CITE"
+data CODE = CODE
+instance Show CODE where show CODE = "CODE"
+data COL = COL
+instance Show COL where show COL = "COL"
+data COLGROUP = COLGROUP
+instance Show COLGROUP where show COLGROUP = "COLGROUP"
+data DD = DD
+instance Show DD where show DD = "DD"
+data DEL = DEL
+instance Show DEL where show DEL = "DEL"
+data DFN = DFN
+instance Show DFN where show DFN = "DFN"
+data DIR = DIR
+instance Show DIR where show DIR = "DIR"
+data DIV = DIV
+instance Show DIV where show DIV = "DIV"
+data DL = DL
+instance Show DL where show DL = "DL"
+data DT = DT
+instance Show DT where show DT = "DT"
+data EM = EM
+instance Show EM where show EM = "EM"
+data FIELDSET = FIELDSET
+instance Show FIELDSET where show FIELDSET = "FIELDSET"
+data FONT = FONT
+instance Show FONT where show FONT = "FONT"
+data FORM = FORM
+instance Show FORM where show FORM = "FORM"
+data FRAME = FRAME
+instance Show FRAME where show FRAME = "FRAME"
+data FRAMESET = FRAMESET
+instance Show FRAMESET where show FRAMESET = "FRAMESET"
+data H1 = H1
+instance Show H1 where show H1 = "H1"
+data H2 = H2
+instance Show H2 where show H2 = "H2"
+data H3 = H3
+instance Show H3 where show H3 = "H3"
+data H4 = H4
+instance Show H4 where show H4 = "H4"
+data H5 = H5
+instance Show H5 where show H5 = "H5"
+data H6 = H6
+instance Show H6 where show H6 = "H6"
+data HEAD = HEAD
+instance Show HEAD where show HEAD = "HEAD"
+data HR = HR
+instance Show HR where show HR = "HR"
+data HTML = HTML
+instance Show HTML where show HTML = "HTML"
+data I = I
+instance Show I where show I = "I"
+data IFRAME = IFRAME
+instance Show IFRAME where show IFRAME = "IFRAME"
+data IMG = IMG
+instance Show IMG where show IMG = "IMG"
+data INPUT = INPUT
+instance Show INPUT where show INPUT = "INPUT"
+data INS = INS
+instance Show INS where show INS = "INS"
+data ISINDEX = ISINDEX
+instance Show ISINDEX where show ISINDEX = "ISINDEX"
+data KBD = KBD
+instance Show KBD where show KBD = "KBD"
+data LABEL = LABEL
+instance Show LABEL where show LABEL = "LABEL"
+data LEGEND = LEGEND
+instance Show LEGEND where show LEGEND = "LEGEND"
+data LI = LI
+instance Show LI where show LI = "LI"
+data LINK = LINK
+instance Show LINK where show LINK = "LINK"
+data MAP = MAP
+instance Show MAP where show MAP = "MAP"
+data MENU = MENU
+instance Show MENU where show MENU = "MENU"
+data META = META
+instance Show META where show META = "META"
+data NOFRAMES = NOFRAMES
+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"
+data NOSCRIPT = NOSCRIPT
+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"
+data OBJECT = OBJECT
+instance Show OBJECT where show OBJECT = "OBJECT"
+data OL = OL
+instance Show OL where show OL = "OL"
+data OPTGROUP = OPTGROUP
+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"
+data OPTION = OPTION
+instance Show OPTION where show OPTION = "OPTION"
+data P = P
+instance Show P where show P = "P"
+data PARAM = PARAM
+instance Show PARAM where show PARAM = "PARAM"
+data PRE = PRE
+instance Show PRE where show PRE = "PRE"
+data Q = Q
+instance Show Q where show Q = "Q"
+data S = S
+instance Show S where show S = "S"
+data SAMP = SAMP
+instance Show SAMP where show SAMP = "SAMP"
+data SCRIPT = SCRIPT
+instance Show SCRIPT where show SCRIPT = "SCRIPT"
+data SELECT = SELECT
+instance Show SELECT where show SELECT = "SELECT"
+data SMALL = SMALL
+instance Show SMALL where show SMALL = "SMALL"
+data SPAN = SPAN
+instance Show SPAN where show SPAN = "SPAN"
+data STRIKE = STRIKE
+instance Show STRIKE where show STRIKE = "STRIKE"
+data STRONG = STRONG
+instance Show STRONG where show STRONG = "STRONG"
+data STYLE = STYLE
+instance Show STYLE where show STYLE = "STYLE"
+data SUB = SUB
+instance Show SUB where show SUB = "SUB"
+data SUP = SUP
+instance Show SUP where show SUP = "SUP"
+data TABLE = TABLE
+instance Show TABLE where show TABLE = "TABLE"
+data TBODY = TBODY
+instance Show TBODY where show TBODY = "TBODY"
+data TD = TD
+instance Show TD where show TD = "TD"
+data TEXTAREA = TEXTAREA
+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"
+data TFOOT = TFOOT
+instance Show TFOOT where show TFOOT = "TFOOT"
+data TH = TH
+instance Show TH where show TH = "TH"
+data THEAD = THEAD
+instance Show THEAD where show THEAD = "THEAD"
+data TITLE = TITLE
+instance Show TITLE where show TITLE = "TITLE"
+data TR = TR
+instance Show TR where show TR = "TR"
+data TT = TT
+instance Show TT where show TT = "TT"
+data U = U
+instance Show U where show U = "U"
+data UL = UL
+instance Show UL where show UL = "UL"
+data VAR = VAR
+instance Show VAR where show VAR = "VAR"
+
+instance AdmitChildHEAD HTML
+instance AdmitChildFRAMESET HTML
+
+instance AdmitChildP NOSCRIPT
+instance AdmitChildH1 NOSCRIPT
+instance AdmitChildH2 NOSCRIPT
+instance AdmitChildH3 NOSCRIPT
+instance AdmitChildH4 NOSCRIPT
+instance AdmitChildH5 NOSCRIPT
+instance AdmitChildH6 NOSCRIPT
+instance AdmitChildUL NOSCRIPT
+instance AdmitChildOL NOSCRIPT
+instance AdmitChildDIR NOSCRIPT
+instance AdmitChildMENU NOSCRIPT
+instance AdmitChildPRE NOSCRIPT
+instance AdmitChildDL NOSCRIPT
+instance AdmitChildDIV NOSCRIPT
+instance AdmitChildCENTER NOSCRIPT
+instance AdmitChildNOSCRIPT NOSCRIPT
+instance AdmitChildNOFRAMES NOSCRIPT
+instance AdmitChildBLOCKQUOTE NOSCRIPT
+instance AdmitChildFORM NOSCRIPT
+instance AdmitChildISINDEX NOSCRIPT
+instance AdmitChildHR NOSCRIPT
+instance AdmitChildTABLE NOSCRIPT
+instance AdmitChildFIELDSET NOSCRIPT
+instance AdmitChildADDRESS NOSCRIPT
+instance AdmitChildCDATA NOSCRIPT
+instance AdmitChildTT NOSCRIPT
+instance AdmitChildI NOSCRIPT
+instance AdmitChildB NOSCRIPT
+instance AdmitChildU NOSCRIPT
+instance AdmitChildS NOSCRIPT
+instance AdmitChildSTRIKE NOSCRIPT
+instance AdmitChildBIG NOSCRIPT
+instance AdmitChildSMALL NOSCRIPT
+instance AdmitChildEM NOSCRIPT
+instance AdmitChildSTRONG NOSCRIPT
+instance AdmitChildDFN NOSCRIPT
+instance AdmitChildCODE NOSCRIPT
+instance AdmitChildSAMP NOSCRIPT
+instance AdmitChildKBD NOSCRIPT
+instance AdmitChildVAR NOSCRIPT
+instance AdmitChildCITE NOSCRIPT
+instance AdmitChildABBR NOSCRIPT
+instance AdmitChildACRONYM NOSCRIPT
+instance AdmitChildA NOSCRIPT
+instance AdmitChildIMG NOSCRIPT
+instance AdmitChildAPPLET NOSCRIPT
+instance AdmitChildOBJECT NOSCRIPT
+instance AdmitChildFONT NOSCRIPT
+instance AdmitChildBASEFONT NOSCRIPT
+instance AdmitChildBR NOSCRIPT
+instance AdmitChildSCRIPT NOSCRIPT
+instance AdmitChildMAP NOSCRIPT
+instance AdmitChildQ NOSCRIPT
+instance AdmitChildSUB NOSCRIPT
+instance AdmitChildSUP NOSCRIPT
+instance AdmitChildSPAN NOSCRIPT
+instance AdmitChildBDO NOSCRIPT
+instance AdmitChildIFRAME NOSCRIPT
+instance AdmitChildINPUT NOSCRIPT
+instance AdmitChildSELECT NOSCRIPT
+instance AdmitChildTEXTAREA NOSCRIPT
+instance AdmitChildLABEL NOSCRIPT
+instance AdmitChildBUTTON NOSCRIPT
+
+instance AdmitChildCDATA SCRIPT
+
+instance AdmitChildCDATA STYLE
+
+
+
+
+instance AdmitChildCDATA TITLE
+
+instance AdmitChildTITLE HEAD
+instance AdmitChildISINDEX HEAD
+instance AdmitChildBASE HEAD
+instance AdmitChildSCRIPT HEAD
+instance AdmitChildSTYLE HEAD
+instance AdmitChildMETA HEAD
+instance AdmitChildLINK HEAD
+instance AdmitChildOBJECT HEAD
+
+instance AdmitChildBODY NOFRAMES
+
+instance AdmitChildP IFRAME
+instance AdmitChildH1 IFRAME
+instance AdmitChildH2 IFRAME
+instance AdmitChildH3 IFRAME
+instance AdmitChildH4 IFRAME
+instance AdmitChildH5 IFRAME
+instance AdmitChildH6 IFRAME
+instance AdmitChildUL IFRAME
+instance AdmitChildOL IFRAME
+instance AdmitChildDIR IFRAME
+instance AdmitChildMENU IFRAME
+instance AdmitChildPRE IFRAME
+instance AdmitChildDL IFRAME
+instance AdmitChildDIV IFRAME
+instance AdmitChildCENTER IFRAME
+instance AdmitChildNOSCRIPT IFRAME
+instance AdmitChildNOFRAMES IFRAME
+instance AdmitChildBLOCKQUOTE IFRAME
+instance AdmitChildFORM IFRAME
+instance AdmitChildISINDEX IFRAME
+instance AdmitChildHR IFRAME
+instance AdmitChildTABLE IFRAME
+instance AdmitChildFIELDSET IFRAME
+instance AdmitChildADDRESS IFRAME
+instance AdmitChildCDATA IFRAME
+instance AdmitChildTT IFRAME
+instance AdmitChildI IFRAME
+instance AdmitChildB IFRAME
+instance AdmitChildU IFRAME
+instance AdmitChildS IFRAME
+instance AdmitChildSTRIKE IFRAME
+instance AdmitChildBIG IFRAME
+instance AdmitChildSMALL IFRAME
+instance AdmitChildEM IFRAME
+instance AdmitChildSTRONG IFRAME
+instance AdmitChildDFN IFRAME
+instance AdmitChildCODE IFRAME
+instance AdmitChildSAMP IFRAME
+instance AdmitChildKBD IFRAME
+instance AdmitChildVAR IFRAME
+instance AdmitChildCITE IFRAME
+instance AdmitChildABBR IFRAME
+instance AdmitChildACRONYM IFRAME
+instance AdmitChildA IFRAME
+instance AdmitChildIMG IFRAME
+instance AdmitChildAPPLET IFRAME
+instance AdmitChildOBJECT IFRAME
+instance AdmitChildFONT IFRAME
+instance AdmitChildBASEFONT IFRAME
+instance AdmitChildBR IFRAME
+instance AdmitChildSCRIPT IFRAME
+instance AdmitChildMAP IFRAME
+instance AdmitChildQ IFRAME
+instance AdmitChildSUB IFRAME
+instance AdmitChildSUP IFRAME
+instance AdmitChildSPAN IFRAME
+instance AdmitChildBDO IFRAME
+instance AdmitChildIFRAME IFRAME
+instance AdmitChildINPUT IFRAME
+instance AdmitChildSELECT IFRAME
+instance AdmitChildTEXTAREA IFRAME
+instance AdmitChildLABEL IFRAME
+instance AdmitChildBUTTON IFRAME
+
+
+instance AdmitChildFRAMESET FRAMESET
+instance AdmitChildFRAME FRAMESET
+instance AdmitChildNOFRAMES FRAMESET
+
+instance AdmitChildP TH
+instance AdmitChildH1 TH
+instance AdmitChildH2 TH
+instance AdmitChildH3 TH
+instance AdmitChildH4 TH
+instance AdmitChildH5 TH
+instance AdmitChildH6 TH
+instance AdmitChildUL TH
+instance AdmitChildOL TH
+instance AdmitChildDIR TH
+instance AdmitChildMENU TH
+instance AdmitChildPRE TH
+instance AdmitChildDL TH
+instance AdmitChildDIV TH
+instance AdmitChildCENTER TH
+instance AdmitChildNOSCRIPT TH
+instance AdmitChildNOFRAMES TH
+instance AdmitChildBLOCKQUOTE TH
+instance AdmitChildFORM TH
+instance AdmitChildISINDEX TH
+instance AdmitChildHR TH
+instance AdmitChildTABLE TH
+instance AdmitChildFIELDSET TH
+instance AdmitChildADDRESS TH
+instance AdmitChildCDATA TH
+instance AdmitChildTT TH
+instance AdmitChildI TH
+instance AdmitChildB TH
+instance AdmitChildU TH
+instance AdmitChildS TH
+instance AdmitChildSTRIKE TH
+instance AdmitChildBIG TH
+instance AdmitChildSMALL TH
+instance AdmitChildEM TH
+instance AdmitChildSTRONG TH
+instance AdmitChildDFN TH
+instance AdmitChildCODE TH
+instance AdmitChildSAMP TH
+instance AdmitChildKBD TH
+instance AdmitChildVAR TH
+instance AdmitChildCITE TH
+instance AdmitChildABBR TH
+instance AdmitChildACRONYM TH
+instance AdmitChildA TH
+instance AdmitChildIMG TH
+instance AdmitChildAPPLET TH
+instance AdmitChildOBJECT TH
+instance AdmitChildFONT TH
+instance AdmitChildBASEFONT TH
+instance AdmitChildBR TH
+instance AdmitChildSCRIPT TH
+instance AdmitChildMAP TH
+instance AdmitChildQ TH
+instance AdmitChildSUB TH
+instance AdmitChildSUP TH
+instance AdmitChildSPAN TH
+instance AdmitChildBDO TH
+instance AdmitChildIFRAME TH
+instance AdmitChildINPUT TH
+instance AdmitChildSELECT TH
+instance AdmitChildTEXTAREA TH
+instance AdmitChildLABEL TH
+instance AdmitChildBUTTON TH
+
+instance AdmitChildP TD
+instance AdmitChildH1 TD
+instance AdmitChildH2 TD
+instance AdmitChildH3 TD
+instance AdmitChildH4 TD
+instance AdmitChildH5 TD
+instance AdmitChildH6 TD
+instance AdmitChildUL TD
+instance AdmitChildOL TD
+instance AdmitChildDIR TD
+instance AdmitChildMENU TD
+instance AdmitChildPRE TD
+instance AdmitChildDL TD
+instance AdmitChildDIV TD
+instance AdmitChildCENTER TD
+instance AdmitChildNOSCRIPT TD
+instance AdmitChildNOFRAMES TD
+instance AdmitChildBLOCKQUOTE TD
+instance AdmitChildFORM TD
+instance AdmitChildISINDEX TD
+instance AdmitChildHR TD
+instance AdmitChildTABLE TD
+instance AdmitChildFIELDSET TD
+instance AdmitChildADDRESS TD
+instance AdmitChildCDATA TD
+instance AdmitChildTT TD
+instance AdmitChildI TD
+instance AdmitChildB TD
+instance AdmitChildU TD
+instance AdmitChildS TD
+instance AdmitChildSTRIKE TD
+instance AdmitChildBIG TD
+instance AdmitChildSMALL TD
+instance AdmitChildEM TD
+instance AdmitChildSTRONG TD
+instance AdmitChildDFN TD
+instance AdmitChildCODE TD
+instance AdmitChildSAMP TD
+instance AdmitChildKBD TD
+instance AdmitChildVAR TD
+instance AdmitChildCITE TD
+instance AdmitChildABBR TD
+instance AdmitChildACRONYM TD
+instance AdmitChildA TD
+instance AdmitChildIMG TD
+instance AdmitChildAPPLET TD
+instance AdmitChildOBJECT TD
+instance AdmitChildFONT TD
+instance AdmitChildBASEFONT TD
+instance AdmitChildBR TD
+instance AdmitChildSCRIPT TD
+instance AdmitChildMAP TD
+instance AdmitChildQ TD
+instance AdmitChildSUB TD
+instance AdmitChildSUP TD
+instance AdmitChildSPAN TD
+instance AdmitChildBDO TD
+instance AdmitChildIFRAME TD
+instance AdmitChildINPUT TD
+instance AdmitChildSELECT TD
+instance AdmitChildTEXTAREA TD
+instance AdmitChildLABEL TD
+instance AdmitChildBUTTON TD
+
+instance AdmitChildTH TR
+instance AdmitChildTD TR
+
+
+instance AdmitChildCOL COLGROUP
+
+instance AdmitChildTR TBODY
+
+instance AdmitChildTR TFOOT
+
+instance AdmitChildTR THEAD
+
+instance AdmitChildCDATA CAPTION
+instance AdmitChildTT CAPTION
+instance AdmitChildI CAPTION
+instance AdmitChildB CAPTION
+instance AdmitChildU CAPTION
+instance AdmitChildS CAPTION
+instance AdmitChildSTRIKE CAPTION
+instance AdmitChildBIG CAPTION
+instance AdmitChildSMALL CAPTION
+instance AdmitChildEM CAPTION
+instance AdmitChildSTRONG CAPTION
+instance AdmitChildDFN CAPTION
+instance AdmitChildCODE CAPTION
+instance AdmitChildSAMP CAPTION
+instance AdmitChildKBD CAPTION
+instance AdmitChildVAR CAPTION
+instance AdmitChildCITE CAPTION
+instance AdmitChildABBR CAPTION
+instance AdmitChildACRONYM CAPTION
+instance AdmitChildA CAPTION
+instance AdmitChildIMG CAPTION
+instance AdmitChildAPPLET CAPTION
+instance AdmitChildOBJECT CAPTION
+instance AdmitChildFONT CAPTION
+instance AdmitChildBASEFONT CAPTION
+instance AdmitChildBR CAPTION
+instance AdmitChildSCRIPT CAPTION
+instance AdmitChildMAP CAPTION
+instance AdmitChildQ CAPTION
+instance AdmitChildSUB CAPTION
+instance AdmitChildSUP CAPTION
+instance AdmitChildSPAN CAPTION
+instance AdmitChildBDO CAPTION
+instance AdmitChildIFRAME CAPTION
+instance AdmitChildINPUT CAPTION
+instance AdmitChildSELECT CAPTION
+instance AdmitChildTEXTAREA CAPTION
+instance AdmitChildLABEL CAPTION
+instance AdmitChildBUTTON CAPTION
+
+instance AdmitChildCAPTION TABLE
+instance AdmitChildCOL TABLE
+instance AdmitChildCOLGROUP TABLE
+instance AdmitChildTHEAD TABLE
+instance AdmitChildTFOOT TABLE
+instance AdmitChildTBODY TABLE
+
+instance AdmitChildP BUTTON
+instance AdmitChildH1 BUTTON
+instance AdmitChildH2 BUTTON
+instance AdmitChildH3 BUTTON
+instance AdmitChildH4 BUTTON
+instance AdmitChildH5 BUTTON
+instance AdmitChildH6 BUTTON
+instance AdmitChildUL BUTTON
+instance AdmitChildOL BUTTON
+instance AdmitChildDIR BUTTON
+instance AdmitChildMENU BUTTON
+instance AdmitChildPRE BUTTON
+instance AdmitChildDL BUTTON
+instance AdmitChildDIV BUTTON
+instance AdmitChildCENTER BUTTON
+instance AdmitChildNOSCRIPT BUTTON
+instance AdmitChildNOFRAMES BUTTON
+instance AdmitChildBLOCKQUOTE BUTTON
+instance AdmitChildHR BUTTON
+instance AdmitChildTABLE BUTTON
+instance AdmitChildADDRESS BUTTON
+instance AdmitChildCDATA BUTTON
+instance AdmitChildTT BUTTON
+instance AdmitChildI BUTTON
+instance AdmitChildB BUTTON
+instance AdmitChildU BUTTON
+instance AdmitChildS BUTTON
+instance AdmitChildSTRIKE BUTTON
+instance AdmitChildBIG BUTTON
+instance AdmitChildSMALL BUTTON
+instance AdmitChildEM BUTTON
+instance AdmitChildSTRONG BUTTON
+instance AdmitChildDFN BUTTON
+instance AdmitChildCODE BUTTON
+instance AdmitChildSAMP BUTTON
+instance AdmitChildKBD BUTTON
+instance AdmitChildVAR BUTTON
+instance AdmitChildCITE BUTTON
+instance AdmitChildABBR BUTTON
+instance AdmitChildACRONYM BUTTON
+instance AdmitChildIMG BUTTON
+instance AdmitChildAPPLET BUTTON
+instance AdmitChildOBJECT BUTTON
+instance AdmitChildFONT BUTTON
+instance AdmitChildBASEFONT BUTTON
+instance AdmitChildBR BUTTON
+instance AdmitChildSCRIPT BUTTON
+instance AdmitChildMAP BUTTON
+instance AdmitChildQ BUTTON
+instance AdmitChildSUB BUTTON
+instance AdmitChildSUP BUTTON
+instance AdmitChildSPAN BUTTON
+instance AdmitChildBDO BUTTON
+
+instance AdmitChildCDATA LEGEND
+instance AdmitChildTT LEGEND
+instance AdmitChildI LEGEND
+instance AdmitChildB LEGEND
+instance AdmitChildU LEGEND
+instance AdmitChildS LEGEND
+instance AdmitChildSTRIKE LEGEND
+instance AdmitChildBIG LEGEND
+instance AdmitChildSMALL LEGEND
+instance AdmitChildEM LEGEND
+instance AdmitChildSTRONG LEGEND
+instance AdmitChildDFN LEGEND
+instance AdmitChildCODE LEGEND
+instance AdmitChildSAMP LEGEND
+instance AdmitChildKBD LEGEND
+instance AdmitChildVAR LEGEND
+instance AdmitChildCITE LEGEND
+instance AdmitChildABBR LEGEND
+instance AdmitChildACRONYM LEGEND
+instance AdmitChildA LEGEND
+instance AdmitChildIMG LEGEND
+instance AdmitChildAPPLET LEGEND
+instance AdmitChildOBJECT LEGEND
+instance AdmitChildFONT LEGEND
+instance AdmitChildBASEFONT LEGEND
+instance AdmitChildBR LEGEND
+instance AdmitChildSCRIPT LEGEND
+instance AdmitChildMAP LEGEND
+instance AdmitChildQ LEGEND
+instance AdmitChildSUB LEGEND
+instance AdmitChildSUP LEGEND
+instance AdmitChildSPAN LEGEND
+instance AdmitChildBDO LEGEND
+instance AdmitChildIFRAME LEGEND
+instance AdmitChildINPUT LEGEND
+instance AdmitChildSELECT LEGEND
+instance AdmitChildTEXTAREA LEGEND
+instance AdmitChildLABEL LEGEND
+instance AdmitChildBUTTON LEGEND
+
+instance AdmitChildCDATA FIELDSET
+instance AdmitChildLEGEND FIELDSET
+instance AdmitChildP FIELDSET
+instance AdmitChildH1 FIELDSET
+instance AdmitChildH2 FIELDSET
+instance AdmitChildH3 FIELDSET
+instance AdmitChildH4 FIELDSET
+instance AdmitChildH5 FIELDSET
+instance AdmitChildH6 FIELDSET
+instance AdmitChildUL FIELDSET
+instance AdmitChildOL FIELDSET
+instance AdmitChildDIR FIELDSET
+instance AdmitChildMENU FIELDSET
+instance AdmitChildPRE FIELDSET
+instance AdmitChildDL FIELDSET
+instance AdmitChildDIV FIELDSET
+instance AdmitChildCENTER FIELDSET
+instance AdmitChildNOSCRIPT FIELDSET
+instance AdmitChildNOFRAMES FIELDSET
+instance AdmitChildBLOCKQUOTE FIELDSET
+instance AdmitChildFORM FIELDSET
+instance AdmitChildISINDEX FIELDSET
+instance AdmitChildHR FIELDSET
+instance AdmitChildTABLE FIELDSET
+instance AdmitChildFIELDSET FIELDSET
+instance AdmitChildADDRESS FIELDSET
+instance AdmitChildTT FIELDSET
+instance AdmitChildI FIELDSET
+instance AdmitChildB FIELDSET
+instance AdmitChildU FIELDSET
+instance AdmitChildS FIELDSET
+instance AdmitChildSTRIKE FIELDSET
+instance AdmitChildBIG FIELDSET
+instance AdmitChildSMALL FIELDSET
+instance AdmitChildEM FIELDSET
+instance AdmitChildSTRONG FIELDSET
+instance AdmitChildDFN FIELDSET
+instance AdmitChildCODE FIELDSET
+instance AdmitChildSAMP FIELDSET
+instance AdmitChildKBD FIELDSET
+instance AdmitChildVAR FIELDSET
+instance AdmitChildCITE FIELDSET
+instance AdmitChildABBR FIELDSET
+instance AdmitChildACRONYM FIELDSET
+instance AdmitChildA FIELDSET
+instance AdmitChildIMG FIELDSET
+instance AdmitChildAPPLET FIELDSET
+instance AdmitChildOBJECT FIELDSET
+instance AdmitChildFONT FIELDSET
+instance AdmitChildBASEFONT FIELDSET
+instance AdmitChildBR FIELDSET
+instance AdmitChildSCRIPT FIELDSET
+instance AdmitChildMAP FIELDSET
+instance AdmitChildQ FIELDSET
+instance AdmitChildSUB FIELDSET
+instance AdmitChildSUP FIELDSET
+instance AdmitChildSPAN FIELDSET
+instance AdmitChildBDO FIELDSET
+instance AdmitChildIFRAME FIELDSET
+instance AdmitChildINPUT FIELDSET
+instance AdmitChildSELECT FIELDSET
+instance AdmitChildTEXTAREA FIELDSET
+instance AdmitChildLABEL FIELDSET
+instance AdmitChildBUTTON FIELDSET
+
+instance AdmitChildCDATA TEXTAREA
+
+instance AdmitChildCDATA OPTION
+
+instance AdmitChildOPTION OPTGROUP
+
+instance AdmitChildOPTGROUP SELECT
+instance AdmitChildOPTION SELECT
+
+
+instance AdmitChildCDATA LABEL
+instance AdmitChildTT LABEL
+instance AdmitChildI LABEL
+instance AdmitChildB LABEL
+instance AdmitChildU LABEL
+instance AdmitChildS LABEL
+instance AdmitChildSTRIKE LABEL
+instance AdmitChildBIG LABEL
+instance AdmitChildSMALL LABEL
+instance AdmitChildEM LABEL
+instance AdmitChildSTRONG LABEL
+instance AdmitChildDFN LABEL
+instance AdmitChildCODE LABEL
+instance AdmitChildSAMP LABEL
+instance AdmitChildKBD LABEL
+instance AdmitChildVAR LABEL
+instance AdmitChildCITE LABEL
+instance AdmitChildABBR LABEL
+instance AdmitChildACRONYM LABEL
+instance AdmitChildA LABEL
+instance AdmitChildIMG LABEL
+instance AdmitChildAPPLET LABEL
+instance AdmitChildOBJECT LABEL
+instance AdmitChildFONT LABEL
+instance AdmitChildBASEFONT LABEL
+instance AdmitChildBR LABEL
+instance AdmitChildSCRIPT LABEL
+instance AdmitChildMAP LABEL
+instance AdmitChildQ LABEL
+instance AdmitChildSUB LABEL
+instance AdmitChildSUP LABEL
+instance AdmitChildSPAN LABEL
+instance AdmitChildBDO LABEL
+instance AdmitChildIFRAME LABEL
+instance AdmitChildINPUT LABEL
+instance AdmitChildSELECT LABEL
+instance AdmitChildTEXTAREA LABEL
+instance AdmitChildBUTTON LABEL
+
+instance AdmitChildP FORM
+instance AdmitChildH1 FORM
+instance AdmitChildH2 FORM
+instance AdmitChildH3 FORM
+instance AdmitChildH4 FORM
+instance AdmitChildH5 FORM
+instance AdmitChildH6 FORM
+instance AdmitChildUL FORM
+instance AdmitChildOL FORM
+instance AdmitChildDIR FORM
+instance AdmitChildMENU FORM
+instance AdmitChildPRE FORM
+instance AdmitChildDL FORM
+instance AdmitChildDIV FORM
+instance AdmitChildCENTER FORM
+instance AdmitChildNOSCRIPT FORM
+instance AdmitChildNOFRAMES FORM
+instance AdmitChildBLOCKQUOTE FORM
+instance AdmitChildISINDEX FORM
+instance AdmitChildHR FORM
+instance AdmitChildTABLE FORM
+instance AdmitChildFIELDSET FORM
+instance AdmitChildADDRESS FORM
+instance AdmitChildCDATA FORM
+instance AdmitChildTT FORM
+instance AdmitChildI FORM
+instance AdmitChildB FORM
+instance AdmitChildU FORM
+instance AdmitChildS FORM
+instance AdmitChildSTRIKE FORM
+instance AdmitChildBIG FORM
+instance AdmitChildSMALL FORM
+instance AdmitChildEM FORM
+instance AdmitChildSTRONG FORM
+instance AdmitChildDFN FORM
+instance AdmitChildCODE FORM
+instance AdmitChildSAMP FORM
+instance AdmitChildKBD FORM
+instance AdmitChildVAR FORM
+instance AdmitChildCITE FORM
+instance AdmitChildABBR FORM
+instance AdmitChildACRONYM FORM
+instance AdmitChildA FORM
+instance AdmitChildIMG FORM
+instance AdmitChildAPPLET FORM
+instance AdmitChildOBJECT FORM
+instance AdmitChildFONT FORM
+instance AdmitChildBASEFONT FORM
+instance AdmitChildBR FORM
+instance AdmitChildSCRIPT FORM
+instance AdmitChildMAP FORM
+instance AdmitChildQ FORM
+instance AdmitChildSUB FORM
+instance AdmitChildSUP FORM
+instance AdmitChildSPAN FORM
+instance AdmitChildBDO FORM
+instance AdmitChildIFRAME FORM
+instance AdmitChildINPUT FORM
+instance AdmitChildSELECT FORM
+instance AdmitChildTEXTAREA FORM
+instance AdmitChildLABEL FORM
+instance AdmitChildBUTTON FORM
+
+instance AdmitChildP LI
+instance AdmitChildH1 LI
+instance AdmitChildH2 LI
+instance AdmitChildH3 LI
+instance AdmitChildH4 LI
+instance AdmitChildH5 LI
+instance AdmitChildH6 LI
+instance AdmitChildUL LI
+instance AdmitChildOL LI
+instance AdmitChildDIR LI
+instance AdmitChildMENU LI
+instance AdmitChildPRE LI
+instance AdmitChildDL LI
+instance AdmitChildDIV LI
+instance AdmitChildCENTER LI
+instance AdmitChildNOSCRIPT LI
+instance AdmitChildNOFRAMES LI
+instance AdmitChildBLOCKQUOTE LI
+instance AdmitChildFORM LI
+instance AdmitChildISINDEX LI
+instance AdmitChildHR LI
+instance AdmitChildTABLE LI
+instance AdmitChildFIELDSET LI
+instance AdmitChildADDRESS LI
+instance AdmitChildCDATA LI
+instance AdmitChildTT LI
+instance AdmitChildI LI
+instance AdmitChildB LI
+instance AdmitChildU LI
+instance AdmitChildS LI
+instance AdmitChildSTRIKE LI
+instance AdmitChildBIG LI
+instance AdmitChildSMALL LI
+instance AdmitChildEM LI
+instance AdmitChildSTRONG LI
+instance AdmitChildDFN LI
+instance AdmitChildCODE LI
+instance AdmitChildSAMP LI
+instance AdmitChildKBD LI
+instance AdmitChildVAR LI
+instance AdmitChildCITE LI
+instance AdmitChildABBR LI
+instance AdmitChildACRONYM LI
+instance AdmitChildA LI
+instance AdmitChildIMG LI
+instance AdmitChildAPPLET LI
+instance AdmitChildOBJECT LI
+instance AdmitChildFONT LI
+instance AdmitChildBASEFONT LI
+instance AdmitChildBR LI
+instance AdmitChildSCRIPT LI
+instance AdmitChildMAP LI
+instance AdmitChildQ LI
+instance AdmitChildSUB LI
+instance AdmitChildSUP LI
+instance AdmitChildSPAN LI
+instance AdmitChildBDO LI
+instance AdmitChildIFRAME LI
+instance AdmitChildINPUT LI
+instance AdmitChildSELECT LI
+instance AdmitChildTEXTAREA LI
+instance AdmitChildLABEL LI
+instance AdmitChildBUTTON LI
+
+instance AdmitChildLI DIR
+
+instance AdmitChildLI MENU
+
+instance AdmitChildLI UL
+
+instance AdmitChildLI OL
+
+instance AdmitChildP DD
+instance AdmitChildH1 DD
+instance AdmitChildH2 DD
+instance AdmitChildH3 DD
+instance AdmitChildH4 DD
+instance AdmitChildH5 DD
+instance AdmitChildH6 DD
+instance AdmitChildUL DD
+instance AdmitChildOL DD
+instance AdmitChildDIR DD
+instance AdmitChildMENU DD
+instance AdmitChildPRE DD
+instance AdmitChildDL DD
+instance AdmitChildDIV DD
+instance AdmitChildCENTER DD
+instance AdmitChildNOSCRIPT DD
+instance AdmitChildNOFRAMES DD
+instance AdmitChildBLOCKQUOTE DD
+instance AdmitChildFORM DD
+instance AdmitChildISINDEX DD
+instance AdmitChildHR DD
+instance AdmitChildTABLE DD
+instance AdmitChildFIELDSET DD
+instance AdmitChildADDRESS DD
+instance AdmitChildCDATA DD
+instance AdmitChildTT DD
+instance AdmitChildI DD
+instance AdmitChildB DD
+instance AdmitChildU DD
+instance AdmitChildS DD
+instance AdmitChildSTRIKE DD
+instance AdmitChildBIG DD
+instance AdmitChildSMALL DD
+instance AdmitChildEM DD
+instance AdmitChildSTRONG DD
+instance AdmitChildDFN DD
+instance AdmitChildCODE DD
+instance AdmitChildSAMP DD
+instance AdmitChildKBD DD
+instance AdmitChildVAR DD
+instance AdmitChildCITE DD
+instance AdmitChildABBR DD
+instance AdmitChildACRONYM DD
+instance AdmitChildA DD
+instance AdmitChildIMG DD
+instance AdmitChildAPPLET DD
+instance AdmitChildOBJECT DD
+instance AdmitChildFONT DD
+instance AdmitChildBASEFONT DD
+instance AdmitChildBR DD
+instance AdmitChildSCRIPT DD
+instance AdmitChildMAP DD
+instance AdmitChildQ DD
+instance AdmitChildSUB DD
+instance AdmitChildSUP DD
+instance AdmitChildSPAN DD
+instance AdmitChildBDO DD
+instance AdmitChildIFRAME DD
+instance AdmitChildINPUT DD
+instance AdmitChildSELECT DD
+instance AdmitChildTEXTAREA DD
+instance AdmitChildLABEL DD
+instance AdmitChildBUTTON DD
+
+instance AdmitChildCDATA DT
+instance AdmitChildTT DT
+instance AdmitChildI DT
+instance AdmitChildB DT
+instance AdmitChildU DT
+instance AdmitChildS DT
+instance AdmitChildSTRIKE DT
+instance AdmitChildBIG DT
+instance AdmitChildSMALL DT
+instance AdmitChildEM DT
+instance AdmitChildSTRONG DT
+instance AdmitChildDFN DT
+instance AdmitChildCODE DT
+instance AdmitChildSAMP DT
+instance AdmitChildKBD DT
+instance AdmitChildVAR DT
+instance AdmitChildCITE DT
+instance AdmitChildABBR DT
+instance AdmitChildACRONYM DT
+instance AdmitChildA DT
+instance AdmitChildIMG DT
+instance AdmitChildAPPLET DT
+instance AdmitChildOBJECT DT
+instance AdmitChildFONT DT
+instance AdmitChildBASEFONT DT
+instance AdmitChildBR DT
+instance AdmitChildSCRIPT DT
+instance AdmitChildMAP DT
+instance AdmitChildQ DT
+instance AdmitChildSUB DT
+instance AdmitChildSUP DT
+instance AdmitChildSPAN DT
+instance AdmitChildBDO DT
+instance AdmitChildIFRAME DT
+instance AdmitChildINPUT DT
+instance AdmitChildSELECT DT
+instance AdmitChildTEXTAREA DT
+instance AdmitChildLABEL DT
+instance AdmitChildBUTTON DT
+
+instance AdmitChildDT DL
+instance AdmitChildDD DL
+
+instance AdmitChildP INS
+instance AdmitChildH1 INS
+instance AdmitChildH2 INS
+instance AdmitChildH3 INS
+instance AdmitChildH4 INS
+instance AdmitChildH5 INS
+instance AdmitChildH6 INS
+instance AdmitChildUL INS
+instance AdmitChildOL INS
+instance AdmitChildDIR INS
+instance AdmitChildMENU INS
+instance AdmitChildPRE INS
+instance AdmitChildDL INS
+instance AdmitChildDIV INS
+instance AdmitChildCENTER INS
+instance AdmitChildNOSCRIPT INS
+instance AdmitChildNOFRAMES INS
+instance AdmitChildBLOCKQUOTE INS
+instance AdmitChildFORM INS
+instance AdmitChildISINDEX INS
+instance AdmitChildHR INS
+instance AdmitChildTABLE INS
+instance AdmitChildFIELDSET INS
+instance AdmitChildADDRESS INS
+instance AdmitChildCDATA INS
+instance AdmitChildTT INS
+instance AdmitChildI INS
+instance AdmitChildB INS
+instance AdmitChildU INS
+instance AdmitChildS INS
+instance AdmitChildSTRIKE INS
+instance AdmitChildBIG INS
+instance AdmitChildSMALL INS
+instance AdmitChildEM INS
+instance AdmitChildSTRONG INS
+instance AdmitChildDFN INS
+instance AdmitChildCODE INS
+instance AdmitChildSAMP INS
+instance AdmitChildKBD INS
+instance AdmitChildVAR INS
+instance AdmitChildCITE INS
+instance AdmitChildABBR INS
+instance AdmitChildACRONYM INS
+instance AdmitChildA INS
+instance AdmitChildIMG INS
+instance AdmitChildAPPLET INS
+instance AdmitChildOBJECT INS
+instance AdmitChildFONT INS
+instance AdmitChildBASEFONT INS
+instance AdmitChildBR INS
+instance AdmitChildSCRIPT INS
+instance AdmitChildMAP INS
+instance AdmitChildQ INS
+instance AdmitChildSUB INS
+instance AdmitChildSUP INS
+instance AdmitChildSPAN INS
+instance AdmitChildBDO INS
+instance AdmitChildIFRAME INS
+instance AdmitChildINPUT INS
+instance AdmitChildSELECT INS
+instance AdmitChildTEXTAREA INS
+instance AdmitChildLABEL INS
+instance AdmitChildBUTTON INS
+
+instance AdmitChildP DEL
+instance AdmitChildH1 DEL
+instance AdmitChildH2 DEL
+instance AdmitChildH3 DEL
+instance AdmitChildH4 DEL
+instance AdmitChildH5 DEL
+instance AdmitChildH6 DEL
+instance AdmitChildUL DEL
+instance AdmitChildOL DEL
+instance AdmitChildDIR DEL
+instance AdmitChildMENU DEL
+instance AdmitChildPRE DEL
+instance AdmitChildDL DEL
+instance AdmitChildDIV DEL
+instance AdmitChildCENTER DEL
+instance AdmitChildNOSCRIPT DEL
+instance AdmitChildNOFRAMES DEL
+instance AdmitChildBLOCKQUOTE DEL
+instance AdmitChildFORM DEL
+instance AdmitChildISINDEX DEL
+instance AdmitChildHR DEL
+instance AdmitChildTABLE DEL
+instance AdmitChildFIELDSET DEL
+instance AdmitChildADDRESS DEL
+instance AdmitChildCDATA DEL
+instance AdmitChildTT DEL
+instance AdmitChildI DEL
+instance AdmitChildB DEL
+instance AdmitChildU DEL
+instance AdmitChildS DEL
+instance AdmitChildSTRIKE DEL
+instance AdmitChildBIG DEL
+instance AdmitChildSMALL DEL
+instance AdmitChildEM DEL
+instance AdmitChildSTRONG DEL
+instance AdmitChildDFN DEL
+instance AdmitChildCODE DEL
+instance AdmitChildSAMP DEL
+instance AdmitChildKBD DEL
+instance AdmitChildVAR DEL
+instance AdmitChildCITE DEL
+instance AdmitChildABBR DEL
+instance AdmitChildACRONYM DEL
+instance AdmitChildA DEL
+instance AdmitChildIMG DEL
+instance AdmitChildAPPLET DEL
+instance AdmitChildOBJECT DEL
+instance AdmitChildFONT DEL
+instance AdmitChildBASEFONT DEL
+instance AdmitChildBR DEL
+instance AdmitChildSCRIPT DEL
+instance AdmitChildMAP DEL
+instance AdmitChildQ DEL
+instance AdmitChildSUB DEL
+instance AdmitChildSUP DEL
+instance AdmitChildSPAN DEL
+instance AdmitChildBDO DEL
+instance AdmitChildIFRAME DEL
+instance AdmitChildINPUT DEL
+instance AdmitChildSELECT DEL
+instance AdmitChildTEXTAREA DEL
+instance AdmitChildLABEL DEL
+instance AdmitChildBUTTON DEL
+
+instance AdmitChildP BLOCKQUOTE
+instance AdmitChildH1 BLOCKQUOTE
+instance AdmitChildH2 BLOCKQUOTE
+instance AdmitChildH3 BLOCKQUOTE
+instance AdmitChildH4 BLOCKQUOTE
+instance AdmitChildH5 BLOCKQUOTE
+instance AdmitChildH6 BLOCKQUOTE
+instance AdmitChildUL BLOCKQUOTE
+instance AdmitChildOL BLOCKQUOTE
+instance AdmitChildDIR BLOCKQUOTE
+instance AdmitChildMENU BLOCKQUOTE
+instance AdmitChildPRE BLOCKQUOTE
+instance AdmitChildDL BLOCKQUOTE
+instance AdmitChildDIV BLOCKQUOTE
+instance AdmitChildCENTER BLOCKQUOTE
+instance AdmitChildNOSCRIPT BLOCKQUOTE
+instance AdmitChildNOFRAMES BLOCKQUOTE
+instance AdmitChildBLOCKQUOTE BLOCKQUOTE
+instance AdmitChildFORM BLOCKQUOTE
+instance AdmitChildISINDEX BLOCKQUOTE
+instance AdmitChildHR BLOCKQUOTE
+instance AdmitChildTABLE BLOCKQUOTE
+instance AdmitChildFIELDSET BLOCKQUOTE
+instance AdmitChildADDRESS BLOCKQUOTE
+instance AdmitChildCDATA BLOCKQUOTE
+instance AdmitChildTT BLOCKQUOTE
+instance AdmitChildI BLOCKQUOTE
+instance AdmitChildB BLOCKQUOTE
+instance AdmitChildU BLOCKQUOTE
+instance AdmitChildS BLOCKQUOTE
+instance AdmitChildSTRIKE BLOCKQUOTE
+instance AdmitChildBIG BLOCKQUOTE
+instance AdmitChildSMALL BLOCKQUOTE
+instance AdmitChildEM BLOCKQUOTE
+instance AdmitChildSTRONG BLOCKQUOTE
+instance AdmitChildDFN BLOCKQUOTE
+instance AdmitChildCODE BLOCKQUOTE
+instance AdmitChildSAMP BLOCKQUOTE
+instance AdmitChildKBD BLOCKQUOTE
+instance AdmitChildVAR BLOCKQUOTE
+instance AdmitChildCITE BLOCKQUOTE
+instance AdmitChildABBR BLOCKQUOTE
+instance AdmitChildACRONYM BLOCKQUOTE
+instance AdmitChildA BLOCKQUOTE
+instance AdmitChildIMG BLOCKQUOTE
+instance AdmitChildAPPLET BLOCKQUOTE
+instance AdmitChildOBJECT BLOCKQUOTE
+instance AdmitChildFONT BLOCKQUOTE
+instance AdmitChildBASEFONT BLOCKQUOTE
+instance AdmitChildBR BLOCKQUOTE
+instance AdmitChildSCRIPT BLOCKQUOTE
+instance AdmitChildMAP BLOCKQUOTE
+instance AdmitChildQ BLOCKQUOTE
+instance AdmitChildSUB BLOCKQUOTE
+instance AdmitChildSUP BLOCKQUOTE
+instance AdmitChildSPAN BLOCKQUOTE
+instance AdmitChildBDO BLOCKQUOTE
+instance AdmitChildIFRAME BLOCKQUOTE
+instance AdmitChildINPUT BLOCKQUOTE
+instance AdmitChildSELECT BLOCKQUOTE
+instance AdmitChildTEXTAREA BLOCKQUOTE
+instance AdmitChildLABEL BLOCKQUOTE
+instance AdmitChildBUTTON BLOCKQUOTE
+
+instance AdmitChildCDATA Q
+instance AdmitChildTT Q
+instance AdmitChildI Q
+instance AdmitChildB Q
+instance AdmitChildU Q
+instance AdmitChildS Q
+instance AdmitChildSTRIKE Q
+instance AdmitChildBIG Q
+instance AdmitChildSMALL Q
+instance AdmitChildEM Q
+instance AdmitChildSTRONG Q
+instance AdmitChildDFN Q
+instance AdmitChildCODE Q
+instance AdmitChildSAMP Q
+instance AdmitChildKBD Q
+instance AdmitChildVAR Q
+instance AdmitChildCITE Q
+instance AdmitChildABBR Q
+instance AdmitChildACRONYM Q
+instance AdmitChildA Q
+instance AdmitChildIMG Q
+instance AdmitChildAPPLET Q
+instance AdmitChildOBJECT Q
+instance AdmitChildFONT Q
+instance AdmitChildBASEFONT Q
+instance AdmitChildBR Q
+instance AdmitChildSCRIPT Q
+instance AdmitChildMAP Q
+instance AdmitChildQ Q
+instance AdmitChildSUB Q
+instance AdmitChildSUP Q
+instance AdmitChildSPAN Q
+instance AdmitChildBDO Q
+instance AdmitChildIFRAME Q
+instance AdmitChildINPUT Q
+instance AdmitChildSELECT Q
+instance AdmitChildTEXTAREA Q
+instance AdmitChildLABEL Q
+instance AdmitChildBUTTON Q
+
+instance AdmitChildCDATA PRE
+instance AdmitChildTT PRE
+instance AdmitChildI PRE
+instance AdmitChildB PRE
+instance AdmitChildU PRE
+instance AdmitChildS PRE
+instance AdmitChildSTRIKE PRE
+instance AdmitChildEM PRE
+instance AdmitChildSTRONG PRE
+instance AdmitChildDFN PRE
+instance AdmitChildCODE PRE
+instance AdmitChildSAMP PRE
+instance AdmitChildKBD PRE
+instance AdmitChildVAR PRE
+instance AdmitChildCITE PRE
+instance AdmitChildABBR PRE
+instance AdmitChildACRONYM PRE
+instance AdmitChildA PRE
+instance AdmitChildBR PRE
+instance AdmitChildSCRIPT PRE
+instance AdmitChildMAP PRE
+instance AdmitChildQ PRE
+instance AdmitChildSPAN PRE
+instance AdmitChildBDO PRE
+instance AdmitChildIFRAME PRE
+instance AdmitChildINPUT PRE
+instance AdmitChildSELECT PRE
+instance AdmitChildTEXTAREA PRE
+instance AdmitChildLABEL PRE
+instance AdmitChildBUTTON PRE
+
+instance AdmitChildCDATA H1
+instance AdmitChildTT H1
+instance AdmitChildI H1
+instance AdmitChildB H1
+instance AdmitChildU H1
+instance AdmitChildS H1
+instance AdmitChildSTRIKE H1
+instance AdmitChildBIG H1
+instance AdmitChildSMALL H1
+instance AdmitChildEM H1
+instance AdmitChildSTRONG H1
+instance AdmitChildDFN H1
+instance AdmitChildCODE H1
+instance AdmitChildSAMP H1
+instance AdmitChildKBD H1
+instance AdmitChildVAR H1
+instance AdmitChildCITE H1
+instance AdmitChildABBR H1
+instance AdmitChildACRONYM H1
+instance AdmitChildA H1
+instance AdmitChildIMG H1
+instance AdmitChildAPPLET H1
+instance AdmitChildOBJECT H1
+instance AdmitChildFONT H1
+instance AdmitChildBASEFONT H1
+instance AdmitChildBR H1
+instance AdmitChildSCRIPT H1
+instance AdmitChildMAP H1
+instance AdmitChildQ H1
+instance AdmitChildSUB H1
+instance AdmitChildSUP H1
+instance AdmitChildSPAN H1
+instance AdmitChildBDO H1
+instance AdmitChildIFRAME H1
+instance AdmitChildINPUT H1
+instance AdmitChildSELECT H1
+instance AdmitChildTEXTAREA H1
+instance AdmitChildLABEL H1
+instance AdmitChildBUTTON H1
+
+instance AdmitChildCDATA H2
+instance AdmitChildTT H2
+instance AdmitChildI H2
+instance AdmitChildB H2
+instance AdmitChildU H2
+instance AdmitChildS H2
+instance AdmitChildSTRIKE H2
+instance AdmitChildBIG H2
+instance AdmitChildSMALL H2
+instance AdmitChildEM H2
+instance AdmitChildSTRONG H2
+instance AdmitChildDFN H2
+instance AdmitChildCODE H2
+instance AdmitChildSAMP H2
+instance AdmitChildKBD H2
+instance AdmitChildVAR H2
+instance AdmitChildCITE H2
+instance AdmitChildABBR H2
+instance AdmitChildACRONYM H2
+instance AdmitChildA H2
+instance AdmitChildIMG H2
+instance AdmitChildAPPLET H2
+instance AdmitChildOBJECT H2
+instance AdmitChildFONT H2
+instance AdmitChildBASEFONT H2
+instance AdmitChildBR H2
+instance AdmitChildSCRIPT H2
+instance AdmitChildMAP H2
+instance AdmitChildQ H2
+instance AdmitChildSUB H2
+instance AdmitChildSUP H2
+instance AdmitChildSPAN H2
+instance AdmitChildBDO H2
+instance AdmitChildIFRAME H2
+instance AdmitChildINPUT H2
+instance AdmitChildSELECT H2
+instance AdmitChildTEXTAREA H2
+instance AdmitChildLABEL H2
+instance AdmitChildBUTTON H2
+
+instance AdmitChildCDATA H3
+instance AdmitChildTT H3
+instance AdmitChildI H3
+instance AdmitChildB H3
+instance AdmitChildU H3
+instance AdmitChildS H3
+instance AdmitChildSTRIKE H3
+instance AdmitChildBIG H3
+instance AdmitChildSMALL H3
+instance AdmitChildEM H3
+instance AdmitChildSTRONG H3
+instance AdmitChildDFN H3
+instance AdmitChildCODE H3
+instance AdmitChildSAMP H3
+instance AdmitChildKBD H3
+instance AdmitChildVAR H3
+instance AdmitChildCITE H3
+instance AdmitChildABBR H3
+instance AdmitChildACRONYM H3
+instance AdmitChildA H3
+instance AdmitChildIMG H3
+instance AdmitChildAPPLET H3
+instance AdmitChildOBJECT H3
+instance AdmitChildFONT H3
+instance AdmitChildBASEFONT H3
+instance AdmitChildBR H3
+instance AdmitChildSCRIPT H3
+instance AdmitChildMAP H3
+instance AdmitChildQ H3
+instance AdmitChildSUB H3
+instance AdmitChildSUP H3
+instance AdmitChildSPAN H3
+instance AdmitChildBDO H3
+instance AdmitChildIFRAME H3
+instance AdmitChildINPUT H3
+instance AdmitChildSELECT H3
+instance AdmitChildTEXTAREA H3
+instance AdmitChildLABEL H3
+instance AdmitChildBUTTON H3
+
+instance AdmitChildCDATA H4
+instance AdmitChildTT H4
+instance AdmitChildI H4
+instance AdmitChildB H4
+instance AdmitChildU H4
+instance AdmitChildS H4
+instance AdmitChildSTRIKE H4
+instance AdmitChildBIG H4
+instance AdmitChildSMALL H4
+instance AdmitChildEM H4
+instance AdmitChildSTRONG H4
+instance AdmitChildDFN H4
+instance AdmitChildCODE H4
+instance AdmitChildSAMP H4
+instance AdmitChildKBD H4
+instance AdmitChildVAR H4
+instance AdmitChildCITE H4
+instance AdmitChildABBR H4
+instance AdmitChildACRONYM H4
+instance AdmitChildA H4
+instance AdmitChildIMG H4
+instance AdmitChildAPPLET H4
+instance AdmitChildOBJECT H4
+instance AdmitChildFONT H4
+instance AdmitChildBASEFONT H4
+instance AdmitChildBR H4
+instance AdmitChildSCRIPT H4
+instance AdmitChildMAP H4
+instance AdmitChildQ H4
+instance AdmitChildSUB H4
+instance AdmitChildSUP H4
+instance AdmitChildSPAN H4
+instance AdmitChildBDO H4
+instance AdmitChildIFRAME H4
+instance AdmitChildINPUT H4
+instance AdmitChildSELECT H4
+instance AdmitChildTEXTAREA H4
+instance AdmitChildLABEL H4
+instance AdmitChildBUTTON H4
+
+instance AdmitChildCDATA H5
+instance AdmitChildTT H5
+instance AdmitChildI H5
+instance AdmitChildB H5
+instance AdmitChildU H5
+instance AdmitChildS H5
+instance AdmitChildSTRIKE H5
+instance AdmitChildBIG H5
+instance AdmitChildSMALL H5
+instance AdmitChildEM H5
+instance AdmitChildSTRONG H5
+instance AdmitChildDFN H5
+instance AdmitChildCODE H5
+instance AdmitChildSAMP H5
+instance AdmitChildKBD H5
+instance AdmitChildVAR H5
+instance AdmitChildCITE H5
+instance AdmitChildABBR H5
+instance AdmitChildACRONYM H5
+instance AdmitChildA H5
+instance AdmitChildIMG H5
+instance AdmitChildAPPLET H5
+instance AdmitChildOBJECT H5
+instance AdmitChildFONT H5
+instance AdmitChildBASEFONT H5
+instance AdmitChildBR H5
+instance AdmitChildSCRIPT H5
+instance AdmitChildMAP H5
+instance AdmitChildQ H5
+instance AdmitChildSUB H5
+instance AdmitChildSUP H5
+instance AdmitChildSPAN H5
+instance AdmitChildBDO H5
+instance AdmitChildIFRAME H5
+instance AdmitChildINPUT H5
+instance AdmitChildSELECT H5
+instance AdmitChildTEXTAREA H5
+instance AdmitChildLABEL H5
+instance AdmitChildBUTTON H5
+
+instance AdmitChildCDATA H6
+instance AdmitChildTT H6
+instance AdmitChildI H6
+instance AdmitChildB H6
+instance AdmitChildU H6
+instance AdmitChildS H6
+instance AdmitChildSTRIKE H6
+instance AdmitChildBIG H6
+instance AdmitChildSMALL H6
+instance AdmitChildEM H6
+instance AdmitChildSTRONG H6
+instance AdmitChildDFN H6
+instance AdmitChildCODE H6
+instance AdmitChildSAMP H6
+instance AdmitChildKBD H6
+instance AdmitChildVAR H6
+instance AdmitChildCITE H6
+instance AdmitChildABBR H6
+instance AdmitChildACRONYM H6
+instance AdmitChildA H6
+instance AdmitChildIMG H6
+instance AdmitChildAPPLET H6
+instance AdmitChildOBJECT H6
+instance AdmitChildFONT H6
+instance AdmitChildBASEFONT H6
+instance AdmitChildBR H6
+instance AdmitChildSCRIPT H6
+instance AdmitChildMAP H6
+instance AdmitChildQ H6
+instance AdmitChildSUB H6
+instance AdmitChildSUP H6
+instance AdmitChildSPAN H6
+instance AdmitChildBDO H6
+instance AdmitChildIFRAME H6
+instance AdmitChildINPUT H6
+instance AdmitChildSELECT H6
+instance AdmitChildTEXTAREA H6
+instance AdmitChildLABEL H6
+instance AdmitChildBUTTON H6
+
+instance AdmitChildCDATA P
+instance AdmitChildTT P
+instance AdmitChildI P
+instance AdmitChildB P
+instance AdmitChildU P
+instance AdmitChildS P
+instance AdmitChildSTRIKE P
+instance AdmitChildBIG P
+instance AdmitChildSMALL P
+instance AdmitChildEM P
+instance AdmitChildSTRONG P
+instance AdmitChildDFN P
+instance AdmitChildCODE P
+instance AdmitChildSAMP P
+instance AdmitChildKBD P
+instance AdmitChildVAR P
+instance AdmitChildCITE P
+instance AdmitChildABBR P
+instance AdmitChildACRONYM P
+instance AdmitChildA P
+instance AdmitChildIMG P
+instance AdmitChildAPPLET P
+instance AdmitChildOBJECT P
+instance AdmitChildFONT P
+instance AdmitChildBASEFONT P
+instance AdmitChildBR P
+instance AdmitChildSCRIPT P
+instance AdmitChildMAP P
+instance AdmitChildQ P
+instance AdmitChildSUB P
+instance AdmitChildSUP P
+instance AdmitChildSPAN P
+instance AdmitChildBDO P
+instance AdmitChildIFRAME P
+instance AdmitChildINPUT P
+instance AdmitChildSELECT P
+instance AdmitChildTEXTAREA P
+instance AdmitChildLABEL P
+instance AdmitChildBUTTON P
+
+
+instance AdmitChildPARAM APPLET
+instance AdmitChildP APPLET
+instance AdmitChildH1 APPLET
+instance AdmitChildH2 APPLET
+instance AdmitChildH3 APPLET
+instance AdmitChildH4 APPLET
+instance AdmitChildH5 APPLET
+instance AdmitChildH6 APPLET
+instance AdmitChildUL APPLET
+instance AdmitChildOL APPLET
+instance AdmitChildDIR APPLET
+instance AdmitChildMENU APPLET
+instance AdmitChildPRE APPLET
+instance AdmitChildDL APPLET
+instance AdmitChildDIV APPLET
+instance AdmitChildCENTER APPLET
+instance AdmitChildNOSCRIPT APPLET
+instance AdmitChildNOFRAMES APPLET
+instance AdmitChildBLOCKQUOTE APPLET
+instance AdmitChildFORM APPLET
+instance AdmitChildISINDEX APPLET
+instance AdmitChildHR APPLET
+instance AdmitChildTABLE APPLET
+instance AdmitChildFIELDSET APPLET
+instance AdmitChildADDRESS APPLET
+instance AdmitChildCDATA APPLET
+instance AdmitChildTT APPLET
+instance AdmitChildI APPLET
+instance AdmitChildB APPLET
+instance AdmitChildU APPLET
+instance AdmitChildS APPLET
+instance AdmitChildSTRIKE APPLET
+instance AdmitChildBIG APPLET
+instance AdmitChildSMALL APPLET
+instance AdmitChildEM APPLET
+instance AdmitChildSTRONG APPLET
+instance AdmitChildDFN APPLET
+instance AdmitChildCODE APPLET
+instance AdmitChildSAMP APPLET
+instance AdmitChildKBD APPLET
+instance AdmitChildVAR APPLET
+instance AdmitChildCITE APPLET
+instance AdmitChildABBR APPLET
+instance AdmitChildACRONYM APPLET
+instance AdmitChildA APPLET
+instance AdmitChildIMG APPLET
+instance AdmitChildAPPLET APPLET
+instance AdmitChildOBJECT APPLET
+instance AdmitChildFONT APPLET
+instance AdmitChildBASEFONT APPLET
+instance AdmitChildBR APPLET
+instance AdmitChildSCRIPT APPLET
+instance AdmitChildMAP APPLET
+instance AdmitChildQ APPLET
+instance AdmitChildSUB APPLET
+instance AdmitChildSUP APPLET
+instance AdmitChildSPAN APPLET
+instance AdmitChildBDO APPLET
+instance AdmitChildIFRAME APPLET
+instance AdmitChildINPUT APPLET
+instance AdmitChildSELECT APPLET
+instance AdmitChildTEXTAREA APPLET
+instance AdmitChildLABEL APPLET
+instance AdmitChildBUTTON APPLET
+
+
+instance AdmitChildPARAM OBJECT
+instance AdmitChildP OBJECT
+instance AdmitChildH1 OBJECT
+instance AdmitChildH2 OBJECT
+instance AdmitChildH3 OBJECT
+instance AdmitChildH4 OBJECT
+instance AdmitChildH5 OBJECT
+instance AdmitChildH6 OBJECT
+instance AdmitChildUL OBJECT
+instance AdmitChildOL OBJECT
+instance AdmitChildDIR OBJECT
+instance AdmitChildMENU OBJECT
+instance AdmitChildPRE OBJECT
+instance AdmitChildDL OBJECT
+instance AdmitChildDIV OBJECT
+instance AdmitChildCENTER OBJECT
+instance AdmitChildNOSCRIPT OBJECT
+instance AdmitChildNOFRAMES OBJECT
+instance AdmitChildBLOCKQUOTE OBJECT
+instance AdmitChildFORM OBJECT
+instance AdmitChildISINDEX OBJECT
+instance AdmitChildHR OBJECT
+instance AdmitChildTABLE OBJECT
+instance AdmitChildFIELDSET OBJECT
+instance AdmitChildADDRESS OBJECT
+instance AdmitChildCDATA OBJECT
+instance AdmitChildTT OBJECT
+instance AdmitChildI OBJECT
+instance AdmitChildB OBJECT
+instance AdmitChildU OBJECT
+instance AdmitChildS OBJECT
+instance AdmitChildSTRIKE OBJECT
+instance AdmitChildBIG OBJECT
+instance AdmitChildSMALL OBJECT
+instance AdmitChildEM OBJECT
+instance AdmitChildSTRONG OBJECT
+instance AdmitChildDFN OBJECT
+instance AdmitChildCODE OBJECT
+instance AdmitChildSAMP OBJECT
+instance AdmitChildKBD OBJECT
+instance AdmitChildVAR OBJECT
+instance AdmitChildCITE OBJECT
+instance AdmitChildABBR OBJECT
+instance AdmitChildACRONYM OBJECT
+instance AdmitChildA OBJECT
+instance AdmitChildIMG OBJECT
+instance AdmitChildAPPLET OBJECT
+instance AdmitChildOBJECT OBJECT
+instance AdmitChildFONT OBJECT
+instance AdmitChildBASEFONT OBJECT
+instance AdmitChildBR OBJECT
+instance AdmitChildSCRIPT OBJECT
+instance AdmitChildMAP OBJECT
+instance AdmitChildQ OBJECT
+instance AdmitChildSUB OBJECT
+instance AdmitChildSUP OBJECT
+instance AdmitChildSPAN OBJECT
+instance AdmitChildBDO OBJECT
+instance AdmitChildIFRAME OBJECT
+instance AdmitChildINPUT OBJECT
+instance AdmitChildSELECT OBJECT
+instance AdmitChildTEXTAREA OBJECT
+instance AdmitChildLABEL OBJECT
+instance AdmitChildBUTTON OBJECT
+
+
+
+
+instance AdmitChildP MAP
+instance AdmitChildH1 MAP
+instance AdmitChildH2 MAP
+instance AdmitChildH3 MAP
+instance AdmitChildH4 MAP
+instance AdmitChildH5 MAP
+instance AdmitChildH6 MAP
+instance AdmitChildUL MAP
+instance AdmitChildOL MAP
+instance AdmitChildDIR MAP
+instance AdmitChildMENU MAP
+instance AdmitChildPRE MAP
+instance AdmitChildDL MAP
+instance AdmitChildDIV MAP
+instance AdmitChildCENTER MAP
+instance AdmitChildNOSCRIPT MAP
+instance AdmitChildNOFRAMES MAP
+instance AdmitChildBLOCKQUOTE MAP
+instance AdmitChildFORM MAP
+instance AdmitChildISINDEX MAP
+instance AdmitChildHR MAP
+instance AdmitChildTABLE MAP
+instance AdmitChildFIELDSET MAP
+instance AdmitChildADDRESS MAP
+instance AdmitChildAREA MAP
+
+instance AdmitChildCDATA A
+instance AdmitChildTT A
+instance AdmitChildI A
+instance AdmitChildB A
+instance AdmitChildU A
+instance AdmitChildS A
+instance AdmitChildSTRIKE A
+instance AdmitChildBIG A
+instance AdmitChildSMALL A
+instance AdmitChildEM A
+instance AdmitChildSTRONG A
+instance AdmitChildDFN A
+instance AdmitChildCODE A
+instance AdmitChildSAMP A
+instance AdmitChildKBD A
+instance AdmitChildVAR A
+instance AdmitChildCITE A
+instance AdmitChildABBR A
+instance AdmitChildACRONYM A
+instance AdmitChildIMG A
+instance AdmitChildAPPLET A
+instance AdmitChildOBJECT A
+instance AdmitChildFONT A
+instance AdmitChildBASEFONT A
+instance AdmitChildBR A
+instance AdmitChildSCRIPT A
+instance AdmitChildMAP A
+instance AdmitChildQ A
+instance AdmitChildSUB A
+instance AdmitChildSUP A
+instance AdmitChildSPAN A
+instance AdmitChildBDO A
+instance AdmitChildIFRAME A
+instance AdmitChildINPUT A
+instance AdmitChildSELECT A
+instance AdmitChildTEXTAREA A
+instance AdmitChildLABEL A
+instance AdmitChildBUTTON A
+
+instance AdmitChildP CENTER
+instance AdmitChildH1 CENTER
+instance AdmitChildH2 CENTER
+instance AdmitChildH3 CENTER
+instance AdmitChildH4 CENTER
+instance AdmitChildH5 CENTER
+instance AdmitChildH6 CENTER
+instance AdmitChildUL CENTER
+instance AdmitChildOL CENTER
+instance AdmitChildDIR CENTER
+instance AdmitChildMENU CENTER
+instance AdmitChildPRE CENTER
+instance AdmitChildDL CENTER
+instance AdmitChildDIV CENTER
+instance AdmitChildCENTER CENTER
+instance AdmitChildNOSCRIPT CENTER
+instance AdmitChildNOFRAMES CENTER
+instance AdmitChildBLOCKQUOTE CENTER
+instance AdmitChildFORM CENTER
+instance AdmitChildISINDEX CENTER
+instance AdmitChildHR CENTER
+instance AdmitChildTABLE CENTER
+instance AdmitChildFIELDSET CENTER
+instance AdmitChildADDRESS CENTER
+instance AdmitChildCDATA CENTER
+instance AdmitChildTT CENTER
+instance AdmitChildI CENTER
+instance AdmitChildB CENTER
+instance AdmitChildU CENTER
+instance AdmitChildS CENTER
+instance AdmitChildSTRIKE CENTER
+instance AdmitChildBIG CENTER
+instance AdmitChildSMALL CENTER
+instance AdmitChildEM CENTER
+instance AdmitChildSTRONG CENTER
+instance AdmitChildDFN CENTER
+instance AdmitChildCODE CENTER
+instance AdmitChildSAMP CENTER
+instance AdmitChildKBD CENTER
+instance AdmitChildVAR CENTER
+instance AdmitChildCITE CENTER
+instance AdmitChildABBR CENTER
+instance AdmitChildACRONYM CENTER
+instance AdmitChildA CENTER
+instance AdmitChildIMG CENTER
+instance AdmitChildAPPLET CENTER
+instance AdmitChildOBJECT CENTER
+instance AdmitChildFONT CENTER
+instance AdmitChildBASEFONT CENTER
+instance AdmitChildBR CENTER
+instance AdmitChildSCRIPT CENTER
+instance AdmitChildMAP CENTER
+instance AdmitChildQ CENTER
+instance AdmitChildSUB CENTER
+instance AdmitChildSUP CENTER
+instance AdmitChildSPAN CENTER
+instance AdmitChildBDO CENTER
+instance AdmitChildIFRAME CENTER
+instance AdmitChildINPUT CENTER
+instance AdmitChildSELECT CENTER
+instance AdmitChildTEXTAREA CENTER
+instance AdmitChildLABEL CENTER
+instance AdmitChildBUTTON CENTER
+
+instance AdmitChildP DIV
+instance AdmitChildH1 DIV
+instance AdmitChildH2 DIV
+instance AdmitChildH3 DIV
+instance AdmitChildH4 DIV
+instance AdmitChildH5 DIV
+instance AdmitChildH6 DIV
+instance AdmitChildUL DIV
+instance AdmitChildOL DIV
+instance AdmitChildDIR DIV
+instance AdmitChildMENU DIV
+instance AdmitChildPRE DIV
+instance AdmitChildDL DIV
+instance AdmitChildDIV DIV
+instance AdmitChildCENTER DIV
+instance AdmitChildNOSCRIPT DIV
+instance AdmitChildNOFRAMES DIV
+instance AdmitChildBLOCKQUOTE DIV
+instance AdmitChildFORM DIV
+instance AdmitChildISINDEX DIV
+instance AdmitChildHR DIV
+instance AdmitChildTABLE DIV
+instance AdmitChildFIELDSET DIV
+instance AdmitChildADDRESS DIV
+instance AdmitChildCDATA DIV
+instance AdmitChildTT DIV
+instance AdmitChildI DIV
+instance AdmitChildB DIV
+instance AdmitChildU DIV
+instance AdmitChildS DIV
+instance AdmitChildSTRIKE DIV
+instance AdmitChildBIG DIV
+instance AdmitChildSMALL DIV
+instance AdmitChildEM DIV
+instance AdmitChildSTRONG DIV
+instance AdmitChildDFN DIV
+instance AdmitChildCODE DIV
+instance AdmitChildSAMP DIV
+instance AdmitChildKBD DIV
+instance AdmitChildVAR DIV
+instance AdmitChildCITE DIV
+instance AdmitChildABBR DIV
+instance AdmitChildACRONYM DIV
+instance AdmitChildA DIV
+instance AdmitChildIMG DIV
+instance AdmitChildAPPLET DIV
+instance AdmitChildOBJECT DIV
+instance AdmitChildFONT DIV
+instance AdmitChildBASEFONT DIV
+instance AdmitChildBR DIV
+instance AdmitChildSCRIPT DIV
+instance AdmitChildMAP DIV
+instance AdmitChildQ DIV
+instance AdmitChildSUB DIV
+instance AdmitChildSUP DIV
+instance AdmitChildSPAN DIV
+instance AdmitChildBDO DIV
+instance AdmitChildIFRAME DIV
+instance AdmitChildINPUT DIV
+instance AdmitChildSELECT DIV
+instance AdmitChildTEXTAREA DIV
+instance AdmitChildLABEL DIV
+instance AdmitChildBUTTON DIV
+
+instance AdmitChildCDATA ADDRESS
+instance AdmitChildTT ADDRESS
+instance AdmitChildI ADDRESS
+instance AdmitChildB ADDRESS
+instance AdmitChildU ADDRESS
+instance AdmitChildS ADDRESS
+instance AdmitChildSTRIKE ADDRESS
+instance AdmitChildBIG ADDRESS
+instance AdmitChildSMALL ADDRESS
+instance AdmitChildEM ADDRESS
+instance AdmitChildSTRONG ADDRESS
+instance AdmitChildDFN ADDRESS
+instance AdmitChildCODE ADDRESS
+instance AdmitChildSAMP ADDRESS
+instance AdmitChildKBD ADDRESS
+instance AdmitChildVAR ADDRESS
+instance AdmitChildCITE ADDRESS
+instance AdmitChildABBR ADDRESS
+instance AdmitChildACRONYM ADDRESS
+instance AdmitChildA ADDRESS
+instance AdmitChildIMG ADDRESS
+instance AdmitChildAPPLET ADDRESS
+instance AdmitChildOBJECT ADDRESS
+instance AdmitChildFONT ADDRESS
+instance AdmitChildBASEFONT ADDRESS
+instance AdmitChildBR ADDRESS
+instance AdmitChildSCRIPT ADDRESS
+instance AdmitChildMAP ADDRESS
+instance AdmitChildQ ADDRESS
+instance AdmitChildSUB ADDRESS
+instance AdmitChildSUP ADDRESS
+instance AdmitChildSPAN ADDRESS
+instance AdmitChildBDO ADDRESS
+instance AdmitChildIFRAME ADDRESS
+instance AdmitChildINPUT ADDRESS
+instance AdmitChildSELECT ADDRESS
+instance AdmitChildTEXTAREA ADDRESS
+instance AdmitChildLABEL ADDRESS
+instance AdmitChildBUTTON ADDRESS
+instance AdmitChildP ADDRESS
+
+instance AdmitChildP BODY
+instance AdmitChildH1 BODY
+instance AdmitChildH2 BODY
+instance AdmitChildH3 BODY
+instance AdmitChildH4 BODY
+instance AdmitChildH5 BODY
+instance AdmitChildH6 BODY
+instance AdmitChildUL BODY
+instance AdmitChildOL BODY
+instance AdmitChildDIR BODY
+instance AdmitChildMENU BODY
+instance AdmitChildPRE BODY
+instance AdmitChildDL BODY
+instance AdmitChildDIV BODY
+instance AdmitChildCENTER BODY
+instance AdmitChildNOSCRIPT BODY
+instance AdmitChildNOFRAMES BODY
+instance AdmitChildBLOCKQUOTE BODY
+instance AdmitChildFORM BODY
+instance AdmitChildISINDEX BODY
+instance AdmitChildHR BODY
+instance AdmitChildTABLE BODY
+instance AdmitChildFIELDSET BODY
+instance AdmitChildADDRESS BODY
+instance AdmitChildCDATA BODY
+instance AdmitChildTT BODY
+instance AdmitChildI BODY
+instance AdmitChildB BODY
+instance AdmitChildU BODY
+instance AdmitChildS BODY
+instance AdmitChildSTRIKE BODY
+instance AdmitChildBIG BODY
+instance AdmitChildSMALL BODY
+instance AdmitChildEM BODY
+instance AdmitChildSTRONG BODY
+instance AdmitChildDFN BODY
+instance AdmitChildCODE BODY
+instance AdmitChildSAMP BODY
+instance AdmitChildKBD BODY
+instance AdmitChildVAR BODY
+instance AdmitChildCITE BODY
+instance AdmitChildABBR BODY
+instance AdmitChildACRONYM BODY
+instance AdmitChildA BODY
+instance AdmitChildIMG BODY
+instance AdmitChildAPPLET BODY
+instance AdmitChildOBJECT BODY
+instance AdmitChildFONT BODY
+instance AdmitChildBASEFONT BODY
+instance AdmitChildBR BODY
+instance AdmitChildSCRIPT BODY
+instance AdmitChildMAP BODY
+instance AdmitChildQ BODY
+instance AdmitChildSUB BODY
+instance AdmitChildSUP BODY
+instance AdmitChildSPAN BODY
+instance AdmitChildBDO BODY
+instance AdmitChildIFRAME BODY
+instance AdmitChildINPUT BODY
+instance AdmitChildSELECT BODY
+instance AdmitChildTEXTAREA BODY
+instance AdmitChildLABEL BODY
+instance AdmitChildBUTTON BODY
+instance AdmitChildINS BODY
+instance AdmitChildDEL BODY
+
+
+instance AdmitChildCDATA FONT
+instance AdmitChildTT FONT
+instance AdmitChildI FONT
+instance AdmitChildB FONT
+instance AdmitChildU FONT
+instance AdmitChildS FONT
+instance AdmitChildSTRIKE FONT
+instance AdmitChildBIG FONT
+instance AdmitChildSMALL FONT
+instance AdmitChildEM FONT
+instance AdmitChildSTRONG FONT
+instance AdmitChildDFN FONT
+instance AdmitChildCODE FONT
+instance AdmitChildSAMP FONT
+instance AdmitChildKBD FONT
+instance AdmitChildVAR FONT
+instance AdmitChildCITE FONT
+instance AdmitChildABBR FONT
+instance AdmitChildACRONYM FONT
+instance AdmitChildA FONT
+instance AdmitChildIMG FONT
+instance AdmitChildAPPLET FONT
+instance AdmitChildOBJECT FONT
+instance AdmitChildFONT FONT
+instance AdmitChildBASEFONT FONT
+instance AdmitChildBR FONT
+instance AdmitChildSCRIPT FONT
+instance AdmitChildMAP FONT
+instance AdmitChildQ FONT
+instance AdmitChildSUB FONT
+instance AdmitChildSUP FONT
+instance AdmitChildSPAN FONT
+instance AdmitChildBDO FONT
+instance AdmitChildIFRAME FONT
+instance AdmitChildINPUT FONT
+instance AdmitChildSELECT FONT
+instance AdmitChildTEXTAREA FONT
+instance AdmitChildLABEL FONT
+instance AdmitChildBUTTON FONT
+
+
+instance AdmitChildCDATA BDO
+instance AdmitChildTT BDO
+instance AdmitChildI BDO
+instance AdmitChildB BDO
+instance AdmitChildU BDO
+instance AdmitChildS BDO
+instance AdmitChildSTRIKE BDO
+instance AdmitChildBIG BDO
+instance AdmitChildSMALL BDO
+instance AdmitChildEM BDO
+instance AdmitChildSTRONG BDO
+instance AdmitChildDFN BDO
+instance AdmitChildCODE BDO
+instance AdmitChildSAMP BDO
+instance AdmitChildKBD BDO
+instance AdmitChildVAR BDO
+instance AdmitChildCITE BDO
+instance AdmitChildABBR BDO
+instance AdmitChildACRONYM BDO
+instance AdmitChildA BDO
+instance AdmitChildIMG BDO
+instance AdmitChildAPPLET BDO
+instance AdmitChildOBJECT BDO
+instance AdmitChildFONT BDO
+instance AdmitChildBASEFONT BDO
+instance AdmitChildBR BDO
+instance AdmitChildSCRIPT BDO
+instance AdmitChildMAP BDO
+instance AdmitChildQ BDO
+instance AdmitChildSUB BDO
+instance AdmitChildSUP BDO
+instance AdmitChildSPAN BDO
+instance AdmitChildBDO BDO
+instance AdmitChildIFRAME BDO
+instance AdmitChildINPUT BDO
+instance AdmitChildSELECT BDO
+instance AdmitChildTEXTAREA BDO
+instance AdmitChildLABEL BDO
+instance AdmitChildBUTTON BDO
+
+instance AdmitChildCDATA SPAN
+instance AdmitChildTT SPAN
+instance AdmitChildI SPAN
+instance AdmitChildB SPAN
+instance AdmitChildU SPAN
+instance AdmitChildS SPAN
+instance AdmitChildSTRIKE SPAN
+instance AdmitChildBIG SPAN
+instance AdmitChildSMALL SPAN
+instance AdmitChildEM SPAN
+instance AdmitChildSTRONG SPAN
+instance AdmitChildDFN SPAN
+instance AdmitChildCODE SPAN
+instance AdmitChildSAMP SPAN
+instance AdmitChildKBD SPAN
+instance AdmitChildVAR SPAN
+instance AdmitChildCITE SPAN
+instance AdmitChildABBR SPAN
+instance AdmitChildACRONYM SPAN
+instance AdmitChildA SPAN
+instance AdmitChildIMG SPAN
+instance AdmitChildAPPLET SPAN
+instance AdmitChildOBJECT SPAN
+instance AdmitChildFONT SPAN
+instance AdmitChildBASEFONT SPAN
+instance AdmitChildBR SPAN
+instance AdmitChildSCRIPT SPAN
+instance AdmitChildMAP SPAN
+instance AdmitChildQ SPAN
+instance AdmitChildSUB SPAN
+instance AdmitChildSUP SPAN
+instance AdmitChildSPAN SPAN
+instance AdmitChildBDO SPAN
+instance AdmitChildIFRAME SPAN
+instance AdmitChildINPUT SPAN
+instance AdmitChildSELECT SPAN
+instance AdmitChildTEXTAREA SPAN
+instance AdmitChildLABEL SPAN
+instance AdmitChildBUTTON SPAN
+
+instance AdmitChildCDATA SUB
+instance AdmitChildTT SUB
+instance AdmitChildI SUB
+instance AdmitChildB SUB
+instance AdmitChildU SUB
+instance AdmitChildS SUB
+instance AdmitChildSTRIKE SUB
+instance AdmitChildBIG SUB
+instance AdmitChildSMALL SUB
+instance AdmitChildEM SUB
+instance AdmitChildSTRONG SUB
+instance AdmitChildDFN SUB
+instance AdmitChildCODE SUB
+instance AdmitChildSAMP SUB
+instance AdmitChildKBD SUB
+instance AdmitChildVAR SUB
+instance AdmitChildCITE SUB
+instance AdmitChildABBR SUB
+instance AdmitChildACRONYM SUB
+instance AdmitChildA SUB
+instance AdmitChildIMG SUB
+instance AdmitChildAPPLET SUB
+instance AdmitChildOBJECT SUB
+instance AdmitChildFONT SUB
+instance AdmitChildBASEFONT SUB
+instance AdmitChildBR SUB
+instance AdmitChildSCRIPT SUB
+instance AdmitChildMAP SUB
+instance AdmitChildQ SUB
+instance AdmitChildSUB SUB
+instance AdmitChildSUP SUB
+instance AdmitChildSPAN SUB
+instance AdmitChildBDO SUB
+instance AdmitChildIFRAME SUB
+instance AdmitChildINPUT SUB
+instance AdmitChildSELECT SUB
+instance AdmitChildTEXTAREA SUB
+instance AdmitChildLABEL SUB
+instance AdmitChildBUTTON SUB
+
+instance AdmitChildCDATA SUP
+instance AdmitChildTT SUP
+instance AdmitChildI SUP
+instance AdmitChildB SUP
+instance AdmitChildU SUP
+instance AdmitChildS SUP
+instance AdmitChildSTRIKE SUP
+instance AdmitChildBIG SUP
+instance AdmitChildSMALL SUP
+instance AdmitChildEM SUP
+instance AdmitChildSTRONG SUP
+instance AdmitChildDFN SUP
+instance AdmitChildCODE SUP
+instance AdmitChildSAMP SUP
+instance AdmitChildKBD SUP
+instance AdmitChildVAR SUP
+instance AdmitChildCITE SUP
+instance AdmitChildABBR SUP
+instance AdmitChildACRONYM SUP
+instance AdmitChildA SUP
+instance AdmitChildIMG SUP
+instance AdmitChildAPPLET SUP
+instance AdmitChildOBJECT SUP
+instance AdmitChildFONT SUP
+instance AdmitChildBASEFONT SUP
+instance AdmitChildBR SUP
+instance AdmitChildSCRIPT SUP
+instance AdmitChildMAP SUP
+instance AdmitChildQ SUP
+instance AdmitChildSUB SUP
+instance AdmitChildSUP SUP
+instance AdmitChildSPAN SUP
+instance AdmitChildBDO SUP
+instance AdmitChildIFRAME SUP
+instance AdmitChildINPUT SUP
+instance AdmitChildSELECT SUP
+instance AdmitChildTEXTAREA SUP
+instance AdmitChildLABEL SUP
+instance AdmitChildBUTTON SUP
+
+instance AdmitChildCDATA TT
+instance AdmitChildTT TT
+instance AdmitChildI TT
+instance AdmitChildB TT
+instance AdmitChildU TT
+instance AdmitChildS TT
+instance AdmitChildSTRIKE TT
+instance AdmitChildBIG TT
+instance AdmitChildSMALL TT
+instance AdmitChildEM TT
+instance AdmitChildSTRONG TT
+instance AdmitChildDFN TT
+instance AdmitChildCODE TT
+instance AdmitChildSAMP TT
+instance AdmitChildKBD TT
+instance AdmitChildVAR TT
+instance AdmitChildCITE TT
+instance AdmitChildABBR TT
+instance AdmitChildACRONYM TT
+instance AdmitChildA TT
+instance AdmitChildIMG TT
+instance AdmitChildAPPLET TT
+instance AdmitChildOBJECT TT
+instance AdmitChildFONT TT
+instance AdmitChildBASEFONT TT
+instance AdmitChildBR TT
+instance AdmitChildSCRIPT TT
+instance AdmitChildMAP TT
+instance AdmitChildQ TT
+instance AdmitChildSUB TT
+instance AdmitChildSUP TT
+instance AdmitChildSPAN TT
+instance AdmitChildBDO TT
+instance AdmitChildIFRAME TT
+instance AdmitChildINPUT TT
+instance AdmitChildSELECT TT
+instance AdmitChildTEXTAREA TT
+instance AdmitChildLABEL TT
+instance AdmitChildBUTTON TT
+
+instance AdmitChildCDATA I
+instance AdmitChildTT I
+instance AdmitChildI I
+instance AdmitChildB I
+instance AdmitChildU I
+instance AdmitChildS I
+instance AdmitChildSTRIKE I
+instance AdmitChildBIG I
+instance AdmitChildSMALL I
+instance AdmitChildEM I
+instance AdmitChildSTRONG I
+instance AdmitChildDFN I
+instance AdmitChildCODE I
+instance AdmitChildSAMP I
+instance AdmitChildKBD I
+instance AdmitChildVAR I
+instance AdmitChildCITE I
+instance AdmitChildABBR I
+instance AdmitChildACRONYM I
+instance AdmitChildA I
+instance AdmitChildIMG I
+instance AdmitChildAPPLET I
+instance AdmitChildOBJECT I
+instance AdmitChildFONT I
+instance AdmitChildBASEFONT I
+instance AdmitChildBR I
+instance AdmitChildSCRIPT I
+instance AdmitChildMAP I
+instance AdmitChildQ I
+instance AdmitChildSUB I
+instance AdmitChildSUP I
+instance AdmitChildSPAN I
+instance AdmitChildBDO I
+instance AdmitChildIFRAME I
+instance AdmitChildINPUT I
+instance AdmitChildSELECT I
+instance AdmitChildTEXTAREA I
+instance AdmitChildLABEL I
+instance AdmitChildBUTTON I
+
+instance AdmitChildCDATA B
+instance AdmitChildTT B
+instance AdmitChildI B
+instance AdmitChildB B
+instance AdmitChildU B
+instance AdmitChildS B
+instance AdmitChildSTRIKE B
+instance AdmitChildBIG B
+instance AdmitChildSMALL B
+instance AdmitChildEM B
+instance AdmitChildSTRONG B
+instance AdmitChildDFN B
+instance AdmitChildCODE B
+instance AdmitChildSAMP B
+instance AdmitChildKBD B
+instance AdmitChildVAR B
+instance AdmitChildCITE B
+instance AdmitChildABBR B
+instance AdmitChildACRONYM B
+instance AdmitChildA B
+instance AdmitChildIMG B
+instance AdmitChildAPPLET B
+instance AdmitChildOBJECT B
+instance AdmitChildFONT B
+instance AdmitChildBASEFONT B
+instance AdmitChildBR B
+instance AdmitChildSCRIPT B
+instance AdmitChildMAP B
+instance AdmitChildQ B
+instance AdmitChildSUB B
+instance AdmitChildSUP B
+instance AdmitChildSPAN B
+instance AdmitChildBDO B
+instance AdmitChildIFRAME B
+instance AdmitChildINPUT B
+instance AdmitChildSELECT B
+instance AdmitChildTEXTAREA B
+instance AdmitChildLABEL B
+instance AdmitChildBUTTON B
+
+instance AdmitChildCDATA U
+instance AdmitChildTT U
+instance AdmitChildI U
+instance AdmitChildB U
+instance AdmitChildU U
+instance AdmitChildS U
+instance AdmitChildSTRIKE U
+instance AdmitChildBIG U
+instance AdmitChildSMALL U
+instance AdmitChildEM U
+instance AdmitChildSTRONG U
+instance AdmitChildDFN U
+instance AdmitChildCODE U
+instance AdmitChildSAMP U
+instance AdmitChildKBD U
+instance AdmitChildVAR U
+instance AdmitChildCITE U
+instance AdmitChildABBR U
+instance AdmitChildACRONYM U
+instance AdmitChildA U
+instance AdmitChildIMG U
+instance AdmitChildAPPLET U
+instance AdmitChildOBJECT U
+instance AdmitChildFONT U
+instance AdmitChildBASEFONT U
+instance AdmitChildBR U
+instance AdmitChildSCRIPT U
+instance AdmitChildMAP U
+instance AdmitChildQ U
+instance AdmitChildSUB U
+instance AdmitChildSUP U
+instance AdmitChildSPAN U
+instance AdmitChildBDO U
+instance AdmitChildIFRAME U
+instance AdmitChildINPUT U
+instance AdmitChildSELECT U
+instance AdmitChildTEXTAREA U
+instance AdmitChildLABEL U
+instance AdmitChildBUTTON U
+
+instance AdmitChildCDATA S
+instance AdmitChildTT S
+instance AdmitChildI S
+instance AdmitChildB S
+instance AdmitChildU S
+instance AdmitChildS S
+instance AdmitChildSTRIKE S
+instance AdmitChildBIG S
+instance AdmitChildSMALL S
+instance AdmitChildEM S
+instance AdmitChildSTRONG S
+instance AdmitChildDFN S
+instance AdmitChildCODE S
+instance AdmitChildSAMP S
+instance AdmitChildKBD S
+instance AdmitChildVAR S
+instance AdmitChildCITE S
+instance AdmitChildABBR S
+instance AdmitChildACRONYM S
+instance AdmitChildA S
+instance AdmitChildIMG S
+instance AdmitChildAPPLET S
+instance AdmitChildOBJECT S
+instance AdmitChildFONT S
+instance AdmitChildBASEFONT S
+instance AdmitChildBR S
+instance AdmitChildSCRIPT S
+instance AdmitChildMAP S
+instance AdmitChildQ S
+instance AdmitChildSUB S
+instance AdmitChildSUP S
+instance AdmitChildSPAN S
+instance AdmitChildBDO S
+instance AdmitChildIFRAME S
+instance AdmitChildINPUT S
+instance AdmitChildSELECT S
+instance AdmitChildTEXTAREA S
+instance AdmitChildLABEL S
+instance AdmitChildBUTTON S
+
+instance AdmitChildCDATA STRIKE
+instance AdmitChildTT STRIKE
+instance AdmitChildI STRIKE
+instance AdmitChildB STRIKE
+instance AdmitChildU STRIKE
+instance AdmitChildS STRIKE
+instance AdmitChildSTRIKE STRIKE
+instance AdmitChildBIG STRIKE
+instance AdmitChildSMALL STRIKE
+instance AdmitChildEM STRIKE
+instance AdmitChildSTRONG STRIKE
+instance AdmitChildDFN STRIKE
+instance AdmitChildCODE STRIKE
+instance AdmitChildSAMP STRIKE
+instance AdmitChildKBD STRIKE
+instance AdmitChildVAR STRIKE
+instance AdmitChildCITE STRIKE
+instance AdmitChildABBR STRIKE
+instance AdmitChildACRONYM STRIKE
+instance AdmitChildA STRIKE
+instance AdmitChildIMG STRIKE
+instance AdmitChildAPPLET STRIKE
+instance AdmitChildOBJECT STRIKE
+instance AdmitChildFONT STRIKE
+instance AdmitChildBASEFONT STRIKE
+instance AdmitChildBR STRIKE
+instance AdmitChildSCRIPT STRIKE
+instance AdmitChildMAP STRIKE
+instance AdmitChildQ STRIKE
+instance AdmitChildSUB STRIKE
+instance AdmitChildSUP STRIKE
+instance AdmitChildSPAN STRIKE
+instance AdmitChildBDO STRIKE
+instance AdmitChildIFRAME STRIKE
+instance AdmitChildINPUT STRIKE
+instance AdmitChildSELECT STRIKE
+instance AdmitChildTEXTAREA STRIKE
+instance AdmitChildLABEL STRIKE
+instance AdmitChildBUTTON STRIKE
+
+instance AdmitChildCDATA BIG
+instance AdmitChildTT BIG
+instance AdmitChildI BIG
+instance AdmitChildB BIG
+instance AdmitChildU BIG
+instance AdmitChildS BIG
+instance AdmitChildSTRIKE BIG
+instance AdmitChildBIG BIG
+instance AdmitChildSMALL BIG
+instance AdmitChildEM BIG
+instance AdmitChildSTRONG BIG
+instance AdmitChildDFN BIG
+instance AdmitChildCODE BIG
+instance AdmitChildSAMP BIG
+instance AdmitChildKBD BIG
+instance AdmitChildVAR BIG
+instance AdmitChildCITE BIG
+instance AdmitChildABBR BIG
+instance AdmitChildACRONYM BIG
+instance AdmitChildA BIG
+instance AdmitChildIMG BIG
+instance AdmitChildAPPLET BIG
+instance AdmitChildOBJECT BIG
+instance AdmitChildFONT BIG
+instance AdmitChildBASEFONT BIG
+instance AdmitChildBR BIG
+instance AdmitChildSCRIPT BIG
+instance AdmitChildMAP BIG
+instance AdmitChildQ BIG
+instance AdmitChildSUB BIG
+instance AdmitChildSUP BIG
+instance AdmitChildSPAN BIG
+instance AdmitChildBDO BIG
+instance AdmitChildIFRAME BIG
+instance AdmitChildINPUT BIG
+instance AdmitChildSELECT BIG
+instance AdmitChildTEXTAREA BIG
+instance AdmitChildLABEL BIG
+instance AdmitChildBUTTON BIG
+
+instance AdmitChildCDATA SMALL
+instance AdmitChildTT SMALL
+instance AdmitChildI SMALL
+instance AdmitChildB SMALL
+instance AdmitChildU SMALL
+instance AdmitChildS SMALL
+instance AdmitChildSTRIKE SMALL
+instance AdmitChildBIG SMALL
+instance AdmitChildSMALL SMALL
+instance AdmitChildEM SMALL
+instance AdmitChildSTRONG SMALL
+instance AdmitChildDFN SMALL
+instance AdmitChildCODE SMALL
+instance AdmitChildSAMP SMALL
+instance AdmitChildKBD SMALL
+instance AdmitChildVAR SMALL
+instance AdmitChildCITE SMALL
+instance AdmitChildABBR SMALL
+instance AdmitChildACRONYM SMALL
+instance AdmitChildA SMALL
+instance AdmitChildIMG SMALL
+instance AdmitChildAPPLET SMALL
+instance AdmitChildOBJECT SMALL
+instance AdmitChildFONT SMALL
+instance AdmitChildBASEFONT SMALL
+instance AdmitChildBR SMALL
+instance AdmitChildSCRIPT SMALL
+instance AdmitChildMAP SMALL
+instance AdmitChildQ SMALL
+instance AdmitChildSUB SMALL
+instance AdmitChildSUP SMALL
+instance AdmitChildSPAN SMALL
+instance AdmitChildBDO SMALL
+instance AdmitChildIFRAME SMALL
+instance AdmitChildINPUT SMALL
+instance AdmitChildSELECT SMALL
+instance AdmitChildTEXTAREA SMALL
+instance AdmitChildLABEL SMALL
+instance AdmitChildBUTTON SMALL
+
+instance AdmitChildCDATA EM
+instance AdmitChildTT EM
+instance AdmitChildI EM
+instance AdmitChildB EM
+instance AdmitChildU EM
+instance AdmitChildS EM
+instance AdmitChildSTRIKE EM
+instance AdmitChildBIG EM
+instance AdmitChildSMALL EM
+instance AdmitChildEM EM
+instance AdmitChildSTRONG EM
+instance AdmitChildDFN EM
+instance AdmitChildCODE EM
+instance AdmitChildSAMP EM
+instance AdmitChildKBD EM
+instance AdmitChildVAR EM
+instance AdmitChildCITE EM
+instance AdmitChildABBR EM
+instance AdmitChildACRONYM EM
+instance AdmitChildA EM
+instance AdmitChildIMG EM
+instance AdmitChildAPPLET EM
+instance AdmitChildOBJECT EM
+instance AdmitChildFONT EM
+instance AdmitChildBASEFONT EM
+instance AdmitChildBR EM
+instance AdmitChildSCRIPT EM
+instance AdmitChildMAP EM
+instance AdmitChildQ EM
+instance AdmitChildSUB EM
+instance AdmitChildSUP EM
+instance AdmitChildSPAN EM
+instance AdmitChildBDO EM
+instance AdmitChildIFRAME EM
+instance AdmitChildINPUT EM
+instance AdmitChildSELECT EM
+instance AdmitChildTEXTAREA EM
+instance AdmitChildLABEL EM
+instance AdmitChildBUTTON EM
+
+instance AdmitChildCDATA STRONG
+instance AdmitChildTT STRONG
+instance AdmitChildI STRONG
+instance AdmitChildB STRONG
+instance AdmitChildU STRONG
+instance AdmitChildS STRONG
+instance AdmitChildSTRIKE STRONG
+instance AdmitChildBIG STRONG
+instance AdmitChildSMALL STRONG
+instance AdmitChildEM STRONG
+instance AdmitChildSTRONG STRONG
+instance AdmitChildDFN STRONG
+instance AdmitChildCODE STRONG
+instance AdmitChildSAMP STRONG
+instance AdmitChildKBD STRONG
+instance AdmitChildVAR STRONG
+instance AdmitChildCITE STRONG
+instance AdmitChildABBR STRONG
+instance AdmitChildACRONYM STRONG
+instance AdmitChildA STRONG
+instance AdmitChildIMG STRONG
+instance AdmitChildAPPLET STRONG
+instance AdmitChildOBJECT STRONG
+instance AdmitChildFONT STRONG
+instance AdmitChildBASEFONT STRONG
+instance AdmitChildBR STRONG
+instance AdmitChildSCRIPT STRONG
+instance AdmitChildMAP STRONG
+instance AdmitChildQ STRONG
+instance AdmitChildSUB STRONG
+instance AdmitChildSUP STRONG
+instance AdmitChildSPAN STRONG
+instance AdmitChildBDO STRONG
+instance AdmitChildIFRAME STRONG
+instance AdmitChildINPUT STRONG
+instance AdmitChildSELECT STRONG
+instance AdmitChildTEXTAREA STRONG
+instance AdmitChildLABEL STRONG
+instance AdmitChildBUTTON STRONG
+
+instance AdmitChildCDATA DFN
+instance AdmitChildTT DFN
+instance AdmitChildI DFN
+instance AdmitChildB DFN
+instance AdmitChildU DFN
+instance AdmitChildS DFN
+instance AdmitChildSTRIKE DFN
+instance AdmitChildBIG DFN
+instance AdmitChildSMALL DFN
+instance AdmitChildEM DFN
+instance AdmitChildSTRONG DFN
+instance AdmitChildDFN DFN
+instance AdmitChildCODE DFN
+instance AdmitChildSAMP DFN
+instance AdmitChildKBD DFN
+instance AdmitChildVAR DFN
+instance AdmitChildCITE DFN
+instance AdmitChildABBR DFN
+instance AdmitChildACRONYM DFN
+instance AdmitChildA DFN
+instance AdmitChildIMG DFN
+instance AdmitChildAPPLET DFN
+instance AdmitChildOBJECT DFN
+instance AdmitChildFONT DFN
+instance AdmitChildBASEFONT DFN
+instance AdmitChildBR DFN
+instance AdmitChildSCRIPT DFN
+instance AdmitChildMAP DFN
+instance AdmitChildQ DFN
+instance AdmitChildSUB DFN
+instance AdmitChildSUP DFN
+instance AdmitChildSPAN DFN
+instance AdmitChildBDO DFN
+instance AdmitChildIFRAME DFN
+instance AdmitChildINPUT DFN
+instance AdmitChildSELECT DFN
+instance AdmitChildTEXTAREA DFN
+instance AdmitChildLABEL DFN
+instance AdmitChildBUTTON DFN
+
+instance AdmitChildCDATA CODE
+instance AdmitChildTT CODE
+instance AdmitChildI CODE
+instance AdmitChildB CODE
+instance AdmitChildU CODE
+instance AdmitChildS CODE
+instance AdmitChildSTRIKE CODE
+instance AdmitChildBIG CODE
+instance AdmitChildSMALL CODE
+instance AdmitChildEM CODE
+instance AdmitChildSTRONG CODE
+instance AdmitChildDFN CODE
+instance AdmitChildCODE CODE
+instance AdmitChildSAMP CODE
+instance AdmitChildKBD CODE
+instance AdmitChildVAR CODE
+instance AdmitChildCITE CODE
+instance AdmitChildABBR CODE
+instance AdmitChildACRONYM CODE
+instance AdmitChildA CODE
+instance AdmitChildIMG CODE
+instance AdmitChildAPPLET CODE
+instance AdmitChildOBJECT CODE
+instance AdmitChildFONT CODE
+instance AdmitChildBASEFONT CODE
+instance AdmitChildBR CODE
+instance AdmitChildSCRIPT CODE
+instance AdmitChildMAP CODE
+instance AdmitChildQ CODE
+instance AdmitChildSUB CODE
+instance AdmitChildSUP CODE
+instance AdmitChildSPAN CODE
+instance AdmitChildBDO CODE
+instance AdmitChildIFRAME CODE
+instance AdmitChildINPUT CODE
+instance AdmitChildSELECT CODE
+instance AdmitChildTEXTAREA CODE
+instance AdmitChildLABEL CODE
+instance AdmitChildBUTTON CODE
+
+instance AdmitChildCDATA SAMP
+instance AdmitChildTT SAMP
+instance AdmitChildI SAMP
+instance AdmitChildB SAMP
+instance AdmitChildU SAMP
+instance AdmitChildS SAMP
+instance AdmitChildSTRIKE SAMP
+instance AdmitChildBIG SAMP
+instance AdmitChildSMALL SAMP
+instance AdmitChildEM SAMP
+instance AdmitChildSTRONG SAMP
+instance AdmitChildDFN SAMP
+instance AdmitChildCODE SAMP
+instance AdmitChildSAMP SAMP
+instance AdmitChildKBD SAMP
+instance AdmitChildVAR SAMP
+instance AdmitChildCITE SAMP
+instance AdmitChildABBR SAMP
+instance AdmitChildACRONYM SAMP
+instance AdmitChildA SAMP
+instance AdmitChildIMG SAMP
+instance AdmitChildAPPLET SAMP
+instance AdmitChildOBJECT SAMP
+instance AdmitChildFONT SAMP
+instance AdmitChildBASEFONT SAMP
+instance AdmitChildBR SAMP
+instance AdmitChildSCRIPT SAMP
+instance AdmitChildMAP SAMP
+instance AdmitChildQ SAMP
+instance AdmitChildSUB SAMP
+instance AdmitChildSUP SAMP
+instance AdmitChildSPAN SAMP
+instance AdmitChildBDO SAMP
+instance AdmitChildIFRAME SAMP
+instance AdmitChildINPUT SAMP
+instance AdmitChildSELECT SAMP
+instance AdmitChildTEXTAREA SAMP
+instance AdmitChildLABEL SAMP
+instance AdmitChildBUTTON SAMP
+
+instance AdmitChildCDATA KBD
+instance AdmitChildTT KBD
+instance AdmitChildI KBD
+instance AdmitChildB KBD
+instance AdmitChildU KBD
+instance AdmitChildS KBD
+instance AdmitChildSTRIKE KBD
+instance AdmitChildBIG KBD
+instance AdmitChildSMALL KBD
+instance AdmitChildEM KBD
+instance AdmitChildSTRONG KBD
+instance AdmitChildDFN KBD
+instance AdmitChildCODE KBD
+instance AdmitChildSAMP KBD
+instance AdmitChildKBD KBD
+instance AdmitChildVAR KBD
+instance AdmitChildCITE KBD
+instance AdmitChildABBR KBD
+instance AdmitChildACRONYM KBD
+instance AdmitChildA KBD
+instance AdmitChildIMG KBD
+instance AdmitChildAPPLET KBD
+instance AdmitChildOBJECT KBD
+instance AdmitChildFONT KBD
+instance AdmitChildBASEFONT KBD
+instance AdmitChildBR KBD
+instance AdmitChildSCRIPT KBD
+instance AdmitChildMAP KBD
+instance AdmitChildQ KBD
+instance AdmitChildSUB KBD
+instance AdmitChildSUP KBD
+instance AdmitChildSPAN KBD
+instance AdmitChildBDO KBD
+instance AdmitChildIFRAME KBD
+instance AdmitChildINPUT KBD
+instance AdmitChildSELECT KBD
+instance AdmitChildTEXTAREA KBD
+instance AdmitChildLABEL KBD
+instance AdmitChildBUTTON KBD
+
+instance AdmitChildCDATA VAR
+instance AdmitChildTT VAR
+instance AdmitChildI VAR
+instance AdmitChildB VAR
+instance AdmitChildU VAR
+instance AdmitChildS VAR
+instance AdmitChildSTRIKE VAR
+instance AdmitChildBIG VAR
+instance AdmitChildSMALL VAR
+instance AdmitChildEM VAR
+instance AdmitChildSTRONG VAR
+instance AdmitChildDFN VAR
+instance AdmitChildCODE VAR
+instance AdmitChildSAMP VAR
+instance AdmitChildKBD VAR
+instance AdmitChildVAR VAR
+instance AdmitChildCITE VAR
+instance AdmitChildABBR VAR
+instance AdmitChildACRONYM VAR
+instance AdmitChildA VAR
+instance AdmitChildIMG VAR
+instance AdmitChildAPPLET VAR
+instance AdmitChildOBJECT VAR
+instance AdmitChildFONT VAR
+instance AdmitChildBASEFONT VAR
+instance AdmitChildBR VAR
+instance AdmitChildSCRIPT VAR
+instance AdmitChildMAP VAR
+instance AdmitChildQ VAR
+instance AdmitChildSUB VAR
+instance AdmitChildSUP VAR
+instance AdmitChildSPAN VAR
+instance AdmitChildBDO VAR
+instance AdmitChildIFRAME VAR
+instance AdmitChildINPUT VAR
+instance AdmitChildSELECT VAR
+instance AdmitChildTEXTAREA VAR
+instance AdmitChildLABEL VAR
+instance AdmitChildBUTTON VAR
+
+instance AdmitChildCDATA CITE
+instance AdmitChildTT CITE
+instance AdmitChildI CITE
+instance AdmitChildB CITE
+instance AdmitChildU CITE
+instance AdmitChildS CITE
+instance AdmitChildSTRIKE CITE
+instance AdmitChildBIG CITE
+instance AdmitChildSMALL CITE
+instance AdmitChildEM CITE
+instance AdmitChildSTRONG CITE
+instance AdmitChildDFN CITE
+instance AdmitChildCODE CITE
+instance AdmitChildSAMP CITE
+instance AdmitChildKBD CITE
+instance AdmitChildVAR CITE
+instance AdmitChildCITE CITE
+instance AdmitChildABBR CITE
+instance AdmitChildACRONYM CITE
+instance AdmitChildA CITE
+instance AdmitChildIMG CITE
+instance AdmitChildAPPLET CITE
+instance AdmitChildOBJECT CITE
+instance AdmitChildFONT CITE
+instance AdmitChildBASEFONT CITE
+instance AdmitChildBR CITE
+instance AdmitChildSCRIPT CITE
+instance AdmitChildMAP CITE
+instance AdmitChildQ CITE
+instance AdmitChildSUB CITE
+instance AdmitChildSUP CITE
+instance AdmitChildSPAN CITE
+instance AdmitChildBDO CITE
+instance AdmitChildIFRAME CITE
+instance AdmitChildINPUT CITE
+instance AdmitChildSELECT CITE
+instance AdmitChildTEXTAREA CITE
+instance AdmitChildLABEL CITE
+instance AdmitChildBUTTON CITE
+
+instance AdmitChildCDATA ABBR
+instance AdmitChildTT ABBR
+instance AdmitChildI ABBR
+instance AdmitChildB ABBR
+instance AdmitChildU ABBR
+instance AdmitChildS ABBR
+instance AdmitChildSTRIKE ABBR
+instance AdmitChildBIG ABBR
+instance AdmitChildSMALL ABBR
+instance AdmitChildEM ABBR
+instance AdmitChildSTRONG ABBR
+instance AdmitChildDFN ABBR
+instance AdmitChildCODE ABBR
+instance AdmitChildSAMP ABBR
+instance AdmitChildKBD ABBR
+instance AdmitChildVAR ABBR
+instance AdmitChildCITE ABBR
+instance AdmitChildABBR ABBR
+instance AdmitChildACRONYM ABBR
+instance AdmitChildA ABBR
+instance AdmitChildIMG ABBR
+instance AdmitChildAPPLET ABBR
+instance AdmitChildOBJECT ABBR
+instance AdmitChildFONT ABBR
+instance AdmitChildBASEFONT ABBR
+instance AdmitChildBR ABBR
+instance AdmitChildSCRIPT ABBR
+instance AdmitChildMAP ABBR
+instance AdmitChildQ ABBR
+instance AdmitChildSUB ABBR
+instance AdmitChildSUP ABBR
+instance AdmitChildSPAN ABBR
+instance AdmitChildBDO ABBR
+instance AdmitChildIFRAME ABBR
+instance AdmitChildINPUT ABBR
+instance AdmitChildSELECT ABBR
+instance AdmitChildTEXTAREA ABBR
+instance AdmitChildLABEL ABBR
+instance AdmitChildBUTTON ABBR
+
+instance AdmitChildCDATA ACRONYM
+instance AdmitChildTT ACRONYM
+instance AdmitChildI ACRONYM
+instance AdmitChildB ACRONYM
+instance AdmitChildU ACRONYM
+instance AdmitChildS ACRONYM
+instance AdmitChildSTRIKE ACRONYM
+instance AdmitChildBIG ACRONYM
+instance AdmitChildSMALL ACRONYM
+instance AdmitChildEM ACRONYM
+instance AdmitChildSTRONG ACRONYM
+instance AdmitChildDFN ACRONYM
+instance AdmitChildCODE ACRONYM
+instance AdmitChildSAMP ACRONYM
+instance AdmitChildKBD ACRONYM
+instance AdmitChildVAR ACRONYM
+instance AdmitChildCITE ACRONYM
+instance AdmitChildABBR ACRONYM
+instance AdmitChildACRONYM ACRONYM
+instance AdmitChildA ACRONYM
+instance AdmitChildIMG ACRONYM
+instance AdmitChildAPPLET ACRONYM
+instance AdmitChildOBJECT ACRONYM
+instance AdmitChildFONT ACRONYM
+instance AdmitChildBASEFONT ACRONYM
+instance AdmitChildBR ACRONYM
+instance AdmitChildSCRIPT ACRONYM
+instance AdmitChildMAP ACRONYM
+instance AdmitChildQ ACRONYM
+instance AdmitChildSUB ACRONYM
+instance AdmitChildSUP ACRONYM
+instance AdmitChildSPAN ACRONYM
+instance AdmitChildBDO ACRONYM
+instance AdmitChildIFRAME ACRONYM
+instance AdmitChildINPUT ACRONYM
+instance AdmitChildSELECT ACRONYM
+instance AdmitChildTEXTAREA ACRONYM
+instance AdmitChildLABEL ACRONYM
+instance AdmitChildBUTTON ACRONYM
+data ALIGN_bottom = ALIGN_bottom
+data ALIGN_center = ALIGN_center
+data ALIGN_char = ALIGN_char
+data ALIGN_justify = ALIGN_justify
+data ALIGN_left = ALIGN_left
+data ALIGN_middle = ALIGN_middle
+data ALIGN_right = ALIGN_right
+data ALIGN_top = ALIGN_top
+data CHECKED_checked = CHECKED_checked
+data CLEAR_all = CLEAR_all
+data CLEAR_left = CLEAR_left
+data CLEAR_none = CLEAR_none
+data CLEAR_right = CLEAR_right
+data COMPACT_compact = COMPACT_compact
+data DECLARE_declare = DECLARE_declare
+data DEFER_defer = DEFER_defer
+data DIR_ltr = DIR_ltr
+data DIR_rtl = DIR_rtl
+data DISABLED_disabled = DISABLED_disabled
+data FRAME_above = FRAME_above
+data FRAME_below = FRAME_below
+data FRAME_border = FRAME_border
+data FRAME_box = FRAME_box
+data FRAME_hsides = FRAME_hsides
+data FRAME_lhs = FRAME_lhs
+data FRAME_rhs = FRAME_rhs
+data FRAME_void = FRAME_void
+data FRAME_vsides = FRAME_vsides
+data ISMAP_ismap = ISMAP_ismap
+data METHOD_GET = METHOD_GET
+data METHOD_POST = METHOD_POST
+data MULTIPLE_multiple = MULTIPLE_multiple
+data NOHREF_nohref = NOHREF_nohref
+data NORESIZE_noresize = NORESIZE_noresize
+data NOSHADE_noshade = NOSHADE_noshade
+data NOWRAP_nowrap = NOWRAP_nowrap
+data READONLY_readonly = READONLY_readonly
+data RULES_all = RULES_all
+data RULES_cols = RULES_cols
+data RULES_groups = RULES_groups
+data RULES_none = RULES_none
+data RULES_rows = RULES_rows
+data SCOPE_col = SCOPE_col
+data SCOPE_colgroup = SCOPE_colgroup
+data SCOPE_row = SCOPE_row
+data SCOPE_rowgroup = SCOPE_rowgroup
+data SCROLLING_auto = SCROLLING_auto
+data SCROLLING_no = SCROLLING_no
+data SCROLLING_yes = SCROLLING_yes
+data SELECTED_selected = SELECTED_selected
+data SHAPE_circle = SHAPE_circle
+data SHAPE_default' = SHAPE_default'
+data SHAPE_poly = SHAPE_poly
+data SHAPE_rect = SHAPE_rect
+data TYPE_BUTTON = TYPE_BUTTON
+data TYPE_CHECKBOX = TYPE_CHECKBOX
+data TYPE_FILE = TYPE_FILE
+data TYPE_HIDDEN = TYPE_HIDDEN
+data TYPE_IMAGE = TYPE_IMAGE
+data TYPE_PASSWORD = TYPE_PASSWORD
+data TYPE_RADIO = TYPE_RADIO
+data TYPE_RESET = TYPE_RESET
+data TYPE_SUBMIT = TYPE_SUBMIT
+data TYPE_TEXT = TYPE_TEXT
+data TYPE_button = TYPE_button
+data TYPE_circle = TYPE_circle
+data TYPE_disc = TYPE_disc
+data TYPE_reset = TYPE_reset
+data TYPE_square = TYPE_square
+data TYPE_submit = TYPE_submit
+data VALIGN_baseline = VALIGN_baseline
+data VALIGN_bottom = VALIGN_bottom
+data VALIGN_middle = VALIGN_middle
+data VALIGN_top = VALIGN_top
+data VALUETYPE_DATA = VALUETYPE_DATA
+data VALUETYPE_OBJECT = VALUETYPE_OBJECT
+data VALUETYPE_REF = VALUETYPE_REF
+instance AttrValueABBR Char
+instance AttrValueABBR a => AttrValueABBR [a]
+instance AttrValueACCEPT Char
+instance AttrValueACCEPT a => AttrValueACCEPT [a]
+instance AttrValueACCEPT_CHARSET Char
+instance AttrValueACCEPT_CHARSET a => AttrValueACCEPT_CHARSET [a]
+instance AttrValueACCESSKEY Char
+instance AttrValueACCESSKEY a => AttrValueACCESSKEY [a]
+instance AttrValueACTION Char
+instance AttrValueACTION a => AttrValueACTION [a]
+instance AttrValueALIGN ALIGN_bottom
+instance AttrValueALIGN ALIGN_center
+instance AttrValueALIGN ALIGN_char
+instance AttrValueALIGN ALIGN_justify
+instance AttrValueALIGN ALIGN_left
+instance AttrValueALIGN ALIGN_middle
+instance AttrValueALIGN ALIGN_right
+instance AttrValueALIGN ALIGN_top
+instance AttrValueALINK Char
+instance AttrValueALINK a => AttrValueALINK [a]
+instance AttrValueALT Char
+instance AttrValueALT a => AttrValueALT [a]
+instance AttrValueARCHIVE Char
+instance AttrValueARCHIVE a => AttrValueARCHIVE [a]
+instance AttrValueAXIS Char
+instance AttrValueAXIS a => AttrValueAXIS [a]
+instance AttrValueBACKGROUND Char
+instance AttrValueBACKGROUND a => AttrValueBACKGROUND [a]
+instance AttrValueBGCOLOR Char
+instance AttrValueBGCOLOR a => AttrValueBGCOLOR [a]
+instance AttrValueBORDER Char
+instance AttrValueBORDER a => AttrValueBORDER [a]
+instance AttrValueCELLPADDING Char
+instance AttrValueCELLPADDING a => AttrValueCELLPADDING [a]
+instance AttrValueCELLSPACING Char
+instance AttrValueCELLSPACING a => AttrValueCELLSPACING [a]
+instance AttrValueCHAR Char
+instance AttrValueCHAR a => AttrValueCHAR [a]
+instance AttrValueCHAROFF Char
+instance AttrValueCHAROFF a => AttrValueCHAROFF [a]
+instance AttrValueCHARSET Char
+instance AttrValueCHARSET a => AttrValueCHARSET [a]
+instance AttrValueCHECKED CHECKED_checked
+instance AttrValueCITE Char
+instance AttrValueCITE a => AttrValueCITE [a]
+instance AttrValueCLASS Char
+instance AttrValueCLASS a => AttrValueCLASS [a]
+instance AttrValueCLASSID Char
+instance AttrValueCLASSID a => AttrValueCLASSID [a]
+instance AttrValueCLEAR CLEAR_all
+instance AttrValueCLEAR CLEAR_left
+instance AttrValueCLEAR CLEAR_none
+instance AttrValueCLEAR CLEAR_right
+instance AttrValueCODE Char
+instance AttrValueCODE a => AttrValueCODE [a]
+instance AttrValueCODEBASE Char
+instance AttrValueCODEBASE a => AttrValueCODEBASE [a]
+instance AttrValueCODETYPE Char
+instance AttrValueCODETYPE a => AttrValueCODETYPE [a]
+instance AttrValueCOLOR Char
+instance AttrValueCOLOR a => AttrValueCOLOR [a]
+instance AttrValueCOLS Char
+instance AttrValueCOLS Int
+instance AttrValueCOLS a => AttrValueCOLS [a]
+instance AttrValueCOLSPAN Int
+instance AttrValueCOMPACT COMPACT_compact
+instance AttrValueCONTENT Char
+instance AttrValueCONTENT a => AttrValueCONTENT [a]
+instance AttrValueCOORDS Char
+instance AttrValueCOORDS a => AttrValueCOORDS [a]
+instance AttrValueDATA Char
+instance AttrValueDATA a => AttrValueDATA [a]
+instance AttrValueDATAPAGESIZE Char
+instance AttrValueDATAPAGESIZE a => AttrValueDATAPAGESIZE [a]
+instance AttrValueDATETIME Char
+instance AttrValueDATETIME a => AttrValueDATETIME [a]
+instance AttrValueDECLARE DECLARE_declare
+instance AttrValueDEFER DEFER_defer
+instance AttrValueDIR DIR_ltr
+instance AttrValueDIR DIR_rtl
+instance AttrValueDISABLED DISABLED_disabled
+instance AttrValueENCTYPE Char
+instance AttrValueENCTYPE a => AttrValueENCTYPE [a]
+instance AttrValueEVENT Char
+instance AttrValueEVENT a => AttrValueEVENT [a]
+instance AttrValueFACE Char
+instance AttrValueFACE a => AttrValueFACE [a]
+instance AttrValueFOR Char
+instance AttrValueFOR a => AttrValueFOR [a]
+instance AttrValueFRAME FRAME_above
+instance AttrValueFRAME FRAME_below
+instance AttrValueFRAME FRAME_border
+instance AttrValueFRAME FRAME_box
+instance AttrValueFRAME FRAME_hsides
+instance AttrValueFRAME FRAME_lhs
+instance AttrValueFRAME FRAME_rhs
+instance AttrValueFRAME FRAME_void
+instance AttrValueFRAME FRAME_vsides
+instance AttrValueFRAMEBORDER Int
+instance AttrValueHEADERS Char
+instance AttrValueHEADERS a => AttrValueHEADERS [a]
+instance AttrValueHEIGHT Char
+instance AttrValueHEIGHT a => AttrValueHEIGHT [a]
+instance AttrValueHREF Char
+instance AttrValueHREF a => AttrValueHREF [a]
+instance AttrValueHREFLANG Char
+instance AttrValueHREFLANG a => AttrValueHREFLANG [a]
+instance AttrValueHSPACE Char
+instance AttrValueHSPACE a => AttrValueHSPACE [a]
+instance AttrValueHTTP_EQUIV Char
+instance AttrValueHTTP_EQUIV a => AttrValueHTTP_EQUIV [a]
+instance AttrValueID Char
+instance AttrValueID a => AttrValueID [a]
+instance AttrValueISMAP ISMAP_ismap
+instance AttrValueLABEL Char
+instance AttrValueLABEL a => AttrValueLABEL [a]
+instance AttrValueLANG Char
+instance AttrValueLANG a => AttrValueLANG [a]
+instance AttrValueLANGUAGE Char
+instance AttrValueLANGUAGE a => AttrValueLANGUAGE [a]
+instance AttrValueLINK Char
+instance AttrValueLINK a => AttrValueLINK [a]
+instance AttrValueLONGDESC Char
+instance AttrValueLONGDESC a => AttrValueLONGDESC [a]
+instance AttrValueMARGINHEIGHT Char
+instance AttrValueMARGINHEIGHT a => AttrValueMARGINHEIGHT [a]
+instance AttrValueMARGINWIDTH Char
+instance AttrValueMARGINWIDTH a => AttrValueMARGINWIDTH [a]
+instance AttrValueMAXLENGTH Int
+instance AttrValueMEDIA Char
+instance AttrValueMEDIA a => AttrValueMEDIA [a]
+instance AttrValueMETHOD METHOD_GET
+instance AttrValueMETHOD METHOD_POST
+instance AttrValueMULTIPLE MULTIPLE_multiple
+instance AttrValueNAME Char
+instance AttrValueNAME a => AttrValueNAME [a]
+instance AttrValueNOHREF NOHREF_nohref
+instance AttrValueNORESIZE NORESIZE_noresize
+instance AttrValueNOSHADE NOSHADE_noshade
+instance AttrValueNOWRAP NOWRAP_nowrap
+instance AttrValueOBJECT Char
+instance AttrValueOBJECT a => AttrValueOBJECT [a]
+instance AttrValueONBLUR Char
+instance AttrValueONBLUR a => AttrValueONBLUR [a]
+instance AttrValueONCHANGE Char
+instance AttrValueONCHANGE a => AttrValueONCHANGE [a]
+instance AttrValueONCLICK Char
+instance AttrValueONCLICK a => AttrValueONCLICK [a]
+instance AttrValueONDBLCLICK Char
+instance AttrValueONDBLCLICK a => AttrValueONDBLCLICK [a]
+instance AttrValueONFOCUS Char
+instance AttrValueONFOCUS a => AttrValueONFOCUS [a]
+instance AttrValueONKEYDOWN Char
+instance AttrValueONKEYDOWN a => AttrValueONKEYDOWN [a]
+instance AttrValueONKEYPRESS Char
+instance AttrValueONKEYPRESS a => AttrValueONKEYPRESS [a]
+instance AttrValueONKEYUP Char
+instance AttrValueONKEYUP a => AttrValueONKEYUP [a]
+instance AttrValueONLOAD Char
+instance AttrValueONLOAD a => AttrValueONLOAD [a]
+instance AttrValueONMOUSEDOWN Char
+instance AttrValueONMOUSEDOWN a => AttrValueONMOUSEDOWN [a]
+instance AttrValueONMOUSEMOVE Char
+instance AttrValueONMOUSEMOVE a => AttrValueONMOUSEMOVE [a]
+instance AttrValueONMOUSEOUT Char
+instance AttrValueONMOUSEOUT a => AttrValueONMOUSEOUT [a]
+instance AttrValueONMOUSEOVER Char
+instance AttrValueONMOUSEOVER a => AttrValueONMOUSEOVER [a]
+instance AttrValueONMOUSEUP Char
+instance AttrValueONMOUSEUP a => AttrValueONMOUSEUP [a]
+instance AttrValueONRESET Char
+instance AttrValueONRESET a => AttrValueONRESET [a]
+instance AttrValueONSELECT Char
+instance AttrValueONSELECT a => AttrValueONSELECT [a]
+instance AttrValueONSUBMIT Char
+instance AttrValueONSUBMIT a => AttrValueONSUBMIT [a]
+instance AttrValueONUNLOAD Char
+instance AttrValueONUNLOAD a => AttrValueONUNLOAD [a]
+instance AttrValuePROFILE Char
+instance AttrValuePROFILE a => AttrValuePROFILE [a]
+instance AttrValuePROMPT Char
+instance AttrValuePROMPT a => AttrValuePROMPT [a]
+instance AttrValueREADONLY READONLY_readonly
+instance AttrValueREL Char
+instance AttrValueREL a => AttrValueREL [a]
+instance AttrValueREV Char
+instance AttrValueREV a => AttrValueREV [a]
+instance AttrValueROWS Char
+instance AttrValueROWS Int
+instance AttrValueROWS a => AttrValueROWS [a]
+instance AttrValueROWSPAN Int
+instance AttrValueRULES RULES_all
+instance AttrValueRULES RULES_cols
+instance AttrValueRULES RULES_groups
+instance AttrValueRULES RULES_none
+instance AttrValueRULES RULES_rows
+instance AttrValueSCHEME Char
+instance AttrValueSCHEME a => AttrValueSCHEME [a]
+instance AttrValueSCOPE SCOPE_col
+instance AttrValueSCOPE SCOPE_colgroup
+instance AttrValueSCOPE SCOPE_row
+instance AttrValueSCOPE SCOPE_rowgroup
+instance AttrValueSCROLLING SCROLLING_auto
+instance AttrValueSCROLLING SCROLLING_no
+instance AttrValueSCROLLING SCROLLING_yes
+instance AttrValueSELECTED SELECTED_selected
+instance AttrValueSHAPE SHAPE_circle
+instance AttrValueSHAPE SHAPE_default'
+instance AttrValueSHAPE SHAPE_poly
+instance AttrValueSHAPE SHAPE_rect
+instance AttrValueSIZE Char
+instance AttrValueSIZE Int
+instance AttrValueSIZE a => AttrValueSIZE [a]
+instance AttrValueSPAN Int
+instance AttrValueSRC Char
+instance AttrValueSRC a => AttrValueSRC [a]
+instance AttrValueSTANDBY Char
+instance AttrValueSTANDBY a => AttrValueSTANDBY [a]
+instance AttrValueSTART Int
+instance AttrValueSTYLE Char
+instance AttrValueSTYLE a => AttrValueSTYLE [a]
+instance AttrValueSUMMARY Char
+instance AttrValueSUMMARY a => AttrValueSUMMARY [a]
+instance AttrValueTABINDEX Int
+instance AttrValueTARGET Char
+instance AttrValueTARGET a => AttrValueTARGET [a]
+instance AttrValueTEXT Char
+instance AttrValueTEXT a => AttrValueTEXT [a]
+instance AttrValueTITLE Char
+instance AttrValueTITLE a => AttrValueTITLE [a]
+instance AttrValueTYPE Char
+instance AttrValueTYPE TYPE_BUTTON
+instance AttrValueTYPE TYPE_CHECKBOX
+instance AttrValueTYPE TYPE_FILE
+instance AttrValueTYPE TYPE_HIDDEN
+instance AttrValueTYPE TYPE_IMAGE
+instance AttrValueTYPE TYPE_PASSWORD
+instance AttrValueTYPE TYPE_RADIO
+instance AttrValueTYPE TYPE_RESET
+instance AttrValueTYPE TYPE_SUBMIT
+instance AttrValueTYPE TYPE_TEXT
+instance AttrValueTYPE TYPE_button
+instance AttrValueTYPE TYPE_circle
+instance AttrValueTYPE TYPE_disc
+instance AttrValueTYPE TYPE_reset
+instance AttrValueTYPE TYPE_square
+instance AttrValueTYPE TYPE_submit
+instance AttrValueTYPE a => AttrValueTYPE [a]
+instance AttrValueUSEMAP Char
+instance AttrValueUSEMAP a => AttrValueUSEMAP [a]
+instance AttrValueVALIGN VALIGN_baseline
+instance AttrValueVALIGN VALIGN_bottom
+instance AttrValueVALIGN VALIGN_middle
+instance AttrValueVALIGN VALIGN_top
+instance AttrValueVALUE Char
+instance AttrValueVALUE Int
+instance AttrValueVALUE a => AttrValueVALUE [a]
+instance AttrValueVALUETYPE VALUETYPE_DATA
+instance AttrValueVALUETYPE VALUETYPE_OBJECT
+instance AttrValueVALUETYPE VALUETYPE_REF
+instance AttrValueVERSION Char
+instance AttrValueVERSION a => AttrValueVERSION [a]
+instance AttrValueVLINK Char
+instance AttrValueVLINK a => AttrValueVLINK [a]
+instance AttrValueVSPACE Char
+instance AttrValueVSPACE a => AttrValueVSPACE [a]
+instance AttrValueWIDTH Char
+instance AttrValueWIDTH Int
+instance AttrValueWIDTH a => AttrValueWIDTH [a]
+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"
+instance Show ALIGN_center where show ALIGN_center = "center"
+instance Show ALIGN_char where show ALIGN_char = "char"
+instance Show ALIGN_justify where show ALIGN_justify = "justify"
+instance Show ALIGN_left where show ALIGN_left = "left"
+instance Show ALIGN_middle where show ALIGN_middle = "middle"
+instance Show ALIGN_right where show ALIGN_right = "right"
+instance Show ALIGN_top where show ALIGN_top = "top"
+instance Show CHECKED_checked where show CHECKED_checked = "checked"
+instance Show CLEAR_all where show CLEAR_all = "all"
+instance Show CLEAR_left where show CLEAR_left = "left"
+instance Show CLEAR_none where show CLEAR_none = "none"
+instance Show CLEAR_right where show CLEAR_right = "right"
+instance Show COMPACT_compact where show COMPACT_compact = "compact"
+instance Show DECLARE_declare where show DECLARE_declare = "declare"
+instance Show DEFER_defer where show DEFER_defer = "defer"
+instance Show DIR_ltr where show DIR_ltr = "ltr"
+instance Show DIR_rtl where show DIR_rtl = "rtl"
+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"
+instance Show FRAME_above where show FRAME_above = "above"
+instance Show FRAME_below where show FRAME_below = "below"
+instance Show FRAME_border where show FRAME_border = "border"
+instance Show FRAME_box where show FRAME_box = "box"
+instance Show FRAME_hsides where show FRAME_hsides = "hsides"
+instance Show FRAME_lhs where show FRAME_lhs = "lhs"
+instance Show FRAME_rhs where show FRAME_rhs = "rhs"
+instance Show FRAME_void where show FRAME_void = "void"
+instance Show FRAME_vsides where show FRAME_vsides = "vsides"
+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"
+instance Show METHOD_GET where show METHOD_GET = "GET"
+instance Show METHOD_POST where show METHOD_POST = "POST"
+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"
+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"
+instance Show NORESIZE_noresize where show NORESIZE_noresize = "noresize"
+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"
+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"
+instance Show READONLY_readonly where show READONLY_readonly = "readonly"
+instance Show RULES_all where show RULES_all = "all"
+instance Show RULES_cols where show RULES_cols = "cols"
+instance Show RULES_groups where show RULES_groups = "groups"
+instance Show RULES_none where show RULES_none = "none"
+instance Show RULES_rows where show RULES_rows = "rows"
+instance Show SCOPE_col where show SCOPE_col = "col"
+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"
+instance Show SCOPE_row where show SCOPE_row = "row"
+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"
+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"
+instance Show SCROLLING_no where show SCROLLING_no = "no"
+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"
+instance Show SELECTED_selected where show SELECTED_selected = "selected"
+instance Show SHAPE_circle where show SHAPE_circle = "circle"
+instance Show SHAPE_default' where show SHAPE_default' = "default"
+instance Show SHAPE_poly where show SHAPE_poly = "poly"
+instance Show SHAPE_rect where show SHAPE_rect = "rect"
+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"
+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"
+instance Show TYPE_FILE where show TYPE_FILE = "FILE"
+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"
+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"
+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"
+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"
+instance Show TYPE_RESET where show TYPE_RESET = "RESET"
+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"
+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"
+instance Show TYPE_button where show TYPE_button = "button"
+instance Show TYPE_circle where show TYPE_circle = "circle"
+instance Show TYPE_disc where show TYPE_disc = "disc"
+instance Show TYPE_reset where show TYPE_reset = "reset"
+instance Show TYPE_square where show TYPE_square = "square"
+instance Show TYPE_submit where show TYPE_submit = "submit"
+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"
+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"
+instance Show VALIGN_middle where show VALIGN_middle = "middle"
+instance Show VALIGN_top where show VALIGN_top = "top"
+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"
+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"
+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"
+instance AdmitAttrABBR TD
+instance AdmitAttrABBR TH
+instance AdmitAttrACCEPT INPUT
+instance AdmitAttrACCEPT_CHARSET FORM
+instance AdmitAttrACCESSKEY A
+instance AdmitAttrACCESSKEY AREA
+instance AdmitAttrACCESSKEY BUTTON
+instance AdmitAttrACCESSKEY INPUT
+instance AdmitAttrACCESSKEY LABEL
+instance AdmitAttrACCESSKEY LEGEND
+instance AdmitAttrACCESSKEY TEXTAREA
+instance AdmitAttrACTION FORM
+instance AdmitAttrALIGN APPLET
+instance AdmitAttrALIGN CAPTION
+instance AdmitAttrALIGN COL
+instance AdmitAttrALIGN COLGROUP
+instance AdmitAttrALIGN DIV
+instance AdmitAttrALIGN H1
+instance AdmitAttrALIGN H2
+instance AdmitAttrALIGN H3
+instance AdmitAttrALIGN H4
+instance AdmitAttrALIGN H5
+instance AdmitAttrALIGN H6
+instance AdmitAttrALIGN HR
+instance AdmitAttrALIGN IFRAME
+instance AdmitAttrALIGN IMG
+instance AdmitAttrALIGN INPUT
+instance AdmitAttrALIGN LEGEND
+instance AdmitAttrALIGN OBJECT
+instance AdmitAttrALIGN P
+instance AdmitAttrALIGN TABLE
+instance AdmitAttrALIGN TBODY
+instance AdmitAttrALIGN TD
+instance AdmitAttrALIGN TFOOT
+instance AdmitAttrALIGN TH
+instance AdmitAttrALIGN THEAD
+instance AdmitAttrALIGN TR
+instance AdmitAttrALINK BODY
+instance AdmitAttrALT APPLET
+instance AdmitAttrALT AREA
+instance AdmitAttrALT IMG
+instance AdmitAttrALT INPUT
+instance AdmitAttrARCHIVE APPLET
+instance AdmitAttrARCHIVE OBJECT
+instance AdmitAttrAXIS TD
+instance AdmitAttrAXIS TH
+instance AdmitAttrBACKGROUND BODY
+instance AdmitAttrBGCOLOR BODY
+instance AdmitAttrBGCOLOR TABLE
+instance AdmitAttrBGCOLOR TD
+instance AdmitAttrBGCOLOR TH
+instance AdmitAttrBGCOLOR TR
+instance AdmitAttrBORDER IMG
+instance AdmitAttrBORDER OBJECT
+instance AdmitAttrBORDER TABLE
+instance AdmitAttrCELLPADDING TABLE
+instance AdmitAttrCELLSPACING TABLE
+instance AdmitAttrCHAR COL
+instance AdmitAttrCHAR COLGROUP
+instance AdmitAttrCHAR TBODY
+instance AdmitAttrCHAR TD
+instance AdmitAttrCHAR TFOOT
+instance AdmitAttrCHAR TH
+instance AdmitAttrCHAR THEAD
+instance AdmitAttrCHAR TR
+instance AdmitAttrCHAROFF COL
+instance AdmitAttrCHAROFF COLGROUP
+instance AdmitAttrCHAROFF TBODY
+instance AdmitAttrCHAROFF TD
+instance AdmitAttrCHAROFF TFOOT
+instance AdmitAttrCHAROFF TH
+instance AdmitAttrCHAROFF THEAD
+instance AdmitAttrCHAROFF TR
+instance AdmitAttrCHARSET A
+instance AdmitAttrCHARSET LINK
+instance AdmitAttrCHARSET SCRIPT
+instance AdmitAttrCHECKED INPUT
+instance AdmitAttrCITE BLOCKQUOTE
+instance AdmitAttrCITE DEL
+instance AdmitAttrCITE INS
+instance AdmitAttrCITE Q
+instance AdmitAttrCLASS A
+instance AdmitAttrCLASS ABBR
+instance AdmitAttrCLASS ACRONYM
+instance AdmitAttrCLASS ADDRESS
+instance AdmitAttrCLASS APPLET
+instance AdmitAttrCLASS AREA
+instance AdmitAttrCLASS B
+instance AdmitAttrCLASS BDO
+instance AdmitAttrCLASS BIG
+instance AdmitAttrCLASS BLOCKQUOTE
+instance AdmitAttrCLASS BODY
+instance AdmitAttrCLASS BR
+instance AdmitAttrCLASS BUTTON
+instance AdmitAttrCLASS CAPTION
+instance AdmitAttrCLASS CENTER
+instance AdmitAttrCLASS CITE
+instance AdmitAttrCLASS CODE
+instance AdmitAttrCLASS COL
+instance AdmitAttrCLASS COLGROUP
+instance AdmitAttrCLASS DD
+instance AdmitAttrCLASS DEL
+instance AdmitAttrCLASS DFN
+instance AdmitAttrCLASS DIR
+instance AdmitAttrCLASS DIV
+instance AdmitAttrCLASS DL
+instance AdmitAttrCLASS DT
+instance AdmitAttrCLASS EM
+instance AdmitAttrCLASS FIELDSET
+instance AdmitAttrCLASS FONT
+instance AdmitAttrCLASS FORM
+instance AdmitAttrCLASS FRAME
+instance AdmitAttrCLASS FRAMESET
+instance AdmitAttrCLASS H1
+instance AdmitAttrCLASS H2
+instance AdmitAttrCLASS H3
+instance AdmitAttrCLASS H4
+instance AdmitAttrCLASS H5
+instance AdmitAttrCLASS H6
+instance AdmitAttrCLASS HR
+instance AdmitAttrCLASS I
+instance AdmitAttrCLASS IFRAME
+instance AdmitAttrCLASS IMG
+instance AdmitAttrCLASS INPUT
+instance AdmitAttrCLASS INS
+instance AdmitAttrCLASS ISINDEX
+instance AdmitAttrCLASS KBD
+instance AdmitAttrCLASS LABEL
+instance AdmitAttrCLASS LEGEND
+instance AdmitAttrCLASS LI
+instance AdmitAttrCLASS LINK
+instance AdmitAttrCLASS MAP
+instance AdmitAttrCLASS MENU
+instance AdmitAttrCLASS NOFRAMES
+instance AdmitAttrCLASS NOSCRIPT
+instance AdmitAttrCLASS OBJECT
+instance AdmitAttrCLASS OL
+instance AdmitAttrCLASS OPTGROUP
+instance AdmitAttrCLASS OPTION
+instance AdmitAttrCLASS P
+instance AdmitAttrCLASS PRE
+instance AdmitAttrCLASS Q
+instance AdmitAttrCLASS S
+instance AdmitAttrCLASS SAMP
+instance AdmitAttrCLASS SELECT
+instance AdmitAttrCLASS SMALL
+instance AdmitAttrCLASS SPAN
+instance AdmitAttrCLASS STRIKE
+instance AdmitAttrCLASS STRONG
+instance AdmitAttrCLASS SUB
+instance AdmitAttrCLASS SUP
+instance AdmitAttrCLASS TABLE
+instance AdmitAttrCLASS TBODY
+instance AdmitAttrCLASS TD
+instance AdmitAttrCLASS TEXTAREA
+instance AdmitAttrCLASS TFOOT
+instance AdmitAttrCLASS TH
+instance AdmitAttrCLASS THEAD
+instance AdmitAttrCLASS TR
+instance AdmitAttrCLASS TT
+instance AdmitAttrCLASS U
+instance AdmitAttrCLASS UL
+instance AdmitAttrCLASS VAR
+instance AdmitAttrCLASSID OBJECT
+instance AdmitAttrCLEAR BR
+instance AdmitAttrCODE APPLET
+instance AdmitAttrCODEBASE APPLET
+instance AdmitAttrCODEBASE OBJECT
+instance AdmitAttrCODETYPE OBJECT
+instance AdmitAttrCOLOR BASEFONT
+instance AdmitAttrCOLOR FONT
+instance AdmitAttrCOLS FRAMESET
+instance AdmitAttrCOLS TEXTAREA
+instance AdmitAttrCOLSPAN TD
+instance AdmitAttrCOLSPAN TH
+instance AdmitAttrCOMPACT DIR
+instance AdmitAttrCOMPACT DL
+instance AdmitAttrCOMPACT MENU
+instance AdmitAttrCOMPACT OL
+instance AdmitAttrCOMPACT UL
+instance AdmitAttrCONTENT META
+instance AdmitAttrCOORDS A
+instance AdmitAttrCOORDS AREA
+instance AdmitAttrDATA OBJECT
+instance AdmitAttrDATAPAGESIZE TABLE
+instance AdmitAttrDATETIME DEL
+instance AdmitAttrDATETIME INS
+instance AdmitAttrDECLARE OBJECT
+instance AdmitAttrDEFER SCRIPT
+instance AdmitAttrDIR A
+instance AdmitAttrDIR ABBR
+instance AdmitAttrDIR ACRONYM
+instance AdmitAttrDIR ADDRESS
+instance AdmitAttrDIR AREA
+instance AdmitAttrDIR B
+instance AdmitAttrDIR BDO
+instance AdmitAttrDIR BIG
+instance AdmitAttrDIR BLOCKQUOTE
+instance AdmitAttrDIR BODY
+instance AdmitAttrDIR BUTTON
+instance AdmitAttrDIR CAPTION
+instance AdmitAttrDIR CENTER
+instance AdmitAttrDIR CITE
+instance AdmitAttrDIR CODE
+instance AdmitAttrDIR COL
+instance AdmitAttrDIR COLGROUP
+instance AdmitAttrDIR DD
+instance AdmitAttrDIR DEL
+instance AdmitAttrDIR DFN
+instance AdmitAttrDIR DIR
+instance AdmitAttrDIR DIV
+instance AdmitAttrDIR DL
+instance AdmitAttrDIR DT
+instance AdmitAttrDIR EM
+instance AdmitAttrDIR FIELDSET
+instance AdmitAttrDIR FONT
+instance AdmitAttrDIR FORM
+instance AdmitAttrDIR H1
+instance AdmitAttrDIR H2
+instance AdmitAttrDIR H3
+instance AdmitAttrDIR H4
+instance AdmitAttrDIR H5
+instance AdmitAttrDIR H6
+instance AdmitAttrDIR HEAD
+instance AdmitAttrDIR HR
+instance AdmitAttrDIR HTML
+instance AdmitAttrDIR I
+instance AdmitAttrDIR IMG
+instance AdmitAttrDIR INPUT
+instance AdmitAttrDIR INS
+instance AdmitAttrDIR ISINDEX
+instance AdmitAttrDIR KBD
+instance AdmitAttrDIR LABEL
+instance AdmitAttrDIR LEGEND
+instance AdmitAttrDIR LI
+instance AdmitAttrDIR LINK
+instance AdmitAttrDIR MAP
+instance AdmitAttrDIR MENU
+instance AdmitAttrDIR META
+instance AdmitAttrDIR NOFRAMES
+instance AdmitAttrDIR NOSCRIPT
+instance AdmitAttrDIR OBJECT
+instance AdmitAttrDIR OL
+instance AdmitAttrDIR OPTGROUP
+instance AdmitAttrDIR OPTION
+instance AdmitAttrDIR P
+instance AdmitAttrDIR PRE
+instance AdmitAttrDIR Q
+instance AdmitAttrDIR S
+instance AdmitAttrDIR SAMP
+instance AdmitAttrDIR SELECT
+instance AdmitAttrDIR SMALL
+instance AdmitAttrDIR SPAN
+instance AdmitAttrDIR STRIKE
+instance AdmitAttrDIR STRONG
+instance AdmitAttrDIR STYLE
+instance AdmitAttrDIR SUB
+instance AdmitAttrDIR SUP
+instance AdmitAttrDIR TABLE
+instance AdmitAttrDIR TBODY
+instance AdmitAttrDIR TD
+instance AdmitAttrDIR TEXTAREA
+instance AdmitAttrDIR TFOOT
+instance AdmitAttrDIR TH
+instance AdmitAttrDIR THEAD
+instance AdmitAttrDIR TITLE
+instance AdmitAttrDIR TR
+instance AdmitAttrDIR TT
+instance AdmitAttrDIR U
+instance AdmitAttrDIR UL
+instance AdmitAttrDIR VAR
+instance AdmitAttrDISABLED BUTTON
+instance AdmitAttrDISABLED INPUT
+instance AdmitAttrDISABLED OPTGROUP
+instance AdmitAttrDISABLED OPTION
+instance AdmitAttrDISABLED SELECT
+instance AdmitAttrDISABLED TEXTAREA
+instance AdmitAttrENCTYPE FORM
+instance AdmitAttrEVENT SCRIPT
+instance AdmitAttrFACE BASEFONT
+instance AdmitAttrFACE FONT
+instance AdmitAttrFOR LABEL
+instance AdmitAttrFOR SCRIPT
+instance AdmitAttrFRAME TABLE
+instance AdmitAttrFRAMEBORDER FRAME
+instance AdmitAttrFRAMEBORDER IFRAME
+instance AdmitAttrHEADERS TD
+instance AdmitAttrHEADERS TH
+instance AdmitAttrHEIGHT APPLET
+instance AdmitAttrHEIGHT IFRAME
+instance AdmitAttrHEIGHT IMG
+instance AdmitAttrHEIGHT OBJECT
+instance AdmitAttrHEIGHT TD
+instance AdmitAttrHEIGHT TH
+instance AdmitAttrHREF A
+instance AdmitAttrHREF AREA
+instance AdmitAttrHREF BASE
+instance AdmitAttrHREF LINK
+instance AdmitAttrHREFLANG A
+instance AdmitAttrHREFLANG LINK
+instance AdmitAttrHSPACE APPLET
+instance AdmitAttrHSPACE IMG
+instance AdmitAttrHSPACE OBJECT
+instance AdmitAttrHTTP_EQUIV META
+instance AdmitAttrID A
+instance AdmitAttrID ABBR
+instance AdmitAttrID ACRONYM
+instance AdmitAttrID ADDRESS
+instance AdmitAttrID APPLET
+instance AdmitAttrID AREA
+instance AdmitAttrID B
+instance AdmitAttrID BASEFONT
+instance AdmitAttrID BDO
+instance AdmitAttrID BIG
+instance AdmitAttrID BLOCKQUOTE
+instance AdmitAttrID BODY
+instance AdmitAttrID BR
+instance AdmitAttrID BUTTON
+instance AdmitAttrID CAPTION
+instance AdmitAttrID CENTER
+instance AdmitAttrID CITE
+instance AdmitAttrID CODE
+instance AdmitAttrID COL
+instance AdmitAttrID COLGROUP
+instance AdmitAttrID DD
+instance AdmitAttrID DEL
+instance AdmitAttrID DFN
+instance AdmitAttrID DIR
+instance AdmitAttrID DIV
+instance AdmitAttrID DL
+instance AdmitAttrID DT
+instance AdmitAttrID EM
+instance AdmitAttrID FIELDSET
+instance AdmitAttrID FONT
+instance AdmitAttrID FORM
+instance AdmitAttrID FRAME
+instance AdmitAttrID FRAMESET
+instance AdmitAttrID H1
+instance AdmitAttrID H2
+instance AdmitAttrID H3
+instance AdmitAttrID H4
+instance AdmitAttrID H5
+instance AdmitAttrID H6
+instance AdmitAttrID HR
+instance AdmitAttrID I
+instance AdmitAttrID IFRAME
+instance AdmitAttrID IMG
+instance AdmitAttrID INPUT
+instance AdmitAttrID INS
+instance AdmitAttrID ISINDEX
+instance AdmitAttrID KBD
+instance AdmitAttrID LABEL
+instance AdmitAttrID LEGEND
+instance AdmitAttrID LI
+instance AdmitAttrID LINK
+instance AdmitAttrID MAP
+instance AdmitAttrID MENU
+instance AdmitAttrID NOFRAMES
+instance AdmitAttrID NOSCRIPT
+instance AdmitAttrID OBJECT
+instance AdmitAttrID OL
+instance AdmitAttrID OPTGROUP
+instance AdmitAttrID OPTION
+instance AdmitAttrID P
+instance AdmitAttrID PARAM
+instance AdmitAttrID PRE
+instance AdmitAttrID Q
+instance AdmitAttrID S
+instance AdmitAttrID SAMP
+instance AdmitAttrID SELECT
+instance AdmitAttrID SMALL
+instance AdmitAttrID SPAN
+instance AdmitAttrID STRIKE
+instance AdmitAttrID STRONG
+instance AdmitAttrID SUB
+instance AdmitAttrID SUP
+instance AdmitAttrID TABLE
+instance AdmitAttrID TBODY
+instance AdmitAttrID TD
+instance AdmitAttrID TEXTAREA
+instance AdmitAttrID TFOOT
+instance AdmitAttrID TH
+instance AdmitAttrID THEAD
+instance AdmitAttrID TR
+instance AdmitAttrID TT
+instance AdmitAttrID U
+instance AdmitAttrID UL
+instance AdmitAttrID VAR
+instance AdmitAttrISMAP IMG
+instance AdmitAttrISMAP INPUT
+instance AdmitAttrLABEL OPTGROUP
+instance AdmitAttrLABEL OPTION
+instance AdmitAttrLANG A
+instance AdmitAttrLANG ABBR
+instance AdmitAttrLANG ACRONYM
+instance AdmitAttrLANG ADDRESS
+instance AdmitAttrLANG AREA
+instance AdmitAttrLANG B
+instance AdmitAttrLANG BDO
+instance AdmitAttrLANG BIG
+instance AdmitAttrLANG BLOCKQUOTE
+instance AdmitAttrLANG BODY
+instance AdmitAttrLANG BUTTON
+instance AdmitAttrLANG CAPTION
+instance AdmitAttrLANG CENTER
+instance AdmitAttrLANG CITE
+instance AdmitAttrLANG CODE
+instance AdmitAttrLANG COL
+instance AdmitAttrLANG COLGROUP
+instance AdmitAttrLANG DD
+instance AdmitAttrLANG DEL
+instance AdmitAttrLANG DFN
+instance AdmitAttrLANG DIR
+instance AdmitAttrLANG DIV
+instance AdmitAttrLANG DL
+instance AdmitAttrLANG DT
+instance AdmitAttrLANG EM
+instance AdmitAttrLANG FIELDSET
+instance AdmitAttrLANG FONT
+instance AdmitAttrLANG FORM
+instance AdmitAttrLANG H1
+instance AdmitAttrLANG H2
+instance AdmitAttrLANG H3
+instance AdmitAttrLANG H4
+instance AdmitAttrLANG H5
+instance AdmitAttrLANG H6
+instance AdmitAttrLANG HEAD
+instance AdmitAttrLANG HR
+instance AdmitAttrLANG HTML
+instance AdmitAttrLANG I
+instance AdmitAttrLANG IMG
+instance AdmitAttrLANG INPUT
+instance AdmitAttrLANG INS
+instance AdmitAttrLANG ISINDEX
+instance AdmitAttrLANG KBD
+instance AdmitAttrLANG LABEL
+instance AdmitAttrLANG LEGEND
+instance AdmitAttrLANG LI
+instance AdmitAttrLANG LINK
+instance AdmitAttrLANG MAP
+instance AdmitAttrLANG MENU
+instance AdmitAttrLANG META
+instance AdmitAttrLANG NOFRAMES
+instance AdmitAttrLANG NOSCRIPT
+instance AdmitAttrLANG OBJECT
+instance AdmitAttrLANG OL
+instance AdmitAttrLANG OPTGROUP
+instance AdmitAttrLANG OPTION
+instance AdmitAttrLANG P
+instance AdmitAttrLANG PRE
+instance AdmitAttrLANG Q
+instance AdmitAttrLANG S
+instance AdmitAttrLANG SAMP
+instance AdmitAttrLANG SELECT
+instance AdmitAttrLANG SMALL
+instance AdmitAttrLANG SPAN
+instance AdmitAttrLANG STRIKE
+instance AdmitAttrLANG STRONG
+instance AdmitAttrLANG STYLE
+instance AdmitAttrLANG SUB
+instance AdmitAttrLANG SUP
+instance AdmitAttrLANG TABLE
+instance AdmitAttrLANG TBODY
+instance AdmitAttrLANG TD
+instance AdmitAttrLANG TEXTAREA
+instance AdmitAttrLANG TFOOT
+instance AdmitAttrLANG TH
+instance AdmitAttrLANG THEAD
+instance AdmitAttrLANG TITLE
+instance AdmitAttrLANG TR
+instance AdmitAttrLANG TT
+instance AdmitAttrLANG U
+instance AdmitAttrLANG UL
+instance AdmitAttrLANG VAR
+instance AdmitAttrLANGUAGE SCRIPT
+instance AdmitAttrLINK BODY
+instance AdmitAttrLONGDESC FRAME
+instance AdmitAttrLONGDESC IFRAME
+instance AdmitAttrLONGDESC IMG
+instance AdmitAttrMARGINHEIGHT FRAME
+instance AdmitAttrMARGINHEIGHT IFRAME
+instance AdmitAttrMARGINWIDTH FRAME
+instance AdmitAttrMARGINWIDTH IFRAME
+instance AdmitAttrMAXLENGTH INPUT
+instance AdmitAttrMEDIA LINK
+instance AdmitAttrMEDIA STYLE
+instance AdmitAttrMETHOD FORM
+instance AdmitAttrMULTIPLE SELECT
+instance AdmitAttrNAME A
+instance AdmitAttrNAME APPLET
+instance AdmitAttrNAME BUTTON
+instance AdmitAttrNAME FORM
+instance AdmitAttrNAME FRAME
+instance AdmitAttrNAME IFRAME
+instance AdmitAttrNAME IMG
+instance AdmitAttrNAME INPUT
+instance AdmitAttrNAME MAP
+instance AdmitAttrNAME META
+instance AdmitAttrNAME OBJECT
+instance AdmitAttrNAME PARAM
+instance AdmitAttrNAME SELECT
+instance AdmitAttrNAME TEXTAREA
+instance AdmitAttrNOHREF AREA
+instance AdmitAttrNORESIZE FRAME
+instance AdmitAttrNOSHADE HR
+instance AdmitAttrNOWRAP TD
+instance AdmitAttrNOWRAP TH
+instance AdmitAttrOBJECT APPLET
+instance AdmitAttrONBLUR A
+instance AdmitAttrONBLUR AREA
+instance AdmitAttrONBLUR BUTTON
+instance AdmitAttrONBLUR INPUT
+instance AdmitAttrONBLUR LABEL
+instance AdmitAttrONBLUR SELECT
+instance AdmitAttrONBLUR TEXTAREA
+instance AdmitAttrONCHANGE INPUT
+instance AdmitAttrONCHANGE SELECT
+instance AdmitAttrONCHANGE TEXTAREA
+instance AdmitAttrONCLICK A
+instance AdmitAttrONCLICK ABBR
+instance AdmitAttrONCLICK ACRONYM
+instance AdmitAttrONCLICK ADDRESS
+instance AdmitAttrONCLICK AREA
+instance AdmitAttrONCLICK B
+instance AdmitAttrONCLICK BIG
+instance AdmitAttrONCLICK BLOCKQUOTE
+instance AdmitAttrONCLICK BODY
+instance AdmitAttrONCLICK BUTTON
+instance AdmitAttrONCLICK CAPTION
+instance AdmitAttrONCLICK CENTER
+instance AdmitAttrONCLICK CITE
+instance AdmitAttrONCLICK CODE
+instance AdmitAttrONCLICK COL
+instance AdmitAttrONCLICK COLGROUP
+instance AdmitAttrONCLICK DD
+instance AdmitAttrONCLICK DEL
+instance AdmitAttrONCLICK DFN
+instance AdmitAttrONCLICK DIR
+instance AdmitAttrONCLICK DIV
+instance AdmitAttrONCLICK DL
+instance AdmitAttrONCLICK DT
+instance AdmitAttrONCLICK EM
+instance AdmitAttrONCLICK FIELDSET
+instance AdmitAttrONCLICK FORM
+instance AdmitAttrONCLICK H1
+instance AdmitAttrONCLICK H2
+instance AdmitAttrONCLICK H3
+instance AdmitAttrONCLICK H4
+instance AdmitAttrONCLICK H5
+instance AdmitAttrONCLICK H6
+instance AdmitAttrONCLICK HR
+instance AdmitAttrONCLICK I
+instance AdmitAttrONCLICK IMG
+instance AdmitAttrONCLICK INPUT
+instance AdmitAttrONCLICK INS
+instance AdmitAttrONCLICK KBD
+instance AdmitAttrONCLICK LABEL
+instance AdmitAttrONCLICK LEGEND
+instance AdmitAttrONCLICK LI
+instance AdmitAttrONCLICK LINK
+instance AdmitAttrONCLICK MAP
+instance AdmitAttrONCLICK MENU
+instance AdmitAttrONCLICK NOFRAMES
+instance AdmitAttrONCLICK NOSCRIPT
+instance AdmitAttrONCLICK OBJECT
+instance AdmitAttrONCLICK OL
+instance AdmitAttrONCLICK OPTGROUP
+instance AdmitAttrONCLICK OPTION
+instance AdmitAttrONCLICK P
+instance AdmitAttrONCLICK PRE
+instance AdmitAttrONCLICK Q
+instance AdmitAttrONCLICK S
+instance AdmitAttrONCLICK SAMP
+instance AdmitAttrONCLICK SELECT
+instance AdmitAttrONCLICK SMALL
+instance AdmitAttrONCLICK SPAN
+instance AdmitAttrONCLICK STRIKE
+instance AdmitAttrONCLICK STRONG
+instance AdmitAttrONCLICK SUB
+instance AdmitAttrONCLICK SUP
+instance AdmitAttrONCLICK TABLE
+instance AdmitAttrONCLICK TBODY
+instance AdmitAttrONCLICK TD
+instance AdmitAttrONCLICK TEXTAREA
+instance AdmitAttrONCLICK TFOOT
+instance AdmitAttrONCLICK TH
+instance AdmitAttrONCLICK THEAD
+instance AdmitAttrONCLICK TR
+instance AdmitAttrONCLICK TT
+instance AdmitAttrONCLICK U
+instance AdmitAttrONCLICK UL
+instance AdmitAttrONCLICK VAR
+instance AdmitAttrONDBLCLICK A
+instance AdmitAttrONDBLCLICK ABBR
+instance AdmitAttrONDBLCLICK ACRONYM
+instance AdmitAttrONDBLCLICK ADDRESS
+instance AdmitAttrONDBLCLICK AREA
+instance AdmitAttrONDBLCLICK B
+instance AdmitAttrONDBLCLICK BIG
+instance AdmitAttrONDBLCLICK BLOCKQUOTE
+instance AdmitAttrONDBLCLICK BODY
+instance AdmitAttrONDBLCLICK BUTTON
+instance AdmitAttrONDBLCLICK CAPTION
+instance AdmitAttrONDBLCLICK CENTER
+instance AdmitAttrONDBLCLICK CITE
+instance AdmitAttrONDBLCLICK CODE
+instance AdmitAttrONDBLCLICK COL
+instance AdmitAttrONDBLCLICK COLGROUP
+instance AdmitAttrONDBLCLICK DD
+instance AdmitAttrONDBLCLICK DEL
+instance AdmitAttrONDBLCLICK DFN
+instance AdmitAttrONDBLCLICK DIR
+instance AdmitAttrONDBLCLICK DIV
+instance AdmitAttrONDBLCLICK DL
+instance AdmitAttrONDBLCLICK DT
+instance AdmitAttrONDBLCLICK EM
+instance AdmitAttrONDBLCLICK FIELDSET
+instance AdmitAttrONDBLCLICK FORM
+instance AdmitAttrONDBLCLICK H1
+instance AdmitAttrONDBLCLICK H2
+instance AdmitAttrONDBLCLICK H3
+instance AdmitAttrONDBLCLICK H4
+instance AdmitAttrONDBLCLICK H5
+instance AdmitAttrONDBLCLICK H6
+instance AdmitAttrONDBLCLICK HR
+instance AdmitAttrONDBLCLICK I
+instance AdmitAttrONDBLCLICK IMG
+instance AdmitAttrONDBLCLICK INPUT
+instance AdmitAttrONDBLCLICK INS
+instance AdmitAttrONDBLCLICK KBD
+instance AdmitAttrONDBLCLICK LABEL
+instance AdmitAttrONDBLCLICK LEGEND
+instance AdmitAttrONDBLCLICK LI
+instance AdmitAttrONDBLCLICK LINK
+instance AdmitAttrONDBLCLICK MAP
+instance AdmitAttrONDBLCLICK MENU
+instance AdmitAttrONDBLCLICK NOFRAMES
+instance AdmitAttrONDBLCLICK NOSCRIPT
+instance AdmitAttrONDBLCLICK OBJECT
+instance AdmitAttrONDBLCLICK OL
+instance AdmitAttrONDBLCLICK OPTGROUP
+instance AdmitAttrONDBLCLICK OPTION
+instance AdmitAttrONDBLCLICK P
+instance AdmitAttrONDBLCLICK PRE
+instance AdmitAttrONDBLCLICK Q
+instance AdmitAttrONDBLCLICK S
+instance AdmitAttrONDBLCLICK SAMP
+instance AdmitAttrONDBLCLICK SELECT
+instance AdmitAttrONDBLCLICK SMALL
+instance AdmitAttrONDBLCLICK SPAN
+instance AdmitAttrONDBLCLICK STRIKE
+instance AdmitAttrONDBLCLICK STRONG
+instance AdmitAttrONDBLCLICK SUB
+instance AdmitAttrONDBLCLICK SUP
+instance AdmitAttrONDBLCLICK TABLE
+instance AdmitAttrONDBLCLICK TBODY
+instance AdmitAttrONDBLCLICK TD
+instance AdmitAttrONDBLCLICK TEXTAREA
+instance AdmitAttrONDBLCLICK TFOOT
+instance AdmitAttrONDBLCLICK TH
+instance AdmitAttrONDBLCLICK THEAD
+instance AdmitAttrONDBLCLICK TR
+instance AdmitAttrONDBLCLICK TT
+instance AdmitAttrONDBLCLICK U
+instance AdmitAttrONDBLCLICK UL
+instance AdmitAttrONDBLCLICK VAR
+instance AdmitAttrONFOCUS A
+instance AdmitAttrONFOCUS AREA
+instance AdmitAttrONFOCUS BUTTON
+instance AdmitAttrONFOCUS INPUT
+instance AdmitAttrONFOCUS LABEL
+instance AdmitAttrONFOCUS SELECT
+instance AdmitAttrONFOCUS TEXTAREA
+instance AdmitAttrONKEYDOWN A
+instance AdmitAttrONKEYDOWN ABBR
+instance AdmitAttrONKEYDOWN ACRONYM
+instance AdmitAttrONKEYDOWN ADDRESS
+instance AdmitAttrONKEYDOWN AREA
+instance AdmitAttrONKEYDOWN B
+instance AdmitAttrONKEYDOWN BIG
+instance AdmitAttrONKEYDOWN BLOCKQUOTE
+instance AdmitAttrONKEYDOWN BODY
+instance AdmitAttrONKEYDOWN BUTTON
+instance AdmitAttrONKEYDOWN CAPTION
+instance AdmitAttrONKEYDOWN CENTER
+instance AdmitAttrONKEYDOWN CITE
+instance AdmitAttrONKEYDOWN CODE
+instance AdmitAttrONKEYDOWN COL
+instance AdmitAttrONKEYDOWN COLGROUP
+instance AdmitAttrONKEYDOWN DD
+instance AdmitAttrONKEYDOWN DEL
+instance AdmitAttrONKEYDOWN DFN
+instance AdmitAttrONKEYDOWN DIR
+instance AdmitAttrONKEYDOWN DIV
+instance AdmitAttrONKEYDOWN DL
+instance AdmitAttrONKEYDOWN DT
+instance AdmitAttrONKEYDOWN EM
+instance AdmitAttrONKEYDOWN FIELDSET
+instance AdmitAttrONKEYDOWN FORM
+instance AdmitAttrONKEYDOWN H1
+instance AdmitAttrONKEYDOWN H2
+instance AdmitAttrONKEYDOWN H3
+instance AdmitAttrONKEYDOWN H4
+instance AdmitAttrONKEYDOWN H5
+instance AdmitAttrONKEYDOWN H6
+instance AdmitAttrONKEYDOWN HR
+instance AdmitAttrONKEYDOWN I
+instance AdmitAttrONKEYDOWN IMG
+instance AdmitAttrONKEYDOWN INPUT
+instance AdmitAttrONKEYDOWN INS
+instance AdmitAttrONKEYDOWN KBD
+instance AdmitAttrONKEYDOWN LABEL
+instance AdmitAttrONKEYDOWN LEGEND
+instance AdmitAttrONKEYDOWN LI
+instance AdmitAttrONKEYDOWN LINK
+instance AdmitAttrONKEYDOWN MAP
+instance AdmitAttrONKEYDOWN MENU
+instance AdmitAttrONKEYDOWN NOFRAMES
+instance AdmitAttrONKEYDOWN NOSCRIPT
+instance AdmitAttrONKEYDOWN OBJECT
+instance AdmitAttrONKEYDOWN OL
+instance AdmitAttrONKEYDOWN OPTGROUP
+instance AdmitAttrONKEYDOWN OPTION
+instance AdmitAttrONKEYDOWN P
+instance AdmitAttrONKEYDOWN PRE
+instance AdmitAttrONKEYDOWN Q
+instance AdmitAttrONKEYDOWN S
+instance AdmitAttrONKEYDOWN SAMP
+instance AdmitAttrONKEYDOWN SELECT
+instance AdmitAttrONKEYDOWN SMALL
+instance AdmitAttrONKEYDOWN SPAN
+instance AdmitAttrONKEYDOWN STRIKE
+instance AdmitAttrONKEYDOWN STRONG
+instance AdmitAttrONKEYDOWN SUB
+instance AdmitAttrONKEYDOWN SUP
+instance AdmitAttrONKEYDOWN TABLE
+instance AdmitAttrONKEYDOWN TBODY
+instance AdmitAttrONKEYDOWN TD
+instance AdmitAttrONKEYDOWN TEXTAREA
+instance AdmitAttrONKEYDOWN TFOOT
+instance AdmitAttrONKEYDOWN TH
+instance AdmitAttrONKEYDOWN THEAD
+instance AdmitAttrONKEYDOWN TR
+instance AdmitAttrONKEYDOWN TT
+instance AdmitAttrONKEYDOWN U
+instance AdmitAttrONKEYDOWN UL
+instance AdmitAttrONKEYDOWN VAR
+instance AdmitAttrONKEYPRESS A
+instance AdmitAttrONKEYPRESS ABBR
+instance AdmitAttrONKEYPRESS ACRONYM
+instance AdmitAttrONKEYPRESS ADDRESS
+instance AdmitAttrONKEYPRESS AREA
+instance AdmitAttrONKEYPRESS B
+instance AdmitAttrONKEYPRESS BIG
+instance AdmitAttrONKEYPRESS BLOCKQUOTE
+instance AdmitAttrONKEYPRESS BODY
+instance AdmitAttrONKEYPRESS BUTTON
+instance AdmitAttrONKEYPRESS CAPTION
+instance AdmitAttrONKEYPRESS CENTER
+instance AdmitAttrONKEYPRESS CITE
+instance AdmitAttrONKEYPRESS CODE
+instance AdmitAttrONKEYPRESS COL
+instance AdmitAttrONKEYPRESS COLGROUP
+instance AdmitAttrONKEYPRESS DD
+instance AdmitAttrONKEYPRESS DEL
+instance AdmitAttrONKEYPRESS DFN
+instance AdmitAttrONKEYPRESS DIR
+instance AdmitAttrONKEYPRESS DIV
+instance AdmitAttrONKEYPRESS DL
+instance AdmitAttrONKEYPRESS DT
+instance AdmitAttrONKEYPRESS EM
+instance AdmitAttrONKEYPRESS FIELDSET
+instance AdmitAttrONKEYPRESS FORM
+instance AdmitAttrONKEYPRESS H1
+instance AdmitAttrONKEYPRESS H2
+instance AdmitAttrONKEYPRESS H3
+instance AdmitAttrONKEYPRESS H4
+instance AdmitAttrONKEYPRESS H5
+instance AdmitAttrONKEYPRESS H6
+instance AdmitAttrONKEYPRESS HR
+instance AdmitAttrONKEYPRESS I
+instance AdmitAttrONKEYPRESS IMG
+instance AdmitAttrONKEYPRESS INPUT
+instance AdmitAttrONKEYPRESS INS
+instance AdmitAttrONKEYPRESS KBD
+instance AdmitAttrONKEYPRESS LABEL
+instance AdmitAttrONKEYPRESS LEGEND
+instance AdmitAttrONKEYPRESS LI
+instance AdmitAttrONKEYPRESS LINK
+instance AdmitAttrONKEYPRESS MAP
+instance AdmitAttrONKEYPRESS MENU
+instance AdmitAttrONKEYPRESS NOFRAMES
+instance AdmitAttrONKEYPRESS NOSCRIPT
+instance AdmitAttrONKEYPRESS OBJECT
+instance AdmitAttrONKEYPRESS OL
+instance AdmitAttrONKEYPRESS OPTGROUP
+instance AdmitAttrONKEYPRESS OPTION
+instance AdmitAttrONKEYPRESS P
+instance AdmitAttrONKEYPRESS PRE
+instance AdmitAttrONKEYPRESS Q
+instance AdmitAttrONKEYPRESS S
+instance AdmitAttrONKEYPRESS SAMP
+instance AdmitAttrONKEYPRESS SELECT
+instance AdmitAttrONKEYPRESS SMALL
+instance AdmitAttrONKEYPRESS SPAN
+instance AdmitAttrONKEYPRESS STRIKE
+instance AdmitAttrONKEYPRESS STRONG
+instance AdmitAttrONKEYPRESS SUB
+instance AdmitAttrONKEYPRESS SUP
+instance AdmitAttrONKEYPRESS TABLE
+instance AdmitAttrONKEYPRESS TBODY
+instance AdmitAttrONKEYPRESS TD
+instance AdmitAttrONKEYPRESS TEXTAREA
+instance AdmitAttrONKEYPRESS TFOOT
+instance AdmitAttrONKEYPRESS TH
+instance AdmitAttrONKEYPRESS THEAD
+instance AdmitAttrONKEYPRESS TR
+instance AdmitAttrONKEYPRESS TT
+instance AdmitAttrONKEYPRESS U
+instance AdmitAttrONKEYPRESS UL
+instance AdmitAttrONKEYPRESS VAR
+instance AdmitAttrONKEYUP A
+instance AdmitAttrONKEYUP ABBR
+instance AdmitAttrONKEYUP ACRONYM
+instance AdmitAttrONKEYUP ADDRESS
+instance AdmitAttrONKEYUP AREA
+instance AdmitAttrONKEYUP B
+instance AdmitAttrONKEYUP BIG
+instance AdmitAttrONKEYUP BLOCKQUOTE
+instance AdmitAttrONKEYUP BODY
+instance AdmitAttrONKEYUP BUTTON
+instance AdmitAttrONKEYUP CAPTION
+instance AdmitAttrONKEYUP CENTER
+instance AdmitAttrONKEYUP CITE
+instance AdmitAttrONKEYUP CODE
+instance AdmitAttrONKEYUP COL
+instance AdmitAttrONKEYUP COLGROUP
+instance AdmitAttrONKEYUP DD
+instance AdmitAttrONKEYUP DEL
+instance AdmitAttrONKEYUP DFN
+instance AdmitAttrONKEYUP DIR
+instance AdmitAttrONKEYUP DIV
+instance AdmitAttrONKEYUP DL
+instance AdmitAttrONKEYUP DT
+instance AdmitAttrONKEYUP EM
+instance AdmitAttrONKEYUP FIELDSET
+instance AdmitAttrONKEYUP FORM
+instance AdmitAttrONKEYUP H1
+instance AdmitAttrONKEYUP H2
+instance AdmitAttrONKEYUP H3
+instance AdmitAttrONKEYUP H4
+instance AdmitAttrONKEYUP H5
+instance AdmitAttrONKEYUP H6
+instance AdmitAttrONKEYUP HR
+instance AdmitAttrONKEYUP I
+instance AdmitAttrONKEYUP IMG
+instance AdmitAttrONKEYUP INPUT
+instance AdmitAttrONKEYUP INS
+instance AdmitAttrONKEYUP KBD
+instance AdmitAttrONKEYUP LABEL
+instance AdmitAttrONKEYUP LEGEND
+instance AdmitAttrONKEYUP LI
+instance AdmitAttrONKEYUP LINK
+instance AdmitAttrONKEYUP MAP
+instance AdmitAttrONKEYUP MENU
+instance AdmitAttrONKEYUP NOFRAMES
+instance AdmitAttrONKEYUP NOSCRIPT
+instance AdmitAttrONKEYUP OBJECT
+instance AdmitAttrONKEYUP OL
+instance AdmitAttrONKEYUP OPTGROUP
+instance AdmitAttrONKEYUP OPTION
+instance AdmitAttrONKEYUP P
+instance AdmitAttrONKEYUP PRE
+instance AdmitAttrONKEYUP Q
+instance AdmitAttrONKEYUP S
+instance AdmitAttrONKEYUP SAMP
+instance AdmitAttrONKEYUP SELECT
+instance AdmitAttrONKEYUP SMALL
+instance AdmitAttrONKEYUP SPAN
+instance AdmitAttrONKEYUP STRIKE
+instance AdmitAttrONKEYUP STRONG
+instance AdmitAttrONKEYUP SUB
+instance AdmitAttrONKEYUP SUP
+instance AdmitAttrONKEYUP TABLE
+instance AdmitAttrONKEYUP TBODY
+instance AdmitAttrONKEYUP TD
+instance AdmitAttrONKEYUP TEXTAREA
+instance AdmitAttrONKEYUP TFOOT
+instance AdmitAttrONKEYUP TH
+instance AdmitAttrONKEYUP THEAD
+instance AdmitAttrONKEYUP TR
+instance AdmitAttrONKEYUP TT
+instance AdmitAttrONKEYUP U
+instance AdmitAttrONKEYUP UL
+instance AdmitAttrONKEYUP VAR
+instance AdmitAttrONLOAD BODY
+instance AdmitAttrONLOAD FRAMESET
+instance AdmitAttrONMOUSEDOWN A
+instance AdmitAttrONMOUSEDOWN ABBR
+instance AdmitAttrONMOUSEDOWN ACRONYM
+instance AdmitAttrONMOUSEDOWN ADDRESS
+instance AdmitAttrONMOUSEDOWN AREA
+instance AdmitAttrONMOUSEDOWN B
+instance AdmitAttrONMOUSEDOWN BIG
+instance AdmitAttrONMOUSEDOWN BLOCKQUOTE
+instance AdmitAttrONMOUSEDOWN BODY
+instance AdmitAttrONMOUSEDOWN BUTTON
+instance AdmitAttrONMOUSEDOWN CAPTION
+instance AdmitAttrONMOUSEDOWN CENTER
+instance AdmitAttrONMOUSEDOWN CITE
+instance AdmitAttrONMOUSEDOWN CODE
+instance AdmitAttrONMOUSEDOWN COL
+instance AdmitAttrONMOUSEDOWN COLGROUP
+instance AdmitAttrONMOUSEDOWN DD
+instance AdmitAttrONMOUSEDOWN DEL
+instance AdmitAttrONMOUSEDOWN DFN
+instance AdmitAttrONMOUSEDOWN DIR
+instance AdmitAttrONMOUSEDOWN DIV
+instance AdmitAttrONMOUSEDOWN DL
+instance AdmitAttrONMOUSEDOWN DT
+instance AdmitAttrONMOUSEDOWN EM
+instance AdmitAttrONMOUSEDOWN FIELDSET
+instance AdmitAttrONMOUSEDOWN FORM
+instance AdmitAttrONMOUSEDOWN H1
+instance AdmitAttrONMOUSEDOWN H2
+instance AdmitAttrONMOUSEDOWN H3
+instance AdmitAttrONMOUSEDOWN H4
+instance AdmitAttrONMOUSEDOWN H5
+instance AdmitAttrONMOUSEDOWN H6
+instance AdmitAttrONMOUSEDOWN HR
+instance AdmitAttrONMOUSEDOWN I
+instance AdmitAttrONMOUSEDOWN IMG
+instance AdmitAttrONMOUSEDOWN INPUT
+instance AdmitAttrONMOUSEDOWN INS
+instance AdmitAttrONMOUSEDOWN KBD
+instance AdmitAttrONMOUSEDOWN LABEL
+instance AdmitAttrONMOUSEDOWN LEGEND
+instance AdmitAttrONMOUSEDOWN LI
+instance AdmitAttrONMOUSEDOWN LINK
+instance AdmitAttrONMOUSEDOWN MAP
+instance AdmitAttrONMOUSEDOWN MENU
+instance AdmitAttrONMOUSEDOWN NOFRAMES
+instance AdmitAttrONMOUSEDOWN NOSCRIPT
+instance AdmitAttrONMOUSEDOWN OBJECT
+instance AdmitAttrONMOUSEDOWN OL
+instance AdmitAttrONMOUSEDOWN OPTGROUP
+instance AdmitAttrONMOUSEDOWN OPTION
+instance AdmitAttrONMOUSEDOWN P
+instance AdmitAttrONMOUSEDOWN PRE
+instance AdmitAttrONMOUSEDOWN Q
+instance AdmitAttrONMOUSEDOWN S
+instance AdmitAttrONMOUSEDOWN SAMP
+instance AdmitAttrONMOUSEDOWN SELECT
+instance AdmitAttrONMOUSEDOWN SMALL
+instance AdmitAttrONMOUSEDOWN SPAN
+instance AdmitAttrONMOUSEDOWN STRIKE
+instance AdmitAttrONMOUSEDOWN STRONG
+instance AdmitAttrONMOUSEDOWN SUB
+instance AdmitAttrONMOUSEDOWN SUP
+instance AdmitAttrONMOUSEDOWN TABLE
+instance AdmitAttrONMOUSEDOWN TBODY
+instance AdmitAttrONMOUSEDOWN TD
+instance AdmitAttrONMOUSEDOWN TEXTAREA
+instance AdmitAttrONMOUSEDOWN TFOOT
+instance AdmitAttrONMOUSEDOWN TH
+instance AdmitAttrONMOUSEDOWN THEAD
+instance AdmitAttrONMOUSEDOWN TR
+instance AdmitAttrONMOUSEDOWN TT
+instance AdmitAttrONMOUSEDOWN U
+instance AdmitAttrONMOUSEDOWN UL
+instance AdmitAttrONMOUSEDOWN VAR
+instance AdmitAttrONMOUSEMOVE A
+instance AdmitAttrONMOUSEMOVE ABBR
+instance AdmitAttrONMOUSEMOVE ACRONYM
+instance AdmitAttrONMOUSEMOVE ADDRESS
+instance AdmitAttrONMOUSEMOVE AREA
+instance AdmitAttrONMOUSEMOVE B
+instance AdmitAttrONMOUSEMOVE BIG
+instance AdmitAttrONMOUSEMOVE BLOCKQUOTE
+instance AdmitAttrONMOUSEMOVE BODY
+instance AdmitAttrONMOUSEMOVE BUTTON
+instance AdmitAttrONMOUSEMOVE CAPTION
+instance AdmitAttrONMOUSEMOVE CENTER
+instance AdmitAttrONMOUSEMOVE CITE
+instance AdmitAttrONMOUSEMOVE CODE
+instance AdmitAttrONMOUSEMOVE COL
+instance AdmitAttrONMOUSEMOVE COLGROUP
+instance AdmitAttrONMOUSEMOVE DD
+instance AdmitAttrONMOUSEMOVE DEL
+instance AdmitAttrONMOUSEMOVE DFN
+instance AdmitAttrONMOUSEMOVE DIR
+instance AdmitAttrONMOUSEMOVE DIV
+instance AdmitAttrONMOUSEMOVE DL
+instance AdmitAttrONMOUSEMOVE DT
+instance AdmitAttrONMOUSEMOVE EM
+instance AdmitAttrONMOUSEMOVE FIELDSET
+instance AdmitAttrONMOUSEMOVE FORM
+instance AdmitAttrONMOUSEMOVE H1
+instance AdmitAttrONMOUSEMOVE H2
+instance AdmitAttrONMOUSEMOVE H3
+instance AdmitAttrONMOUSEMOVE H4
+instance AdmitAttrONMOUSEMOVE H5
+instance AdmitAttrONMOUSEMOVE H6
+instance AdmitAttrONMOUSEMOVE HR
+instance AdmitAttrONMOUSEMOVE I
+instance AdmitAttrONMOUSEMOVE IMG
+instance AdmitAttrONMOUSEMOVE INPUT
+instance AdmitAttrONMOUSEMOVE INS
+instance AdmitAttrONMOUSEMOVE KBD
+instance AdmitAttrONMOUSEMOVE LABEL
+instance AdmitAttrONMOUSEMOVE LEGEND
+instance AdmitAttrONMOUSEMOVE LI
+instance AdmitAttrONMOUSEMOVE LINK
+instance AdmitAttrONMOUSEMOVE MAP
+instance AdmitAttrONMOUSEMOVE MENU
+instance AdmitAttrONMOUSEMOVE NOFRAMES
+instance AdmitAttrONMOUSEMOVE NOSCRIPT
+instance AdmitAttrONMOUSEMOVE OBJECT
+instance AdmitAttrONMOUSEMOVE OL
+instance AdmitAttrONMOUSEMOVE OPTGROUP
+instance AdmitAttrONMOUSEMOVE OPTION
+instance AdmitAttrONMOUSEMOVE P
+instance AdmitAttrONMOUSEMOVE PRE
+instance AdmitAttrONMOUSEMOVE Q
+instance AdmitAttrONMOUSEMOVE S
+instance AdmitAttrONMOUSEMOVE SAMP
+instance AdmitAttrONMOUSEMOVE SELECT
+instance AdmitAttrONMOUSEMOVE SMALL
+instance AdmitAttrONMOUSEMOVE SPAN
+instance AdmitAttrONMOUSEMOVE STRIKE
+instance AdmitAttrONMOUSEMOVE STRONG
+instance AdmitAttrONMOUSEMOVE SUB
+instance AdmitAttrONMOUSEMOVE SUP
+instance AdmitAttrONMOUSEMOVE TABLE
+instance AdmitAttrONMOUSEMOVE TBODY
+instance AdmitAttrONMOUSEMOVE TD
+instance AdmitAttrONMOUSEMOVE TEXTAREA
+instance AdmitAttrONMOUSEMOVE TFOOT
+instance AdmitAttrONMOUSEMOVE TH
+instance AdmitAttrONMOUSEMOVE THEAD
+instance AdmitAttrONMOUSEMOVE TR
+instance AdmitAttrONMOUSEMOVE TT
+instance AdmitAttrONMOUSEMOVE U
+instance AdmitAttrONMOUSEMOVE UL
+instance AdmitAttrONMOUSEMOVE VAR
+instance AdmitAttrONMOUSEOUT A
+instance AdmitAttrONMOUSEOUT ABBR
+instance AdmitAttrONMOUSEOUT ACRONYM
+instance AdmitAttrONMOUSEOUT ADDRESS
+instance AdmitAttrONMOUSEOUT AREA
+instance AdmitAttrONMOUSEOUT B
+instance AdmitAttrONMOUSEOUT BIG
+instance AdmitAttrONMOUSEOUT BLOCKQUOTE
+instance AdmitAttrONMOUSEOUT BODY
+instance AdmitAttrONMOUSEOUT BUTTON
+instance AdmitAttrONMOUSEOUT CAPTION
+instance AdmitAttrONMOUSEOUT CENTER
+instance AdmitAttrONMOUSEOUT CITE
+instance AdmitAttrONMOUSEOUT CODE
+instance AdmitAttrONMOUSEOUT COL
+instance AdmitAttrONMOUSEOUT COLGROUP
+instance AdmitAttrONMOUSEOUT DD
+instance AdmitAttrONMOUSEOUT DEL
+instance AdmitAttrONMOUSEOUT DFN
+instance AdmitAttrONMOUSEOUT DIR
+instance AdmitAttrONMOUSEOUT DIV
+instance AdmitAttrONMOUSEOUT DL
+instance AdmitAttrONMOUSEOUT DT
+instance AdmitAttrONMOUSEOUT EM
+instance AdmitAttrONMOUSEOUT FIELDSET
+instance AdmitAttrONMOUSEOUT FORM
+instance AdmitAttrONMOUSEOUT H1
+instance AdmitAttrONMOUSEOUT H2
+instance AdmitAttrONMOUSEOUT H3
+instance AdmitAttrONMOUSEOUT H4
+instance AdmitAttrONMOUSEOUT H5
+instance AdmitAttrONMOUSEOUT H6
+instance AdmitAttrONMOUSEOUT HR
+instance AdmitAttrONMOUSEOUT I
+instance AdmitAttrONMOUSEOUT IMG
+instance AdmitAttrONMOUSEOUT INPUT
+instance AdmitAttrONMOUSEOUT INS
+instance AdmitAttrONMOUSEOUT KBD
+instance AdmitAttrONMOUSEOUT LABEL
+instance AdmitAttrONMOUSEOUT LEGEND
+instance AdmitAttrONMOUSEOUT LI
+instance AdmitAttrONMOUSEOUT LINK
+instance AdmitAttrONMOUSEOUT MAP
+instance AdmitAttrONMOUSEOUT MENU
+instance AdmitAttrONMOUSEOUT NOFRAMES
+instance AdmitAttrONMOUSEOUT NOSCRIPT
+instance AdmitAttrONMOUSEOUT OBJECT
+instance AdmitAttrONMOUSEOUT OL
+instance AdmitAttrONMOUSEOUT OPTGROUP
+instance AdmitAttrONMOUSEOUT OPTION
+instance AdmitAttrONMOUSEOUT P
+instance AdmitAttrONMOUSEOUT PRE
+instance AdmitAttrONMOUSEOUT Q
+instance AdmitAttrONMOUSEOUT S
+instance AdmitAttrONMOUSEOUT SAMP
+instance AdmitAttrONMOUSEOUT SELECT
+instance AdmitAttrONMOUSEOUT SMALL
+instance AdmitAttrONMOUSEOUT SPAN
+instance AdmitAttrONMOUSEOUT STRIKE
+instance AdmitAttrONMOUSEOUT STRONG
+instance AdmitAttrONMOUSEOUT SUB
+instance AdmitAttrONMOUSEOUT SUP
+instance AdmitAttrONMOUSEOUT TABLE
+instance AdmitAttrONMOUSEOUT TBODY
+instance AdmitAttrONMOUSEOUT TD
+instance AdmitAttrONMOUSEOUT TEXTAREA
+instance AdmitAttrONMOUSEOUT TFOOT
+instance AdmitAttrONMOUSEOUT TH
+instance AdmitAttrONMOUSEOUT THEAD
+instance AdmitAttrONMOUSEOUT TR
+instance AdmitAttrONMOUSEOUT TT
+instance AdmitAttrONMOUSEOUT U
+instance AdmitAttrONMOUSEOUT UL
+instance AdmitAttrONMOUSEOUT VAR
+instance AdmitAttrONMOUSEOVER A
+instance AdmitAttrONMOUSEOVER ABBR
+instance AdmitAttrONMOUSEOVER ACRONYM
+instance AdmitAttrONMOUSEOVER ADDRESS
+instance AdmitAttrONMOUSEOVER AREA
+instance AdmitAttrONMOUSEOVER B
+instance AdmitAttrONMOUSEOVER BIG
+instance AdmitAttrONMOUSEOVER BLOCKQUOTE
+instance AdmitAttrONMOUSEOVER BODY
+instance AdmitAttrONMOUSEOVER BUTTON
+instance AdmitAttrONMOUSEOVER CAPTION
+instance AdmitAttrONMOUSEOVER CENTER
+instance AdmitAttrONMOUSEOVER CITE
+instance AdmitAttrONMOUSEOVER CODE
+instance AdmitAttrONMOUSEOVER COL
+instance AdmitAttrONMOUSEOVER COLGROUP
+instance AdmitAttrONMOUSEOVER DD
+instance AdmitAttrONMOUSEOVER DEL
+instance AdmitAttrONMOUSEOVER DFN
+instance AdmitAttrONMOUSEOVER DIR
+instance AdmitAttrONMOUSEOVER DIV
+instance AdmitAttrONMOUSEOVER DL
+instance AdmitAttrONMOUSEOVER DT
+instance AdmitAttrONMOUSEOVER EM
+instance AdmitAttrONMOUSEOVER FIELDSET
+instance AdmitAttrONMOUSEOVER FORM
+instance AdmitAttrONMOUSEOVER H1
+instance AdmitAttrONMOUSEOVER H2
+instance AdmitAttrONMOUSEOVER H3
+instance AdmitAttrONMOUSEOVER H4
+instance AdmitAttrONMOUSEOVER H5
+instance AdmitAttrONMOUSEOVER H6
+instance AdmitAttrONMOUSEOVER HR
+instance AdmitAttrONMOUSEOVER I
+instance AdmitAttrONMOUSEOVER IMG
+instance AdmitAttrONMOUSEOVER INPUT
+instance AdmitAttrONMOUSEOVER INS
+instance AdmitAttrONMOUSEOVER KBD
+instance AdmitAttrONMOUSEOVER LABEL
+instance AdmitAttrONMOUSEOVER LEGEND
+instance AdmitAttrONMOUSEOVER LI
+instance AdmitAttrONMOUSEOVER LINK
+instance AdmitAttrONMOUSEOVER MAP
+instance AdmitAttrONMOUSEOVER MENU
+instance AdmitAttrONMOUSEOVER NOFRAMES
+instance AdmitAttrONMOUSEOVER NOSCRIPT
+instance AdmitAttrONMOUSEOVER OBJECT
+instance AdmitAttrONMOUSEOVER OL
+instance AdmitAttrONMOUSEOVER OPTGROUP
+instance AdmitAttrONMOUSEOVER OPTION
+instance AdmitAttrONMOUSEOVER P
+instance AdmitAttrONMOUSEOVER PRE
+instance AdmitAttrONMOUSEOVER Q
+instance AdmitAttrONMOUSEOVER S
+instance AdmitAttrONMOUSEOVER SAMP
+instance AdmitAttrONMOUSEOVER SELECT
+instance AdmitAttrONMOUSEOVER SMALL
+instance AdmitAttrONMOUSEOVER SPAN
+instance AdmitAttrONMOUSEOVER STRIKE
+instance AdmitAttrONMOUSEOVER STRONG
+instance AdmitAttrONMOUSEOVER SUB
+instance AdmitAttrONMOUSEOVER SUP
+instance AdmitAttrONMOUSEOVER TABLE
+instance AdmitAttrONMOUSEOVER TBODY
+instance AdmitAttrONMOUSEOVER TD
+instance AdmitAttrONMOUSEOVER TEXTAREA
+instance AdmitAttrONMOUSEOVER TFOOT
+instance AdmitAttrONMOUSEOVER TH
+instance AdmitAttrONMOUSEOVER THEAD
+instance AdmitAttrONMOUSEOVER TR
+instance AdmitAttrONMOUSEOVER TT
+instance AdmitAttrONMOUSEOVER U
+instance AdmitAttrONMOUSEOVER UL
+instance AdmitAttrONMOUSEOVER VAR
+instance AdmitAttrONMOUSEUP A
+instance AdmitAttrONMOUSEUP ABBR
+instance AdmitAttrONMOUSEUP ACRONYM
+instance AdmitAttrONMOUSEUP ADDRESS
+instance AdmitAttrONMOUSEUP AREA
+instance AdmitAttrONMOUSEUP B
+instance AdmitAttrONMOUSEUP BIG
+instance AdmitAttrONMOUSEUP BLOCKQUOTE
+instance AdmitAttrONMOUSEUP BODY
+instance AdmitAttrONMOUSEUP BUTTON
+instance AdmitAttrONMOUSEUP CAPTION
+instance AdmitAttrONMOUSEUP CENTER
+instance AdmitAttrONMOUSEUP CITE
+instance AdmitAttrONMOUSEUP CODE
+instance AdmitAttrONMOUSEUP COL
+instance AdmitAttrONMOUSEUP COLGROUP
+instance AdmitAttrONMOUSEUP DD
+instance AdmitAttrONMOUSEUP DEL
+instance AdmitAttrONMOUSEUP DFN
+instance AdmitAttrONMOUSEUP DIR
+instance AdmitAttrONMOUSEUP DIV
+instance AdmitAttrONMOUSEUP DL
+instance AdmitAttrONMOUSEUP DT
+instance AdmitAttrONMOUSEUP EM
+instance AdmitAttrONMOUSEUP FIELDSET
+instance AdmitAttrONMOUSEUP FORM
+instance AdmitAttrONMOUSEUP H1
+instance AdmitAttrONMOUSEUP H2
+instance AdmitAttrONMOUSEUP H3
+instance AdmitAttrONMOUSEUP H4
+instance AdmitAttrONMOUSEUP H5
+instance AdmitAttrONMOUSEUP H6
+instance AdmitAttrONMOUSEUP HR
+instance AdmitAttrONMOUSEUP I
+instance AdmitAttrONMOUSEUP IMG
+instance AdmitAttrONMOUSEUP INPUT
+instance AdmitAttrONMOUSEUP INS
+instance AdmitAttrONMOUSEUP KBD
+instance AdmitAttrONMOUSEUP LABEL
+instance AdmitAttrONMOUSEUP LEGEND
+instance AdmitAttrONMOUSEUP LI
+instance AdmitAttrONMOUSEUP LINK
+instance AdmitAttrONMOUSEUP MAP
+instance AdmitAttrONMOUSEUP MENU
+instance AdmitAttrONMOUSEUP NOFRAMES
+instance AdmitAttrONMOUSEUP NOSCRIPT
+instance AdmitAttrONMOUSEUP OBJECT
+instance AdmitAttrONMOUSEUP OL
+instance AdmitAttrONMOUSEUP OPTGROUP
+instance AdmitAttrONMOUSEUP OPTION
+instance AdmitAttrONMOUSEUP P
+instance AdmitAttrONMOUSEUP PRE
+instance AdmitAttrONMOUSEUP Q
+instance AdmitAttrONMOUSEUP S
+instance AdmitAttrONMOUSEUP SAMP
+instance AdmitAttrONMOUSEUP SELECT
+instance AdmitAttrONMOUSEUP SMALL
+instance AdmitAttrONMOUSEUP SPAN
+instance AdmitAttrONMOUSEUP STRIKE
+instance AdmitAttrONMOUSEUP STRONG
+instance AdmitAttrONMOUSEUP SUB
+instance AdmitAttrONMOUSEUP SUP
+instance AdmitAttrONMOUSEUP TABLE
+instance AdmitAttrONMOUSEUP TBODY
+instance AdmitAttrONMOUSEUP TD
+instance AdmitAttrONMOUSEUP TEXTAREA
+instance AdmitAttrONMOUSEUP TFOOT
+instance AdmitAttrONMOUSEUP TH
+instance AdmitAttrONMOUSEUP THEAD
+instance AdmitAttrONMOUSEUP TR
+instance AdmitAttrONMOUSEUP TT
+instance AdmitAttrONMOUSEUP U
+instance AdmitAttrONMOUSEUP UL
+instance AdmitAttrONMOUSEUP VAR
+instance AdmitAttrONRESET FORM
+instance AdmitAttrONSELECT INPUT
+instance AdmitAttrONSELECT TEXTAREA
+instance AdmitAttrONSUBMIT FORM
+instance AdmitAttrONUNLOAD BODY
+instance AdmitAttrONUNLOAD FRAMESET
+instance AdmitAttrPROFILE HEAD
+instance AdmitAttrPROMPT ISINDEX
+instance AdmitAttrREADONLY INPUT
+instance AdmitAttrREADONLY TEXTAREA
+instance AdmitAttrREL A
+instance AdmitAttrREL LINK
+instance AdmitAttrREV A
+instance AdmitAttrREV LINK
+instance AdmitAttrROWS FRAMESET
+instance AdmitAttrROWS TEXTAREA
+instance AdmitAttrROWSPAN TD
+instance AdmitAttrROWSPAN TH
+instance AdmitAttrRULES TABLE
+instance AdmitAttrSCHEME META
+instance AdmitAttrSCOPE TD
+instance AdmitAttrSCOPE TH
+instance AdmitAttrSCROLLING FRAME
+instance AdmitAttrSCROLLING IFRAME
+instance AdmitAttrSELECTED OPTION
+instance AdmitAttrSHAPE A
+instance AdmitAttrSHAPE AREA
+instance AdmitAttrSIZE BASEFONT
+instance AdmitAttrSIZE FONT
+instance AdmitAttrSIZE HR
+instance AdmitAttrSIZE INPUT
+instance AdmitAttrSIZE SELECT
+instance AdmitAttrSPAN COL
+instance AdmitAttrSPAN COLGROUP
+instance AdmitAttrSRC FRAME
+instance AdmitAttrSRC IFRAME
+instance AdmitAttrSRC IMG
+instance AdmitAttrSRC INPUT
+instance AdmitAttrSRC SCRIPT
+instance AdmitAttrSTANDBY OBJECT
+instance AdmitAttrSTART OL
+instance AdmitAttrSTYLE A
+instance AdmitAttrSTYLE ABBR
+instance AdmitAttrSTYLE ACRONYM
+instance AdmitAttrSTYLE ADDRESS
+instance AdmitAttrSTYLE APPLET
+instance AdmitAttrSTYLE AREA
+instance AdmitAttrSTYLE B
+instance AdmitAttrSTYLE BDO
+instance AdmitAttrSTYLE BIG
+instance AdmitAttrSTYLE BLOCKQUOTE
+instance AdmitAttrSTYLE BODY
+instance AdmitAttrSTYLE BR
+instance AdmitAttrSTYLE BUTTON
+instance AdmitAttrSTYLE CAPTION
+instance AdmitAttrSTYLE CENTER
+instance AdmitAttrSTYLE CITE
+instance AdmitAttrSTYLE CODE
+instance AdmitAttrSTYLE COL
+instance AdmitAttrSTYLE COLGROUP
+instance AdmitAttrSTYLE DD
+instance AdmitAttrSTYLE DEL
+instance AdmitAttrSTYLE DFN
+instance AdmitAttrSTYLE DIR
+instance AdmitAttrSTYLE DIV
+instance AdmitAttrSTYLE DL
+instance AdmitAttrSTYLE DT
+instance AdmitAttrSTYLE EM
+instance AdmitAttrSTYLE FIELDSET
+instance AdmitAttrSTYLE FONT
+instance AdmitAttrSTYLE FORM
+instance AdmitAttrSTYLE FRAME
+instance AdmitAttrSTYLE FRAMESET
+instance AdmitAttrSTYLE H1
+instance AdmitAttrSTYLE H2
+instance AdmitAttrSTYLE H3
+instance AdmitAttrSTYLE H4
+instance AdmitAttrSTYLE H5
+instance AdmitAttrSTYLE H6
+instance AdmitAttrSTYLE HR
+instance AdmitAttrSTYLE I
+instance AdmitAttrSTYLE IFRAME
+instance AdmitAttrSTYLE IMG
+instance AdmitAttrSTYLE INPUT
+instance AdmitAttrSTYLE INS
+instance AdmitAttrSTYLE ISINDEX
+instance AdmitAttrSTYLE KBD
+instance AdmitAttrSTYLE LABEL
+instance AdmitAttrSTYLE LEGEND
+instance AdmitAttrSTYLE LI
+instance AdmitAttrSTYLE LINK
+instance AdmitAttrSTYLE MAP
+instance AdmitAttrSTYLE MENU
+instance AdmitAttrSTYLE NOFRAMES
+instance AdmitAttrSTYLE NOSCRIPT
+instance AdmitAttrSTYLE OBJECT
+instance AdmitAttrSTYLE OL
+instance AdmitAttrSTYLE OPTGROUP
+instance AdmitAttrSTYLE OPTION
+instance AdmitAttrSTYLE P
+instance AdmitAttrSTYLE PRE
+instance AdmitAttrSTYLE Q
+instance AdmitAttrSTYLE S
+instance AdmitAttrSTYLE SAMP
+instance AdmitAttrSTYLE SELECT
+instance AdmitAttrSTYLE SMALL
+instance AdmitAttrSTYLE SPAN
+instance AdmitAttrSTYLE STRIKE
+instance AdmitAttrSTYLE STRONG
+instance AdmitAttrSTYLE SUB
+instance AdmitAttrSTYLE SUP
+instance AdmitAttrSTYLE TABLE
+instance AdmitAttrSTYLE TBODY
+instance AdmitAttrSTYLE TD
+instance AdmitAttrSTYLE TEXTAREA
+instance AdmitAttrSTYLE TFOOT
+instance AdmitAttrSTYLE TH
+instance AdmitAttrSTYLE THEAD
+instance AdmitAttrSTYLE TR
+instance AdmitAttrSTYLE TT
+instance AdmitAttrSTYLE U
+instance AdmitAttrSTYLE UL
+instance AdmitAttrSTYLE VAR
+instance AdmitAttrSUMMARY TABLE
+instance AdmitAttrTABINDEX A
+instance AdmitAttrTABINDEX AREA
+instance AdmitAttrTABINDEX BUTTON
+instance AdmitAttrTABINDEX INPUT
+instance AdmitAttrTABINDEX OBJECT
+instance AdmitAttrTABINDEX SELECT
+instance AdmitAttrTABINDEX TEXTAREA
+instance AdmitAttrTARGET A
+instance AdmitAttrTARGET AREA
+instance AdmitAttrTARGET BASE
+instance AdmitAttrTARGET FORM
+instance AdmitAttrTARGET LINK
+instance AdmitAttrTEXT BODY
+instance AdmitAttrTITLE A
+instance AdmitAttrTITLE ABBR
+instance AdmitAttrTITLE ACRONYM
+instance AdmitAttrTITLE ADDRESS
+instance AdmitAttrTITLE APPLET
+instance AdmitAttrTITLE AREA
+instance AdmitAttrTITLE B
+instance AdmitAttrTITLE BDO
+instance AdmitAttrTITLE BIG
+instance AdmitAttrTITLE BLOCKQUOTE
+instance AdmitAttrTITLE BODY
+instance AdmitAttrTITLE BR
+instance AdmitAttrTITLE BUTTON
+instance AdmitAttrTITLE CAPTION
+instance AdmitAttrTITLE CENTER
+instance AdmitAttrTITLE CITE
+instance AdmitAttrTITLE CODE
+instance AdmitAttrTITLE COL
+instance AdmitAttrTITLE COLGROUP
+instance AdmitAttrTITLE DD
+instance AdmitAttrTITLE DEL
+instance AdmitAttrTITLE DFN
+instance AdmitAttrTITLE DIR
+instance AdmitAttrTITLE DIV
+instance AdmitAttrTITLE DL
+instance AdmitAttrTITLE DT
+instance AdmitAttrTITLE EM
+instance AdmitAttrTITLE FIELDSET
+instance AdmitAttrTITLE FONT
+instance AdmitAttrTITLE FORM
+instance AdmitAttrTITLE FRAME
+instance AdmitAttrTITLE FRAMESET
+instance AdmitAttrTITLE H1
+instance AdmitAttrTITLE H2
+instance AdmitAttrTITLE H3
+instance AdmitAttrTITLE H4
+instance AdmitAttrTITLE H5
+instance AdmitAttrTITLE H6
+instance AdmitAttrTITLE HR
+instance AdmitAttrTITLE I
+instance AdmitAttrTITLE IFRAME
+instance AdmitAttrTITLE IMG
+instance AdmitAttrTITLE INPUT
+instance AdmitAttrTITLE INS
+instance AdmitAttrTITLE ISINDEX
+instance AdmitAttrTITLE KBD
+instance AdmitAttrTITLE LABEL
+instance AdmitAttrTITLE LEGEND
+instance AdmitAttrTITLE LI
+instance AdmitAttrTITLE LINK
+instance AdmitAttrTITLE MAP
+instance AdmitAttrTITLE MENU
+instance AdmitAttrTITLE NOFRAMES
+instance AdmitAttrTITLE NOSCRIPT
+instance AdmitAttrTITLE OBJECT
+instance AdmitAttrTITLE OL
+instance AdmitAttrTITLE OPTGROUP
+instance AdmitAttrTITLE OPTION
+instance AdmitAttrTITLE P
+instance AdmitAttrTITLE PRE
+instance AdmitAttrTITLE Q
+instance AdmitAttrTITLE S
+instance AdmitAttrTITLE SAMP
+instance AdmitAttrTITLE SELECT
+instance AdmitAttrTITLE SMALL
+instance AdmitAttrTITLE SPAN
+instance AdmitAttrTITLE STRIKE
+instance AdmitAttrTITLE STRONG
+instance AdmitAttrTITLE STYLE
+instance AdmitAttrTITLE SUB
+instance AdmitAttrTITLE SUP
+instance AdmitAttrTITLE TABLE
+instance AdmitAttrTITLE TBODY
+instance AdmitAttrTITLE TD
+instance AdmitAttrTITLE TEXTAREA
+instance AdmitAttrTITLE TFOOT
+instance AdmitAttrTITLE TH
+instance AdmitAttrTITLE THEAD
+instance AdmitAttrTITLE TR
+instance AdmitAttrTITLE TT
+instance AdmitAttrTITLE U
+instance AdmitAttrTITLE UL
+instance AdmitAttrTITLE VAR
+instance AdmitAttrTYPE A
+instance AdmitAttrTYPE BUTTON
+instance AdmitAttrTYPE INPUT
+instance AdmitAttrTYPE LI
+instance AdmitAttrTYPE LINK
+instance AdmitAttrTYPE OBJECT
+instance AdmitAttrTYPE OL
+instance AdmitAttrTYPE PARAM
+instance AdmitAttrTYPE SCRIPT
+instance AdmitAttrTYPE STYLE
+instance AdmitAttrTYPE UL
+instance AdmitAttrUSEMAP IMG
+instance AdmitAttrUSEMAP INPUT
+instance AdmitAttrUSEMAP OBJECT
+instance AdmitAttrVALIGN COL
+instance AdmitAttrVALIGN COLGROUP
+instance AdmitAttrVALIGN TBODY
+instance AdmitAttrVALIGN TD
+instance AdmitAttrVALIGN TFOOT
+instance AdmitAttrVALIGN TH
+instance AdmitAttrVALIGN THEAD
+instance AdmitAttrVALIGN TR
+instance AdmitAttrVALUE BUTTON
+instance AdmitAttrVALUE INPUT
+instance AdmitAttrVALUE LI
+instance AdmitAttrVALUE OPTION
+instance AdmitAttrVALUE PARAM
+instance AdmitAttrVALUETYPE PARAM
+instance AdmitAttrVERSION HTML
+instance AdmitAttrVLINK BODY
+instance AdmitAttrVSPACE APPLET
+instance AdmitAttrVSPACE IMG
+instance AdmitAttrVSPACE OBJECT
+instance AdmitAttrWIDTH APPLET
+instance AdmitAttrWIDTH COL
+instance AdmitAttrWIDTH COLGROUP
+instance AdmitAttrWIDTH HR
+instance AdmitAttrWIDTH IFRAME
+instance AdmitAttrWIDTH IMG
+instance AdmitAttrWIDTH OBJECT
+instance AdmitAttrWIDTH PRE
+instance AdmitAttrWIDTH TABLE
+instance AdmitAttrWIDTH TD
+instance AdmitAttrWIDTH TH
diff --git a/WASH/HTML/HTMLMonadAttrs.hs b/WASH/HTML/HTMLMonadAttrs.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLMonadAttrs.hs
@@ -0,0 +1,250 @@
+-- © 2001-2003 Peter Thiemann
+-- this file is generated -- do not edit
+module WASH.HTML.HTMLMonadAttrs 
+  (module WASH.HTML.HTMLMonadAttrs,module WASH.HTML.HTMLMonadBase)
+  where
+import Prelude hiding (id,span)
+import WASH.HTML.HTMLMonadBase (attr, WithHTML)
+-- end fixed prologue
+abbr :: Monad m => String -> WithHTML x m ()
+abbr =  attr "abbr"
+accept :: Monad m => String -> WithHTML x m ()
+accept =  attr "accept"
+accept_charset :: Monad m => String -> WithHTML x m ()
+accept_charset =  attr "accept-charset"
+accesskey :: Monad m => String -> WithHTML x m ()
+accesskey =  attr "accesskey"
+action :: Monad m => String -> WithHTML x m ()
+action =  attr "action"
+align :: Monad m => String -> WithHTML x m ()
+align =  attr "align"
+alink :: Monad m => String -> WithHTML x m ()
+alink =  attr "alink"
+alt :: Monad m => String -> WithHTML x m ()
+alt =  attr "alt"
+archive :: Monad m => String -> WithHTML x m ()
+archive =  attr "archive"
+axis :: Monad m => String -> WithHTML x m ()
+axis =  attr "axis"
+background :: Monad m => String -> WithHTML x m ()
+background =  attr "background"
+bgcolor :: Monad m => String -> WithHTML x m ()
+bgcolor =  attr "bgcolor"
+border :: Monad m => String -> WithHTML x m ()
+border =  attr "border"
+cellpadding :: Monad m => String -> WithHTML x m ()
+cellpadding =  attr "cellpadding"
+cellspacing :: Monad m => String -> WithHTML x m ()
+cellspacing =  attr "cellspacing"
+char :: Monad m => String -> WithHTML x m ()
+char =  attr "char"
+charoff :: Monad m => String -> WithHTML x m ()
+charoff =  attr "charoff"
+charset :: Monad m => String -> WithHTML x m ()
+charset =  attr "charset"
+checked :: Monad m => String -> WithHTML x m ()
+checked =  attr "checked"
+cite :: Monad m => String -> WithHTML x m ()
+cite =  attr "cite"
+class' :: Monad m => String -> WithHTML x m ()
+class' =  attr "class"
+classid :: Monad m => String -> WithHTML x m ()
+classid =  attr "classid"
+clear :: Monad m => String -> WithHTML x m ()
+clear =  attr "clear"
+code :: Monad m => String -> WithHTML x m ()
+code =  attr "code"
+codebase :: Monad m => String -> WithHTML x m ()
+codebase =  attr "codebase"
+codetype :: Monad m => String -> WithHTML x m ()
+codetype =  attr "codetype"
+color :: Monad m => String -> WithHTML x m ()
+color =  attr "color"
+cols :: Monad m => String -> WithHTML x m ()
+cols =  attr "cols"
+colspan :: Monad m => String -> WithHTML x m ()
+colspan =  attr "colspan"
+compact :: Monad m => String -> WithHTML x m ()
+compact =  attr "compact"
+content :: Monad m => String -> WithHTML x m ()
+content =  attr "content"
+coords :: Monad m => String -> WithHTML x m ()
+coords =  attr "coords"
+data' :: Monad m => String -> WithHTML x m ()
+data' =  attr "data"
+datapagesize :: Monad m => String -> WithHTML x m ()
+datapagesize =  attr "datapagesize"
+datetime :: Monad m => String -> WithHTML x m ()
+datetime =  attr "datetime"
+declare :: Monad m => String -> WithHTML x m ()
+declare =  attr "declare"
+defer :: Monad m => String -> WithHTML x m ()
+defer =  attr "defer"
+dir :: Monad m => String -> WithHTML x m ()
+dir =  attr "dir"
+disabled :: Monad m => String -> WithHTML x m ()
+disabled =  attr "disabled"
+enctype :: Monad m => String -> WithHTML x m ()
+enctype =  attr "enctype"
+event :: Monad m => String -> WithHTML x m ()
+event =  attr "event"
+face :: Monad m => String -> WithHTML x m ()
+face =  attr "face"
+for :: Monad m => String -> WithHTML x m ()
+for =  attr "for"
+frame :: Monad m => String -> WithHTML x m ()
+frame =  attr "frame"
+frameborder :: Monad m => String -> WithHTML x m ()
+frameborder =  attr "frameborder"
+headers :: Monad m => String -> WithHTML x m ()
+headers =  attr "headers"
+height :: Monad m => String -> WithHTML x m ()
+height =  attr "height"
+href :: Monad m => String -> WithHTML x m ()
+href =  attr "href"
+hreflang :: Monad m => String -> WithHTML x m ()
+hreflang =  attr "hreflang"
+hspace :: Monad m => String -> WithHTML x m ()
+hspace =  attr "hspace"
+http_equiv :: Monad m => String -> WithHTML x m ()
+http_equiv =  attr "http-equiv"
+id :: Monad m => String -> WithHTML x m ()
+id =  attr "id"
+ismap :: Monad m => String -> WithHTML x m ()
+ismap =  attr "ismap"
+label :: Monad m => String -> WithHTML x m ()
+label =  attr "label"
+lang :: Monad m => String -> WithHTML x m ()
+lang =  attr "lang"
+language :: Monad m => String -> WithHTML x m ()
+language =  attr "language"
+link :: Monad m => String -> WithHTML x m ()
+link =  attr "link"
+longdesc :: Monad m => String -> WithHTML x m ()
+longdesc =  attr "longdesc"
+marginheight :: Monad m => String -> WithHTML x m ()
+marginheight =  attr "marginheight"
+marginwidth :: Monad m => String -> WithHTML x m ()
+marginwidth =  attr "marginwidth"
+maxlength :: Monad m => String -> WithHTML x m ()
+maxlength =  attr "maxlength"
+media :: Monad m => String -> WithHTML x m ()
+media =  attr "media"
+method :: Monad m => String -> WithHTML x m ()
+method =  attr "method"
+multiple :: Monad m => String -> WithHTML x m ()
+multiple =  attr "multiple"
+name :: Monad m => String -> WithHTML x m ()
+name =  attr "name"
+nohref :: Monad m => String -> WithHTML x m ()
+nohref =  attr "nohref"
+noresize :: Monad m => String -> WithHTML x m ()
+noresize =  attr "noresize"
+noshade :: Monad m => String -> WithHTML x m ()
+noshade =  attr "noshade"
+nowrap :: Monad m => String -> WithHTML x m ()
+nowrap =  attr "nowrap"
+object :: Monad m => String -> WithHTML x m ()
+object =  attr "object"
+onblur :: Monad m => String -> WithHTML x m ()
+onblur =  attr "onblur"
+onchange :: Monad m => String -> WithHTML x m ()
+onchange =  attr "onchange"
+onclick :: Monad m => String -> WithHTML x m ()
+onclick =  attr "onclick"
+ondblclick :: Monad m => String -> WithHTML x m ()
+ondblclick =  attr "ondblclick"
+onfocus :: Monad m => String -> WithHTML x m ()
+onfocus =  attr "onfocus"
+onkeydown :: Monad m => String -> WithHTML x m ()
+onkeydown =  attr "onkeydown"
+onkeypress :: Monad m => String -> WithHTML x m ()
+onkeypress =  attr "onkeypress"
+onkeyup :: Monad m => String -> WithHTML x m ()
+onkeyup =  attr "onkeyup"
+onload :: Monad m => String -> WithHTML x m ()
+onload =  attr "onload"
+onmousedown :: Monad m => String -> WithHTML x m ()
+onmousedown =  attr "onmousedown"
+onmousemove :: Monad m => String -> WithHTML x m ()
+onmousemove =  attr "onmousemove"
+onmouseout :: Monad m => String -> WithHTML x m ()
+onmouseout =  attr "onmouseout"
+onmouseover :: Monad m => String -> WithHTML x m ()
+onmouseover =  attr "onmouseover"
+onmouseup :: Monad m => String -> WithHTML x m ()
+onmouseup =  attr "onmouseup"
+onreset :: Monad m => String -> WithHTML x m ()
+onreset =  attr "onreset"
+onselect :: Monad m => String -> WithHTML x m ()
+onselect =  attr "onselect"
+onsubmit :: Monad m => String -> WithHTML x m ()
+onsubmit =  attr "onsubmit"
+onunload :: Monad m => String -> WithHTML x m ()
+onunload =  attr "onunload"
+profile :: Monad m => String -> WithHTML x m ()
+profile =  attr "profile"
+prompt :: Monad m => String -> WithHTML x m ()
+prompt =  attr "prompt"
+readonly :: Monad m => String -> WithHTML x m ()
+readonly =  attr "readonly"
+rel :: Monad m => String -> WithHTML x m ()
+rel =  attr "rel"
+rev :: Monad m => String -> WithHTML x m ()
+rev =  attr "rev"
+rows :: Monad m => String -> WithHTML x m ()
+rows =  attr "rows"
+rowspan :: Monad m => String -> WithHTML x m ()
+rowspan =  attr "rowspan"
+rules :: Monad m => String -> WithHTML x m ()
+rules =  attr "rules"
+scheme :: Monad m => String -> WithHTML x m ()
+scheme =  attr "scheme"
+scope :: Monad m => String -> WithHTML x m ()
+scope =  attr "scope"
+scrolling :: Monad m => String -> WithHTML x m ()
+scrolling =  attr "scrolling"
+selected :: Monad m => String -> WithHTML x m ()
+selected =  attr "selected"
+shape :: Monad m => String -> WithHTML x m ()
+shape =  attr "shape"
+size :: Monad m => String -> WithHTML x m ()
+size =  attr "size"
+span :: Monad m => String -> WithHTML x m ()
+span =  attr "span"
+src :: Monad m => String -> WithHTML x m ()
+src =  attr "src"
+standby :: Monad m => String -> WithHTML x m ()
+standby =  attr "standby"
+start :: Monad m => String -> WithHTML x m ()
+start =  attr "start"
+style :: Monad m => String -> WithHTML x m ()
+style =  attr "style"
+summary :: Monad m => String -> WithHTML x m ()
+summary =  attr "summary"
+tabindex :: Monad m => String -> WithHTML x m ()
+tabindex =  attr "tabindex"
+target :: Monad m => String -> WithHTML x m ()
+target =  attr "target"
+text :: Monad m => String -> WithHTML x m ()
+text =  attr "text"
+title :: Monad m => String -> WithHTML x m ()
+title =  attr "title"
+type' :: Monad m => String -> WithHTML x m ()
+type' =  attr "type"
+usemap :: Monad m => String -> WithHTML x m ()
+usemap =  attr "usemap"
+valign :: Monad m => String -> WithHTML x m ()
+valign =  attr "valign"
+value :: Monad m => String -> WithHTML x m ()
+value =  attr "value"
+valuetype :: Monad m => String -> WithHTML x m ()
+valuetype =  attr "valuetype"
+version :: Monad m => String -> WithHTML x m ()
+version =  attr "version"
+vlink :: Monad m => String -> WithHTML x m ()
+vlink =  attr "vlink"
+vspace :: Monad m => String -> WithHTML x m ()
+vspace =  attr "vspace"
+width :: Monad m => String -> WithHTML x m ()
+width =  attr "width"
diff --git a/WASH/HTML/HTMLMonadBase.hs b/WASH/HTML/HTMLMonadBase.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLMonadBase.hs
@@ -0,0 +1,92 @@
+-- © 2001, 2002, 2005 Peter Thiemann
+module WASH.HTML.HTMLMonadBase
+  (module WASH.HTML.HTMLMonadBase, B.ELEMENT_, B.ATTR_, B.attr_name, B.attr_value)
+  where
+import qualified WASH.HTML.HTMLBase as B
+type Element = B.ELEMENT_
+type Attributes = [Attribute]
+type Attribute = B.ATTR_
+data WithHTML x m a =
+  WithHTML { unWithHTML :: Element -> m (a, Element) }
+type HTMLCons x y m a = WithHTML x m a -> WithHTML y m a
+instance Monad m => Monad (WithHTML x m) where
+  return a = WithHTML (\elem -> return (a, elem))
+  ma >>= f = WithHTML (\elem -> unWithHTML ma elem >>= \(a, elem') ->
+                                unWithHTML (f a) elem')
+-- contributed by Frederik Eaton <frederik@ofb.net>
+--instance MonadFix m => MonadFix (WithHTML x m) where
+--  mfix f = WithHTML (\elem ->
+--		     mfix (\x -> (unWithHTML (f x)) elem >>= (return.fst))
+--		     >>= (\x -> return (x,elem)))
+lift :: Monad m => m a -> WithHTML x m a
+lift ma = WithHTML (\elem -> ma >>= \a -> return (a, elem))
+get_attrs :: Monad m => WithHTML x m Attributes
+get_attrs = WithHTML (\elem -> return (B.get_attrs_ elem, elem))
+-- | empty node sequence
+empty :: Monad m => WithHTML x m ()
+empty = return ()
+-- | concatenation of sequences
+infixl 1 ##
+x ## y = x >>= \a -> y >> return a
+-- | cleanup of attribute values
+av (str@('\"':_)) = let str1 = read str :: String in str1
+av str = str
+--
+addNode add cdata =
+  \s -> WithHTML (\elem -> return ((), add elem (cdata s)))
+comment, comment_S, comment_T :: Monad m => String -> WithHTML x m ()
+comment   = addNode B.add_ B.comment_
+comment_S = addNode B.add_ B.comment_S
+comment_T = addNode B.add_ B.comment_T
+-- | create a text node with all illegal characters properly escaped
+text :: Monad m => String -> WithHTML x m ()
+text          = addNode B.add_ (B.cdata_ [])
+-- | create a text node from any Showable type
+showText :: (Monad m, Show a) => a -> WithHTML x m ()
+showText x = text (av (show x))
+-- | create a text node where the string is dropped into the webpage without
+-- change, e.g., preserving entities 
+rawtext :: Monad m => String -> WithHTML x m ()
+rawtext       = addNode B.add_ (B.cdata_ [B.CDATA_ENCODED])
+formattedtext :: Monad m => String -> WithHTML x m ()
+formattedtext = addNode B.add_ (B.cdata_ [B.CDATA_FORMATTED])
+text_S, rawtext_S, formattedtext_S :: Monad m => String -> WithHTML x m ()
+text_S          = addNode B.add_ (B.cdata_S [])
+rawtext_S       = addNode B.add_ (B.cdata_S [B.CDATA_ENCODED])
+formattedtext_S = addNode B.add_ (B.cdata_S [B.CDATA_FORMATTED])
+text_T, rawtext_T, formattedtext_T :: Monad m => String -> WithHTML x m ()
+text_T          = addNode B.add_ (B.cdata_T [])
+rawtext_T       = addNode B.add_ (B.cdata_T [B.CDATA_ENCODED])
+formattedtext_T = addNode B.add_ (B.cdata_T [B.CDATA_FORMATTED])
+attr :: Monad m => String -> String -> WithHTML x m ()
+attr a = addNode B.add_attr_ (B.attr_ a)
+attr_SS :: Monad m => String -> String -> WithHTML x m ()
+attr_SS a = addNode B.add_attr_ (B.attr_SS a)
+attr_TS :: Monad m => String -> String -> WithHTML x m ()
+attr_TS a = addNode B.add_attr_ (B.attr_TS a)
+attr_TD :: Monad m => String -> String -> WithHTML x m ()
+attr_TD a = addNode B.add_attr_ (B.attr_TD a)
+attr_SD :: Monad m => String -> String -> WithHTML x m ()
+attr_SD a = addNode B.add_attr_ (B.attr_SD a)
+(@@) :: Monad m => String -> String -> WithHTML x m ()
+a @@ v = attr a v
+addMaker subelem ma =
+  WithHTML (\elem -> unWithHTML ma subelem >>= \(a, subelem') ->
+                     return (a, B.add_ elem subelem'))
+mkElement, mkEmpty :: Monad m => String -> HTMLCons x y m a
+mkElement tag = addMaker $ B.element_ tag [] []
+mkEmpty tag   = addMaker $ B.empty_   tag []
+mkElement_S, mkEmpty_S :: Monad m => String -> HTMLCons x y m a
+mkElement_S tag = addMaker $ B.element_S tag [] []
+mkEmpty_S tag   = addMaker $ B.empty_S   tag []
+mkElement_T, mkEmpty_T :: Monad m => String -> HTMLCons x y m a
+mkElement_T tag = addMaker $ B.element_T tag [] []
+mkEmpty_T tag   = addMaker $ B.empty_T   tag []
+build_document :: Monad m => WithHTML x m a -> m Element
+build_document ma = unWithHTML ma
+  (B.doctype_T 
+   [ "html"
+   , "PUBLIC"
+   , "\"-//W3C//DTD XHTML 1.0 Transitional//EN\""
+   , "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""] [])
+  >>= \ (a, elem) -> return elem
diff --git a/WASH/HTML/HTMLPrelude.hs b/WASH/HTML/HTMLPrelude.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLPrelude.hs
@@ -0,0 +1,5209 @@
+{-# OPTIONS -fglasgow-exts #-}
+-- © 2001 Peter Thiemann
+module WASH.HTML.HTMLPrelude 
+  (module WASH.HTML.HTMLPrelude,module WASH.HTML.HTMLTypedBase)
+  where
+import Prelude hiding (div,head,map,span)
+import WASH.HTML.HTMLTypedBase
+-- identity function
+empty x = x
+-- reverse function application
+( # ) = flip ($)	-- DON'T REMOVE THE SPACES
+-- reverse function composition
+( ## ) = flip (.)	-- DON'T REMOVE THE SPACES
+-- 
+instance AddTo DOCUMENT HTML
+build_document :: (ELT HTML -> ELT HTML) -> ELT DOCUMENT
+build_document addToHTML = make DOCUMENT # html addToHTML
+-- end fixed prologue
+a f elt = elt `add` f (make A)
+abbr f elt = elt `add` f (make ABBR)
+acronym f elt = elt `add` f (make ACRONYM)
+address f elt = elt `add` f (make ADDRESS)
+applet f elt = elt `add` f (make APPLET)
+area f elt = elt `add` f (make AREA)
+b f elt = elt `add` f (make B)
+base f elt = elt `add` f (make BASE)
+basefont f elt = elt `add` f (make BASEFONT)
+bdo f elt = elt `add` f (make BDO)
+big f elt = elt `add` f (make BIG)
+blockquote f elt = elt `add` f (make BLOCKQUOTE)
+body f elt = elt `add` f (make BODY)
+br f elt = elt `add` f (make BR)
+button f elt = elt `add` f (make BUTTON)
+caption f elt = elt `add` f (make CAPTION)
+center f elt = elt `add` f (make CENTER)
+cite f elt = elt `add` f (make CITE)
+code f elt = elt `add` f (make CODE)
+col f elt = elt `add` f (make COL)
+colgroup f elt = elt `add` f (make COLGROUP)
+dd f elt = elt `add` f (make DD)
+del f elt = elt `add` f (make DEL)
+dfn f elt = elt `add` f (make DFN)
+dir f elt = elt `add` f (make DIR)
+div f elt = elt `add` f (make DIV)
+dl f elt = elt `add` f (make DL)
+dt f elt = elt `add` f (make DT)
+em f elt = elt `add` f (make EM)
+fieldset f elt = elt `add` f (make FIELDSET)
+font f elt = elt `add` f (make FONT)
+form f elt = elt `add` f (make FORM)
+h1 f elt = elt `add` f (make H1)
+h2 f elt = elt `add` f (make H2)
+h3 f elt = elt `add` f (make H3)
+h4 f elt = elt `add` f (make H4)
+h5 f elt = elt `add` f (make H5)
+h6 f elt = elt `add` f (make H6)
+head f elt = elt `add` f (make HEAD)
+hr f elt = elt `add` f (make HR)
+html f elt = elt `add` f (make HTML)
+i f elt = elt `add` f (make I)
+iframe f elt = elt `add` f (make IFRAME)
+img f elt = elt `add` f (make IMG)
+input f elt = elt `add` f (make INPUT)
+ins f elt = elt `add` f (make INS)
+isindex f elt = elt `add` f (make ISINDEX)
+kbd f elt = elt `add` f (make KBD)
+label f elt = elt `add` f (make LABEL)
+legend f elt = elt `add` f (make LEGEND)
+li f elt = elt `add` f (make LI)
+link f elt = elt `add` f (make LINK)
+map f elt = elt `add` f (make MAP)
+menu f elt = elt `add` f (make MENU)
+meta f elt = elt `add` f (make META)
+noframes f elt = elt `add` f (make NOFRAMES)
+noscript f elt = elt `add` f (make NOSCRIPT)
+object f elt = elt `add` f (make OBJECT)
+ol f elt = elt `add` f (make OL)
+optgroup f elt = elt `add` f (make OPTGROUP)
+option f elt = elt `add` f (make OPTION)
+p f elt = elt `add` f (make P)
+param f elt = elt `add` f (make PARAM)
+pre f elt = elt `add` f (make PRE)
+q f elt = elt `add` f (make Q)
+s f elt = elt `add` f (make S)
+samp f elt = elt `add` f (make SAMP)
+script f elt = elt `add` f (make SCRIPT)
+select f elt = elt `add` f (make SELECT)
+small f elt = elt `add` f (make SMALL)
+span f elt = elt `add` f (make SPAN)
+strike f elt = elt `add` f (make STRIKE)
+strong f elt = elt `add` f (make STRONG)
+style f elt = elt `add` f (make STYLE)
+sub f elt = elt `add` f (make SUB)
+sup f elt = elt `add` f (make SUP)
+table f elt = elt `add` f (make TABLE)
+tbody f elt = elt `add` f (make TBODY)
+td f elt = elt `add` f (make TD)
+textarea f elt = elt `add` f (make TEXTAREA)
+tfoot f elt = elt `add` f (make TFOOT)
+th f elt = elt `add` f (make TH)
+thead f elt = elt `add` f (make THEAD)
+title f elt = elt `add` f (make TITLE)
+tr f elt = elt `add` f (make TR)
+tt f elt = elt `add` f (make TT)
+u f elt = elt `add` f (make U)
+ul f elt = elt `add` f (make UL)
+var f elt = elt `add` f (make VAR)
+data A = A
+instance Show A where show A = "A"
+data ABBR = ABBR
+instance Show ABBR where show ABBR = "ABBR"
+data ACRONYM = ACRONYM
+instance Show ACRONYM where show ACRONYM = "ACRONYM"
+data ADDRESS = ADDRESS
+instance Show ADDRESS where show ADDRESS = "ADDRESS"
+data APPLET = APPLET
+instance Show APPLET where show APPLET = "APPLET"
+data AREA = AREA
+instance Show AREA where show AREA = "AREA"
+data B = B
+instance Show B where show B = "B"
+data BASE = BASE
+instance Show BASE where show BASE = "BASE"
+data BASEFONT = BASEFONT
+instance Show BASEFONT where show BASEFONT = "BASEFONT"
+data BDO = BDO
+instance Show BDO where show BDO = "BDO"
+data BIG = BIG
+instance Show BIG where show BIG = "BIG"
+data BLOCKQUOTE = BLOCKQUOTE
+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"
+data BODY = BODY
+instance Show BODY where show BODY = "BODY"
+data BR = BR
+instance Show BR where show BR = "BR"
+data BUTTON = BUTTON
+instance Show BUTTON where show BUTTON = "BUTTON"
+data CAPTION = CAPTION
+instance Show CAPTION where show CAPTION = "CAPTION"
+data CENTER = CENTER
+instance Show CENTER where show CENTER = "CENTER"
+data CITE = CITE
+instance Show CITE where show CITE = "CITE"
+data CODE = CODE
+instance Show CODE where show CODE = "CODE"
+data COL = COL
+instance Show COL where show COL = "COL"
+data COLGROUP = COLGROUP
+instance Show COLGROUP where show COLGROUP = "COLGROUP"
+data DD = DD
+instance Show DD where show DD = "DD"
+data DEL = DEL
+instance Show DEL where show DEL = "DEL"
+data DFN = DFN
+instance Show DFN where show DFN = "DFN"
+data DIR = DIR
+instance Show DIR where show DIR = "DIR"
+data DIV = DIV
+instance Show DIV where show DIV = "DIV"
+data DL = DL
+instance Show DL where show DL = "DL"
+data DT = DT
+instance Show DT where show DT = "DT"
+data EM = EM
+instance Show EM where show EM = "EM"
+data FIELDSET = FIELDSET
+instance Show FIELDSET where show FIELDSET = "FIELDSET"
+data FONT = FONT
+instance Show FONT where show FONT = "FONT"
+data FORM = FORM
+instance Show FORM where show FORM = "FORM"
+data H1 = H1
+instance Show H1 where show H1 = "H1"
+data H2 = H2
+instance Show H2 where show H2 = "H2"
+data H3 = H3
+instance Show H3 where show H3 = "H3"
+data H4 = H4
+instance Show H4 where show H4 = "H4"
+data H5 = H5
+instance Show H5 where show H5 = "H5"
+data H6 = H6
+instance Show H6 where show H6 = "H6"
+data HEAD = HEAD
+instance Show HEAD where show HEAD = "HEAD"
+data HR = HR
+instance Show HR where show HR = "HR"
+data HTML = HTML
+instance Show HTML where show HTML = "HTML"
+data I = I
+instance Show I where show I = "I"
+data IFRAME = IFRAME
+instance Show IFRAME where show IFRAME = "IFRAME"
+data IMG = IMG
+instance Show IMG where show IMG = "IMG"
+data INPUT = INPUT
+instance Show INPUT where show INPUT = "INPUT"
+data INS = INS
+instance Show INS where show INS = "INS"
+data ISINDEX = ISINDEX
+instance Show ISINDEX where show ISINDEX = "ISINDEX"
+data KBD = KBD
+instance Show KBD where show KBD = "KBD"
+data LABEL = LABEL
+instance Show LABEL where show LABEL = "LABEL"
+data LEGEND = LEGEND
+instance Show LEGEND where show LEGEND = "LEGEND"
+data LI = LI
+instance Show LI where show LI = "LI"
+data LINK = LINK
+instance Show LINK where show LINK = "LINK"
+data MAP = MAP
+instance Show MAP where show MAP = "MAP"
+data MENU = MENU
+instance Show MENU where show MENU = "MENU"
+data META = META
+instance Show META where show META = "META"
+data NOFRAMES = NOFRAMES
+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"
+data NOSCRIPT = NOSCRIPT
+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"
+data OBJECT = OBJECT
+instance Show OBJECT where show OBJECT = "OBJECT"
+data OL = OL
+instance Show OL where show OL = "OL"
+data OPTGROUP = OPTGROUP
+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"
+data OPTION = OPTION
+instance Show OPTION where show OPTION = "OPTION"
+data P = P
+instance Show P where show P = "P"
+data PARAM = PARAM
+instance Show PARAM where show PARAM = "PARAM"
+data PRE = PRE
+instance Show PRE where show PRE = "PRE"
+data Q = Q
+instance Show Q where show Q = "Q"
+data S = S
+instance Show S where show S = "S"
+data SAMP = SAMP
+instance Show SAMP where show SAMP = "SAMP"
+data SCRIPT = SCRIPT
+instance Show SCRIPT where show SCRIPT = "SCRIPT"
+data SELECT = SELECT
+instance Show SELECT where show SELECT = "SELECT"
+data SMALL = SMALL
+instance Show SMALL where show SMALL = "SMALL"
+data SPAN = SPAN
+instance Show SPAN where show SPAN = "SPAN"
+data STRIKE = STRIKE
+instance Show STRIKE where show STRIKE = "STRIKE"
+data STRONG = STRONG
+instance Show STRONG where show STRONG = "STRONG"
+data STYLE = STYLE
+instance Show STYLE where show STYLE = "STYLE"
+data SUB = SUB
+instance Show SUB where show SUB = "SUB"
+data SUP = SUP
+instance Show SUP where show SUP = "SUP"
+data TABLE = TABLE
+instance Show TABLE where show TABLE = "TABLE"
+data TBODY = TBODY
+instance Show TBODY where show TBODY = "TBODY"
+data TD = TD
+instance Show TD where show TD = "TD"
+data TEXTAREA = TEXTAREA
+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"
+data TFOOT = TFOOT
+instance Show TFOOT where show TFOOT = "TFOOT"
+data TH = TH
+instance Show TH where show TH = "TH"
+data THEAD = THEAD
+instance Show THEAD where show THEAD = "THEAD"
+data TITLE = TITLE
+instance Show TITLE where show TITLE = "TITLE"
+data TR = TR
+instance Show TR where show TR = "TR"
+data TT = TT
+instance Show TT where show TT = "TT"
+data U = U
+instance Show U where show U = "U"
+data UL = UL
+instance Show UL where show UL = "UL"
+data VAR = VAR
+instance Show VAR where show VAR = "VAR"
+data VERSION = VERSION
+instance Show VERSION where show VERSION = "VERSION"
+data LANG = LANG
+instance Show LANG where show LANG = "LANG"
+data ONKEYUP = ONKEYUP
+instance Show ONKEYUP where show ONKEYUP = "ONKEYUP"
+data ONKEYDOWN = ONKEYDOWN
+instance Show ONKEYDOWN where show ONKEYDOWN = "ONKEYDOWN"
+data ONKEYPRESS = ONKEYPRESS
+instance Show ONKEYPRESS where show ONKEYPRESS = "ONKEYPRESS"
+data ONMOUSEOUT = ONMOUSEOUT
+instance Show ONMOUSEOUT where show ONMOUSEOUT = "ONMOUSEOUT"
+data ONMOUSEMOVE = ONMOUSEMOVE
+instance Show ONMOUSEMOVE where show ONMOUSEMOVE = "ONMOUSEMOVE"
+data ONMOUSEOVER = ONMOUSEOVER
+instance Show ONMOUSEOVER where show ONMOUSEOVER = "ONMOUSEOVER"
+data ONMOUSEUP = ONMOUSEUP
+instance Show ONMOUSEUP where show ONMOUSEUP = "ONMOUSEUP"
+data ONMOUSEDOWN = ONMOUSEDOWN
+instance Show ONMOUSEDOWN where show ONMOUSEDOWN = "ONMOUSEDOWN"
+data ONDBLCLICK = ONDBLCLICK
+instance Show ONDBLCLICK where show ONDBLCLICK = "ONDBLCLICK"
+data ONCLICK = ONCLICK
+instance Show ONCLICK where show ONCLICK = "ONCLICK"
+data CLASS = CLASS
+instance Show CLASS where show CLASS = "CLASS"
+data ID = ID
+instance Show ID where show ID = "ID"
+data FOR = FOR
+instance Show FOR where show FOR = "FOR"
+data EVENT = EVENT
+instance Show EVENT where show EVENT = "EVENT"
+data DEFER = DEFER
+instance Show DEFER where show DEFER = "DEFER"
+data SRC = SRC
+instance Show SRC where show SRC = "SRC"
+data LANGUAGE = LANGUAGE
+instance Show LANGUAGE where show LANGUAGE = "LANGUAGE"
+data TYPE = TYPE
+instance Show TYPE where show TYPE = "TYPE"
+data CHARSET = CHARSET
+instance Show CHARSET where show CHARSET = "CHARSET"
+data MEDIA = MEDIA
+instance Show MEDIA where show MEDIA = "MEDIA"
+data SCHEME = SCHEME
+instance Show SCHEME where show SCHEME = "SCHEME"
+data CONTENT = CONTENT
+instance Show CONTENT where show CONTENT = "CONTENT"
+data NAME = NAME
+instance Show NAME where show NAME = "NAME"
+data HTTP_EQUIV = HTTP_EQUIV
+instance Show HTTP_EQUIV where show HTTP_EQUIV = "HTTP-EQUIV"
+data TARGET = TARGET
+instance Show TARGET where show TARGET = "TARGET"
+data HREF = HREF
+instance Show HREF where show HREF = "HREF"
+data PROMPT = PROMPT
+instance Show PROMPT where show PROMPT = "PROMPT"
+data PROFILE = PROFILE
+instance Show PROFILE where show PROFILE = "PROFILE"
+data WIDTH = WIDTH
+instance Show WIDTH where show WIDTH = "WIDTH"
+data HEIGHT = HEIGHT
+instance Show HEIGHT where show HEIGHT = "HEIGHT"
+data ALIGN = ALIGN
+instance Show ALIGN where show ALIGN = "ALIGN"
+data SCROLLING = SCROLLING
+instance Show SCROLLING where show SCROLLING = "SCROLLING"
+data MARGINHEIGHT = MARGINHEIGHT
+instance Show MARGINHEIGHT where show MARGINHEIGHT = "MARGINHEIGHT"
+data MARGINWIDTH = MARGINWIDTH
+instance Show MARGINWIDTH where show MARGINWIDTH = "MARGINWIDTH"
+data FRAMEBORDER = FRAMEBORDER
+instance Show FRAMEBORDER where show FRAMEBORDER = "FRAMEBORDER"
+data LONGDESC = LONGDESC
+instance Show LONGDESC where show LONGDESC = "LONGDESC"
+data BGCOLOR = BGCOLOR
+instance Show BGCOLOR where show BGCOLOR = "BGCOLOR"
+data NOWRAP = NOWRAP
+instance Show NOWRAP where show NOWRAP = "NOWRAP"
+data VALIGN = VALIGN
+instance Show VALIGN where show VALIGN = "VALIGN"
+data CHAROFF = CHAROFF
+instance Show CHAROFF where show CHAROFF = "CHAROFF"
+data CHAR = CHAR
+instance Show CHAR where show CHAR = "CHAR"
+data COLSPAN = COLSPAN
+instance Show COLSPAN where show COLSPAN = "COLSPAN"
+data ROWSPAN = ROWSPAN
+instance Show ROWSPAN where show ROWSPAN = "ROWSPAN"
+data SCOPE = SCOPE
+instance Show SCOPE where show SCOPE = "SCOPE"
+data HEADERS = HEADERS
+instance Show HEADERS where show HEADERS = "HEADERS"
+data AXIS = AXIS
+instance Show AXIS where show AXIS = "AXIS"
+data DATAPAGESIZE = DATAPAGESIZE
+instance Show DATAPAGESIZE where show DATAPAGESIZE = "DATAPAGESIZE"
+data CELLPADDING = CELLPADDING
+instance Show CELLPADDING where show CELLPADDING = "CELLPADDING"
+data CELLSPACING = CELLSPACING
+instance Show CELLSPACING where show CELLSPACING = "CELLSPACING"
+data RULES = RULES
+instance Show RULES where show RULES = "RULES"
+data FRAME = FRAME
+instance Show FRAME where show FRAME = "FRAME"
+data BORDER = BORDER
+instance Show BORDER where show BORDER = "BORDER"
+data SUMMARY = SUMMARY
+instance Show SUMMARY where show SUMMARY = "SUMMARY"
+data ONBLUR = ONBLUR
+instance Show ONBLUR where show ONBLUR = "ONBLUR"
+data ONFOCUS = ONFOCUS
+instance Show ONFOCUS where show ONFOCUS = "ONFOCUS"
+data ACCESSKEY = ACCESSKEY
+instance Show ACCESSKEY where show ACCESSKEY = "ACCESSKEY"
+data TABINDEX = TABINDEX
+instance Show TABINDEX where show TABINDEX = "TABINDEX"
+data DISABLED = DISABLED
+instance Show DISABLED where show DISABLED = "DISABLED"
+data VALUE = VALUE
+instance Show VALUE where show VALUE = "VALUE"
+data ONCHANGE = ONCHANGE
+instance Show ONCHANGE where show ONCHANGE = "ONCHANGE"
+data ONSELECT = ONSELECT
+instance Show ONSELECT where show ONSELECT = "ONSELECT"
+data READONLY = READONLY
+instance Show READONLY where show READONLY = "READONLY"
+data COLS = COLS
+instance Show COLS where show COLS = "COLS"
+data ROWS = ROWS
+instance Show ROWS where show ROWS = "ROWS"
+data SELECTED = SELECTED
+instance Show SELECTED where show SELECTED = "SELECTED"
+data MULTIPLE = MULTIPLE
+instance Show MULTIPLE where show MULTIPLE = "MULTIPLE"
+data SIZE = SIZE
+instance Show SIZE where show SIZE = "SIZE"
+data ACCEPT = ACCEPT
+instance Show ACCEPT where show ACCEPT = "ACCEPT"
+data USEMAP = USEMAP
+instance Show USEMAP where show USEMAP = "USEMAP"
+data ALT = ALT
+instance Show ALT where show ALT = "ALT"
+data MAXLENGTH = MAXLENGTH
+instance Show MAXLENGTH where show MAXLENGTH = "MAXLENGTH"
+data CHECKED = CHECKED
+instance Show CHECKED where show CHECKED = "CHECKED"
+data ACCEPT_CHARSET = ACCEPT_CHARSET
+instance Show ACCEPT_CHARSET where show ACCEPT_CHARSET = "ACCEPT-CHARSET"
+data ONRESET = ONRESET
+instance Show ONRESET where show ONRESET = "ONRESET"
+data ONSUBMIT = ONSUBMIT
+instance Show ONSUBMIT where show ONSUBMIT = "ONSUBMIT"
+data ENCTYPE = ENCTYPE
+instance Show ENCTYPE where show ENCTYPE = "ENCTYPE"
+data METHOD = METHOD
+instance Show METHOD where show METHOD = "METHOD"
+data ACTION = ACTION
+instance Show ACTION where show ACTION = "ACTION"
+data COMPACT = COMPACT
+instance Show COMPACT where show COMPACT = "COMPACT"
+data START = START
+instance Show START where show START = "START"
+data DATETIME = DATETIME
+instance Show DATETIME where show DATETIME = "DATETIME"
+data NOSHADE = NOSHADE
+instance Show NOSHADE where show NOSHADE = "NOSHADE"
+data VSPACE = VSPACE
+instance Show VSPACE where show VSPACE = "VSPACE"
+data HSPACE = HSPACE
+instance Show HSPACE where show HSPACE = "HSPACE"
+data ARCHIVE = ARCHIVE
+instance Show ARCHIVE where show ARCHIVE = "ARCHIVE"
+data CODEBASE = CODEBASE
+instance Show CODEBASE where show CODEBASE = "CODEBASE"
+data VALUETYPE = VALUETYPE
+instance Show VALUETYPE where show VALUETYPE = "VALUETYPE"
+data STANDBY = STANDBY
+instance Show STANDBY where show STANDBY = "STANDBY"
+data CODETYPE = CODETYPE
+instance Show CODETYPE where show CODETYPE = "CODETYPE"
+data DATA = DATA
+instance Show DATA where show DATA = "DATA"
+data CLASSID = CLASSID
+instance Show CLASSID where show CLASSID = "CLASSID"
+data DECLARE = DECLARE
+instance Show DECLARE where show DECLARE = "DECLARE"
+data ISMAP = ISMAP
+instance Show ISMAP where show ISMAP = "ISMAP"
+data REV = REV
+instance Show REV where show REV = "REV"
+data REL = REL
+instance Show REL where show REL = "REL"
+data HREFLANG = HREFLANG
+instance Show HREFLANG where show HREFLANG = "HREFLANG"
+data NOHREF = NOHREF
+instance Show NOHREF where show NOHREF = "NOHREF"
+data COORDS = COORDS
+instance Show COORDS where show COORDS = "COORDS"
+data SHAPE = SHAPE
+instance Show SHAPE where show SHAPE = "SHAPE"
+data ALINK = ALINK
+instance Show ALINK where show ALINK = "ALINK"
+data VLINK = VLINK
+instance Show VLINK where show VLINK = "VLINK"
+data TEXT = TEXT
+instance Show TEXT where show TEXT = "TEXT"
+data BACKGROUND = BACKGROUND
+instance Show BACKGROUND where show BACKGROUND = "BACKGROUND"
+data ONUNLOAD = ONUNLOAD
+instance Show ONUNLOAD where show ONUNLOAD = "ONUNLOAD"
+data ONLOAD = ONLOAD
+instance Show ONLOAD where show ONLOAD = "ONLOAD"
+data CLEAR = CLEAR
+instance Show CLEAR where show CLEAR = "CLEAR"
+data FACE = FACE
+instance Show FACE where show FACE = "FACE"
+data COLOR = COLOR
+instance Show COLOR where show COLOR = "COLOR"
+instance TAG HTML
+instance AddTo HTML HEAD
+instance AddTo HTML BODY
+instance TAG NOSCRIPT
+instance AddTo NOSCRIPT P
+instance AddTo NOSCRIPT H1
+instance AddTo NOSCRIPT H2
+instance AddTo NOSCRIPT H3
+instance AddTo NOSCRIPT H4
+instance AddTo NOSCRIPT H5
+instance AddTo NOSCRIPT H6
+instance AddTo NOSCRIPT UL
+instance AddTo NOSCRIPT OL
+instance AddTo NOSCRIPT DIR
+instance AddTo NOSCRIPT MENU
+instance AddTo NOSCRIPT PRE
+instance AddTo NOSCRIPT DL
+instance AddTo NOSCRIPT DIV
+instance AddTo NOSCRIPT CENTER
+instance AddTo NOSCRIPT NOSCRIPT
+instance AddTo NOSCRIPT NOFRAMES
+instance AddTo NOSCRIPT BLOCKQUOTE
+instance AddTo NOSCRIPT FORM
+instance AddTo NOSCRIPT ISINDEX
+instance AddTo NOSCRIPT HR
+instance AddTo NOSCRIPT TABLE
+instance AddTo NOSCRIPT FIELDSET
+instance AddTo NOSCRIPT ADDRESS
+instance AddTo NOSCRIPT CDATA
+instance AddTo NOSCRIPT TT
+instance AddTo NOSCRIPT I
+instance AddTo NOSCRIPT B
+instance AddTo NOSCRIPT U
+instance AddTo NOSCRIPT S
+instance AddTo NOSCRIPT STRIKE
+instance AddTo NOSCRIPT BIG
+instance AddTo NOSCRIPT SMALL
+instance AddTo NOSCRIPT EM
+instance AddTo NOSCRIPT STRONG
+instance AddTo NOSCRIPT DFN
+instance AddTo NOSCRIPT CODE
+instance AddTo NOSCRIPT SAMP
+instance AddTo NOSCRIPT KBD
+instance AddTo NOSCRIPT VAR
+instance AddTo NOSCRIPT CITE
+instance AddTo NOSCRIPT ABBR
+instance AddTo NOSCRIPT ACRONYM
+instance AddTo NOSCRIPT A
+instance AddTo NOSCRIPT IMG
+instance AddTo NOSCRIPT APPLET
+instance AddTo NOSCRIPT OBJECT
+instance AddTo NOSCRIPT FONT
+instance AddTo NOSCRIPT BASEFONT
+instance AddTo NOSCRIPT BR
+instance AddTo NOSCRIPT SCRIPT
+instance AddTo NOSCRIPT MAP
+instance AddTo NOSCRIPT Q
+instance AddTo NOSCRIPT SUB
+instance AddTo NOSCRIPT SUP
+instance AddTo NOSCRIPT SPAN
+instance AddTo NOSCRIPT BDO
+instance AddTo NOSCRIPT IFRAME
+instance AddTo NOSCRIPT INPUT
+instance AddTo NOSCRIPT SELECT
+instance AddTo NOSCRIPT TEXTAREA
+instance AddTo NOSCRIPT LABEL
+instance AddTo NOSCRIPT BUTTON
+instance TAG SCRIPT
+instance AddTo SCRIPT CDATA
+instance TAG STYLE
+instance AddTo STYLE CDATA
+instance TAG META where make = make_empty
+instance TAG BASE where make = make_empty
+instance TAG ISINDEX where make = make_empty
+instance TAG TITLE
+instance AddTo TITLE CDATA
+instance TAG HEAD
+instance AddTo HEAD TITLE
+instance AddTo HEAD ISINDEX
+instance AddTo HEAD BASE
+instance AddTo HEAD SCRIPT
+instance AddTo HEAD STYLE
+instance AddTo HEAD META
+instance AddTo HEAD LINK
+instance AddTo HEAD OBJECT
+instance TAG NOFRAMES
+instance AddTo NOFRAMES P
+instance AddTo NOFRAMES H1
+instance AddTo NOFRAMES H2
+instance AddTo NOFRAMES H3
+instance AddTo NOFRAMES H4
+instance AddTo NOFRAMES H5
+instance AddTo NOFRAMES H6
+instance AddTo NOFRAMES UL
+instance AddTo NOFRAMES OL
+instance AddTo NOFRAMES DIR
+instance AddTo NOFRAMES MENU
+instance AddTo NOFRAMES PRE
+instance AddTo NOFRAMES DL
+instance AddTo NOFRAMES DIV
+instance AddTo NOFRAMES CENTER
+instance AddTo NOFRAMES NOSCRIPT
+instance AddTo NOFRAMES NOFRAMES
+instance AddTo NOFRAMES BLOCKQUOTE
+instance AddTo NOFRAMES FORM
+instance AddTo NOFRAMES ISINDEX
+instance AddTo NOFRAMES HR
+instance AddTo NOFRAMES TABLE
+instance AddTo NOFRAMES FIELDSET
+instance AddTo NOFRAMES ADDRESS
+instance AddTo NOFRAMES CDATA
+instance AddTo NOFRAMES TT
+instance AddTo NOFRAMES I
+instance AddTo NOFRAMES B
+instance AddTo NOFRAMES U
+instance AddTo NOFRAMES S
+instance AddTo NOFRAMES STRIKE
+instance AddTo NOFRAMES BIG
+instance AddTo NOFRAMES SMALL
+instance AddTo NOFRAMES EM
+instance AddTo NOFRAMES STRONG
+instance AddTo NOFRAMES DFN
+instance AddTo NOFRAMES CODE
+instance AddTo NOFRAMES SAMP
+instance AddTo NOFRAMES KBD
+instance AddTo NOFRAMES VAR
+instance AddTo NOFRAMES CITE
+instance AddTo NOFRAMES ABBR
+instance AddTo NOFRAMES ACRONYM
+instance AddTo NOFRAMES A
+instance AddTo NOFRAMES IMG
+instance AddTo NOFRAMES APPLET
+instance AddTo NOFRAMES OBJECT
+instance AddTo NOFRAMES FONT
+instance AddTo NOFRAMES BASEFONT
+instance AddTo NOFRAMES BR
+instance AddTo NOFRAMES SCRIPT
+instance AddTo NOFRAMES MAP
+instance AddTo NOFRAMES Q
+instance AddTo NOFRAMES SUB
+instance AddTo NOFRAMES SUP
+instance AddTo NOFRAMES SPAN
+instance AddTo NOFRAMES BDO
+instance AddTo NOFRAMES IFRAME
+instance AddTo NOFRAMES INPUT
+instance AddTo NOFRAMES SELECT
+instance AddTo NOFRAMES TEXTAREA
+instance AddTo NOFRAMES LABEL
+instance AddTo NOFRAMES BUTTON
+instance TAG IFRAME
+instance AddTo IFRAME P
+instance AddTo IFRAME H1
+instance AddTo IFRAME H2
+instance AddTo IFRAME H3
+instance AddTo IFRAME H4
+instance AddTo IFRAME H5
+instance AddTo IFRAME H6
+instance AddTo IFRAME UL
+instance AddTo IFRAME OL
+instance AddTo IFRAME DIR
+instance AddTo IFRAME MENU
+instance AddTo IFRAME PRE
+instance AddTo IFRAME DL
+instance AddTo IFRAME DIV
+instance AddTo IFRAME CENTER
+instance AddTo IFRAME NOSCRIPT
+instance AddTo IFRAME NOFRAMES
+instance AddTo IFRAME BLOCKQUOTE
+instance AddTo IFRAME FORM
+instance AddTo IFRAME ISINDEX
+instance AddTo IFRAME HR
+instance AddTo IFRAME TABLE
+instance AddTo IFRAME FIELDSET
+instance AddTo IFRAME ADDRESS
+instance AddTo IFRAME CDATA
+instance AddTo IFRAME TT
+instance AddTo IFRAME I
+instance AddTo IFRAME B
+instance AddTo IFRAME U
+instance AddTo IFRAME S
+instance AddTo IFRAME STRIKE
+instance AddTo IFRAME BIG
+instance AddTo IFRAME SMALL
+instance AddTo IFRAME EM
+instance AddTo IFRAME STRONG
+instance AddTo IFRAME DFN
+instance AddTo IFRAME CODE
+instance AddTo IFRAME SAMP
+instance AddTo IFRAME KBD
+instance AddTo IFRAME VAR
+instance AddTo IFRAME CITE
+instance AddTo IFRAME ABBR
+instance AddTo IFRAME ACRONYM
+instance AddTo IFRAME A
+instance AddTo IFRAME IMG
+instance AddTo IFRAME APPLET
+instance AddTo IFRAME OBJECT
+instance AddTo IFRAME FONT
+instance AddTo IFRAME BASEFONT
+instance AddTo IFRAME BR
+instance AddTo IFRAME SCRIPT
+instance AddTo IFRAME MAP
+instance AddTo IFRAME Q
+instance AddTo IFRAME SUB
+instance AddTo IFRAME SUP
+instance AddTo IFRAME SPAN
+instance AddTo IFRAME BDO
+instance AddTo IFRAME IFRAME
+instance AddTo IFRAME INPUT
+instance AddTo IFRAME SELECT
+instance AddTo IFRAME TEXTAREA
+instance AddTo IFRAME LABEL
+instance AddTo IFRAME BUTTON
+instance TAG TH
+instance AddTo TH P
+instance AddTo TH H1
+instance AddTo TH H2
+instance AddTo TH H3
+instance AddTo TH H4
+instance AddTo TH H5
+instance AddTo TH H6
+instance AddTo TH UL
+instance AddTo TH OL
+instance AddTo TH DIR
+instance AddTo TH MENU
+instance AddTo TH PRE
+instance AddTo TH DL
+instance AddTo TH DIV
+instance AddTo TH CENTER
+instance AddTo TH NOSCRIPT
+instance AddTo TH NOFRAMES
+instance AddTo TH BLOCKQUOTE
+instance AddTo TH FORM
+instance AddTo TH ISINDEX
+instance AddTo TH HR
+instance AddTo TH TABLE
+instance AddTo TH FIELDSET
+instance AddTo TH ADDRESS
+instance AddTo TH CDATA
+instance AddTo TH TT
+instance AddTo TH I
+instance AddTo TH B
+instance AddTo TH U
+instance AddTo TH S
+instance AddTo TH STRIKE
+instance AddTo TH BIG
+instance AddTo TH SMALL
+instance AddTo TH EM
+instance AddTo TH STRONG
+instance AddTo TH DFN
+instance AddTo TH CODE
+instance AddTo TH SAMP
+instance AddTo TH KBD
+instance AddTo TH VAR
+instance AddTo TH CITE
+instance AddTo TH ABBR
+instance AddTo TH ACRONYM
+instance AddTo TH A
+instance AddTo TH IMG
+instance AddTo TH APPLET
+instance AddTo TH OBJECT
+instance AddTo TH FONT
+instance AddTo TH BASEFONT
+instance AddTo TH BR
+instance AddTo TH SCRIPT
+instance AddTo TH MAP
+instance AddTo TH Q
+instance AddTo TH SUB
+instance AddTo TH SUP
+instance AddTo TH SPAN
+instance AddTo TH BDO
+instance AddTo TH IFRAME
+instance AddTo TH INPUT
+instance AddTo TH SELECT
+instance AddTo TH TEXTAREA
+instance AddTo TH LABEL
+instance AddTo TH BUTTON
+instance TAG TD
+instance AddTo TD P
+instance AddTo TD H1
+instance AddTo TD H2
+instance AddTo TD H3
+instance AddTo TD H4
+instance AddTo TD H5
+instance AddTo TD H6
+instance AddTo TD UL
+instance AddTo TD OL
+instance AddTo TD DIR
+instance AddTo TD MENU
+instance AddTo TD PRE
+instance AddTo TD DL
+instance AddTo TD DIV
+instance AddTo TD CENTER
+instance AddTo TD NOSCRIPT
+instance AddTo TD NOFRAMES
+instance AddTo TD BLOCKQUOTE
+instance AddTo TD FORM
+instance AddTo TD ISINDEX
+instance AddTo TD HR
+instance AddTo TD TABLE
+instance AddTo TD FIELDSET
+instance AddTo TD ADDRESS
+instance AddTo TD CDATA
+instance AddTo TD TT
+instance AddTo TD I
+instance AddTo TD B
+instance AddTo TD U
+instance AddTo TD S
+instance AddTo TD STRIKE
+instance AddTo TD BIG
+instance AddTo TD SMALL
+instance AddTo TD EM
+instance AddTo TD STRONG
+instance AddTo TD DFN
+instance AddTo TD CODE
+instance AddTo TD SAMP
+instance AddTo TD KBD
+instance AddTo TD VAR
+instance AddTo TD CITE
+instance AddTo TD ABBR
+instance AddTo TD ACRONYM
+instance AddTo TD A
+instance AddTo TD IMG
+instance AddTo TD APPLET
+instance AddTo TD OBJECT
+instance AddTo TD FONT
+instance AddTo TD BASEFONT
+instance AddTo TD BR
+instance AddTo TD SCRIPT
+instance AddTo TD MAP
+instance AddTo TD Q
+instance AddTo TD SUB
+instance AddTo TD SUP
+instance AddTo TD SPAN
+instance AddTo TD BDO
+instance AddTo TD IFRAME
+instance AddTo TD INPUT
+instance AddTo TD SELECT
+instance AddTo TD TEXTAREA
+instance AddTo TD LABEL
+instance AddTo TD BUTTON
+instance TAG TR
+instance AddTo TR TH
+instance AddTo TR TD
+instance TAG COL where make = make_empty
+instance TAG COLGROUP
+instance AddTo COLGROUP COL
+instance TAG TBODY
+instance AddTo TBODY TR
+instance TAG TFOOT
+instance AddTo TFOOT TR
+instance TAG THEAD
+instance AddTo THEAD TR
+instance TAG CAPTION
+instance AddTo CAPTION CDATA
+instance AddTo CAPTION TT
+instance AddTo CAPTION I
+instance AddTo CAPTION B
+instance AddTo CAPTION U
+instance AddTo CAPTION S
+instance AddTo CAPTION STRIKE
+instance AddTo CAPTION BIG
+instance AddTo CAPTION SMALL
+instance AddTo CAPTION EM
+instance AddTo CAPTION STRONG
+instance AddTo CAPTION DFN
+instance AddTo CAPTION CODE
+instance AddTo CAPTION SAMP
+instance AddTo CAPTION KBD
+instance AddTo CAPTION VAR
+instance AddTo CAPTION CITE
+instance AddTo CAPTION ABBR
+instance AddTo CAPTION ACRONYM
+instance AddTo CAPTION A
+instance AddTo CAPTION IMG
+instance AddTo CAPTION APPLET
+instance AddTo CAPTION OBJECT
+instance AddTo CAPTION FONT
+instance AddTo CAPTION BASEFONT
+instance AddTo CAPTION BR
+instance AddTo CAPTION SCRIPT
+instance AddTo CAPTION MAP
+instance AddTo CAPTION Q
+instance AddTo CAPTION SUB
+instance AddTo CAPTION SUP
+instance AddTo CAPTION SPAN
+instance AddTo CAPTION BDO
+instance AddTo CAPTION IFRAME
+instance AddTo CAPTION INPUT
+instance AddTo CAPTION SELECT
+instance AddTo CAPTION TEXTAREA
+instance AddTo CAPTION LABEL
+instance AddTo CAPTION BUTTON
+instance TAG TABLE
+instance AddTo TABLE CAPTION
+instance AddTo TABLE COL
+instance AddTo TABLE COLGROUP
+instance AddTo TABLE THEAD
+instance AddTo TABLE TFOOT
+instance AddTo TABLE TBODY
+instance TAG BUTTON
+instance AddTo BUTTON P
+instance AddTo BUTTON H1
+instance AddTo BUTTON H2
+instance AddTo BUTTON H3
+instance AddTo BUTTON H4
+instance AddTo BUTTON H5
+instance AddTo BUTTON H6
+instance AddTo BUTTON UL
+instance AddTo BUTTON OL
+instance AddTo BUTTON DIR
+instance AddTo BUTTON MENU
+instance AddTo BUTTON PRE
+instance AddTo BUTTON DL
+instance AddTo BUTTON DIV
+instance AddTo BUTTON CENTER
+instance AddTo BUTTON NOSCRIPT
+instance AddTo BUTTON NOFRAMES
+instance AddTo BUTTON BLOCKQUOTE
+instance AddTo BUTTON HR
+instance AddTo BUTTON TABLE
+instance AddTo BUTTON ADDRESS
+instance AddTo BUTTON CDATA
+instance AddTo BUTTON TT
+instance AddTo BUTTON I
+instance AddTo BUTTON B
+instance AddTo BUTTON U
+instance AddTo BUTTON S
+instance AddTo BUTTON STRIKE
+instance AddTo BUTTON BIG
+instance AddTo BUTTON SMALL
+instance AddTo BUTTON EM
+instance AddTo BUTTON STRONG
+instance AddTo BUTTON DFN
+instance AddTo BUTTON CODE
+instance AddTo BUTTON SAMP
+instance AddTo BUTTON KBD
+instance AddTo BUTTON VAR
+instance AddTo BUTTON CITE
+instance AddTo BUTTON ABBR
+instance AddTo BUTTON ACRONYM
+instance AddTo BUTTON IMG
+instance AddTo BUTTON APPLET
+instance AddTo BUTTON OBJECT
+instance AddTo BUTTON FONT
+instance AddTo BUTTON BASEFONT
+instance AddTo BUTTON BR
+instance AddTo BUTTON SCRIPT
+instance AddTo BUTTON MAP
+instance AddTo BUTTON Q
+instance AddTo BUTTON SUB
+instance AddTo BUTTON SUP
+instance AddTo BUTTON SPAN
+instance AddTo BUTTON BDO
+instance TAG LEGEND
+instance AddTo LEGEND CDATA
+instance AddTo LEGEND TT
+instance AddTo LEGEND I
+instance AddTo LEGEND B
+instance AddTo LEGEND U
+instance AddTo LEGEND S
+instance AddTo LEGEND STRIKE
+instance AddTo LEGEND BIG
+instance AddTo LEGEND SMALL
+instance AddTo LEGEND EM
+instance AddTo LEGEND STRONG
+instance AddTo LEGEND DFN
+instance AddTo LEGEND CODE
+instance AddTo LEGEND SAMP
+instance AddTo LEGEND KBD
+instance AddTo LEGEND VAR
+instance AddTo LEGEND CITE
+instance AddTo LEGEND ABBR
+instance AddTo LEGEND ACRONYM
+instance AddTo LEGEND A
+instance AddTo LEGEND IMG
+instance AddTo LEGEND APPLET
+instance AddTo LEGEND OBJECT
+instance AddTo LEGEND FONT
+instance AddTo LEGEND BASEFONT
+instance AddTo LEGEND BR
+instance AddTo LEGEND SCRIPT
+instance AddTo LEGEND MAP
+instance AddTo LEGEND Q
+instance AddTo LEGEND SUB
+instance AddTo LEGEND SUP
+instance AddTo LEGEND SPAN
+instance AddTo LEGEND BDO
+instance AddTo LEGEND IFRAME
+instance AddTo LEGEND INPUT
+instance AddTo LEGEND SELECT
+instance AddTo LEGEND TEXTAREA
+instance AddTo LEGEND LABEL
+instance AddTo LEGEND BUTTON
+instance TAG FIELDSET
+instance AddTo FIELDSET CDATA
+instance AddTo FIELDSET LEGEND
+instance AddTo FIELDSET P
+instance AddTo FIELDSET H1
+instance AddTo FIELDSET H2
+instance AddTo FIELDSET H3
+instance AddTo FIELDSET H4
+instance AddTo FIELDSET H5
+instance AddTo FIELDSET H6
+instance AddTo FIELDSET UL
+instance AddTo FIELDSET OL
+instance AddTo FIELDSET DIR
+instance AddTo FIELDSET MENU
+instance AddTo FIELDSET PRE
+instance AddTo FIELDSET DL
+instance AddTo FIELDSET DIV
+instance AddTo FIELDSET CENTER
+instance AddTo FIELDSET NOSCRIPT
+instance AddTo FIELDSET NOFRAMES
+instance AddTo FIELDSET BLOCKQUOTE
+instance AddTo FIELDSET FORM
+instance AddTo FIELDSET ISINDEX
+instance AddTo FIELDSET HR
+instance AddTo FIELDSET TABLE
+instance AddTo FIELDSET FIELDSET
+instance AddTo FIELDSET ADDRESS
+instance AddTo FIELDSET TT
+instance AddTo FIELDSET I
+instance AddTo FIELDSET B
+instance AddTo FIELDSET U
+instance AddTo FIELDSET S
+instance AddTo FIELDSET STRIKE
+instance AddTo FIELDSET BIG
+instance AddTo FIELDSET SMALL
+instance AddTo FIELDSET EM
+instance AddTo FIELDSET STRONG
+instance AddTo FIELDSET DFN
+instance AddTo FIELDSET CODE
+instance AddTo FIELDSET SAMP
+instance AddTo FIELDSET KBD
+instance AddTo FIELDSET VAR
+instance AddTo FIELDSET CITE
+instance AddTo FIELDSET ABBR
+instance AddTo FIELDSET ACRONYM
+instance AddTo FIELDSET A
+instance AddTo FIELDSET IMG
+instance AddTo FIELDSET APPLET
+instance AddTo FIELDSET OBJECT
+instance AddTo FIELDSET FONT
+instance AddTo FIELDSET BASEFONT
+instance AddTo FIELDSET BR
+instance AddTo FIELDSET SCRIPT
+instance AddTo FIELDSET MAP
+instance AddTo FIELDSET Q
+instance AddTo FIELDSET SUB
+instance AddTo FIELDSET SUP
+instance AddTo FIELDSET SPAN
+instance AddTo FIELDSET BDO
+instance AddTo FIELDSET IFRAME
+instance AddTo FIELDSET INPUT
+instance AddTo FIELDSET SELECT
+instance AddTo FIELDSET TEXTAREA
+instance AddTo FIELDSET LABEL
+instance AddTo FIELDSET BUTTON
+instance TAG TEXTAREA
+instance AddTo TEXTAREA CDATA
+instance TAG OPTION
+instance AddTo OPTION CDATA
+instance TAG OPTGROUP
+instance AddTo OPTGROUP OPTION
+instance TAG SELECT
+instance AddTo SELECT OPTGROUP
+instance AddTo SELECT OPTION
+instance TAG INPUT where make = make_empty
+instance TAG LABEL
+instance AddTo LABEL CDATA
+instance AddTo LABEL TT
+instance AddTo LABEL I
+instance AddTo LABEL B
+instance AddTo LABEL U
+instance AddTo LABEL S
+instance AddTo LABEL STRIKE
+instance AddTo LABEL BIG
+instance AddTo LABEL SMALL
+instance AddTo LABEL EM
+instance AddTo LABEL STRONG
+instance AddTo LABEL DFN
+instance AddTo LABEL CODE
+instance AddTo LABEL SAMP
+instance AddTo LABEL KBD
+instance AddTo LABEL VAR
+instance AddTo LABEL CITE
+instance AddTo LABEL ABBR
+instance AddTo LABEL ACRONYM
+instance AddTo LABEL A
+instance AddTo LABEL IMG
+instance AddTo LABEL APPLET
+instance AddTo LABEL OBJECT
+instance AddTo LABEL FONT
+instance AddTo LABEL BASEFONT
+instance AddTo LABEL BR
+instance AddTo LABEL SCRIPT
+instance AddTo LABEL MAP
+instance AddTo LABEL Q
+instance AddTo LABEL SUB
+instance AddTo LABEL SUP
+instance AddTo LABEL SPAN
+instance AddTo LABEL BDO
+instance AddTo LABEL IFRAME
+instance AddTo LABEL INPUT
+instance AddTo LABEL SELECT
+instance AddTo LABEL TEXTAREA
+instance AddTo LABEL BUTTON
+instance TAG FORM
+instance AddTo FORM P
+instance AddTo FORM H1
+instance AddTo FORM H2
+instance AddTo FORM H3
+instance AddTo FORM H4
+instance AddTo FORM H5
+instance AddTo FORM H6
+instance AddTo FORM UL
+instance AddTo FORM OL
+instance AddTo FORM DIR
+instance AddTo FORM MENU
+instance AddTo FORM PRE
+instance AddTo FORM DL
+instance AddTo FORM DIV
+instance AddTo FORM CENTER
+instance AddTo FORM NOSCRIPT
+instance AddTo FORM NOFRAMES
+instance AddTo FORM BLOCKQUOTE
+instance AddTo FORM ISINDEX
+instance AddTo FORM HR
+instance AddTo FORM TABLE
+instance AddTo FORM FIELDSET
+instance AddTo FORM ADDRESS
+instance AddTo FORM CDATA
+instance AddTo FORM TT
+instance AddTo FORM I
+instance AddTo FORM B
+instance AddTo FORM U
+instance AddTo FORM S
+instance AddTo FORM STRIKE
+instance AddTo FORM BIG
+instance AddTo FORM SMALL
+instance AddTo FORM EM
+instance AddTo FORM STRONG
+instance AddTo FORM DFN
+instance AddTo FORM CODE
+instance AddTo FORM SAMP
+instance AddTo FORM KBD
+instance AddTo FORM VAR
+instance AddTo FORM CITE
+instance AddTo FORM ABBR
+instance AddTo FORM ACRONYM
+instance AddTo FORM A
+instance AddTo FORM IMG
+instance AddTo FORM APPLET
+instance AddTo FORM OBJECT
+instance AddTo FORM FONT
+instance AddTo FORM BASEFONT
+instance AddTo FORM BR
+instance AddTo FORM SCRIPT
+instance AddTo FORM MAP
+instance AddTo FORM Q
+instance AddTo FORM SUB
+instance AddTo FORM SUP
+instance AddTo FORM SPAN
+instance AddTo FORM BDO
+instance AddTo FORM IFRAME
+instance AddTo FORM INPUT
+instance AddTo FORM SELECT
+instance AddTo FORM TEXTAREA
+instance AddTo FORM LABEL
+instance AddTo FORM BUTTON
+instance TAG LI
+instance AddTo LI P
+instance AddTo LI H1
+instance AddTo LI H2
+instance AddTo LI H3
+instance AddTo LI H4
+instance AddTo LI H5
+instance AddTo LI H6
+instance AddTo LI UL
+instance AddTo LI OL
+instance AddTo LI DIR
+instance AddTo LI MENU
+instance AddTo LI PRE
+instance AddTo LI DL
+instance AddTo LI DIV
+instance AddTo LI CENTER
+instance AddTo LI NOSCRIPT
+instance AddTo LI NOFRAMES
+instance AddTo LI BLOCKQUOTE
+instance AddTo LI FORM
+instance AddTo LI ISINDEX
+instance AddTo LI HR
+instance AddTo LI TABLE
+instance AddTo LI FIELDSET
+instance AddTo LI ADDRESS
+instance AddTo LI CDATA
+instance AddTo LI TT
+instance AddTo LI I
+instance AddTo LI B
+instance AddTo LI U
+instance AddTo LI S
+instance AddTo LI STRIKE
+instance AddTo LI BIG
+instance AddTo LI SMALL
+instance AddTo LI EM
+instance AddTo LI STRONG
+instance AddTo LI DFN
+instance AddTo LI CODE
+instance AddTo LI SAMP
+instance AddTo LI KBD
+instance AddTo LI VAR
+instance AddTo LI CITE
+instance AddTo LI ABBR
+instance AddTo LI ACRONYM
+instance AddTo LI A
+instance AddTo LI IMG
+instance AddTo LI APPLET
+instance AddTo LI OBJECT
+instance AddTo LI FONT
+instance AddTo LI BASEFONT
+instance AddTo LI BR
+instance AddTo LI SCRIPT
+instance AddTo LI MAP
+instance AddTo LI Q
+instance AddTo LI SUB
+instance AddTo LI SUP
+instance AddTo LI SPAN
+instance AddTo LI BDO
+instance AddTo LI IFRAME
+instance AddTo LI INPUT
+instance AddTo LI SELECT
+instance AddTo LI TEXTAREA
+instance AddTo LI LABEL
+instance AddTo LI BUTTON
+instance TAG DIR
+instance AddTo DIR LI
+instance TAG MENU
+instance AddTo MENU LI
+instance TAG UL
+instance AddTo UL LI
+instance TAG OL
+instance AddTo OL LI
+instance TAG DD
+instance AddTo DD P
+instance AddTo DD H1
+instance AddTo DD H2
+instance AddTo DD H3
+instance AddTo DD H4
+instance AddTo DD H5
+instance AddTo DD H6
+instance AddTo DD UL
+instance AddTo DD OL
+instance AddTo DD DIR
+instance AddTo DD MENU
+instance AddTo DD PRE
+instance AddTo DD DL
+instance AddTo DD DIV
+instance AddTo DD CENTER
+instance AddTo DD NOSCRIPT
+instance AddTo DD NOFRAMES
+instance AddTo DD BLOCKQUOTE
+instance AddTo DD FORM
+instance AddTo DD ISINDEX
+instance AddTo DD HR
+instance AddTo DD TABLE
+instance AddTo DD FIELDSET
+instance AddTo DD ADDRESS
+instance AddTo DD CDATA
+instance AddTo DD TT
+instance AddTo DD I
+instance AddTo DD B
+instance AddTo DD U
+instance AddTo DD S
+instance AddTo DD STRIKE
+instance AddTo DD BIG
+instance AddTo DD SMALL
+instance AddTo DD EM
+instance AddTo DD STRONG
+instance AddTo DD DFN
+instance AddTo DD CODE
+instance AddTo DD SAMP
+instance AddTo DD KBD
+instance AddTo DD VAR
+instance AddTo DD CITE
+instance AddTo DD ABBR
+instance AddTo DD ACRONYM
+instance AddTo DD A
+instance AddTo DD IMG
+instance AddTo DD APPLET
+instance AddTo DD OBJECT
+instance AddTo DD FONT
+instance AddTo DD BASEFONT
+instance AddTo DD BR
+instance AddTo DD SCRIPT
+instance AddTo DD MAP
+instance AddTo DD Q
+instance AddTo DD SUB
+instance AddTo DD SUP
+instance AddTo DD SPAN
+instance AddTo DD BDO
+instance AddTo DD IFRAME
+instance AddTo DD INPUT
+instance AddTo DD SELECT
+instance AddTo DD TEXTAREA
+instance AddTo DD LABEL
+instance AddTo DD BUTTON
+instance TAG DT
+instance AddTo DT CDATA
+instance AddTo DT TT
+instance AddTo DT I
+instance AddTo DT B
+instance AddTo DT U
+instance AddTo DT S
+instance AddTo DT STRIKE
+instance AddTo DT BIG
+instance AddTo DT SMALL
+instance AddTo DT EM
+instance AddTo DT STRONG
+instance AddTo DT DFN
+instance AddTo DT CODE
+instance AddTo DT SAMP
+instance AddTo DT KBD
+instance AddTo DT VAR
+instance AddTo DT CITE
+instance AddTo DT ABBR
+instance AddTo DT ACRONYM
+instance AddTo DT A
+instance AddTo DT IMG
+instance AddTo DT APPLET
+instance AddTo DT OBJECT
+instance AddTo DT FONT
+instance AddTo DT BASEFONT
+instance AddTo DT BR
+instance AddTo DT SCRIPT
+instance AddTo DT MAP
+instance AddTo DT Q
+instance AddTo DT SUB
+instance AddTo DT SUP
+instance AddTo DT SPAN
+instance AddTo DT BDO
+instance AddTo DT IFRAME
+instance AddTo DT INPUT
+instance AddTo DT SELECT
+instance AddTo DT TEXTAREA
+instance AddTo DT LABEL
+instance AddTo DT BUTTON
+instance TAG DL
+instance AddTo DL DT
+instance AddTo DL DD
+instance TAG INS
+instance AddTo INS P
+instance AddTo INS H1
+instance AddTo INS H2
+instance AddTo INS H3
+instance AddTo INS H4
+instance AddTo INS H5
+instance AddTo INS H6
+instance AddTo INS UL
+instance AddTo INS OL
+instance AddTo INS DIR
+instance AddTo INS MENU
+instance AddTo INS PRE
+instance AddTo INS DL
+instance AddTo INS DIV
+instance AddTo INS CENTER
+instance AddTo INS NOSCRIPT
+instance AddTo INS NOFRAMES
+instance AddTo INS BLOCKQUOTE
+instance AddTo INS FORM
+instance AddTo INS ISINDEX
+instance AddTo INS HR
+instance AddTo INS TABLE
+instance AddTo INS FIELDSET
+instance AddTo INS ADDRESS
+instance AddTo INS CDATA
+instance AddTo INS TT
+instance AddTo INS I
+instance AddTo INS B
+instance AddTo INS U
+instance AddTo INS S
+instance AddTo INS STRIKE
+instance AddTo INS BIG
+instance AddTo INS SMALL
+instance AddTo INS EM
+instance AddTo INS STRONG
+instance AddTo INS DFN
+instance AddTo INS CODE
+instance AddTo INS SAMP
+instance AddTo INS KBD
+instance AddTo INS VAR
+instance AddTo INS CITE
+instance AddTo INS ABBR
+instance AddTo INS ACRONYM
+instance AddTo INS A
+instance AddTo INS IMG
+instance AddTo INS APPLET
+instance AddTo INS OBJECT
+instance AddTo INS FONT
+instance AddTo INS BASEFONT
+instance AddTo INS BR
+instance AddTo INS SCRIPT
+instance AddTo INS MAP
+instance AddTo INS Q
+instance AddTo INS SUB
+instance AddTo INS SUP
+instance AddTo INS SPAN
+instance AddTo INS BDO
+instance AddTo INS IFRAME
+instance AddTo INS INPUT
+instance AddTo INS SELECT
+instance AddTo INS TEXTAREA
+instance AddTo INS LABEL
+instance AddTo INS BUTTON
+instance TAG DEL
+instance AddTo DEL P
+instance AddTo DEL H1
+instance AddTo DEL H2
+instance AddTo DEL H3
+instance AddTo DEL H4
+instance AddTo DEL H5
+instance AddTo DEL H6
+instance AddTo DEL UL
+instance AddTo DEL OL
+instance AddTo DEL DIR
+instance AddTo DEL MENU
+instance AddTo DEL PRE
+instance AddTo DEL DL
+instance AddTo DEL DIV
+instance AddTo DEL CENTER
+instance AddTo DEL NOSCRIPT
+instance AddTo DEL NOFRAMES
+instance AddTo DEL BLOCKQUOTE
+instance AddTo DEL FORM
+instance AddTo DEL ISINDEX
+instance AddTo DEL HR
+instance AddTo DEL TABLE
+instance AddTo DEL FIELDSET
+instance AddTo DEL ADDRESS
+instance AddTo DEL CDATA
+instance AddTo DEL TT
+instance AddTo DEL I
+instance AddTo DEL B
+instance AddTo DEL U
+instance AddTo DEL S
+instance AddTo DEL STRIKE
+instance AddTo DEL BIG
+instance AddTo DEL SMALL
+instance AddTo DEL EM
+instance AddTo DEL STRONG
+instance AddTo DEL DFN
+instance AddTo DEL CODE
+instance AddTo DEL SAMP
+instance AddTo DEL KBD
+instance AddTo DEL VAR
+instance AddTo DEL CITE
+instance AddTo DEL ABBR
+instance AddTo DEL ACRONYM
+instance AddTo DEL A
+instance AddTo DEL IMG
+instance AddTo DEL APPLET
+instance AddTo DEL OBJECT
+instance AddTo DEL FONT
+instance AddTo DEL BASEFONT
+instance AddTo DEL BR
+instance AddTo DEL SCRIPT
+instance AddTo DEL MAP
+instance AddTo DEL Q
+instance AddTo DEL SUB
+instance AddTo DEL SUP
+instance AddTo DEL SPAN
+instance AddTo DEL BDO
+instance AddTo DEL IFRAME
+instance AddTo DEL INPUT
+instance AddTo DEL SELECT
+instance AddTo DEL TEXTAREA
+instance AddTo DEL LABEL
+instance AddTo DEL BUTTON
+instance TAG BLOCKQUOTE
+instance AddTo BLOCKQUOTE P
+instance AddTo BLOCKQUOTE H1
+instance AddTo BLOCKQUOTE H2
+instance AddTo BLOCKQUOTE H3
+instance AddTo BLOCKQUOTE H4
+instance AddTo BLOCKQUOTE H5
+instance AddTo BLOCKQUOTE H6
+instance AddTo BLOCKQUOTE UL
+instance AddTo BLOCKQUOTE OL
+instance AddTo BLOCKQUOTE DIR
+instance AddTo BLOCKQUOTE MENU
+instance AddTo BLOCKQUOTE PRE
+instance AddTo BLOCKQUOTE DL
+instance AddTo BLOCKQUOTE DIV
+instance AddTo BLOCKQUOTE CENTER
+instance AddTo BLOCKQUOTE NOSCRIPT
+instance AddTo BLOCKQUOTE NOFRAMES
+instance AddTo BLOCKQUOTE BLOCKQUOTE
+instance AddTo BLOCKQUOTE FORM
+instance AddTo BLOCKQUOTE ISINDEX
+instance AddTo BLOCKQUOTE HR
+instance AddTo BLOCKQUOTE TABLE
+instance AddTo BLOCKQUOTE FIELDSET
+instance AddTo BLOCKQUOTE ADDRESS
+instance AddTo BLOCKQUOTE CDATA
+instance AddTo BLOCKQUOTE TT
+instance AddTo BLOCKQUOTE I
+instance AddTo BLOCKQUOTE B
+instance AddTo BLOCKQUOTE U
+instance AddTo BLOCKQUOTE S
+instance AddTo BLOCKQUOTE STRIKE
+instance AddTo BLOCKQUOTE BIG
+instance AddTo BLOCKQUOTE SMALL
+instance AddTo BLOCKQUOTE EM
+instance AddTo BLOCKQUOTE STRONG
+instance AddTo BLOCKQUOTE DFN
+instance AddTo BLOCKQUOTE CODE
+instance AddTo BLOCKQUOTE SAMP
+instance AddTo BLOCKQUOTE KBD
+instance AddTo BLOCKQUOTE VAR
+instance AddTo BLOCKQUOTE CITE
+instance AddTo BLOCKQUOTE ABBR
+instance AddTo BLOCKQUOTE ACRONYM
+instance AddTo BLOCKQUOTE A
+instance AddTo BLOCKQUOTE IMG
+instance AddTo BLOCKQUOTE APPLET
+instance AddTo BLOCKQUOTE OBJECT
+instance AddTo BLOCKQUOTE FONT
+instance AddTo BLOCKQUOTE BASEFONT
+instance AddTo BLOCKQUOTE BR
+instance AddTo BLOCKQUOTE SCRIPT
+instance AddTo BLOCKQUOTE MAP
+instance AddTo BLOCKQUOTE Q
+instance AddTo BLOCKQUOTE SUB
+instance AddTo BLOCKQUOTE SUP
+instance AddTo BLOCKQUOTE SPAN
+instance AddTo BLOCKQUOTE BDO
+instance AddTo BLOCKQUOTE IFRAME
+instance AddTo BLOCKQUOTE INPUT
+instance AddTo BLOCKQUOTE SELECT
+instance AddTo BLOCKQUOTE TEXTAREA
+instance AddTo BLOCKQUOTE LABEL
+instance AddTo BLOCKQUOTE BUTTON
+instance TAG Q
+instance AddTo Q CDATA
+instance AddTo Q TT
+instance AddTo Q I
+instance AddTo Q B
+instance AddTo Q U
+instance AddTo Q S
+instance AddTo Q STRIKE
+instance AddTo Q BIG
+instance AddTo Q SMALL
+instance AddTo Q EM
+instance AddTo Q STRONG
+instance AddTo Q DFN
+instance AddTo Q CODE
+instance AddTo Q SAMP
+instance AddTo Q KBD
+instance AddTo Q VAR
+instance AddTo Q CITE
+instance AddTo Q ABBR
+instance AddTo Q ACRONYM
+instance AddTo Q A
+instance AddTo Q IMG
+instance AddTo Q APPLET
+instance AddTo Q OBJECT
+instance AddTo Q FONT
+instance AddTo Q BASEFONT
+instance AddTo Q BR
+instance AddTo Q SCRIPT
+instance AddTo Q MAP
+instance AddTo Q Q
+instance AddTo Q SUB
+instance AddTo Q SUP
+instance AddTo Q SPAN
+instance AddTo Q BDO
+instance AddTo Q IFRAME
+instance AddTo Q INPUT
+instance AddTo Q SELECT
+instance AddTo Q TEXTAREA
+instance AddTo Q LABEL
+instance AddTo Q BUTTON
+instance TAG PRE
+instance AddTo PRE CDATA
+instance AddTo PRE TT
+instance AddTo PRE I
+instance AddTo PRE B
+instance AddTo PRE U
+instance AddTo PRE S
+instance AddTo PRE STRIKE
+instance AddTo PRE EM
+instance AddTo PRE STRONG
+instance AddTo PRE DFN
+instance AddTo PRE CODE
+instance AddTo PRE SAMP
+instance AddTo PRE KBD
+instance AddTo PRE VAR
+instance AddTo PRE CITE
+instance AddTo PRE ABBR
+instance AddTo PRE ACRONYM
+instance AddTo PRE A
+instance AddTo PRE BR
+instance AddTo PRE SCRIPT
+instance AddTo PRE MAP
+instance AddTo PRE Q
+instance AddTo PRE SPAN
+instance AddTo PRE BDO
+instance AddTo PRE IFRAME
+instance AddTo PRE INPUT
+instance AddTo PRE SELECT
+instance AddTo PRE TEXTAREA
+instance AddTo PRE LABEL
+instance AddTo PRE BUTTON
+instance TAG H1
+instance AddTo H1 CDATA
+instance AddTo H1 TT
+instance AddTo H1 I
+instance AddTo H1 B
+instance AddTo H1 U
+instance AddTo H1 S
+instance AddTo H1 STRIKE
+instance AddTo H1 BIG
+instance AddTo H1 SMALL
+instance AddTo H1 EM
+instance AddTo H1 STRONG
+instance AddTo H1 DFN
+instance AddTo H1 CODE
+instance AddTo H1 SAMP
+instance AddTo H1 KBD
+instance AddTo H1 VAR
+instance AddTo H1 CITE
+instance AddTo H1 ABBR
+instance AddTo H1 ACRONYM
+instance AddTo H1 A
+instance AddTo H1 IMG
+instance AddTo H1 APPLET
+instance AddTo H1 OBJECT
+instance AddTo H1 FONT
+instance AddTo H1 BASEFONT
+instance AddTo H1 BR
+instance AddTo H1 SCRIPT
+instance AddTo H1 MAP
+instance AddTo H1 Q
+instance AddTo H1 SUB
+instance AddTo H1 SUP
+instance AddTo H1 SPAN
+instance AddTo H1 BDO
+instance AddTo H1 IFRAME
+instance AddTo H1 INPUT
+instance AddTo H1 SELECT
+instance AddTo H1 TEXTAREA
+instance AddTo H1 LABEL
+instance AddTo H1 BUTTON
+instance TAG H2
+instance AddTo H2 CDATA
+instance AddTo H2 TT
+instance AddTo H2 I
+instance AddTo H2 B
+instance AddTo H2 U
+instance AddTo H2 S
+instance AddTo H2 STRIKE
+instance AddTo H2 BIG
+instance AddTo H2 SMALL
+instance AddTo H2 EM
+instance AddTo H2 STRONG
+instance AddTo H2 DFN
+instance AddTo H2 CODE
+instance AddTo H2 SAMP
+instance AddTo H2 KBD
+instance AddTo H2 VAR
+instance AddTo H2 CITE
+instance AddTo H2 ABBR
+instance AddTo H2 ACRONYM
+instance AddTo H2 A
+instance AddTo H2 IMG
+instance AddTo H2 APPLET
+instance AddTo H2 OBJECT
+instance AddTo H2 FONT
+instance AddTo H2 BASEFONT
+instance AddTo H2 BR
+instance AddTo H2 SCRIPT
+instance AddTo H2 MAP
+instance AddTo H2 Q
+instance AddTo H2 SUB
+instance AddTo H2 SUP
+instance AddTo H2 SPAN
+instance AddTo H2 BDO
+instance AddTo H2 IFRAME
+instance AddTo H2 INPUT
+instance AddTo H2 SELECT
+instance AddTo H2 TEXTAREA
+instance AddTo H2 LABEL
+instance AddTo H2 BUTTON
+instance TAG H3
+instance AddTo H3 CDATA
+instance AddTo H3 TT
+instance AddTo H3 I
+instance AddTo H3 B
+instance AddTo H3 U
+instance AddTo H3 S
+instance AddTo H3 STRIKE
+instance AddTo H3 BIG
+instance AddTo H3 SMALL
+instance AddTo H3 EM
+instance AddTo H3 STRONG
+instance AddTo H3 DFN
+instance AddTo H3 CODE
+instance AddTo H3 SAMP
+instance AddTo H3 KBD
+instance AddTo H3 VAR
+instance AddTo H3 CITE
+instance AddTo H3 ABBR
+instance AddTo H3 ACRONYM
+instance AddTo H3 A
+instance AddTo H3 IMG
+instance AddTo H3 APPLET
+instance AddTo H3 OBJECT
+instance AddTo H3 FONT
+instance AddTo H3 BASEFONT
+instance AddTo H3 BR
+instance AddTo H3 SCRIPT
+instance AddTo H3 MAP
+instance AddTo H3 Q
+instance AddTo H3 SUB
+instance AddTo H3 SUP
+instance AddTo H3 SPAN
+instance AddTo H3 BDO
+instance AddTo H3 IFRAME
+instance AddTo H3 INPUT
+instance AddTo H3 SELECT
+instance AddTo H3 TEXTAREA
+instance AddTo H3 LABEL
+instance AddTo H3 BUTTON
+instance TAG H4
+instance AddTo H4 CDATA
+instance AddTo H4 TT
+instance AddTo H4 I
+instance AddTo H4 B
+instance AddTo H4 U
+instance AddTo H4 S
+instance AddTo H4 STRIKE
+instance AddTo H4 BIG
+instance AddTo H4 SMALL
+instance AddTo H4 EM
+instance AddTo H4 STRONG
+instance AddTo H4 DFN
+instance AddTo H4 CODE
+instance AddTo H4 SAMP
+instance AddTo H4 KBD
+instance AddTo H4 VAR
+instance AddTo H4 CITE
+instance AddTo H4 ABBR
+instance AddTo H4 ACRONYM
+instance AddTo H4 A
+instance AddTo H4 IMG
+instance AddTo H4 APPLET
+instance AddTo H4 OBJECT
+instance AddTo H4 FONT
+instance AddTo H4 BASEFONT
+instance AddTo H4 BR
+instance AddTo H4 SCRIPT
+instance AddTo H4 MAP
+instance AddTo H4 Q
+instance AddTo H4 SUB
+instance AddTo H4 SUP
+instance AddTo H4 SPAN
+instance AddTo H4 BDO
+instance AddTo H4 IFRAME
+instance AddTo H4 INPUT
+instance AddTo H4 SELECT
+instance AddTo H4 TEXTAREA
+instance AddTo H4 LABEL
+instance AddTo H4 BUTTON
+instance TAG H5
+instance AddTo H5 CDATA
+instance AddTo H5 TT
+instance AddTo H5 I
+instance AddTo H5 B
+instance AddTo H5 U
+instance AddTo H5 S
+instance AddTo H5 STRIKE
+instance AddTo H5 BIG
+instance AddTo H5 SMALL
+instance AddTo H5 EM
+instance AddTo H5 STRONG
+instance AddTo H5 DFN
+instance AddTo H5 CODE
+instance AddTo H5 SAMP
+instance AddTo H5 KBD
+instance AddTo H5 VAR
+instance AddTo H5 CITE
+instance AddTo H5 ABBR
+instance AddTo H5 ACRONYM
+instance AddTo H5 A
+instance AddTo H5 IMG
+instance AddTo H5 APPLET
+instance AddTo H5 OBJECT
+instance AddTo H5 FONT
+instance AddTo H5 BASEFONT
+instance AddTo H5 BR
+instance AddTo H5 SCRIPT
+instance AddTo H5 MAP
+instance AddTo H5 Q
+instance AddTo H5 SUB
+instance AddTo H5 SUP
+instance AddTo H5 SPAN
+instance AddTo H5 BDO
+instance AddTo H5 IFRAME
+instance AddTo H5 INPUT
+instance AddTo H5 SELECT
+instance AddTo H5 TEXTAREA
+instance AddTo H5 LABEL
+instance AddTo H5 BUTTON
+instance TAG H6
+instance AddTo H6 CDATA
+instance AddTo H6 TT
+instance AddTo H6 I
+instance AddTo H6 B
+instance AddTo H6 U
+instance AddTo H6 S
+instance AddTo H6 STRIKE
+instance AddTo H6 BIG
+instance AddTo H6 SMALL
+instance AddTo H6 EM
+instance AddTo H6 STRONG
+instance AddTo H6 DFN
+instance AddTo H6 CODE
+instance AddTo H6 SAMP
+instance AddTo H6 KBD
+instance AddTo H6 VAR
+instance AddTo H6 CITE
+instance AddTo H6 ABBR
+instance AddTo H6 ACRONYM
+instance AddTo H6 A
+instance AddTo H6 IMG
+instance AddTo H6 APPLET
+instance AddTo H6 OBJECT
+instance AddTo H6 FONT
+instance AddTo H6 BASEFONT
+instance AddTo H6 BR
+instance AddTo H6 SCRIPT
+instance AddTo H6 MAP
+instance AddTo H6 Q
+instance AddTo H6 SUB
+instance AddTo H6 SUP
+instance AddTo H6 SPAN
+instance AddTo H6 BDO
+instance AddTo H6 IFRAME
+instance AddTo H6 INPUT
+instance AddTo H6 SELECT
+instance AddTo H6 TEXTAREA
+instance AddTo H6 LABEL
+instance AddTo H6 BUTTON
+instance TAG P
+instance AddTo P CDATA
+instance AddTo P TT
+instance AddTo P I
+instance AddTo P B
+instance AddTo P U
+instance AddTo P S
+instance AddTo P STRIKE
+instance AddTo P BIG
+instance AddTo P SMALL
+instance AddTo P EM
+instance AddTo P STRONG
+instance AddTo P DFN
+instance AddTo P CODE
+instance AddTo P SAMP
+instance AddTo P KBD
+instance AddTo P VAR
+instance AddTo P CITE
+instance AddTo P ABBR
+instance AddTo P ACRONYM
+instance AddTo P A
+instance AddTo P IMG
+instance AddTo P APPLET
+instance AddTo P OBJECT
+instance AddTo P FONT
+instance AddTo P BASEFONT
+instance AddTo P BR
+instance AddTo P SCRIPT
+instance AddTo P MAP
+instance AddTo P Q
+instance AddTo P SUB
+instance AddTo P SUP
+instance AddTo P SPAN
+instance AddTo P BDO
+instance AddTo P IFRAME
+instance AddTo P INPUT
+instance AddTo P SELECT
+instance AddTo P TEXTAREA
+instance AddTo P LABEL
+instance AddTo P BUTTON
+instance TAG HR where make = make_empty
+instance TAG APPLET
+instance AddTo APPLET PARAM
+instance AddTo APPLET P
+instance AddTo APPLET H1
+instance AddTo APPLET H2
+instance AddTo APPLET H3
+instance AddTo APPLET H4
+instance AddTo APPLET H5
+instance AddTo APPLET H6
+instance AddTo APPLET UL
+instance AddTo APPLET OL
+instance AddTo APPLET DIR
+instance AddTo APPLET MENU
+instance AddTo APPLET PRE
+instance AddTo APPLET DL
+instance AddTo APPLET DIV
+instance AddTo APPLET CENTER
+instance AddTo APPLET NOSCRIPT
+instance AddTo APPLET NOFRAMES
+instance AddTo APPLET BLOCKQUOTE
+instance AddTo APPLET FORM
+instance AddTo APPLET ISINDEX
+instance AddTo APPLET HR
+instance AddTo APPLET TABLE
+instance AddTo APPLET FIELDSET
+instance AddTo APPLET ADDRESS
+instance AddTo APPLET CDATA
+instance AddTo APPLET TT
+instance AddTo APPLET I
+instance AddTo APPLET B
+instance AddTo APPLET U
+instance AddTo APPLET S
+instance AddTo APPLET STRIKE
+instance AddTo APPLET BIG
+instance AddTo APPLET SMALL
+instance AddTo APPLET EM
+instance AddTo APPLET STRONG
+instance AddTo APPLET DFN
+instance AddTo APPLET CODE
+instance AddTo APPLET SAMP
+instance AddTo APPLET KBD
+instance AddTo APPLET VAR
+instance AddTo APPLET CITE
+instance AddTo APPLET ABBR
+instance AddTo APPLET ACRONYM
+instance AddTo APPLET A
+instance AddTo APPLET IMG
+instance AddTo APPLET APPLET
+instance AddTo APPLET OBJECT
+instance AddTo APPLET FONT
+instance AddTo APPLET BASEFONT
+instance AddTo APPLET BR
+instance AddTo APPLET SCRIPT
+instance AddTo APPLET MAP
+instance AddTo APPLET Q
+instance AddTo APPLET SUB
+instance AddTo APPLET SUP
+instance AddTo APPLET SPAN
+instance AddTo APPLET BDO
+instance AddTo APPLET IFRAME
+instance AddTo APPLET INPUT
+instance AddTo APPLET SELECT
+instance AddTo APPLET TEXTAREA
+instance AddTo APPLET LABEL
+instance AddTo APPLET BUTTON
+instance TAG PARAM where make = make_empty
+instance TAG OBJECT
+instance AddTo OBJECT PARAM
+instance AddTo OBJECT P
+instance AddTo OBJECT H1
+instance AddTo OBJECT H2
+instance AddTo OBJECT H3
+instance AddTo OBJECT H4
+instance AddTo OBJECT H5
+instance AddTo OBJECT H6
+instance AddTo OBJECT UL
+instance AddTo OBJECT OL
+instance AddTo OBJECT DIR
+instance AddTo OBJECT MENU
+instance AddTo OBJECT PRE
+instance AddTo OBJECT DL
+instance AddTo OBJECT DIV
+instance AddTo OBJECT CENTER
+instance AddTo OBJECT NOSCRIPT
+instance AddTo OBJECT NOFRAMES
+instance AddTo OBJECT BLOCKQUOTE
+instance AddTo OBJECT FORM
+instance AddTo OBJECT ISINDEX
+instance AddTo OBJECT HR
+instance AddTo OBJECT TABLE
+instance AddTo OBJECT FIELDSET
+instance AddTo OBJECT ADDRESS
+instance AddTo OBJECT CDATA
+instance AddTo OBJECT TT
+instance AddTo OBJECT I
+instance AddTo OBJECT B
+instance AddTo OBJECT U
+instance AddTo OBJECT S
+instance AddTo OBJECT STRIKE
+instance AddTo OBJECT BIG
+instance AddTo OBJECT SMALL
+instance AddTo OBJECT EM
+instance AddTo OBJECT STRONG
+instance AddTo OBJECT DFN
+instance AddTo OBJECT CODE
+instance AddTo OBJECT SAMP
+instance AddTo OBJECT KBD
+instance AddTo OBJECT VAR
+instance AddTo OBJECT CITE
+instance AddTo OBJECT ABBR
+instance AddTo OBJECT ACRONYM
+instance AddTo OBJECT A
+instance AddTo OBJECT IMG
+instance AddTo OBJECT APPLET
+instance AddTo OBJECT OBJECT
+instance AddTo OBJECT FONT
+instance AddTo OBJECT BASEFONT
+instance AddTo OBJECT BR
+instance AddTo OBJECT SCRIPT
+instance AddTo OBJECT MAP
+instance AddTo OBJECT Q
+instance AddTo OBJECT SUB
+instance AddTo OBJECT SUP
+instance AddTo OBJECT SPAN
+instance AddTo OBJECT BDO
+instance AddTo OBJECT IFRAME
+instance AddTo OBJECT INPUT
+instance AddTo OBJECT SELECT
+instance AddTo OBJECT TEXTAREA
+instance AddTo OBJECT LABEL
+instance AddTo OBJECT BUTTON
+instance TAG IMG where make = make_empty
+instance TAG LINK where make = make_empty
+instance TAG AREA where make = make_empty
+instance TAG MAP
+instance AddTo MAP P
+instance AddTo MAP H1
+instance AddTo MAP H2
+instance AddTo MAP H3
+instance AddTo MAP H4
+instance AddTo MAP H5
+instance AddTo MAP H6
+instance AddTo MAP UL
+instance AddTo MAP OL
+instance AddTo MAP DIR
+instance AddTo MAP MENU
+instance AddTo MAP PRE
+instance AddTo MAP DL
+instance AddTo MAP DIV
+instance AddTo MAP CENTER
+instance AddTo MAP NOSCRIPT
+instance AddTo MAP NOFRAMES
+instance AddTo MAP BLOCKQUOTE
+instance AddTo MAP FORM
+instance AddTo MAP ISINDEX
+instance AddTo MAP HR
+instance AddTo MAP TABLE
+instance AddTo MAP FIELDSET
+instance AddTo MAP ADDRESS
+instance AddTo MAP AREA
+instance TAG A
+instance AddTo A CDATA
+instance AddTo A TT
+instance AddTo A I
+instance AddTo A B
+instance AddTo A U
+instance AddTo A S
+instance AddTo A STRIKE
+instance AddTo A BIG
+instance AddTo A SMALL
+instance AddTo A EM
+instance AddTo A STRONG
+instance AddTo A DFN
+instance AddTo A CODE
+instance AddTo A SAMP
+instance AddTo A KBD
+instance AddTo A VAR
+instance AddTo A CITE
+instance AddTo A ABBR
+instance AddTo A ACRONYM
+instance AddTo A IMG
+instance AddTo A APPLET
+instance AddTo A OBJECT
+instance AddTo A FONT
+instance AddTo A BASEFONT
+instance AddTo A BR
+instance AddTo A SCRIPT
+instance AddTo A MAP
+instance AddTo A Q
+instance AddTo A SUB
+instance AddTo A SUP
+instance AddTo A SPAN
+instance AddTo A BDO
+instance AddTo A IFRAME
+instance AddTo A INPUT
+instance AddTo A SELECT
+instance AddTo A TEXTAREA
+instance AddTo A LABEL
+instance AddTo A BUTTON
+instance TAG CENTER
+instance AddTo CENTER P
+instance AddTo CENTER H1
+instance AddTo CENTER H2
+instance AddTo CENTER H3
+instance AddTo CENTER H4
+instance AddTo CENTER H5
+instance AddTo CENTER H6
+instance AddTo CENTER UL
+instance AddTo CENTER OL
+instance AddTo CENTER DIR
+instance AddTo CENTER MENU
+instance AddTo CENTER PRE
+instance AddTo CENTER DL
+instance AddTo CENTER DIV
+instance AddTo CENTER CENTER
+instance AddTo CENTER NOSCRIPT
+instance AddTo CENTER NOFRAMES
+instance AddTo CENTER BLOCKQUOTE
+instance AddTo CENTER FORM
+instance AddTo CENTER ISINDEX
+instance AddTo CENTER HR
+instance AddTo CENTER TABLE
+instance AddTo CENTER FIELDSET
+instance AddTo CENTER ADDRESS
+instance AddTo CENTER CDATA
+instance AddTo CENTER TT
+instance AddTo CENTER I
+instance AddTo CENTER B
+instance AddTo CENTER U
+instance AddTo CENTER S
+instance AddTo CENTER STRIKE
+instance AddTo CENTER BIG
+instance AddTo CENTER SMALL
+instance AddTo CENTER EM
+instance AddTo CENTER STRONG
+instance AddTo CENTER DFN
+instance AddTo CENTER CODE
+instance AddTo CENTER SAMP
+instance AddTo CENTER KBD
+instance AddTo CENTER VAR
+instance AddTo CENTER CITE
+instance AddTo CENTER ABBR
+instance AddTo CENTER ACRONYM
+instance AddTo CENTER A
+instance AddTo CENTER IMG
+instance AddTo CENTER APPLET
+instance AddTo CENTER OBJECT
+instance AddTo CENTER FONT
+instance AddTo CENTER BASEFONT
+instance AddTo CENTER BR
+instance AddTo CENTER SCRIPT
+instance AddTo CENTER MAP
+instance AddTo CENTER Q
+instance AddTo CENTER SUB
+instance AddTo CENTER SUP
+instance AddTo CENTER SPAN
+instance AddTo CENTER BDO
+instance AddTo CENTER IFRAME
+instance AddTo CENTER INPUT
+instance AddTo CENTER SELECT
+instance AddTo CENTER TEXTAREA
+instance AddTo CENTER LABEL
+instance AddTo CENTER BUTTON
+instance TAG DIV
+instance AddTo DIV P
+instance AddTo DIV H1
+instance AddTo DIV H2
+instance AddTo DIV H3
+instance AddTo DIV H4
+instance AddTo DIV H5
+instance AddTo DIV H6
+instance AddTo DIV UL
+instance AddTo DIV OL
+instance AddTo DIV DIR
+instance AddTo DIV MENU
+instance AddTo DIV PRE
+instance AddTo DIV DL
+instance AddTo DIV DIV
+instance AddTo DIV CENTER
+instance AddTo DIV NOSCRIPT
+instance AddTo DIV NOFRAMES
+instance AddTo DIV BLOCKQUOTE
+instance AddTo DIV FORM
+instance AddTo DIV ISINDEX
+instance AddTo DIV HR
+instance AddTo DIV TABLE
+instance AddTo DIV FIELDSET
+instance AddTo DIV ADDRESS
+instance AddTo DIV CDATA
+instance AddTo DIV TT
+instance AddTo DIV I
+instance AddTo DIV B
+instance AddTo DIV U
+instance AddTo DIV S
+instance AddTo DIV STRIKE
+instance AddTo DIV BIG
+instance AddTo DIV SMALL
+instance AddTo DIV EM
+instance AddTo DIV STRONG
+instance AddTo DIV DFN
+instance AddTo DIV CODE
+instance AddTo DIV SAMP
+instance AddTo DIV KBD
+instance AddTo DIV VAR
+instance AddTo DIV CITE
+instance AddTo DIV ABBR
+instance AddTo DIV ACRONYM
+instance AddTo DIV A
+instance AddTo DIV IMG
+instance AddTo DIV APPLET
+instance AddTo DIV OBJECT
+instance AddTo DIV FONT
+instance AddTo DIV BASEFONT
+instance AddTo DIV BR
+instance AddTo DIV SCRIPT
+instance AddTo DIV MAP
+instance AddTo DIV Q
+instance AddTo DIV SUB
+instance AddTo DIV SUP
+instance AddTo DIV SPAN
+instance AddTo DIV BDO
+instance AddTo DIV IFRAME
+instance AddTo DIV INPUT
+instance AddTo DIV SELECT
+instance AddTo DIV TEXTAREA
+instance AddTo DIV LABEL
+instance AddTo DIV BUTTON
+instance TAG ADDRESS
+instance AddTo ADDRESS CDATA
+instance AddTo ADDRESS TT
+instance AddTo ADDRESS I
+instance AddTo ADDRESS B
+instance AddTo ADDRESS U
+instance AddTo ADDRESS S
+instance AddTo ADDRESS STRIKE
+instance AddTo ADDRESS BIG
+instance AddTo ADDRESS SMALL
+instance AddTo ADDRESS EM
+instance AddTo ADDRESS STRONG
+instance AddTo ADDRESS DFN
+instance AddTo ADDRESS CODE
+instance AddTo ADDRESS SAMP
+instance AddTo ADDRESS KBD
+instance AddTo ADDRESS VAR
+instance AddTo ADDRESS CITE
+instance AddTo ADDRESS ABBR
+instance AddTo ADDRESS ACRONYM
+instance AddTo ADDRESS A
+instance AddTo ADDRESS IMG
+instance AddTo ADDRESS APPLET
+instance AddTo ADDRESS OBJECT
+instance AddTo ADDRESS FONT
+instance AddTo ADDRESS BASEFONT
+instance AddTo ADDRESS BR
+instance AddTo ADDRESS SCRIPT
+instance AddTo ADDRESS MAP
+instance AddTo ADDRESS Q
+instance AddTo ADDRESS SUB
+instance AddTo ADDRESS SUP
+instance AddTo ADDRESS SPAN
+instance AddTo ADDRESS BDO
+instance AddTo ADDRESS IFRAME
+instance AddTo ADDRESS INPUT
+instance AddTo ADDRESS SELECT
+instance AddTo ADDRESS TEXTAREA
+instance AddTo ADDRESS LABEL
+instance AddTo ADDRESS BUTTON
+instance AddTo ADDRESS P
+instance TAG BODY
+instance AddTo BODY P
+instance AddTo BODY H1
+instance AddTo BODY H2
+instance AddTo BODY H3
+instance AddTo BODY H4
+instance AddTo BODY H5
+instance AddTo BODY H6
+instance AddTo BODY UL
+instance AddTo BODY OL
+instance AddTo BODY DIR
+instance AddTo BODY MENU
+instance AddTo BODY PRE
+instance AddTo BODY DL
+instance AddTo BODY DIV
+instance AddTo BODY CENTER
+instance AddTo BODY NOSCRIPT
+instance AddTo BODY NOFRAMES
+instance AddTo BODY BLOCKQUOTE
+instance AddTo BODY FORM
+instance AddTo BODY ISINDEX
+instance AddTo BODY HR
+instance AddTo BODY TABLE
+instance AddTo BODY FIELDSET
+instance AddTo BODY ADDRESS
+instance AddTo BODY CDATA
+instance AddTo BODY TT
+instance AddTo BODY I
+instance AddTo BODY B
+instance AddTo BODY U
+instance AddTo BODY S
+instance AddTo BODY STRIKE
+instance AddTo BODY BIG
+instance AddTo BODY SMALL
+instance AddTo BODY EM
+instance AddTo BODY STRONG
+instance AddTo BODY DFN
+instance AddTo BODY CODE
+instance AddTo BODY SAMP
+instance AddTo BODY KBD
+instance AddTo BODY VAR
+instance AddTo BODY CITE
+instance AddTo BODY ABBR
+instance AddTo BODY ACRONYM
+instance AddTo BODY A
+instance AddTo BODY IMG
+instance AddTo BODY APPLET
+instance AddTo BODY OBJECT
+instance AddTo BODY FONT
+instance AddTo BODY BASEFONT
+instance AddTo BODY BR
+instance AddTo BODY SCRIPT
+instance AddTo BODY MAP
+instance AddTo BODY Q
+instance AddTo BODY SUB
+instance AddTo BODY SUP
+instance AddTo BODY SPAN
+instance AddTo BODY BDO
+instance AddTo BODY IFRAME
+instance AddTo BODY INPUT
+instance AddTo BODY SELECT
+instance AddTo BODY TEXTAREA
+instance AddTo BODY LABEL
+instance AddTo BODY BUTTON
+instance AddTo BODY INS
+instance AddTo BODY DEL
+instance TAG BR where make = make_empty
+instance TAG FONT
+instance AddTo FONT CDATA
+instance AddTo FONT TT
+instance AddTo FONT I
+instance AddTo FONT B
+instance AddTo FONT U
+instance AddTo FONT S
+instance AddTo FONT STRIKE
+instance AddTo FONT BIG
+instance AddTo FONT SMALL
+instance AddTo FONT EM
+instance AddTo FONT STRONG
+instance AddTo FONT DFN
+instance AddTo FONT CODE
+instance AddTo FONT SAMP
+instance AddTo FONT KBD
+instance AddTo FONT VAR
+instance AddTo FONT CITE
+instance AddTo FONT ABBR
+instance AddTo FONT ACRONYM
+instance AddTo FONT A
+instance AddTo FONT IMG
+instance AddTo FONT APPLET
+instance AddTo FONT OBJECT
+instance AddTo FONT FONT
+instance AddTo FONT BASEFONT
+instance AddTo FONT BR
+instance AddTo FONT SCRIPT
+instance AddTo FONT MAP
+instance AddTo FONT Q
+instance AddTo FONT SUB
+instance AddTo FONT SUP
+instance AddTo FONT SPAN
+instance AddTo FONT BDO
+instance AddTo FONT IFRAME
+instance AddTo FONT INPUT
+instance AddTo FONT SELECT
+instance AddTo FONT TEXTAREA
+instance AddTo FONT LABEL
+instance AddTo FONT BUTTON
+instance TAG BASEFONT where make = make_empty
+instance TAG BDO
+instance AddTo BDO CDATA
+instance AddTo BDO TT
+instance AddTo BDO I
+instance AddTo BDO B
+instance AddTo BDO U
+instance AddTo BDO S
+instance AddTo BDO STRIKE
+instance AddTo BDO BIG
+instance AddTo BDO SMALL
+instance AddTo BDO EM
+instance AddTo BDO STRONG
+instance AddTo BDO DFN
+instance AddTo BDO CODE
+instance AddTo BDO SAMP
+instance AddTo BDO KBD
+instance AddTo BDO VAR
+instance AddTo BDO CITE
+instance AddTo BDO ABBR
+instance AddTo BDO ACRONYM
+instance AddTo BDO A
+instance AddTo BDO IMG
+instance AddTo BDO APPLET
+instance AddTo BDO OBJECT
+instance AddTo BDO FONT
+instance AddTo BDO BASEFONT
+instance AddTo BDO BR
+instance AddTo BDO SCRIPT
+instance AddTo BDO MAP
+instance AddTo BDO Q
+instance AddTo BDO SUB
+instance AddTo BDO SUP
+instance AddTo BDO SPAN
+instance AddTo BDO BDO
+instance AddTo BDO IFRAME
+instance AddTo BDO INPUT
+instance AddTo BDO SELECT
+instance AddTo BDO TEXTAREA
+instance AddTo BDO LABEL
+instance AddTo BDO BUTTON
+instance TAG SPAN
+instance AddTo SPAN CDATA
+instance AddTo SPAN TT
+instance AddTo SPAN I
+instance AddTo SPAN B
+instance AddTo SPAN U
+instance AddTo SPAN S
+instance AddTo SPAN STRIKE
+instance AddTo SPAN BIG
+instance AddTo SPAN SMALL
+instance AddTo SPAN EM
+instance AddTo SPAN STRONG
+instance AddTo SPAN DFN
+instance AddTo SPAN CODE
+instance AddTo SPAN SAMP
+instance AddTo SPAN KBD
+instance AddTo SPAN VAR
+instance AddTo SPAN CITE
+instance AddTo SPAN ABBR
+instance AddTo SPAN ACRONYM
+instance AddTo SPAN A
+instance AddTo SPAN IMG
+instance AddTo SPAN APPLET
+instance AddTo SPAN OBJECT
+instance AddTo SPAN FONT
+instance AddTo SPAN BASEFONT
+instance AddTo SPAN BR
+instance AddTo SPAN SCRIPT
+instance AddTo SPAN MAP
+instance AddTo SPAN Q
+instance AddTo SPAN SUB
+instance AddTo SPAN SUP
+instance AddTo SPAN SPAN
+instance AddTo SPAN BDO
+instance AddTo SPAN IFRAME
+instance AddTo SPAN INPUT
+instance AddTo SPAN SELECT
+instance AddTo SPAN TEXTAREA
+instance AddTo SPAN LABEL
+instance AddTo SPAN BUTTON
+instance TAG SUB
+instance AddTo SUB CDATA
+instance AddTo SUB TT
+instance AddTo SUB I
+instance AddTo SUB B
+instance AddTo SUB U
+instance AddTo SUB S
+instance AddTo SUB STRIKE
+instance AddTo SUB BIG
+instance AddTo SUB SMALL
+instance AddTo SUB EM
+instance AddTo SUB STRONG
+instance AddTo SUB DFN
+instance AddTo SUB CODE
+instance AddTo SUB SAMP
+instance AddTo SUB KBD
+instance AddTo SUB VAR
+instance AddTo SUB CITE
+instance AddTo SUB ABBR
+instance AddTo SUB ACRONYM
+instance AddTo SUB A
+instance AddTo SUB IMG
+instance AddTo SUB APPLET
+instance AddTo SUB OBJECT
+instance AddTo SUB FONT
+instance AddTo SUB BASEFONT
+instance AddTo SUB BR
+instance AddTo SUB SCRIPT
+instance AddTo SUB MAP
+instance AddTo SUB Q
+instance AddTo SUB SUB
+instance AddTo SUB SUP
+instance AddTo SUB SPAN
+instance AddTo SUB BDO
+instance AddTo SUB IFRAME
+instance AddTo SUB INPUT
+instance AddTo SUB SELECT
+instance AddTo SUB TEXTAREA
+instance AddTo SUB LABEL
+instance AddTo SUB BUTTON
+instance TAG SUP
+instance AddTo SUP CDATA
+instance AddTo SUP TT
+instance AddTo SUP I
+instance AddTo SUP B
+instance AddTo SUP U
+instance AddTo SUP S
+instance AddTo SUP STRIKE
+instance AddTo SUP BIG
+instance AddTo SUP SMALL
+instance AddTo SUP EM
+instance AddTo SUP STRONG
+instance AddTo SUP DFN
+instance AddTo SUP CODE
+instance AddTo SUP SAMP
+instance AddTo SUP KBD
+instance AddTo SUP VAR
+instance AddTo SUP CITE
+instance AddTo SUP ABBR
+instance AddTo SUP ACRONYM
+instance AddTo SUP A
+instance AddTo SUP IMG
+instance AddTo SUP APPLET
+instance AddTo SUP OBJECT
+instance AddTo SUP FONT
+instance AddTo SUP BASEFONT
+instance AddTo SUP BR
+instance AddTo SUP SCRIPT
+instance AddTo SUP MAP
+instance AddTo SUP Q
+instance AddTo SUP SUB
+instance AddTo SUP SUP
+instance AddTo SUP SPAN
+instance AddTo SUP BDO
+instance AddTo SUP IFRAME
+instance AddTo SUP INPUT
+instance AddTo SUP SELECT
+instance AddTo SUP TEXTAREA
+instance AddTo SUP LABEL
+instance AddTo SUP BUTTON
+instance TAG TT
+instance AddTo TT CDATA
+instance AddTo TT TT
+instance AddTo TT I
+instance AddTo TT B
+instance AddTo TT U
+instance AddTo TT S
+instance AddTo TT STRIKE
+instance AddTo TT BIG
+instance AddTo TT SMALL
+instance AddTo TT EM
+instance AddTo TT STRONG
+instance AddTo TT DFN
+instance AddTo TT CODE
+instance AddTo TT SAMP
+instance AddTo TT KBD
+instance AddTo TT VAR
+instance AddTo TT CITE
+instance AddTo TT ABBR
+instance AddTo TT ACRONYM
+instance AddTo TT A
+instance AddTo TT IMG
+instance AddTo TT APPLET
+instance AddTo TT OBJECT
+instance AddTo TT FONT
+instance AddTo TT BASEFONT
+instance AddTo TT BR
+instance AddTo TT SCRIPT
+instance AddTo TT MAP
+instance AddTo TT Q
+instance AddTo TT SUB
+instance AddTo TT SUP
+instance AddTo TT SPAN
+instance AddTo TT BDO
+instance AddTo TT IFRAME
+instance AddTo TT INPUT
+instance AddTo TT SELECT
+instance AddTo TT TEXTAREA
+instance AddTo TT LABEL
+instance AddTo TT BUTTON
+instance TAG I
+instance AddTo I CDATA
+instance AddTo I TT
+instance AddTo I I
+instance AddTo I B
+instance AddTo I U
+instance AddTo I S
+instance AddTo I STRIKE
+instance AddTo I BIG
+instance AddTo I SMALL
+instance AddTo I EM
+instance AddTo I STRONG
+instance AddTo I DFN
+instance AddTo I CODE
+instance AddTo I SAMP
+instance AddTo I KBD
+instance AddTo I VAR
+instance AddTo I CITE
+instance AddTo I ABBR
+instance AddTo I ACRONYM
+instance AddTo I A
+instance AddTo I IMG
+instance AddTo I APPLET
+instance AddTo I OBJECT
+instance AddTo I FONT
+instance AddTo I BASEFONT
+instance AddTo I BR
+instance AddTo I SCRIPT
+instance AddTo I MAP
+instance AddTo I Q
+instance AddTo I SUB
+instance AddTo I SUP
+instance AddTo I SPAN
+instance AddTo I BDO
+instance AddTo I IFRAME
+instance AddTo I INPUT
+instance AddTo I SELECT
+instance AddTo I TEXTAREA
+instance AddTo I LABEL
+instance AddTo I BUTTON
+instance TAG B
+instance AddTo B CDATA
+instance AddTo B TT
+instance AddTo B I
+instance AddTo B B
+instance AddTo B U
+instance AddTo B S
+instance AddTo B STRIKE
+instance AddTo B BIG
+instance AddTo B SMALL
+instance AddTo B EM
+instance AddTo B STRONG
+instance AddTo B DFN
+instance AddTo B CODE
+instance AddTo B SAMP
+instance AddTo B KBD
+instance AddTo B VAR
+instance AddTo B CITE
+instance AddTo B ABBR
+instance AddTo B ACRONYM
+instance AddTo B A
+instance AddTo B IMG
+instance AddTo B APPLET
+instance AddTo B OBJECT
+instance AddTo B FONT
+instance AddTo B BASEFONT
+instance AddTo B BR
+instance AddTo B SCRIPT
+instance AddTo B MAP
+instance AddTo B Q
+instance AddTo B SUB
+instance AddTo B SUP
+instance AddTo B SPAN
+instance AddTo B BDO
+instance AddTo B IFRAME
+instance AddTo B INPUT
+instance AddTo B SELECT
+instance AddTo B TEXTAREA
+instance AddTo B LABEL
+instance AddTo B BUTTON
+instance TAG U
+instance AddTo U CDATA
+instance AddTo U TT
+instance AddTo U I
+instance AddTo U B
+instance AddTo U U
+instance AddTo U S
+instance AddTo U STRIKE
+instance AddTo U BIG
+instance AddTo U SMALL
+instance AddTo U EM
+instance AddTo U STRONG
+instance AddTo U DFN
+instance AddTo U CODE
+instance AddTo U SAMP
+instance AddTo U KBD
+instance AddTo U VAR
+instance AddTo U CITE
+instance AddTo U ABBR
+instance AddTo U ACRONYM
+instance AddTo U A
+instance AddTo U IMG
+instance AddTo U APPLET
+instance AddTo U OBJECT
+instance AddTo U FONT
+instance AddTo U BASEFONT
+instance AddTo U BR
+instance AddTo U SCRIPT
+instance AddTo U MAP
+instance AddTo U Q
+instance AddTo U SUB
+instance AddTo U SUP
+instance AddTo U SPAN
+instance AddTo U BDO
+instance AddTo U IFRAME
+instance AddTo U INPUT
+instance AddTo U SELECT
+instance AddTo U TEXTAREA
+instance AddTo U LABEL
+instance AddTo U BUTTON
+instance TAG S
+instance AddTo S CDATA
+instance AddTo S TT
+instance AddTo S I
+instance AddTo S B
+instance AddTo S U
+instance AddTo S S
+instance AddTo S STRIKE
+instance AddTo S BIG
+instance AddTo S SMALL
+instance AddTo S EM
+instance AddTo S STRONG
+instance AddTo S DFN
+instance AddTo S CODE
+instance AddTo S SAMP
+instance AddTo S KBD
+instance AddTo S VAR
+instance AddTo S CITE
+instance AddTo S ABBR
+instance AddTo S ACRONYM
+instance AddTo S A
+instance AddTo S IMG
+instance AddTo S APPLET
+instance AddTo S OBJECT
+instance AddTo S FONT
+instance AddTo S BASEFONT
+instance AddTo S BR
+instance AddTo S SCRIPT
+instance AddTo S MAP
+instance AddTo S Q
+instance AddTo S SUB
+instance AddTo S SUP
+instance AddTo S SPAN
+instance AddTo S BDO
+instance AddTo S IFRAME
+instance AddTo S INPUT
+instance AddTo S SELECT
+instance AddTo S TEXTAREA
+instance AddTo S LABEL
+instance AddTo S BUTTON
+instance TAG STRIKE
+instance AddTo STRIKE CDATA
+instance AddTo STRIKE TT
+instance AddTo STRIKE I
+instance AddTo STRIKE B
+instance AddTo STRIKE U
+instance AddTo STRIKE S
+instance AddTo STRIKE STRIKE
+instance AddTo STRIKE BIG
+instance AddTo STRIKE SMALL
+instance AddTo STRIKE EM
+instance AddTo STRIKE STRONG
+instance AddTo STRIKE DFN
+instance AddTo STRIKE CODE
+instance AddTo STRIKE SAMP
+instance AddTo STRIKE KBD
+instance AddTo STRIKE VAR
+instance AddTo STRIKE CITE
+instance AddTo STRIKE ABBR
+instance AddTo STRIKE ACRONYM
+instance AddTo STRIKE A
+instance AddTo STRIKE IMG
+instance AddTo STRIKE APPLET
+instance AddTo STRIKE OBJECT
+instance AddTo STRIKE FONT
+instance AddTo STRIKE BASEFONT
+instance AddTo STRIKE BR
+instance AddTo STRIKE SCRIPT
+instance AddTo STRIKE MAP
+instance AddTo STRIKE Q
+instance AddTo STRIKE SUB
+instance AddTo STRIKE SUP
+instance AddTo STRIKE SPAN
+instance AddTo STRIKE BDO
+instance AddTo STRIKE IFRAME
+instance AddTo STRIKE INPUT
+instance AddTo STRIKE SELECT
+instance AddTo STRIKE TEXTAREA
+instance AddTo STRIKE LABEL
+instance AddTo STRIKE BUTTON
+instance TAG BIG
+instance AddTo BIG CDATA
+instance AddTo BIG TT
+instance AddTo BIG I
+instance AddTo BIG B
+instance AddTo BIG U
+instance AddTo BIG S
+instance AddTo BIG STRIKE
+instance AddTo BIG BIG
+instance AddTo BIG SMALL
+instance AddTo BIG EM
+instance AddTo BIG STRONG
+instance AddTo BIG DFN
+instance AddTo BIG CODE
+instance AddTo BIG SAMP
+instance AddTo BIG KBD
+instance AddTo BIG VAR
+instance AddTo BIG CITE
+instance AddTo BIG ABBR
+instance AddTo BIG ACRONYM
+instance AddTo BIG A
+instance AddTo BIG IMG
+instance AddTo BIG APPLET
+instance AddTo BIG OBJECT
+instance AddTo BIG FONT
+instance AddTo BIG BASEFONT
+instance AddTo BIG BR
+instance AddTo BIG SCRIPT
+instance AddTo BIG MAP
+instance AddTo BIG Q
+instance AddTo BIG SUB
+instance AddTo BIG SUP
+instance AddTo BIG SPAN
+instance AddTo BIG BDO
+instance AddTo BIG IFRAME
+instance AddTo BIG INPUT
+instance AddTo BIG SELECT
+instance AddTo BIG TEXTAREA
+instance AddTo BIG LABEL
+instance AddTo BIG BUTTON
+instance TAG SMALL
+instance AddTo SMALL CDATA
+instance AddTo SMALL TT
+instance AddTo SMALL I
+instance AddTo SMALL B
+instance AddTo SMALL U
+instance AddTo SMALL S
+instance AddTo SMALL STRIKE
+instance AddTo SMALL BIG
+instance AddTo SMALL SMALL
+instance AddTo SMALL EM
+instance AddTo SMALL STRONG
+instance AddTo SMALL DFN
+instance AddTo SMALL CODE
+instance AddTo SMALL SAMP
+instance AddTo SMALL KBD
+instance AddTo SMALL VAR
+instance AddTo SMALL CITE
+instance AddTo SMALL ABBR
+instance AddTo SMALL ACRONYM
+instance AddTo SMALL A
+instance AddTo SMALL IMG
+instance AddTo SMALL APPLET
+instance AddTo SMALL OBJECT
+instance AddTo SMALL FONT
+instance AddTo SMALL BASEFONT
+instance AddTo SMALL BR
+instance AddTo SMALL SCRIPT
+instance AddTo SMALL MAP
+instance AddTo SMALL Q
+instance AddTo SMALL SUB
+instance AddTo SMALL SUP
+instance AddTo SMALL SPAN
+instance AddTo SMALL BDO
+instance AddTo SMALL IFRAME
+instance AddTo SMALL INPUT
+instance AddTo SMALL SELECT
+instance AddTo SMALL TEXTAREA
+instance AddTo SMALL LABEL
+instance AddTo SMALL BUTTON
+instance TAG EM
+instance AddTo EM CDATA
+instance AddTo EM TT
+instance AddTo EM I
+instance AddTo EM B
+instance AddTo EM U
+instance AddTo EM S
+instance AddTo EM STRIKE
+instance AddTo EM BIG
+instance AddTo EM SMALL
+instance AddTo EM EM
+instance AddTo EM STRONG
+instance AddTo EM DFN
+instance AddTo EM CODE
+instance AddTo EM SAMP
+instance AddTo EM KBD
+instance AddTo EM VAR
+instance AddTo EM CITE
+instance AddTo EM ABBR
+instance AddTo EM ACRONYM
+instance AddTo EM A
+instance AddTo EM IMG
+instance AddTo EM APPLET
+instance AddTo EM OBJECT
+instance AddTo EM FONT
+instance AddTo EM BASEFONT
+instance AddTo EM BR
+instance AddTo EM SCRIPT
+instance AddTo EM MAP
+instance AddTo EM Q
+instance AddTo EM SUB
+instance AddTo EM SUP
+instance AddTo EM SPAN
+instance AddTo EM BDO
+instance AddTo EM IFRAME
+instance AddTo EM INPUT
+instance AddTo EM SELECT
+instance AddTo EM TEXTAREA
+instance AddTo EM LABEL
+instance AddTo EM BUTTON
+instance TAG STRONG
+instance AddTo STRONG CDATA
+instance AddTo STRONG TT
+instance AddTo STRONG I
+instance AddTo STRONG B
+instance AddTo STRONG U
+instance AddTo STRONG S
+instance AddTo STRONG STRIKE
+instance AddTo STRONG BIG
+instance AddTo STRONG SMALL
+instance AddTo STRONG EM
+instance AddTo STRONG STRONG
+instance AddTo STRONG DFN
+instance AddTo STRONG CODE
+instance AddTo STRONG SAMP
+instance AddTo STRONG KBD
+instance AddTo STRONG VAR
+instance AddTo STRONG CITE
+instance AddTo STRONG ABBR
+instance AddTo STRONG ACRONYM
+instance AddTo STRONG A
+instance AddTo STRONG IMG
+instance AddTo STRONG APPLET
+instance AddTo STRONG OBJECT
+instance AddTo STRONG FONT
+instance AddTo STRONG BASEFONT
+instance AddTo STRONG BR
+instance AddTo STRONG SCRIPT
+instance AddTo STRONG MAP
+instance AddTo STRONG Q
+instance AddTo STRONG SUB
+instance AddTo STRONG SUP
+instance AddTo STRONG SPAN
+instance AddTo STRONG BDO
+instance AddTo STRONG IFRAME
+instance AddTo STRONG INPUT
+instance AddTo STRONG SELECT
+instance AddTo STRONG TEXTAREA
+instance AddTo STRONG LABEL
+instance AddTo STRONG BUTTON
+instance TAG DFN
+instance AddTo DFN CDATA
+instance AddTo DFN TT
+instance AddTo DFN I
+instance AddTo DFN B
+instance AddTo DFN U
+instance AddTo DFN S
+instance AddTo DFN STRIKE
+instance AddTo DFN BIG
+instance AddTo DFN SMALL
+instance AddTo DFN EM
+instance AddTo DFN STRONG
+instance AddTo DFN DFN
+instance AddTo DFN CODE
+instance AddTo DFN SAMP
+instance AddTo DFN KBD
+instance AddTo DFN VAR
+instance AddTo DFN CITE
+instance AddTo DFN ABBR
+instance AddTo DFN ACRONYM
+instance AddTo DFN A
+instance AddTo DFN IMG
+instance AddTo DFN APPLET
+instance AddTo DFN OBJECT
+instance AddTo DFN FONT
+instance AddTo DFN BASEFONT
+instance AddTo DFN BR
+instance AddTo DFN SCRIPT
+instance AddTo DFN MAP
+instance AddTo DFN Q
+instance AddTo DFN SUB
+instance AddTo DFN SUP
+instance AddTo DFN SPAN
+instance AddTo DFN BDO
+instance AddTo DFN IFRAME
+instance AddTo DFN INPUT
+instance AddTo DFN SELECT
+instance AddTo DFN TEXTAREA
+instance AddTo DFN LABEL
+instance AddTo DFN BUTTON
+instance TAG CODE
+instance AddTo CODE CDATA
+instance AddTo CODE TT
+instance AddTo CODE I
+instance AddTo CODE B
+instance AddTo CODE U
+instance AddTo CODE S
+instance AddTo CODE STRIKE
+instance AddTo CODE BIG
+instance AddTo CODE SMALL
+instance AddTo CODE EM
+instance AddTo CODE STRONG
+instance AddTo CODE DFN
+instance AddTo CODE CODE
+instance AddTo CODE SAMP
+instance AddTo CODE KBD
+instance AddTo CODE VAR
+instance AddTo CODE CITE
+instance AddTo CODE ABBR
+instance AddTo CODE ACRONYM
+instance AddTo CODE A
+instance AddTo CODE IMG
+instance AddTo CODE APPLET
+instance AddTo CODE OBJECT
+instance AddTo CODE FONT
+instance AddTo CODE BASEFONT
+instance AddTo CODE BR
+instance AddTo CODE SCRIPT
+instance AddTo CODE MAP
+instance AddTo CODE Q
+instance AddTo CODE SUB
+instance AddTo CODE SUP
+instance AddTo CODE SPAN
+instance AddTo CODE BDO
+instance AddTo CODE IFRAME
+instance AddTo CODE INPUT
+instance AddTo CODE SELECT
+instance AddTo CODE TEXTAREA
+instance AddTo CODE LABEL
+instance AddTo CODE BUTTON
+instance TAG SAMP
+instance AddTo SAMP CDATA
+instance AddTo SAMP TT
+instance AddTo SAMP I
+instance AddTo SAMP B
+instance AddTo SAMP U
+instance AddTo SAMP S
+instance AddTo SAMP STRIKE
+instance AddTo SAMP BIG
+instance AddTo SAMP SMALL
+instance AddTo SAMP EM
+instance AddTo SAMP STRONG
+instance AddTo SAMP DFN
+instance AddTo SAMP CODE
+instance AddTo SAMP SAMP
+instance AddTo SAMP KBD
+instance AddTo SAMP VAR
+instance AddTo SAMP CITE
+instance AddTo SAMP ABBR
+instance AddTo SAMP ACRONYM
+instance AddTo SAMP A
+instance AddTo SAMP IMG
+instance AddTo SAMP APPLET
+instance AddTo SAMP OBJECT
+instance AddTo SAMP FONT
+instance AddTo SAMP BASEFONT
+instance AddTo SAMP BR
+instance AddTo SAMP SCRIPT
+instance AddTo SAMP MAP
+instance AddTo SAMP Q
+instance AddTo SAMP SUB
+instance AddTo SAMP SUP
+instance AddTo SAMP SPAN
+instance AddTo SAMP BDO
+instance AddTo SAMP IFRAME
+instance AddTo SAMP INPUT
+instance AddTo SAMP SELECT
+instance AddTo SAMP TEXTAREA
+instance AddTo SAMP LABEL
+instance AddTo SAMP BUTTON
+instance TAG KBD
+instance AddTo KBD CDATA
+instance AddTo KBD TT
+instance AddTo KBD I
+instance AddTo KBD B
+instance AddTo KBD U
+instance AddTo KBD S
+instance AddTo KBD STRIKE
+instance AddTo KBD BIG
+instance AddTo KBD SMALL
+instance AddTo KBD EM
+instance AddTo KBD STRONG
+instance AddTo KBD DFN
+instance AddTo KBD CODE
+instance AddTo KBD SAMP
+instance AddTo KBD KBD
+instance AddTo KBD VAR
+instance AddTo KBD CITE
+instance AddTo KBD ABBR
+instance AddTo KBD ACRONYM
+instance AddTo KBD A
+instance AddTo KBD IMG
+instance AddTo KBD APPLET
+instance AddTo KBD OBJECT
+instance AddTo KBD FONT
+instance AddTo KBD BASEFONT
+instance AddTo KBD BR
+instance AddTo KBD SCRIPT
+instance AddTo KBD MAP
+instance AddTo KBD Q
+instance AddTo KBD SUB
+instance AddTo KBD SUP
+instance AddTo KBD SPAN
+instance AddTo KBD BDO
+instance AddTo KBD IFRAME
+instance AddTo KBD INPUT
+instance AddTo KBD SELECT
+instance AddTo KBD TEXTAREA
+instance AddTo KBD LABEL
+instance AddTo KBD BUTTON
+instance TAG VAR
+instance AddTo VAR CDATA
+instance AddTo VAR TT
+instance AddTo VAR I
+instance AddTo VAR B
+instance AddTo VAR U
+instance AddTo VAR S
+instance AddTo VAR STRIKE
+instance AddTo VAR BIG
+instance AddTo VAR SMALL
+instance AddTo VAR EM
+instance AddTo VAR STRONG
+instance AddTo VAR DFN
+instance AddTo VAR CODE
+instance AddTo VAR SAMP
+instance AddTo VAR KBD
+instance AddTo VAR VAR
+instance AddTo VAR CITE
+instance AddTo VAR ABBR
+instance AddTo VAR ACRONYM
+instance AddTo VAR A
+instance AddTo VAR IMG
+instance AddTo VAR APPLET
+instance AddTo VAR OBJECT
+instance AddTo VAR FONT
+instance AddTo VAR BASEFONT
+instance AddTo VAR BR
+instance AddTo VAR SCRIPT
+instance AddTo VAR MAP
+instance AddTo VAR Q
+instance AddTo VAR SUB
+instance AddTo VAR SUP
+instance AddTo VAR SPAN
+instance AddTo VAR BDO
+instance AddTo VAR IFRAME
+instance AddTo VAR INPUT
+instance AddTo VAR SELECT
+instance AddTo VAR TEXTAREA
+instance AddTo VAR LABEL
+instance AddTo VAR BUTTON
+instance TAG CITE
+instance AddTo CITE CDATA
+instance AddTo CITE TT
+instance AddTo CITE I
+instance AddTo CITE B
+instance AddTo CITE U
+instance AddTo CITE S
+instance AddTo CITE STRIKE
+instance AddTo CITE BIG
+instance AddTo CITE SMALL
+instance AddTo CITE EM
+instance AddTo CITE STRONG
+instance AddTo CITE DFN
+instance AddTo CITE CODE
+instance AddTo CITE SAMP
+instance AddTo CITE KBD
+instance AddTo CITE VAR
+instance AddTo CITE CITE
+instance AddTo CITE ABBR
+instance AddTo CITE ACRONYM
+instance AddTo CITE A
+instance AddTo CITE IMG
+instance AddTo CITE APPLET
+instance AddTo CITE OBJECT
+instance AddTo CITE FONT
+instance AddTo CITE BASEFONT
+instance AddTo CITE BR
+instance AddTo CITE SCRIPT
+instance AddTo CITE MAP
+instance AddTo CITE Q
+instance AddTo CITE SUB
+instance AddTo CITE SUP
+instance AddTo CITE SPAN
+instance AddTo CITE BDO
+instance AddTo CITE IFRAME
+instance AddTo CITE INPUT
+instance AddTo CITE SELECT
+instance AddTo CITE TEXTAREA
+instance AddTo CITE LABEL
+instance AddTo CITE BUTTON
+instance TAG ABBR
+instance AddTo ABBR CDATA
+instance AddTo ABBR TT
+instance AddTo ABBR I
+instance AddTo ABBR B
+instance AddTo ABBR U
+instance AddTo ABBR S
+instance AddTo ABBR STRIKE
+instance AddTo ABBR BIG
+instance AddTo ABBR SMALL
+instance AddTo ABBR EM
+instance AddTo ABBR STRONG
+instance AddTo ABBR DFN
+instance AddTo ABBR CODE
+instance AddTo ABBR SAMP
+instance AddTo ABBR KBD
+instance AddTo ABBR VAR
+instance AddTo ABBR CITE
+instance AddTo ABBR ABBR
+instance AddTo ABBR ACRONYM
+instance AddTo ABBR A
+instance AddTo ABBR IMG
+instance AddTo ABBR APPLET
+instance AddTo ABBR OBJECT
+instance AddTo ABBR FONT
+instance AddTo ABBR BASEFONT
+instance AddTo ABBR BR
+instance AddTo ABBR SCRIPT
+instance AddTo ABBR MAP
+instance AddTo ABBR Q
+instance AddTo ABBR SUB
+instance AddTo ABBR SUP
+instance AddTo ABBR SPAN
+instance AddTo ABBR BDO
+instance AddTo ABBR IFRAME
+instance AddTo ABBR INPUT
+instance AddTo ABBR SELECT
+instance AddTo ABBR TEXTAREA
+instance AddTo ABBR LABEL
+instance AddTo ABBR BUTTON
+instance TAG ACRONYM
+instance AddTo ACRONYM CDATA
+instance AddTo ACRONYM TT
+instance AddTo ACRONYM I
+instance AddTo ACRONYM B
+instance AddTo ACRONYM U
+instance AddTo ACRONYM S
+instance AddTo ACRONYM STRIKE
+instance AddTo ACRONYM BIG
+instance AddTo ACRONYM SMALL
+instance AddTo ACRONYM EM
+instance AddTo ACRONYM STRONG
+instance AddTo ACRONYM DFN
+instance AddTo ACRONYM CODE
+instance AddTo ACRONYM SAMP
+instance AddTo ACRONYM KBD
+instance AddTo ACRONYM VAR
+instance AddTo ACRONYM CITE
+instance AddTo ACRONYM ABBR
+instance AddTo ACRONYM ACRONYM
+instance AddTo ACRONYM A
+instance AddTo ACRONYM IMG
+instance AddTo ACRONYM APPLET
+instance AddTo ACRONYM OBJECT
+instance AddTo ACRONYM FONT
+instance AddTo ACRONYM BASEFONT
+instance AddTo ACRONYM BR
+instance AddTo ACRONYM SCRIPT
+instance AddTo ACRONYM MAP
+instance AddTo ACRONYM Q
+instance AddTo ACRONYM SUB
+instance AddTo ACRONYM SUP
+instance AddTo ACRONYM SPAN
+instance AddTo ACRONYM BDO
+instance AddTo ACRONYM IFRAME
+instance AddTo ACRONYM INPUT
+instance AddTo ACRONYM SELECT
+instance AddTo ACRONYM TEXTAREA
+instance AddTo ACRONYM LABEL
+instance AddTo ACRONYM BUTTON
+data ALIGN_bottom = ALIGN_bottom
+data ALIGN_center = ALIGN_center
+data ALIGN_char = ALIGN_char
+data ALIGN_justify = ALIGN_justify
+data ALIGN_left = ALIGN_left
+data ALIGN_middle = ALIGN_middle
+data ALIGN_right = ALIGN_right
+data ALIGN_top = ALIGN_top
+data CHECKED_checked = CHECKED_checked
+data CLEAR_all = CLEAR_all
+data CLEAR_left = CLEAR_left
+data CLEAR_none = CLEAR_none
+data CLEAR_right = CLEAR_right
+data COMPACT_compact = COMPACT_compact
+data DECLARE_declare = DECLARE_declare
+data DEFER_defer = DEFER_defer
+data DIR_ltr = DIR_ltr
+data DIR_rtl = DIR_rtl
+data DISABLED_disabled = DISABLED_disabled
+data FRAME_above = FRAME_above
+data FRAME_below = FRAME_below
+data FRAME_border = FRAME_border
+data FRAME_box = FRAME_box
+data FRAME_hsides = FRAME_hsides
+data FRAME_lhs = FRAME_lhs
+data FRAME_rhs = FRAME_rhs
+data FRAME_void = FRAME_void
+data FRAME_vsides = FRAME_vsides
+data ISMAP_ismap = ISMAP_ismap
+data METHOD_GET = METHOD_GET
+data METHOD_POST = METHOD_POST
+data MULTIPLE_multiple = MULTIPLE_multiple
+data NOHREF_nohref = NOHREF_nohref
+data NOSHADE_noshade = NOSHADE_noshade
+data NOWRAP_nowrap = NOWRAP_nowrap
+data READONLY_readonly = READONLY_readonly
+data RULES_all = RULES_all
+data RULES_cols = RULES_cols
+data RULES_groups = RULES_groups
+data RULES_none = RULES_none
+data RULES_rows = RULES_rows
+data SCOPE_col = SCOPE_col
+data SCOPE_colgroup = SCOPE_colgroup
+data SCOPE_row = SCOPE_row
+data SCOPE_rowgroup = SCOPE_rowgroup
+data SCROLLING_auto = SCROLLING_auto
+data SCROLLING_no = SCROLLING_no
+data SCROLLING_yes = SCROLLING_yes
+data SELECTED_selected = SELECTED_selected
+data SHAPE_circle = SHAPE_circle
+data SHAPE_default' = SHAPE_default'
+data SHAPE_poly = SHAPE_poly
+data SHAPE_rect = SHAPE_rect
+data TYPE_BUTTON = TYPE_BUTTON
+data TYPE_CHECKBOX = TYPE_CHECKBOX
+data TYPE_FILE = TYPE_FILE
+data TYPE_HIDDEN = TYPE_HIDDEN
+data TYPE_IMAGE = TYPE_IMAGE
+data TYPE_PASSWORD = TYPE_PASSWORD
+data TYPE_RADIO = TYPE_RADIO
+data TYPE_RESET = TYPE_RESET
+data TYPE_SUBMIT = TYPE_SUBMIT
+data TYPE_TEXT = TYPE_TEXT
+data TYPE_button = TYPE_button
+data TYPE_circle = TYPE_circle
+data TYPE_disc = TYPE_disc
+data TYPE_reset = TYPE_reset
+data TYPE_square = TYPE_square
+data TYPE_submit = TYPE_submit
+data VALIGN_baseline = VALIGN_baseline
+data VALIGN_bottom = VALIGN_bottom
+data VALIGN_middle = VALIGN_middle
+data VALIGN_top = VALIGN_top
+data VALUETYPE_DATA = VALUETYPE_DATA
+data VALUETYPE_OBJECT = VALUETYPE_OBJECT
+data VALUETYPE_REF = VALUETYPE_REF
+instance ATTRIBUTE ABBR
+instance ATTRIBUTE ACCEPT
+instance ATTRIBUTE ACCEPT_CHARSET
+instance ATTRIBUTE ACCESSKEY
+instance ATTRIBUTE ACTION
+instance ATTRIBUTE ALIGN
+instance ATTRIBUTE ALINK
+instance ATTRIBUTE ALT
+instance ATTRIBUTE ARCHIVE
+instance ATTRIBUTE AXIS
+instance ATTRIBUTE BACKGROUND
+instance ATTRIBUTE BGCOLOR
+instance ATTRIBUTE BORDER
+instance ATTRIBUTE CELLPADDING
+instance ATTRIBUTE CELLSPACING
+instance ATTRIBUTE CHAR
+instance ATTRIBUTE CHAROFF
+instance ATTRIBUTE CHARSET
+instance ATTRIBUTE CHECKED
+instance ATTRIBUTE CITE
+instance ATTRIBUTE CLASS
+instance ATTRIBUTE CLASSID
+instance ATTRIBUTE CLEAR
+instance ATTRIBUTE CODE
+instance ATTRIBUTE CODEBASE
+instance ATTRIBUTE CODETYPE
+instance ATTRIBUTE COLOR
+instance ATTRIBUTE COLS
+instance ATTRIBUTE COLSPAN
+instance ATTRIBUTE COMPACT
+instance ATTRIBUTE CONTENT
+instance ATTRIBUTE COORDS
+instance ATTRIBUTE DATA
+instance ATTRIBUTE DATAPAGESIZE
+instance ATTRIBUTE DATETIME
+instance ATTRIBUTE DECLARE
+instance ATTRIBUTE DEFER
+instance ATTRIBUTE DIR
+instance ATTRIBUTE DISABLED
+instance ATTRIBUTE ENCTYPE
+instance ATTRIBUTE EVENT
+instance ATTRIBUTE FACE
+instance ATTRIBUTE FOR
+instance ATTRIBUTE FRAME
+instance ATTRIBUTE FRAMEBORDER
+instance ATTRIBUTE HEADERS
+instance ATTRIBUTE HEIGHT
+instance ATTRIBUTE HREF
+instance ATTRIBUTE HREFLANG
+instance ATTRIBUTE HSPACE
+instance ATTRIBUTE HTTP_EQUIV
+instance ATTRIBUTE ID
+instance ATTRIBUTE ISMAP
+instance ATTRIBUTE LABEL
+instance ATTRIBUTE LANG
+instance ATTRIBUTE LANGUAGE
+instance ATTRIBUTE LINK
+instance ATTRIBUTE LONGDESC
+instance ATTRIBUTE MARGINHEIGHT
+instance ATTRIBUTE MARGINWIDTH
+instance ATTRIBUTE MAXLENGTH
+instance ATTRIBUTE MEDIA
+instance ATTRIBUTE METHOD
+instance ATTRIBUTE MULTIPLE
+instance ATTRIBUTE NAME
+instance ATTRIBUTE NOHREF
+instance ATTRIBUTE NOSHADE
+instance ATTRIBUTE NOWRAP
+instance ATTRIBUTE OBJECT
+instance ATTRIBUTE ONBLUR
+instance ATTRIBUTE ONCHANGE
+instance ATTRIBUTE ONCLICK
+instance ATTRIBUTE ONDBLCLICK
+instance ATTRIBUTE ONFOCUS
+instance ATTRIBUTE ONKEYDOWN
+instance ATTRIBUTE ONKEYPRESS
+instance ATTRIBUTE ONKEYUP
+instance ATTRIBUTE ONLOAD
+instance ATTRIBUTE ONMOUSEDOWN
+instance ATTRIBUTE ONMOUSEMOVE
+instance ATTRIBUTE ONMOUSEOUT
+instance ATTRIBUTE ONMOUSEOVER
+instance ATTRIBUTE ONMOUSEUP
+instance ATTRIBUTE ONRESET
+instance ATTRIBUTE ONSELECT
+instance ATTRIBUTE ONSUBMIT
+instance ATTRIBUTE ONUNLOAD
+instance ATTRIBUTE PROFILE
+instance ATTRIBUTE PROMPT
+instance ATTRIBUTE READONLY
+instance ATTRIBUTE REL
+instance ATTRIBUTE REV
+instance ATTRIBUTE ROWS
+instance ATTRIBUTE ROWSPAN
+instance ATTRIBUTE RULES
+instance ATTRIBUTE SCHEME
+instance ATTRIBUTE SCOPE
+instance ATTRIBUTE SCROLLING
+instance ATTRIBUTE SELECTED
+instance ATTRIBUTE SHAPE
+instance ATTRIBUTE SIZE
+instance ATTRIBUTE SPAN
+instance ATTRIBUTE SRC
+instance ATTRIBUTE STANDBY
+instance ATTRIBUTE START
+instance ATTRIBUTE STYLE
+instance ATTRIBUTE SUMMARY
+instance ATTRIBUTE TABINDEX
+instance ATTRIBUTE TARGET
+instance ATTRIBUTE TEXT
+instance ATTRIBUTE TITLE
+instance ATTRIBUTE TYPE
+instance ATTRIBUTE USEMAP
+instance ATTRIBUTE VALIGN
+instance ATTRIBUTE VALUE
+instance ATTRIBUTE VALUETYPE
+instance ATTRIBUTE VERSION
+instance ATTRIBUTE VLINK
+instance ATTRIBUTE VSPACE
+instance ATTRIBUTE WIDTH
+instance AttrValue ABBR String
+instance AttrValue ACCEPT String
+instance AttrValue ACCEPT_CHARSET String
+instance AttrValue ACCESSKEY String
+instance AttrValue ACTION String
+instance AttrValue ALIGN ALIGN_bottom
+instance AttrValue ALIGN ALIGN_center
+instance AttrValue ALIGN ALIGN_char
+instance AttrValue ALIGN ALIGN_justify
+instance AttrValue ALIGN ALIGN_left
+instance AttrValue ALIGN ALIGN_middle
+instance AttrValue ALIGN ALIGN_right
+instance AttrValue ALIGN ALIGN_top
+instance AttrValue ALINK String
+instance AttrValue ALT String
+instance AttrValue ARCHIVE String
+instance AttrValue AXIS String
+instance AttrValue BACKGROUND String
+instance AttrValue BGCOLOR String
+instance AttrValue BORDER String
+instance AttrValue CELLPADDING String
+instance AttrValue CELLSPACING String
+instance AttrValue CHAR String
+instance AttrValue CHAROFF String
+instance AttrValue CHARSET String
+instance AttrValue CHECKED CHECKED_checked
+instance AttrValue CITE String
+instance AttrValue CLASS String
+instance AttrValue CLASSID String
+instance AttrValue CLEAR CLEAR_all
+instance AttrValue CLEAR CLEAR_left
+instance AttrValue CLEAR CLEAR_none
+instance AttrValue CLEAR CLEAR_right
+instance AttrValue CODE String
+instance AttrValue CODEBASE String
+instance AttrValue CODETYPE String
+instance AttrValue COLOR String
+instance AttrValue COLS Int
+instance AttrValue COLSPAN Int
+instance AttrValue COMPACT COMPACT_compact
+instance AttrValue CONTENT String
+instance AttrValue COORDS String
+instance AttrValue DATA String
+instance AttrValue DATAPAGESIZE String
+instance AttrValue DATETIME String
+instance AttrValue DECLARE DECLARE_declare
+instance AttrValue DEFER DEFER_defer
+instance AttrValue DIR DIR_ltr
+instance AttrValue DIR DIR_rtl
+instance AttrValue DISABLED DISABLED_disabled
+instance AttrValue ENCTYPE String
+instance AttrValue EVENT String
+instance AttrValue FACE String
+instance AttrValue FOR String
+instance AttrValue FRAME FRAME_above
+instance AttrValue FRAME FRAME_below
+instance AttrValue FRAME FRAME_border
+instance AttrValue FRAME FRAME_box
+instance AttrValue FRAME FRAME_hsides
+instance AttrValue FRAME FRAME_lhs
+instance AttrValue FRAME FRAME_rhs
+instance AttrValue FRAME FRAME_void
+instance AttrValue FRAME FRAME_vsides
+instance AttrValue FRAMEBORDER Int
+instance AttrValue HEADERS [String]
+instance AttrValue HEIGHT String
+instance AttrValue HREF String
+instance AttrValue HREFLANG String
+instance AttrValue HSPACE String
+instance AttrValue HTTP_EQUIV String
+instance AttrValue ID String
+instance AttrValue ISMAP ISMAP_ismap
+instance AttrValue LABEL String
+instance AttrValue LANG String
+instance AttrValue LANGUAGE String
+instance AttrValue LINK String
+instance AttrValue LONGDESC String
+instance AttrValue MARGINHEIGHT String
+instance AttrValue MARGINWIDTH String
+instance AttrValue MAXLENGTH Int
+instance AttrValue MEDIA String
+instance AttrValue METHOD METHOD_GET
+instance AttrValue METHOD METHOD_POST
+instance AttrValue MULTIPLE MULTIPLE_multiple
+instance AttrValue NAME String
+instance AttrValue NOHREF NOHREF_nohref
+instance AttrValue NOSHADE NOSHADE_noshade
+instance AttrValue NOWRAP NOWRAP_nowrap
+instance AttrValue OBJECT String
+instance AttrValue ONBLUR String
+instance AttrValue ONCHANGE String
+instance AttrValue ONCLICK String
+instance AttrValue ONDBLCLICK String
+instance AttrValue ONFOCUS String
+instance AttrValue ONKEYDOWN String
+instance AttrValue ONKEYPRESS String
+instance AttrValue ONKEYUP String
+instance AttrValue ONLOAD String
+instance AttrValue ONMOUSEDOWN String
+instance AttrValue ONMOUSEMOVE String
+instance AttrValue ONMOUSEOUT String
+instance AttrValue ONMOUSEOVER String
+instance AttrValue ONMOUSEUP String
+instance AttrValue ONRESET String
+instance AttrValue ONSELECT String
+instance AttrValue ONSUBMIT String
+instance AttrValue ONUNLOAD String
+instance AttrValue PROFILE String
+instance AttrValue PROMPT String
+instance AttrValue READONLY READONLY_readonly
+instance AttrValue REL String
+instance AttrValue REV String
+instance AttrValue ROWS Int
+instance AttrValue ROWSPAN Int
+instance AttrValue RULES RULES_all
+instance AttrValue RULES RULES_cols
+instance AttrValue RULES RULES_groups
+instance AttrValue RULES RULES_none
+instance AttrValue RULES RULES_rows
+instance AttrValue SCHEME String
+instance AttrValue SCOPE SCOPE_col
+instance AttrValue SCOPE SCOPE_colgroup
+instance AttrValue SCOPE SCOPE_row
+instance AttrValue SCOPE SCOPE_rowgroup
+instance AttrValue SCROLLING SCROLLING_auto
+instance AttrValue SCROLLING SCROLLING_no
+instance AttrValue SCROLLING SCROLLING_yes
+instance AttrValue SELECTED SELECTED_selected
+instance AttrValue SHAPE SHAPE_circle
+instance AttrValue SHAPE SHAPE_default'
+instance AttrValue SHAPE SHAPE_poly
+instance AttrValue SHAPE SHAPE_rect
+instance AttrValue SIZE Int
+instance AttrValue SIZE String
+instance AttrValue SPAN Int
+instance AttrValue SRC String
+instance AttrValue STANDBY String
+instance AttrValue START Int
+instance AttrValue STYLE String
+instance AttrValue SUMMARY String
+instance AttrValue TABINDEX Int
+instance AttrValue TARGET String
+instance AttrValue TEXT String
+instance AttrValue TITLE String
+instance AttrValue TYPE String
+instance AttrValue TYPE TYPE_BUTTON
+instance AttrValue TYPE TYPE_CHECKBOX
+instance AttrValue TYPE TYPE_FILE
+instance AttrValue TYPE TYPE_HIDDEN
+instance AttrValue TYPE TYPE_IMAGE
+instance AttrValue TYPE TYPE_PASSWORD
+instance AttrValue TYPE TYPE_RADIO
+instance AttrValue TYPE TYPE_RESET
+instance AttrValue TYPE TYPE_SUBMIT
+instance AttrValue TYPE TYPE_TEXT
+instance AttrValue TYPE TYPE_button
+instance AttrValue TYPE TYPE_circle
+instance AttrValue TYPE TYPE_disc
+instance AttrValue TYPE TYPE_reset
+instance AttrValue TYPE TYPE_square
+instance AttrValue TYPE TYPE_submit
+instance AttrValue USEMAP String
+instance AttrValue VALIGN VALIGN_baseline
+instance AttrValue VALIGN VALIGN_bottom
+instance AttrValue VALIGN VALIGN_middle
+instance AttrValue VALIGN VALIGN_top
+instance AttrValue VALUE Int
+instance AttrValue VALUE String
+instance AttrValue VALUETYPE VALUETYPE_DATA
+instance AttrValue VALUETYPE VALUETYPE_OBJECT
+instance AttrValue VALUETYPE VALUETYPE_REF
+instance AttrValue VERSION String
+instance AttrValue VLINK String
+instance AttrValue VSPACE String
+instance AttrValue WIDTH Int
+instance AttrValue WIDTH String
+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"
+instance Show ALIGN_center where show ALIGN_center = "center"
+instance Show ALIGN_char where show ALIGN_char = "char"
+instance Show ALIGN_justify where show ALIGN_justify = "justify"
+instance Show ALIGN_left where show ALIGN_left = "left"
+instance Show ALIGN_middle where show ALIGN_middle = "middle"
+instance Show ALIGN_right where show ALIGN_right = "right"
+instance Show ALIGN_top where show ALIGN_top = "top"
+instance Show CHECKED_checked where show CHECKED_checked = "checked"
+instance Show CLEAR_all where show CLEAR_all = "all"
+instance Show CLEAR_left where show CLEAR_left = "left"
+instance Show CLEAR_none where show CLEAR_none = "none"
+instance Show CLEAR_right where show CLEAR_right = "right"
+instance Show COMPACT_compact where show COMPACT_compact = "compact"
+instance Show DECLARE_declare where show DECLARE_declare = "declare"
+instance Show DEFER_defer where show DEFER_defer = "defer"
+instance Show DIR_ltr where show DIR_ltr = "ltr"
+instance Show DIR_rtl where show DIR_rtl = "rtl"
+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"
+instance Show FRAME_above where show FRAME_above = "above"
+instance Show FRAME_below where show FRAME_below = "below"
+instance Show FRAME_border where show FRAME_border = "border"
+instance Show FRAME_box where show FRAME_box = "box"
+instance Show FRAME_hsides where show FRAME_hsides = "hsides"
+instance Show FRAME_lhs where show FRAME_lhs = "lhs"
+instance Show FRAME_rhs where show FRAME_rhs = "rhs"
+instance Show FRAME_void where show FRAME_void = "void"
+instance Show FRAME_vsides where show FRAME_vsides = "vsides"
+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"
+instance Show METHOD_GET where show METHOD_GET = "GET"
+instance Show METHOD_POST where show METHOD_POST = "POST"
+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"
+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"
+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"
+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"
+instance Show READONLY_readonly where show READONLY_readonly = "readonly"
+instance Show RULES_all where show RULES_all = "all"
+instance Show RULES_cols where show RULES_cols = "cols"
+instance Show RULES_groups where show RULES_groups = "groups"
+instance Show RULES_none where show RULES_none = "none"
+instance Show RULES_rows where show RULES_rows = "rows"
+instance Show SCOPE_col where show SCOPE_col = "col"
+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"
+instance Show SCOPE_row where show SCOPE_row = "row"
+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"
+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"
+instance Show SCROLLING_no where show SCROLLING_no = "no"
+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"
+instance Show SELECTED_selected where show SELECTED_selected = "selected"
+instance Show SHAPE_circle where show SHAPE_circle = "circle"
+instance Show SHAPE_default' where show SHAPE_default' = "default"
+instance Show SHAPE_poly where show SHAPE_poly = "poly"
+instance Show SHAPE_rect where show SHAPE_rect = "rect"
+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"
+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"
+instance Show TYPE_FILE where show TYPE_FILE = "FILE"
+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"
+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"
+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"
+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"
+instance Show TYPE_RESET where show TYPE_RESET = "RESET"
+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"
+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"
+instance Show TYPE_button where show TYPE_button = "button"
+instance Show TYPE_circle where show TYPE_circle = "circle"
+instance Show TYPE_disc where show TYPE_disc = "disc"
+instance Show TYPE_reset where show TYPE_reset = "reset"
+instance Show TYPE_square where show TYPE_square = "square"
+instance Show TYPE_submit where show TYPE_submit = "submit"
+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"
+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"
+instance Show VALIGN_middle where show VALIGN_middle = "middle"
+instance Show VALIGN_top where show VALIGN_top = "top"
+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"
+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"
+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"
+instance AddAttr A ACCESSKEY
+instance AddAttr A CHARSET
+instance AddAttr A CLASS
+instance AddAttr A COORDS
+instance AddAttr A DIR
+instance AddAttr A HREF
+instance AddAttr A HREFLANG
+instance AddAttr A ID
+instance AddAttr A LANG
+instance AddAttr A NAME
+instance AddAttr A ONBLUR
+instance AddAttr A ONCLICK
+instance AddAttr A ONDBLCLICK
+instance AddAttr A ONFOCUS
+instance AddAttr A ONKEYDOWN
+instance AddAttr A ONKEYPRESS
+instance AddAttr A ONKEYUP
+instance AddAttr A ONMOUSEDOWN
+instance AddAttr A ONMOUSEMOVE
+instance AddAttr A ONMOUSEOUT
+instance AddAttr A ONMOUSEOVER
+instance AddAttr A ONMOUSEUP
+instance AddAttr A REL
+instance AddAttr A REV
+instance AddAttr A SHAPE
+instance AddAttr A STYLE
+instance AddAttr A TABINDEX
+instance AddAttr A TARGET
+instance AddAttr A TITLE
+instance AddAttr A TYPE
+instance AddAttr ABBR CLASS
+instance AddAttr ABBR DIR
+instance AddAttr ABBR ID
+instance AddAttr ABBR LANG
+instance AddAttr ABBR ONCLICK
+instance AddAttr ABBR ONDBLCLICK
+instance AddAttr ABBR ONKEYDOWN
+instance AddAttr ABBR ONKEYPRESS
+instance AddAttr ABBR ONKEYUP
+instance AddAttr ABBR ONMOUSEDOWN
+instance AddAttr ABBR ONMOUSEMOVE
+instance AddAttr ABBR ONMOUSEOUT
+instance AddAttr ABBR ONMOUSEOVER
+instance AddAttr ABBR ONMOUSEUP
+instance AddAttr ABBR STYLE
+instance AddAttr ABBR TITLE
+instance AddAttr ACRONYM CLASS
+instance AddAttr ACRONYM DIR
+instance AddAttr ACRONYM ID
+instance AddAttr ACRONYM LANG
+instance AddAttr ACRONYM ONCLICK
+instance AddAttr ACRONYM ONDBLCLICK
+instance AddAttr ACRONYM ONKEYDOWN
+instance AddAttr ACRONYM ONKEYPRESS
+instance AddAttr ACRONYM ONKEYUP
+instance AddAttr ACRONYM ONMOUSEDOWN
+instance AddAttr ACRONYM ONMOUSEMOVE
+instance AddAttr ACRONYM ONMOUSEOUT
+instance AddAttr ACRONYM ONMOUSEOVER
+instance AddAttr ACRONYM ONMOUSEUP
+instance AddAttr ACRONYM STYLE
+instance AddAttr ACRONYM TITLE
+instance AddAttr ADDRESS CLASS
+instance AddAttr ADDRESS DIR
+instance AddAttr ADDRESS ID
+instance AddAttr ADDRESS LANG
+instance AddAttr ADDRESS ONCLICK
+instance AddAttr ADDRESS ONDBLCLICK
+instance AddAttr ADDRESS ONKEYDOWN
+instance AddAttr ADDRESS ONKEYPRESS
+instance AddAttr ADDRESS ONKEYUP
+instance AddAttr ADDRESS ONMOUSEDOWN
+instance AddAttr ADDRESS ONMOUSEMOVE
+instance AddAttr ADDRESS ONMOUSEOUT
+instance AddAttr ADDRESS ONMOUSEOVER
+instance AddAttr ADDRESS ONMOUSEUP
+instance AddAttr ADDRESS STYLE
+instance AddAttr ADDRESS TITLE
+instance AddAttr APPLET ALIGN
+instance AddAttr APPLET ALT
+instance AddAttr APPLET ARCHIVE
+instance AddAttr APPLET CLASS
+instance AddAttr APPLET CODE
+instance AddAttr APPLET CODEBASE
+instance AddAttr APPLET HEIGHT
+instance AddAttr APPLET HSPACE
+instance AddAttr APPLET ID
+instance AddAttr APPLET NAME
+instance AddAttr APPLET OBJECT
+instance AddAttr APPLET STYLE
+instance AddAttr APPLET TITLE
+instance AddAttr APPLET VSPACE
+instance AddAttr APPLET WIDTH
+instance AddAttr AREA ACCESSKEY
+instance AddAttr AREA ALT
+instance AddAttr AREA CLASS
+instance AddAttr AREA COORDS
+instance AddAttr AREA DIR
+instance AddAttr AREA HREF
+instance AddAttr AREA ID
+instance AddAttr AREA LANG
+instance AddAttr AREA NOHREF
+instance AddAttr AREA ONBLUR
+instance AddAttr AREA ONCLICK
+instance AddAttr AREA ONDBLCLICK
+instance AddAttr AREA ONFOCUS
+instance AddAttr AREA ONKEYDOWN
+instance AddAttr AREA ONKEYPRESS
+instance AddAttr AREA ONKEYUP
+instance AddAttr AREA ONMOUSEDOWN
+instance AddAttr AREA ONMOUSEMOVE
+instance AddAttr AREA ONMOUSEOUT
+instance AddAttr AREA ONMOUSEOVER
+instance AddAttr AREA ONMOUSEUP
+instance AddAttr AREA SHAPE
+instance AddAttr AREA STYLE
+instance AddAttr AREA TABINDEX
+instance AddAttr AREA TARGET
+instance AddAttr AREA TITLE
+instance AddAttr B CLASS
+instance AddAttr B DIR
+instance AddAttr B ID
+instance AddAttr B LANG
+instance AddAttr B ONCLICK
+instance AddAttr B ONDBLCLICK
+instance AddAttr B ONKEYDOWN
+instance AddAttr B ONKEYPRESS
+instance AddAttr B ONKEYUP
+instance AddAttr B ONMOUSEDOWN
+instance AddAttr B ONMOUSEMOVE
+instance AddAttr B ONMOUSEOUT
+instance AddAttr B ONMOUSEOVER
+instance AddAttr B ONMOUSEUP
+instance AddAttr B STYLE
+instance AddAttr B TITLE
+instance AddAttr BASE HREF
+instance AddAttr BASE TARGET
+instance AddAttr BASEFONT COLOR
+instance AddAttr BASEFONT FACE
+instance AddAttr BASEFONT ID
+instance AddAttr BASEFONT SIZE
+instance AddAttr BDO CLASS
+instance AddAttr BDO DIR
+instance AddAttr BDO ID
+instance AddAttr BDO LANG
+instance AddAttr BDO STYLE
+instance AddAttr BDO TITLE
+instance AddAttr BIG CLASS
+instance AddAttr BIG DIR
+instance AddAttr BIG ID
+instance AddAttr BIG LANG
+instance AddAttr BIG ONCLICK
+instance AddAttr BIG ONDBLCLICK
+instance AddAttr BIG ONKEYDOWN
+instance AddAttr BIG ONKEYPRESS
+instance AddAttr BIG ONKEYUP
+instance AddAttr BIG ONMOUSEDOWN
+instance AddAttr BIG ONMOUSEMOVE
+instance AddAttr BIG ONMOUSEOUT
+instance AddAttr BIG ONMOUSEOVER
+instance AddAttr BIG ONMOUSEUP
+instance AddAttr BIG STYLE
+instance AddAttr BIG TITLE
+instance AddAttr BLOCKQUOTE CITE
+instance AddAttr BLOCKQUOTE CLASS
+instance AddAttr BLOCKQUOTE DIR
+instance AddAttr BLOCKQUOTE ID
+instance AddAttr BLOCKQUOTE LANG
+instance AddAttr BLOCKQUOTE ONCLICK
+instance AddAttr BLOCKQUOTE ONDBLCLICK
+instance AddAttr BLOCKQUOTE ONKEYDOWN
+instance AddAttr BLOCKQUOTE ONKEYPRESS
+instance AddAttr BLOCKQUOTE ONKEYUP
+instance AddAttr BLOCKQUOTE ONMOUSEDOWN
+instance AddAttr BLOCKQUOTE ONMOUSEMOVE
+instance AddAttr BLOCKQUOTE ONMOUSEOUT
+instance AddAttr BLOCKQUOTE ONMOUSEOVER
+instance AddAttr BLOCKQUOTE ONMOUSEUP
+instance AddAttr BLOCKQUOTE STYLE
+instance AddAttr BLOCKQUOTE TITLE
+instance AddAttr BODY ALINK
+instance AddAttr BODY BACKGROUND
+instance AddAttr BODY BGCOLOR
+instance AddAttr BODY CLASS
+instance AddAttr BODY DIR
+instance AddAttr BODY ID
+instance AddAttr BODY LANG
+instance AddAttr BODY LINK
+instance AddAttr BODY ONCLICK
+instance AddAttr BODY ONDBLCLICK
+instance AddAttr BODY ONKEYDOWN
+instance AddAttr BODY ONKEYPRESS
+instance AddAttr BODY ONKEYUP
+instance AddAttr BODY ONLOAD
+instance AddAttr BODY ONMOUSEDOWN
+instance AddAttr BODY ONMOUSEMOVE
+instance AddAttr BODY ONMOUSEOUT
+instance AddAttr BODY ONMOUSEOVER
+instance AddAttr BODY ONMOUSEUP
+instance AddAttr BODY ONUNLOAD
+instance AddAttr BODY STYLE
+instance AddAttr BODY TEXT
+instance AddAttr BODY TITLE
+instance AddAttr BODY VLINK
+instance AddAttr BR CLASS
+instance AddAttr BR CLEAR
+instance AddAttr BR ID
+instance AddAttr BR STYLE
+instance AddAttr BR TITLE
+instance AddAttr BUTTON ACCESSKEY
+instance AddAttr BUTTON CLASS
+instance AddAttr BUTTON DIR
+instance AddAttr BUTTON DISABLED
+instance AddAttr BUTTON ID
+instance AddAttr BUTTON LANG
+instance AddAttr BUTTON NAME
+instance AddAttr BUTTON ONBLUR
+instance AddAttr BUTTON ONCLICK
+instance AddAttr BUTTON ONDBLCLICK
+instance AddAttr BUTTON ONFOCUS
+instance AddAttr BUTTON ONKEYDOWN
+instance AddAttr BUTTON ONKEYPRESS
+instance AddAttr BUTTON ONKEYUP
+instance AddAttr BUTTON ONMOUSEDOWN
+instance AddAttr BUTTON ONMOUSEMOVE
+instance AddAttr BUTTON ONMOUSEOUT
+instance AddAttr BUTTON ONMOUSEOVER
+instance AddAttr BUTTON ONMOUSEUP
+instance AddAttr BUTTON STYLE
+instance AddAttr BUTTON TABINDEX
+instance AddAttr BUTTON TITLE
+instance AddAttr BUTTON TYPE
+instance AddAttr BUTTON VALUE
+instance AddAttr CAPTION ALIGN
+instance AddAttr CAPTION CLASS
+instance AddAttr CAPTION DIR
+instance AddAttr CAPTION ID
+instance AddAttr CAPTION LANG
+instance AddAttr CAPTION ONCLICK
+instance AddAttr CAPTION ONDBLCLICK
+instance AddAttr CAPTION ONKEYDOWN
+instance AddAttr CAPTION ONKEYPRESS
+instance AddAttr CAPTION ONKEYUP
+instance AddAttr CAPTION ONMOUSEDOWN
+instance AddAttr CAPTION ONMOUSEMOVE
+instance AddAttr CAPTION ONMOUSEOUT
+instance AddAttr CAPTION ONMOUSEOVER
+instance AddAttr CAPTION ONMOUSEUP
+instance AddAttr CAPTION STYLE
+instance AddAttr CAPTION TITLE
+instance AddAttr CENTER CLASS
+instance AddAttr CENTER DIR
+instance AddAttr CENTER ID
+instance AddAttr CENTER LANG
+instance AddAttr CENTER ONCLICK
+instance AddAttr CENTER ONDBLCLICK
+instance AddAttr CENTER ONKEYDOWN
+instance AddAttr CENTER ONKEYPRESS
+instance AddAttr CENTER ONKEYUP
+instance AddAttr CENTER ONMOUSEDOWN
+instance AddAttr CENTER ONMOUSEMOVE
+instance AddAttr CENTER ONMOUSEOUT
+instance AddAttr CENTER ONMOUSEOVER
+instance AddAttr CENTER ONMOUSEUP
+instance AddAttr CENTER STYLE
+instance AddAttr CENTER TITLE
+instance AddAttr CITE CLASS
+instance AddAttr CITE DIR
+instance AddAttr CITE ID
+instance AddAttr CITE LANG
+instance AddAttr CITE ONCLICK
+instance AddAttr CITE ONDBLCLICK
+instance AddAttr CITE ONKEYDOWN
+instance AddAttr CITE ONKEYPRESS
+instance AddAttr CITE ONKEYUP
+instance AddAttr CITE ONMOUSEDOWN
+instance AddAttr CITE ONMOUSEMOVE
+instance AddAttr CITE ONMOUSEOUT
+instance AddAttr CITE ONMOUSEOVER
+instance AddAttr CITE ONMOUSEUP
+instance AddAttr CITE STYLE
+instance AddAttr CITE TITLE
+instance AddAttr CODE CLASS
+instance AddAttr CODE DIR
+instance AddAttr CODE ID
+instance AddAttr CODE LANG
+instance AddAttr CODE ONCLICK
+instance AddAttr CODE ONDBLCLICK
+instance AddAttr CODE ONKEYDOWN
+instance AddAttr CODE ONKEYPRESS
+instance AddAttr CODE ONKEYUP
+instance AddAttr CODE ONMOUSEDOWN
+instance AddAttr CODE ONMOUSEMOVE
+instance AddAttr CODE ONMOUSEOUT
+instance AddAttr CODE ONMOUSEOVER
+instance AddAttr CODE ONMOUSEUP
+instance AddAttr CODE STYLE
+instance AddAttr CODE TITLE
+instance AddAttr COL ALIGN
+instance AddAttr COL CHAR
+instance AddAttr COL CHAROFF
+instance AddAttr COL CLASS
+instance AddAttr COL DIR
+instance AddAttr COL ID
+instance AddAttr COL LANG
+instance AddAttr COL ONCLICK
+instance AddAttr COL ONDBLCLICK
+instance AddAttr COL ONKEYDOWN
+instance AddAttr COL ONKEYPRESS
+instance AddAttr COL ONKEYUP
+instance AddAttr COL ONMOUSEDOWN
+instance AddAttr COL ONMOUSEMOVE
+instance AddAttr COL ONMOUSEOUT
+instance AddAttr COL ONMOUSEOVER
+instance AddAttr COL ONMOUSEUP
+instance AddAttr COL SPAN
+instance AddAttr COL STYLE
+instance AddAttr COL TITLE
+instance AddAttr COL VALIGN
+instance AddAttr COL WIDTH
+instance AddAttr COLGROUP ALIGN
+instance AddAttr COLGROUP CHAR
+instance AddAttr COLGROUP CHAROFF
+instance AddAttr COLGROUP CLASS
+instance AddAttr COLGROUP DIR
+instance AddAttr COLGROUP ID
+instance AddAttr COLGROUP LANG
+instance AddAttr COLGROUP ONCLICK
+instance AddAttr COLGROUP ONDBLCLICK
+instance AddAttr COLGROUP ONKEYDOWN
+instance AddAttr COLGROUP ONKEYPRESS
+instance AddAttr COLGROUP ONKEYUP
+instance AddAttr COLGROUP ONMOUSEDOWN
+instance AddAttr COLGROUP ONMOUSEMOVE
+instance AddAttr COLGROUP ONMOUSEOUT
+instance AddAttr COLGROUP ONMOUSEOVER
+instance AddAttr COLGROUP ONMOUSEUP
+instance AddAttr COLGROUP SPAN
+instance AddAttr COLGROUP STYLE
+instance AddAttr COLGROUP TITLE
+instance AddAttr COLGROUP VALIGN
+instance AddAttr COLGROUP WIDTH
+instance AddAttr DD CLASS
+instance AddAttr DD DIR
+instance AddAttr DD ID
+instance AddAttr DD LANG
+instance AddAttr DD ONCLICK
+instance AddAttr DD ONDBLCLICK
+instance AddAttr DD ONKEYDOWN
+instance AddAttr DD ONKEYPRESS
+instance AddAttr DD ONKEYUP
+instance AddAttr DD ONMOUSEDOWN
+instance AddAttr DD ONMOUSEMOVE
+instance AddAttr DD ONMOUSEOUT
+instance AddAttr DD ONMOUSEOVER
+instance AddAttr DD ONMOUSEUP
+instance AddAttr DD STYLE
+instance AddAttr DD TITLE
+instance AddAttr DEL CITE
+instance AddAttr DEL CLASS
+instance AddAttr DEL DATETIME
+instance AddAttr DEL DIR
+instance AddAttr DEL ID
+instance AddAttr DEL LANG
+instance AddAttr DEL ONCLICK
+instance AddAttr DEL ONDBLCLICK
+instance AddAttr DEL ONKEYDOWN
+instance AddAttr DEL ONKEYPRESS
+instance AddAttr DEL ONKEYUP
+instance AddAttr DEL ONMOUSEDOWN
+instance AddAttr DEL ONMOUSEMOVE
+instance AddAttr DEL ONMOUSEOUT
+instance AddAttr DEL ONMOUSEOVER
+instance AddAttr DEL ONMOUSEUP
+instance AddAttr DEL STYLE
+instance AddAttr DEL TITLE
+instance AddAttr DFN CLASS
+instance AddAttr DFN DIR
+instance AddAttr DFN ID
+instance AddAttr DFN LANG
+instance AddAttr DFN ONCLICK
+instance AddAttr DFN ONDBLCLICK
+instance AddAttr DFN ONKEYDOWN
+instance AddAttr DFN ONKEYPRESS
+instance AddAttr DFN ONKEYUP
+instance AddAttr DFN ONMOUSEDOWN
+instance AddAttr DFN ONMOUSEMOVE
+instance AddAttr DFN ONMOUSEOUT
+instance AddAttr DFN ONMOUSEOVER
+instance AddAttr DFN ONMOUSEUP
+instance AddAttr DFN STYLE
+instance AddAttr DFN TITLE
+instance AddAttr DIR CLASS
+instance AddAttr DIR COMPACT
+instance AddAttr DIR DIR
+instance AddAttr DIR ID
+instance AddAttr DIR LANG
+instance AddAttr DIR ONCLICK
+instance AddAttr DIR ONDBLCLICK
+instance AddAttr DIR ONKEYDOWN
+instance AddAttr DIR ONKEYPRESS
+instance AddAttr DIR ONKEYUP
+instance AddAttr DIR ONMOUSEDOWN
+instance AddAttr DIR ONMOUSEMOVE
+instance AddAttr DIR ONMOUSEOUT
+instance AddAttr DIR ONMOUSEOVER
+instance AddAttr DIR ONMOUSEUP
+instance AddAttr DIR STYLE
+instance AddAttr DIR TITLE
+instance AddAttr DIV ALIGN
+instance AddAttr DIV CLASS
+instance AddAttr DIV DIR
+instance AddAttr DIV ID
+instance AddAttr DIV LANG
+instance AddAttr DIV ONCLICK
+instance AddAttr DIV ONDBLCLICK
+instance AddAttr DIV ONKEYDOWN
+instance AddAttr DIV ONKEYPRESS
+instance AddAttr DIV ONKEYUP
+instance AddAttr DIV ONMOUSEDOWN
+instance AddAttr DIV ONMOUSEMOVE
+instance AddAttr DIV ONMOUSEOUT
+instance AddAttr DIV ONMOUSEOVER
+instance AddAttr DIV ONMOUSEUP
+instance AddAttr DIV STYLE
+instance AddAttr DIV TITLE
+instance AddAttr DL CLASS
+instance AddAttr DL COMPACT
+instance AddAttr DL DIR
+instance AddAttr DL ID
+instance AddAttr DL LANG
+instance AddAttr DL ONCLICK
+instance AddAttr DL ONDBLCLICK
+instance AddAttr DL ONKEYDOWN
+instance AddAttr DL ONKEYPRESS
+instance AddAttr DL ONKEYUP
+instance AddAttr DL ONMOUSEDOWN
+instance AddAttr DL ONMOUSEMOVE
+instance AddAttr DL ONMOUSEOUT
+instance AddAttr DL ONMOUSEOVER
+instance AddAttr DL ONMOUSEUP
+instance AddAttr DL STYLE
+instance AddAttr DL TITLE
+instance AddAttr DT CLASS
+instance AddAttr DT DIR
+instance AddAttr DT ID
+instance AddAttr DT LANG
+instance AddAttr DT ONCLICK
+instance AddAttr DT ONDBLCLICK
+instance AddAttr DT ONKEYDOWN
+instance AddAttr DT ONKEYPRESS
+instance AddAttr DT ONKEYUP
+instance AddAttr DT ONMOUSEDOWN
+instance AddAttr DT ONMOUSEMOVE
+instance AddAttr DT ONMOUSEOUT
+instance AddAttr DT ONMOUSEOVER
+instance AddAttr DT ONMOUSEUP
+instance AddAttr DT STYLE
+instance AddAttr DT TITLE
+instance AddAttr EM CLASS
+instance AddAttr EM DIR
+instance AddAttr EM ID
+instance AddAttr EM LANG
+instance AddAttr EM ONCLICK
+instance AddAttr EM ONDBLCLICK
+instance AddAttr EM ONKEYDOWN
+instance AddAttr EM ONKEYPRESS
+instance AddAttr EM ONKEYUP
+instance AddAttr EM ONMOUSEDOWN
+instance AddAttr EM ONMOUSEMOVE
+instance AddAttr EM ONMOUSEOUT
+instance AddAttr EM ONMOUSEOVER
+instance AddAttr EM ONMOUSEUP
+instance AddAttr EM STYLE
+instance AddAttr EM TITLE
+instance AddAttr FIELDSET CLASS
+instance AddAttr FIELDSET DIR
+instance AddAttr FIELDSET ID
+instance AddAttr FIELDSET LANG
+instance AddAttr FIELDSET ONCLICK
+instance AddAttr FIELDSET ONDBLCLICK
+instance AddAttr FIELDSET ONKEYDOWN
+instance AddAttr FIELDSET ONKEYPRESS
+instance AddAttr FIELDSET ONKEYUP
+instance AddAttr FIELDSET ONMOUSEDOWN
+instance AddAttr FIELDSET ONMOUSEMOVE
+instance AddAttr FIELDSET ONMOUSEOUT
+instance AddAttr FIELDSET ONMOUSEOVER
+instance AddAttr FIELDSET ONMOUSEUP
+instance AddAttr FIELDSET STYLE
+instance AddAttr FIELDSET TITLE
+instance AddAttr FONT CLASS
+instance AddAttr FONT COLOR
+instance AddAttr FONT DIR
+instance AddAttr FONT FACE
+instance AddAttr FONT ID
+instance AddAttr FONT LANG
+instance AddAttr FONT SIZE
+instance AddAttr FONT STYLE
+instance AddAttr FONT TITLE
+instance AddAttr FORM ACCEPT_CHARSET
+instance AddAttr FORM ACTION
+instance AddAttr FORM CLASS
+instance AddAttr FORM DIR
+instance AddAttr FORM ENCTYPE
+instance AddAttr FORM ID
+instance AddAttr FORM LANG
+instance AddAttr FORM METHOD
+instance AddAttr FORM ONCLICK
+instance AddAttr FORM ONDBLCLICK
+instance AddAttr FORM ONKEYDOWN
+instance AddAttr FORM ONKEYPRESS
+instance AddAttr FORM ONKEYUP
+instance AddAttr FORM ONMOUSEDOWN
+instance AddAttr FORM ONMOUSEMOVE
+instance AddAttr FORM ONMOUSEOUT
+instance AddAttr FORM ONMOUSEOVER
+instance AddAttr FORM ONMOUSEUP
+instance AddAttr FORM ONRESET
+instance AddAttr FORM ONSUBMIT
+instance AddAttr FORM STYLE
+instance AddAttr FORM TARGET
+instance AddAttr FORM TITLE
+instance AddAttr H1 ALIGN
+instance AddAttr H1 CLASS
+instance AddAttr H1 DIR
+instance AddAttr H1 ID
+instance AddAttr H1 LANG
+instance AddAttr H1 ONCLICK
+instance AddAttr H1 ONDBLCLICK
+instance AddAttr H1 ONKEYDOWN
+instance AddAttr H1 ONKEYPRESS
+instance AddAttr H1 ONKEYUP
+instance AddAttr H1 ONMOUSEDOWN
+instance AddAttr H1 ONMOUSEMOVE
+instance AddAttr H1 ONMOUSEOUT
+instance AddAttr H1 ONMOUSEOVER
+instance AddAttr H1 ONMOUSEUP
+instance AddAttr H1 STYLE
+instance AddAttr H1 TITLE
+instance AddAttr H2 ALIGN
+instance AddAttr H2 CLASS
+instance AddAttr H2 DIR
+instance AddAttr H2 ID
+instance AddAttr H2 LANG
+instance AddAttr H2 ONCLICK
+instance AddAttr H2 ONDBLCLICK
+instance AddAttr H2 ONKEYDOWN
+instance AddAttr H2 ONKEYPRESS
+instance AddAttr H2 ONKEYUP
+instance AddAttr H2 ONMOUSEDOWN
+instance AddAttr H2 ONMOUSEMOVE
+instance AddAttr H2 ONMOUSEOUT
+instance AddAttr H2 ONMOUSEOVER
+instance AddAttr H2 ONMOUSEUP
+instance AddAttr H2 STYLE
+instance AddAttr H2 TITLE
+instance AddAttr H3 ALIGN
+instance AddAttr H3 CLASS
+instance AddAttr H3 DIR
+instance AddAttr H3 ID
+instance AddAttr H3 LANG
+instance AddAttr H3 ONCLICK
+instance AddAttr H3 ONDBLCLICK
+instance AddAttr H3 ONKEYDOWN
+instance AddAttr H3 ONKEYPRESS
+instance AddAttr H3 ONKEYUP
+instance AddAttr H3 ONMOUSEDOWN
+instance AddAttr H3 ONMOUSEMOVE
+instance AddAttr H3 ONMOUSEOUT
+instance AddAttr H3 ONMOUSEOVER
+instance AddAttr H3 ONMOUSEUP
+instance AddAttr H3 STYLE
+instance AddAttr H3 TITLE
+instance AddAttr H4 ALIGN
+instance AddAttr H4 CLASS
+instance AddAttr H4 DIR
+instance AddAttr H4 ID
+instance AddAttr H4 LANG
+instance AddAttr H4 ONCLICK
+instance AddAttr H4 ONDBLCLICK
+instance AddAttr H4 ONKEYDOWN
+instance AddAttr H4 ONKEYPRESS
+instance AddAttr H4 ONKEYUP
+instance AddAttr H4 ONMOUSEDOWN
+instance AddAttr H4 ONMOUSEMOVE
+instance AddAttr H4 ONMOUSEOUT
+instance AddAttr H4 ONMOUSEOVER
+instance AddAttr H4 ONMOUSEUP
+instance AddAttr H4 STYLE
+instance AddAttr H4 TITLE
+instance AddAttr H5 ALIGN
+instance AddAttr H5 CLASS
+instance AddAttr H5 DIR
+instance AddAttr H5 ID
+instance AddAttr H5 LANG
+instance AddAttr H5 ONCLICK
+instance AddAttr H5 ONDBLCLICK
+instance AddAttr H5 ONKEYDOWN
+instance AddAttr H5 ONKEYPRESS
+instance AddAttr H5 ONKEYUP
+instance AddAttr H5 ONMOUSEDOWN
+instance AddAttr H5 ONMOUSEMOVE
+instance AddAttr H5 ONMOUSEOUT
+instance AddAttr H5 ONMOUSEOVER
+instance AddAttr H5 ONMOUSEUP
+instance AddAttr H5 STYLE
+instance AddAttr H5 TITLE
+instance AddAttr H6 ALIGN
+instance AddAttr H6 CLASS
+instance AddAttr H6 DIR
+instance AddAttr H6 ID
+instance AddAttr H6 LANG
+instance AddAttr H6 ONCLICK
+instance AddAttr H6 ONDBLCLICK
+instance AddAttr H6 ONKEYDOWN
+instance AddAttr H6 ONKEYPRESS
+instance AddAttr H6 ONKEYUP
+instance AddAttr H6 ONMOUSEDOWN
+instance AddAttr H6 ONMOUSEMOVE
+instance AddAttr H6 ONMOUSEOUT
+instance AddAttr H6 ONMOUSEOVER
+instance AddAttr H6 ONMOUSEUP
+instance AddAttr H6 STYLE
+instance AddAttr H6 TITLE
+instance AddAttr HEAD DIR
+instance AddAttr HEAD LANG
+instance AddAttr HEAD PROFILE
+instance AddAttr HR ALIGN
+instance AddAttr HR CLASS
+instance AddAttr HR ID
+instance AddAttr HR NOSHADE
+instance AddAttr HR ONCLICK
+instance AddAttr HR ONDBLCLICK
+instance AddAttr HR ONKEYDOWN
+instance AddAttr HR ONKEYPRESS
+instance AddAttr HR ONKEYUP
+instance AddAttr HR ONMOUSEDOWN
+instance AddAttr HR ONMOUSEMOVE
+instance AddAttr HR ONMOUSEOUT
+instance AddAttr HR ONMOUSEOVER
+instance AddAttr HR ONMOUSEUP
+instance AddAttr HR SIZE
+instance AddAttr HR STYLE
+instance AddAttr HR TITLE
+instance AddAttr HR WIDTH
+instance AddAttr HTML DIR
+instance AddAttr HTML LANG
+instance AddAttr HTML VERSION
+instance AddAttr I CLASS
+instance AddAttr I DIR
+instance AddAttr I ID
+instance AddAttr I LANG
+instance AddAttr I ONCLICK
+instance AddAttr I ONDBLCLICK
+instance AddAttr I ONKEYDOWN
+instance AddAttr I ONKEYPRESS
+instance AddAttr I ONKEYUP
+instance AddAttr I ONMOUSEDOWN
+instance AddAttr I ONMOUSEMOVE
+instance AddAttr I ONMOUSEOUT
+instance AddAttr I ONMOUSEOVER
+instance AddAttr I ONMOUSEUP
+instance AddAttr I STYLE
+instance AddAttr I TITLE
+instance AddAttr IFRAME ALIGN
+instance AddAttr IFRAME CLASS
+instance AddAttr IFRAME FRAMEBORDER
+instance AddAttr IFRAME HEIGHT
+instance AddAttr IFRAME ID
+instance AddAttr IFRAME LONGDESC
+instance AddAttr IFRAME MARGINHEIGHT
+instance AddAttr IFRAME MARGINWIDTH
+instance AddAttr IFRAME NAME
+instance AddAttr IFRAME SCROLLING
+instance AddAttr IFRAME SRC
+instance AddAttr IFRAME STYLE
+instance AddAttr IFRAME TITLE
+instance AddAttr IFRAME WIDTH
+instance AddAttr IMG ALIGN
+instance AddAttr IMG ALT
+instance AddAttr IMG BORDER
+instance AddAttr IMG CLASS
+instance AddAttr IMG DIR
+instance AddAttr IMG HEIGHT
+instance AddAttr IMG HSPACE
+instance AddAttr IMG ID
+instance AddAttr IMG ISMAP
+instance AddAttr IMG LANG
+instance AddAttr IMG LONGDESC
+instance AddAttr IMG ONCLICK
+instance AddAttr IMG ONDBLCLICK
+instance AddAttr IMG ONKEYDOWN
+instance AddAttr IMG ONKEYPRESS
+instance AddAttr IMG ONKEYUP
+instance AddAttr IMG ONMOUSEDOWN
+instance AddAttr IMG ONMOUSEMOVE
+instance AddAttr IMG ONMOUSEOUT
+instance AddAttr IMG ONMOUSEOVER
+instance AddAttr IMG ONMOUSEUP
+instance AddAttr IMG SRC
+instance AddAttr IMG STYLE
+instance AddAttr IMG TITLE
+instance AddAttr IMG USEMAP
+instance AddAttr IMG VSPACE
+instance AddAttr IMG WIDTH
+instance AddAttr INPUT ACCEPT
+instance AddAttr INPUT ACCESSKEY
+instance AddAttr INPUT ALIGN
+instance AddAttr INPUT ALT
+instance AddAttr INPUT CHECKED
+instance AddAttr INPUT CLASS
+instance AddAttr INPUT DIR
+instance AddAttr INPUT DISABLED
+instance AddAttr INPUT ID
+instance AddAttr INPUT LANG
+instance AddAttr INPUT MAXLENGTH
+instance AddAttr INPUT NAME
+instance AddAttr INPUT ONBLUR
+instance AddAttr INPUT ONCHANGE
+instance AddAttr INPUT ONCLICK
+instance AddAttr INPUT ONDBLCLICK
+instance AddAttr INPUT ONFOCUS
+instance AddAttr INPUT ONKEYDOWN
+instance AddAttr INPUT ONKEYPRESS
+instance AddAttr INPUT ONKEYUP
+instance AddAttr INPUT ONMOUSEDOWN
+instance AddAttr INPUT ONMOUSEMOVE
+instance AddAttr INPUT ONMOUSEOUT
+instance AddAttr INPUT ONMOUSEOVER
+instance AddAttr INPUT ONMOUSEUP
+instance AddAttr INPUT ONSELECT
+instance AddAttr INPUT READONLY
+instance AddAttr INPUT SIZE
+instance AddAttr INPUT SRC
+instance AddAttr INPUT STYLE
+instance AddAttr INPUT TABINDEX
+instance AddAttr INPUT TITLE
+instance AddAttr INPUT TYPE
+instance AddAttr INPUT USEMAP
+instance AddAttr INPUT VALUE
+instance AddAttr INS CITE
+instance AddAttr INS CLASS
+instance AddAttr INS DATETIME
+instance AddAttr INS DIR
+instance AddAttr INS ID
+instance AddAttr INS LANG
+instance AddAttr INS ONCLICK
+instance AddAttr INS ONDBLCLICK
+instance AddAttr INS ONKEYDOWN
+instance AddAttr INS ONKEYPRESS
+instance AddAttr INS ONKEYUP
+instance AddAttr INS ONMOUSEDOWN
+instance AddAttr INS ONMOUSEMOVE
+instance AddAttr INS ONMOUSEOUT
+instance AddAttr INS ONMOUSEOVER
+instance AddAttr INS ONMOUSEUP
+instance AddAttr INS STYLE
+instance AddAttr INS TITLE
+instance AddAttr ISINDEX CLASS
+instance AddAttr ISINDEX DIR
+instance AddAttr ISINDEX ID
+instance AddAttr ISINDEX LANG
+instance AddAttr ISINDEX PROMPT
+instance AddAttr ISINDEX STYLE
+instance AddAttr ISINDEX TITLE
+instance AddAttr KBD CLASS
+instance AddAttr KBD DIR
+instance AddAttr KBD ID
+instance AddAttr KBD LANG
+instance AddAttr KBD ONCLICK
+instance AddAttr KBD ONDBLCLICK
+instance AddAttr KBD ONKEYDOWN
+instance AddAttr KBD ONKEYPRESS
+instance AddAttr KBD ONKEYUP
+instance AddAttr KBD ONMOUSEDOWN
+instance AddAttr KBD ONMOUSEMOVE
+instance AddAttr KBD ONMOUSEOUT
+instance AddAttr KBD ONMOUSEOVER
+instance AddAttr KBD ONMOUSEUP
+instance AddAttr KBD STYLE
+instance AddAttr KBD TITLE
+instance AddAttr LABEL ACCESSKEY
+instance AddAttr LABEL CLASS
+instance AddAttr LABEL DIR
+instance AddAttr LABEL FOR
+instance AddAttr LABEL ID
+instance AddAttr LABEL LANG
+instance AddAttr LABEL ONBLUR
+instance AddAttr LABEL ONCLICK
+instance AddAttr LABEL ONDBLCLICK
+instance AddAttr LABEL ONFOCUS
+instance AddAttr LABEL ONKEYDOWN
+instance AddAttr LABEL ONKEYPRESS
+instance AddAttr LABEL ONKEYUP
+instance AddAttr LABEL ONMOUSEDOWN
+instance AddAttr LABEL ONMOUSEMOVE
+instance AddAttr LABEL ONMOUSEOUT
+instance AddAttr LABEL ONMOUSEOVER
+instance AddAttr LABEL ONMOUSEUP
+instance AddAttr LABEL STYLE
+instance AddAttr LABEL TITLE
+instance AddAttr LEGEND ACCESSKEY
+instance AddAttr LEGEND ALIGN
+instance AddAttr LEGEND CLASS
+instance AddAttr LEGEND DIR
+instance AddAttr LEGEND ID
+instance AddAttr LEGEND LANG
+instance AddAttr LEGEND ONCLICK
+instance AddAttr LEGEND ONDBLCLICK
+instance AddAttr LEGEND ONKEYDOWN
+instance AddAttr LEGEND ONKEYPRESS
+instance AddAttr LEGEND ONKEYUP
+instance AddAttr LEGEND ONMOUSEDOWN
+instance AddAttr LEGEND ONMOUSEMOVE
+instance AddAttr LEGEND ONMOUSEOUT
+instance AddAttr LEGEND ONMOUSEOVER
+instance AddAttr LEGEND ONMOUSEUP
+instance AddAttr LEGEND STYLE
+instance AddAttr LEGEND TITLE
+instance AddAttr LI CLASS
+instance AddAttr LI DIR
+instance AddAttr LI ID
+instance AddAttr LI LANG
+instance AddAttr LI ONCLICK
+instance AddAttr LI ONDBLCLICK
+instance AddAttr LI ONKEYDOWN
+instance AddAttr LI ONKEYPRESS
+instance AddAttr LI ONKEYUP
+instance AddAttr LI ONMOUSEDOWN
+instance AddAttr LI ONMOUSEMOVE
+instance AddAttr LI ONMOUSEOUT
+instance AddAttr LI ONMOUSEOVER
+instance AddAttr LI ONMOUSEUP
+instance AddAttr LI STYLE
+instance AddAttr LI TITLE
+instance AddAttr LI TYPE
+instance AddAttr LI VALUE
+instance AddAttr LINK CHARSET
+instance AddAttr LINK CLASS
+instance AddAttr LINK DIR
+instance AddAttr LINK HREF
+instance AddAttr LINK HREFLANG
+instance AddAttr LINK ID
+instance AddAttr LINK LANG
+instance AddAttr LINK MEDIA
+instance AddAttr LINK ONCLICK
+instance AddAttr LINK ONDBLCLICK
+instance AddAttr LINK ONKEYDOWN
+instance AddAttr LINK ONKEYPRESS
+instance AddAttr LINK ONKEYUP
+instance AddAttr LINK ONMOUSEDOWN
+instance AddAttr LINK ONMOUSEMOVE
+instance AddAttr LINK ONMOUSEOUT
+instance AddAttr LINK ONMOUSEOVER
+instance AddAttr LINK ONMOUSEUP
+instance AddAttr LINK REL
+instance AddAttr LINK REV
+instance AddAttr LINK STYLE
+instance AddAttr LINK TARGET
+instance AddAttr LINK TITLE
+instance AddAttr LINK TYPE
+instance AddAttr MAP CLASS
+instance AddAttr MAP DIR
+instance AddAttr MAP ID
+instance AddAttr MAP LANG
+instance AddAttr MAP NAME
+instance AddAttr MAP ONCLICK
+instance AddAttr MAP ONDBLCLICK
+instance AddAttr MAP ONKEYDOWN
+instance AddAttr MAP ONKEYPRESS
+instance AddAttr MAP ONKEYUP
+instance AddAttr MAP ONMOUSEDOWN
+instance AddAttr MAP ONMOUSEMOVE
+instance AddAttr MAP ONMOUSEOUT
+instance AddAttr MAP ONMOUSEOVER
+instance AddAttr MAP ONMOUSEUP
+instance AddAttr MAP STYLE
+instance AddAttr MAP TITLE
+instance AddAttr MENU CLASS
+instance AddAttr MENU COMPACT
+instance AddAttr MENU DIR
+instance AddAttr MENU ID
+instance AddAttr MENU LANG
+instance AddAttr MENU ONCLICK
+instance AddAttr MENU ONDBLCLICK
+instance AddAttr MENU ONKEYDOWN
+instance AddAttr MENU ONKEYPRESS
+instance AddAttr MENU ONKEYUP
+instance AddAttr MENU ONMOUSEDOWN
+instance AddAttr MENU ONMOUSEMOVE
+instance AddAttr MENU ONMOUSEOUT
+instance AddAttr MENU ONMOUSEOVER
+instance AddAttr MENU ONMOUSEUP
+instance AddAttr MENU STYLE
+instance AddAttr MENU TITLE
+instance AddAttr META CONTENT
+instance AddAttr META DIR
+instance AddAttr META HTTP_EQUIV
+instance AddAttr META LANG
+instance AddAttr META NAME
+instance AddAttr META SCHEME
+instance AddAttr NOFRAMES CLASS
+instance AddAttr NOFRAMES DIR
+instance AddAttr NOFRAMES ID
+instance AddAttr NOFRAMES LANG
+instance AddAttr NOFRAMES ONCLICK
+instance AddAttr NOFRAMES ONDBLCLICK
+instance AddAttr NOFRAMES ONKEYDOWN
+instance AddAttr NOFRAMES ONKEYPRESS
+instance AddAttr NOFRAMES ONKEYUP
+instance AddAttr NOFRAMES ONMOUSEDOWN
+instance AddAttr NOFRAMES ONMOUSEMOVE
+instance AddAttr NOFRAMES ONMOUSEOUT
+instance AddAttr NOFRAMES ONMOUSEOVER
+instance AddAttr NOFRAMES ONMOUSEUP
+instance AddAttr NOFRAMES STYLE
+instance AddAttr NOFRAMES TITLE
+instance AddAttr NOSCRIPT CLASS
+instance AddAttr NOSCRIPT DIR
+instance AddAttr NOSCRIPT ID
+instance AddAttr NOSCRIPT LANG
+instance AddAttr NOSCRIPT ONCLICK
+instance AddAttr NOSCRIPT ONDBLCLICK
+instance AddAttr NOSCRIPT ONKEYDOWN
+instance AddAttr NOSCRIPT ONKEYPRESS
+instance AddAttr NOSCRIPT ONKEYUP
+instance AddAttr NOSCRIPT ONMOUSEDOWN
+instance AddAttr NOSCRIPT ONMOUSEMOVE
+instance AddAttr NOSCRIPT ONMOUSEOUT
+instance AddAttr NOSCRIPT ONMOUSEOVER
+instance AddAttr NOSCRIPT ONMOUSEUP
+instance AddAttr NOSCRIPT STYLE
+instance AddAttr NOSCRIPT TITLE
+instance AddAttr OBJECT ALIGN
+instance AddAttr OBJECT ARCHIVE
+instance AddAttr OBJECT BORDER
+instance AddAttr OBJECT CLASS
+instance AddAttr OBJECT CLASSID
+instance AddAttr OBJECT CODEBASE
+instance AddAttr OBJECT CODETYPE
+instance AddAttr OBJECT DATA
+instance AddAttr OBJECT DECLARE
+instance AddAttr OBJECT DIR
+instance AddAttr OBJECT HEIGHT
+instance AddAttr OBJECT HSPACE
+instance AddAttr OBJECT ID
+instance AddAttr OBJECT LANG
+instance AddAttr OBJECT NAME
+instance AddAttr OBJECT ONCLICK
+instance AddAttr OBJECT ONDBLCLICK
+instance AddAttr OBJECT ONKEYDOWN
+instance AddAttr OBJECT ONKEYPRESS
+instance AddAttr OBJECT ONKEYUP
+instance AddAttr OBJECT ONMOUSEDOWN
+instance AddAttr OBJECT ONMOUSEMOVE
+instance AddAttr OBJECT ONMOUSEOUT
+instance AddAttr OBJECT ONMOUSEOVER
+instance AddAttr OBJECT ONMOUSEUP
+instance AddAttr OBJECT STANDBY
+instance AddAttr OBJECT STYLE
+instance AddAttr OBJECT TABINDEX
+instance AddAttr OBJECT TITLE
+instance AddAttr OBJECT TYPE
+instance AddAttr OBJECT USEMAP
+instance AddAttr OBJECT VSPACE
+instance AddAttr OBJECT WIDTH
+instance AddAttr OL CLASS
+instance AddAttr OL COMPACT
+instance AddAttr OL DIR
+instance AddAttr OL ID
+instance AddAttr OL LANG
+instance AddAttr OL ONCLICK
+instance AddAttr OL ONDBLCLICK
+instance AddAttr OL ONKEYDOWN
+instance AddAttr OL ONKEYPRESS
+instance AddAttr OL ONKEYUP
+instance AddAttr OL ONMOUSEDOWN
+instance AddAttr OL ONMOUSEMOVE
+instance AddAttr OL ONMOUSEOUT
+instance AddAttr OL ONMOUSEOVER
+instance AddAttr OL ONMOUSEUP
+instance AddAttr OL START
+instance AddAttr OL STYLE
+instance AddAttr OL TITLE
+instance AddAttr OL TYPE
+instance AddAttr OPTGROUP CLASS
+instance AddAttr OPTGROUP DIR
+instance AddAttr OPTGROUP DISABLED
+instance AddAttr OPTGROUP ID
+instance AddAttr OPTGROUP LABEL
+instance AddAttr OPTGROUP LANG
+instance AddAttr OPTGROUP ONCLICK
+instance AddAttr OPTGROUP ONDBLCLICK
+instance AddAttr OPTGROUP ONKEYDOWN
+instance AddAttr OPTGROUP ONKEYPRESS
+instance AddAttr OPTGROUP ONKEYUP
+instance AddAttr OPTGROUP ONMOUSEDOWN
+instance AddAttr OPTGROUP ONMOUSEMOVE
+instance AddAttr OPTGROUP ONMOUSEOUT
+instance AddAttr OPTGROUP ONMOUSEOVER
+instance AddAttr OPTGROUP ONMOUSEUP
+instance AddAttr OPTGROUP STYLE
+instance AddAttr OPTGROUP TITLE
+instance AddAttr OPTION CLASS
+instance AddAttr OPTION DIR
+instance AddAttr OPTION DISABLED
+instance AddAttr OPTION ID
+instance AddAttr OPTION LABEL
+instance AddAttr OPTION LANG
+instance AddAttr OPTION ONCLICK
+instance AddAttr OPTION ONDBLCLICK
+instance AddAttr OPTION ONKEYDOWN
+instance AddAttr OPTION ONKEYPRESS
+instance AddAttr OPTION ONKEYUP
+instance AddAttr OPTION ONMOUSEDOWN
+instance AddAttr OPTION ONMOUSEMOVE
+instance AddAttr OPTION ONMOUSEOUT
+instance AddAttr OPTION ONMOUSEOVER
+instance AddAttr OPTION ONMOUSEUP
+instance AddAttr OPTION SELECTED
+instance AddAttr OPTION STYLE
+instance AddAttr OPTION TITLE
+instance AddAttr OPTION VALUE
+instance AddAttr P ALIGN
+instance AddAttr P CLASS
+instance AddAttr P DIR
+instance AddAttr P ID
+instance AddAttr P LANG
+instance AddAttr P ONCLICK
+instance AddAttr P ONDBLCLICK
+instance AddAttr P ONKEYDOWN
+instance AddAttr P ONKEYPRESS
+instance AddAttr P ONKEYUP
+instance AddAttr P ONMOUSEDOWN
+instance AddAttr P ONMOUSEMOVE
+instance AddAttr P ONMOUSEOUT
+instance AddAttr P ONMOUSEOVER
+instance AddAttr P ONMOUSEUP
+instance AddAttr P STYLE
+instance AddAttr P TITLE
+instance AddAttr PARAM ID
+instance AddAttr PARAM NAME
+instance AddAttr PARAM TYPE
+instance AddAttr PARAM VALUE
+instance AddAttr PARAM VALUETYPE
+instance AddAttr PRE CLASS
+instance AddAttr PRE DIR
+instance AddAttr PRE ID
+instance AddAttr PRE LANG
+instance AddAttr PRE ONCLICK
+instance AddAttr PRE ONDBLCLICK
+instance AddAttr PRE ONKEYDOWN
+instance AddAttr PRE ONKEYPRESS
+instance AddAttr PRE ONKEYUP
+instance AddAttr PRE ONMOUSEDOWN
+instance AddAttr PRE ONMOUSEMOVE
+instance AddAttr PRE ONMOUSEOUT
+instance AddAttr PRE ONMOUSEOVER
+instance AddAttr PRE ONMOUSEUP
+instance AddAttr PRE STYLE
+instance AddAttr PRE TITLE
+instance AddAttr PRE WIDTH
+instance AddAttr Q CITE
+instance AddAttr Q CLASS
+instance AddAttr Q DIR
+instance AddAttr Q ID
+instance AddAttr Q LANG
+instance AddAttr Q ONCLICK
+instance AddAttr Q ONDBLCLICK
+instance AddAttr Q ONKEYDOWN
+instance AddAttr Q ONKEYPRESS
+instance AddAttr Q ONKEYUP
+instance AddAttr Q ONMOUSEDOWN
+instance AddAttr Q ONMOUSEMOVE
+instance AddAttr Q ONMOUSEOUT
+instance AddAttr Q ONMOUSEOVER
+instance AddAttr Q ONMOUSEUP
+instance AddAttr Q STYLE
+instance AddAttr Q TITLE
+instance AddAttr S CLASS
+instance AddAttr S DIR
+instance AddAttr S ID
+instance AddAttr S LANG
+instance AddAttr S ONCLICK
+instance AddAttr S ONDBLCLICK
+instance AddAttr S ONKEYDOWN
+instance AddAttr S ONKEYPRESS
+instance AddAttr S ONKEYUP
+instance AddAttr S ONMOUSEDOWN
+instance AddAttr S ONMOUSEMOVE
+instance AddAttr S ONMOUSEOUT
+instance AddAttr S ONMOUSEOVER
+instance AddAttr S ONMOUSEUP
+instance AddAttr S STYLE
+instance AddAttr S TITLE
+instance AddAttr SAMP CLASS
+instance AddAttr SAMP DIR
+instance AddAttr SAMP ID
+instance AddAttr SAMP LANG
+instance AddAttr SAMP ONCLICK
+instance AddAttr SAMP ONDBLCLICK
+instance AddAttr SAMP ONKEYDOWN
+instance AddAttr SAMP ONKEYPRESS
+instance AddAttr SAMP ONKEYUP
+instance AddAttr SAMP ONMOUSEDOWN
+instance AddAttr SAMP ONMOUSEMOVE
+instance AddAttr SAMP ONMOUSEOUT
+instance AddAttr SAMP ONMOUSEOVER
+instance AddAttr SAMP ONMOUSEUP
+instance AddAttr SAMP STYLE
+instance AddAttr SAMP TITLE
+instance AddAttr SCRIPT CHARSET
+instance AddAttr SCRIPT DEFER
+instance AddAttr SCRIPT EVENT
+instance AddAttr SCRIPT FOR
+instance AddAttr SCRIPT LANGUAGE
+instance AddAttr SCRIPT SRC
+instance AddAttr SCRIPT TYPE
+instance AddAttr SELECT CLASS
+instance AddAttr SELECT DIR
+instance AddAttr SELECT DISABLED
+instance AddAttr SELECT ID
+instance AddAttr SELECT LANG
+instance AddAttr SELECT MULTIPLE
+instance AddAttr SELECT NAME
+instance AddAttr SELECT ONBLUR
+instance AddAttr SELECT ONCHANGE
+instance AddAttr SELECT ONCLICK
+instance AddAttr SELECT ONDBLCLICK
+instance AddAttr SELECT ONFOCUS
+instance AddAttr SELECT ONKEYDOWN
+instance AddAttr SELECT ONKEYPRESS
+instance AddAttr SELECT ONKEYUP
+instance AddAttr SELECT ONMOUSEDOWN
+instance AddAttr SELECT ONMOUSEMOVE
+instance AddAttr SELECT ONMOUSEOUT
+instance AddAttr SELECT ONMOUSEOVER
+instance AddAttr SELECT ONMOUSEUP
+instance AddAttr SELECT SIZE
+instance AddAttr SELECT STYLE
+instance AddAttr SELECT TABINDEX
+instance AddAttr SELECT TITLE
+instance AddAttr SMALL CLASS
+instance AddAttr SMALL DIR
+instance AddAttr SMALL ID
+instance AddAttr SMALL LANG
+instance AddAttr SMALL ONCLICK
+instance AddAttr SMALL ONDBLCLICK
+instance AddAttr SMALL ONKEYDOWN
+instance AddAttr SMALL ONKEYPRESS
+instance AddAttr SMALL ONKEYUP
+instance AddAttr SMALL ONMOUSEDOWN
+instance AddAttr SMALL ONMOUSEMOVE
+instance AddAttr SMALL ONMOUSEOUT
+instance AddAttr SMALL ONMOUSEOVER
+instance AddAttr SMALL ONMOUSEUP
+instance AddAttr SMALL STYLE
+instance AddAttr SMALL TITLE
+instance AddAttr SPAN CLASS
+instance AddAttr SPAN DIR
+instance AddAttr SPAN ID
+instance AddAttr SPAN LANG
+instance AddAttr SPAN ONCLICK
+instance AddAttr SPAN ONDBLCLICK
+instance AddAttr SPAN ONKEYDOWN
+instance AddAttr SPAN ONKEYPRESS
+instance AddAttr SPAN ONKEYUP
+instance AddAttr SPAN ONMOUSEDOWN
+instance AddAttr SPAN ONMOUSEMOVE
+instance AddAttr SPAN ONMOUSEOUT
+instance AddAttr SPAN ONMOUSEOVER
+instance AddAttr SPAN ONMOUSEUP
+instance AddAttr SPAN STYLE
+instance AddAttr SPAN TITLE
+instance AddAttr STRIKE CLASS
+instance AddAttr STRIKE DIR
+instance AddAttr STRIKE ID
+instance AddAttr STRIKE LANG
+instance AddAttr STRIKE ONCLICK
+instance AddAttr STRIKE ONDBLCLICK
+instance AddAttr STRIKE ONKEYDOWN
+instance AddAttr STRIKE ONKEYPRESS
+instance AddAttr STRIKE ONKEYUP
+instance AddAttr STRIKE ONMOUSEDOWN
+instance AddAttr STRIKE ONMOUSEMOVE
+instance AddAttr STRIKE ONMOUSEOUT
+instance AddAttr STRIKE ONMOUSEOVER
+instance AddAttr STRIKE ONMOUSEUP
+instance AddAttr STRIKE STYLE
+instance AddAttr STRIKE TITLE
+instance AddAttr STRONG CLASS
+instance AddAttr STRONG DIR
+instance AddAttr STRONG ID
+instance AddAttr STRONG LANG
+instance AddAttr STRONG ONCLICK
+instance AddAttr STRONG ONDBLCLICK
+instance AddAttr STRONG ONKEYDOWN
+instance AddAttr STRONG ONKEYPRESS
+instance AddAttr STRONG ONKEYUP
+instance AddAttr STRONG ONMOUSEDOWN
+instance AddAttr STRONG ONMOUSEMOVE
+instance AddAttr STRONG ONMOUSEOUT
+instance AddAttr STRONG ONMOUSEOVER
+instance AddAttr STRONG ONMOUSEUP
+instance AddAttr STRONG STYLE
+instance AddAttr STRONG TITLE
+instance AddAttr STYLE DIR
+instance AddAttr STYLE LANG
+instance AddAttr STYLE MEDIA
+instance AddAttr STYLE TITLE
+instance AddAttr STYLE TYPE
+instance AddAttr SUB CLASS
+instance AddAttr SUB DIR
+instance AddAttr SUB ID
+instance AddAttr SUB LANG
+instance AddAttr SUB ONCLICK
+instance AddAttr SUB ONDBLCLICK
+instance AddAttr SUB ONKEYDOWN
+instance AddAttr SUB ONKEYPRESS
+instance AddAttr SUB ONKEYUP
+instance AddAttr SUB ONMOUSEDOWN
+instance AddAttr SUB ONMOUSEMOVE
+instance AddAttr SUB ONMOUSEOUT
+instance AddAttr SUB ONMOUSEOVER
+instance AddAttr SUB ONMOUSEUP
+instance AddAttr SUB STYLE
+instance AddAttr SUB TITLE
+instance AddAttr SUP CLASS
+instance AddAttr SUP DIR
+instance AddAttr SUP ID
+instance AddAttr SUP LANG
+instance AddAttr SUP ONCLICK
+instance AddAttr SUP ONDBLCLICK
+instance AddAttr SUP ONKEYDOWN
+instance AddAttr SUP ONKEYPRESS
+instance AddAttr SUP ONKEYUP
+instance AddAttr SUP ONMOUSEDOWN
+instance AddAttr SUP ONMOUSEMOVE
+instance AddAttr SUP ONMOUSEOUT
+instance AddAttr SUP ONMOUSEOVER
+instance AddAttr SUP ONMOUSEUP
+instance AddAttr SUP STYLE
+instance AddAttr SUP TITLE
+instance AddAttr TABLE ALIGN
+instance AddAttr TABLE BGCOLOR
+instance AddAttr TABLE BORDER
+instance AddAttr TABLE CELLPADDING
+instance AddAttr TABLE CELLSPACING
+instance AddAttr TABLE CLASS
+instance AddAttr TABLE DATAPAGESIZE
+instance AddAttr TABLE DIR
+instance AddAttr TABLE FRAME
+instance AddAttr TABLE ID
+instance AddAttr TABLE LANG
+instance AddAttr TABLE ONCLICK
+instance AddAttr TABLE ONDBLCLICK
+instance AddAttr TABLE ONKEYDOWN
+instance AddAttr TABLE ONKEYPRESS
+instance AddAttr TABLE ONKEYUP
+instance AddAttr TABLE ONMOUSEDOWN
+instance AddAttr TABLE ONMOUSEMOVE
+instance AddAttr TABLE ONMOUSEOUT
+instance AddAttr TABLE ONMOUSEOVER
+instance AddAttr TABLE ONMOUSEUP
+instance AddAttr TABLE RULES
+instance AddAttr TABLE STYLE
+instance AddAttr TABLE SUMMARY
+instance AddAttr TABLE TITLE
+instance AddAttr TABLE WIDTH
+instance AddAttr TBODY ALIGN
+instance AddAttr TBODY CHAR
+instance AddAttr TBODY CHAROFF
+instance AddAttr TBODY CLASS
+instance AddAttr TBODY DIR
+instance AddAttr TBODY ID
+instance AddAttr TBODY LANG
+instance AddAttr TBODY ONCLICK
+instance AddAttr TBODY ONDBLCLICK
+instance AddAttr TBODY ONKEYDOWN
+instance AddAttr TBODY ONKEYPRESS
+instance AddAttr TBODY ONKEYUP
+instance AddAttr TBODY ONMOUSEDOWN
+instance AddAttr TBODY ONMOUSEMOVE
+instance AddAttr TBODY ONMOUSEOUT
+instance AddAttr TBODY ONMOUSEOVER
+instance AddAttr TBODY ONMOUSEUP
+instance AddAttr TBODY STYLE
+instance AddAttr TBODY TITLE
+instance AddAttr TBODY VALIGN
+instance AddAttr TD ABBR
+instance AddAttr TD ALIGN
+instance AddAttr TD AXIS
+instance AddAttr TD BGCOLOR
+instance AddAttr TD CHAR
+instance AddAttr TD CHAROFF
+instance AddAttr TD CLASS
+instance AddAttr TD COLSPAN
+instance AddAttr TD DIR
+instance AddAttr TD HEADERS
+instance AddAttr TD HEIGHT
+instance AddAttr TD ID
+instance AddAttr TD LANG
+instance AddAttr TD NOWRAP
+instance AddAttr TD ONCLICK
+instance AddAttr TD ONDBLCLICK
+instance AddAttr TD ONKEYDOWN
+instance AddAttr TD ONKEYPRESS
+instance AddAttr TD ONKEYUP
+instance AddAttr TD ONMOUSEDOWN
+instance AddAttr TD ONMOUSEMOVE
+instance AddAttr TD ONMOUSEOUT
+instance AddAttr TD ONMOUSEOVER
+instance AddAttr TD ONMOUSEUP
+instance AddAttr TD ROWSPAN
+instance AddAttr TD SCOPE
+instance AddAttr TD STYLE
+instance AddAttr TD TITLE
+instance AddAttr TD VALIGN
+instance AddAttr TD WIDTH
+instance AddAttr TEXTAREA ACCESSKEY
+instance AddAttr TEXTAREA CLASS
+instance AddAttr TEXTAREA COLS
+instance AddAttr TEXTAREA DIR
+instance AddAttr TEXTAREA DISABLED
+instance AddAttr TEXTAREA ID
+instance AddAttr TEXTAREA LANG
+instance AddAttr TEXTAREA NAME
+instance AddAttr TEXTAREA ONBLUR
+instance AddAttr TEXTAREA ONCHANGE
+instance AddAttr TEXTAREA ONCLICK
+instance AddAttr TEXTAREA ONDBLCLICK
+instance AddAttr TEXTAREA ONFOCUS
+instance AddAttr TEXTAREA ONKEYDOWN
+instance AddAttr TEXTAREA ONKEYPRESS
+instance AddAttr TEXTAREA ONKEYUP
+instance AddAttr TEXTAREA ONMOUSEDOWN
+instance AddAttr TEXTAREA ONMOUSEMOVE
+instance AddAttr TEXTAREA ONMOUSEOUT
+instance AddAttr TEXTAREA ONMOUSEOVER
+instance AddAttr TEXTAREA ONMOUSEUP
+instance AddAttr TEXTAREA ONSELECT
+instance AddAttr TEXTAREA READONLY
+instance AddAttr TEXTAREA ROWS
+instance AddAttr TEXTAREA STYLE
+instance AddAttr TEXTAREA TABINDEX
+instance AddAttr TEXTAREA TITLE
+instance AddAttr TFOOT ALIGN
+instance AddAttr TFOOT CHAR
+instance AddAttr TFOOT CHAROFF
+instance AddAttr TFOOT CLASS
+instance AddAttr TFOOT DIR
+instance AddAttr TFOOT ID
+instance AddAttr TFOOT LANG
+instance AddAttr TFOOT ONCLICK
+instance AddAttr TFOOT ONDBLCLICK
+instance AddAttr TFOOT ONKEYDOWN
+instance AddAttr TFOOT ONKEYPRESS
+instance AddAttr TFOOT ONKEYUP
+instance AddAttr TFOOT ONMOUSEDOWN
+instance AddAttr TFOOT ONMOUSEMOVE
+instance AddAttr TFOOT ONMOUSEOUT
+instance AddAttr TFOOT ONMOUSEOVER
+instance AddAttr TFOOT ONMOUSEUP
+instance AddAttr TFOOT STYLE
+instance AddAttr TFOOT TITLE
+instance AddAttr TFOOT VALIGN
+instance AddAttr TH ABBR
+instance AddAttr TH ALIGN
+instance AddAttr TH AXIS
+instance AddAttr TH BGCOLOR
+instance AddAttr TH CHAR
+instance AddAttr TH CHAROFF
+instance AddAttr TH CLASS
+instance AddAttr TH COLSPAN
+instance AddAttr TH DIR
+instance AddAttr TH HEADERS
+instance AddAttr TH HEIGHT
+instance AddAttr TH ID
+instance AddAttr TH LANG
+instance AddAttr TH NOWRAP
+instance AddAttr TH ONCLICK
+instance AddAttr TH ONDBLCLICK
+instance AddAttr TH ONKEYDOWN
+instance AddAttr TH ONKEYPRESS
+instance AddAttr TH ONKEYUP
+instance AddAttr TH ONMOUSEDOWN
+instance AddAttr TH ONMOUSEMOVE
+instance AddAttr TH ONMOUSEOUT
+instance AddAttr TH ONMOUSEOVER
+instance AddAttr TH ONMOUSEUP
+instance AddAttr TH ROWSPAN
+instance AddAttr TH SCOPE
+instance AddAttr TH STYLE
+instance AddAttr TH TITLE
+instance AddAttr TH VALIGN
+instance AddAttr TH WIDTH
+instance AddAttr THEAD ALIGN
+instance AddAttr THEAD CHAR
+instance AddAttr THEAD CHAROFF
+instance AddAttr THEAD CLASS
+instance AddAttr THEAD DIR
+instance AddAttr THEAD ID
+instance AddAttr THEAD LANG
+instance AddAttr THEAD ONCLICK
+instance AddAttr THEAD ONDBLCLICK
+instance AddAttr THEAD ONKEYDOWN
+instance AddAttr THEAD ONKEYPRESS
+instance AddAttr THEAD ONKEYUP
+instance AddAttr THEAD ONMOUSEDOWN
+instance AddAttr THEAD ONMOUSEMOVE
+instance AddAttr THEAD ONMOUSEOUT
+instance AddAttr THEAD ONMOUSEOVER
+instance AddAttr THEAD ONMOUSEUP
+instance AddAttr THEAD STYLE
+instance AddAttr THEAD TITLE
+instance AddAttr THEAD VALIGN
+instance AddAttr TITLE DIR
+instance AddAttr TITLE LANG
+instance AddAttr TR ALIGN
+instance AddAttr TR BGCOLOR
+instance AddAttr TR CHAR
+instance AddAttr TR CHAROFF
+instance AddAttr TR CLASS
+instance AddAttr TR DIR
+instance AddAttr TR ID
+instance AddAttr TR LANG
+instance AddAttr TR ONCLICK
+instance AddAttr TR ONDBLCLICK
+instance AddAttr TR ONKEYDOWN
+instance AddAttr TR ONKEYPRESS
+instance AddAttr TR ONKEYUP
+instance AddAttr TR ONMOUSEDOWN
+instance AddAttr TR ONMOUSEMOVE
+instance AddAttr TR ONMOUSEOUT
+instance AddAttr TR ONMOUSEOVER
+instance AddAttr TR ONMOUSEUP
+instance AddAttr TR STYLE
+instance AddAttr TR TITLE
+instance AddAttr TR VALIGN
+instance AddAttr TT CLASS
+instance AddAttr TT DIR
+instance AddAttr TT ID
+instance AddAttr TT LANG
+instance AddAttr TT ONCLICK
+instance AddAttr TT ONDBLCLICK
+instance AddAttr TT ONKEYDOWN
+instance AddAttr TT ONKEYPRESS
+instance AddAttr TT ONKEYUP
+instance AddAttr TT ONMOUSEDOWN
+instance AddAttr TT ONMOUSEMOVE
+instance AddAttr TT ONMOUSEOUT
+instance AddAttr TT ONMOUSEOVER
+instance AddAttr TT ONMOUSEUP
+instance AddAttr TT STYLE
+instance AddAttr TT TITLE
+instance AddAttr U CLASS
+instance AddAttr U DIR
+instance AddAttr U ID
+instance AddAttr U LANG
+instance AddAttr U ONCLICK
+instance AddAttr U ONDBLCLICK
+instance AddAttr U ONKEYDOWN
+instance AddAttr U ONKEYPRESS
+instance AddAttr U ONKEYUP
+instance AddAttr U ONMOUSEDOWN
+instance AddAttr U ONMOUSEMOVE
+instance AddAttr U ONMOUSEOUT
+instance AddAttr U ONMOUSEOVER
+instance AddAttr U ONMOUSEUP
+instance AddAttr U STYLE
+instance AddAttr U TITLE
+instance AddAttr UL CLASS
+instance AddAttr UL COMPACT
+instance AddAttr UL DIR
+instance AddAttr UL ID
+instance AddAttr UL LANG
+instance AddAttr UL ONCLICK
+instance AddAttr UL ONDBLCLICK
+instance AddAttr UL ONKEYDOWN
+instance AddAttr UL ONKEYPRESS
+instance AddAttr UL ONKEYUP
+instance AddAttr UL ONMOUSEDOWN
+instance AddAttr UL ONMOUSEMOVE
+instance AddAttr UL ONMOUSEOUT
+instance AddAttr UL ONMOUSEOVER
+instance AddAttr UL ONMOUSEUP
+instance AddAttr UL STYLE
+instance AddAttr UL TITLE
+instance AddAttr UL TYPE
+instance AddAttr VAR CLASS
+instance AddAttr VAR DIR
+instance AddAttr VAR ID
+instance AddAttr VAR LANG
+instance AddAttr VAR ONCLICK
+instance AddAttr VAR ONDBLCLICK
+instance AddAttr VAR ONKEYDOWN
+instance AddAttr VAR ONKEYPRESS
+instance AddAttr VAR ONKEYUP
+instance AddAttr VAR ONMOUSEDOWN
+instance AddAttr VAR ONMOUSEMOVE
+instance AddAttr VAR ONMOUSEOUT
+instance AddAttr VAR ONMOUSEOVER
+instance AddAttr VAR ONMOUSEUP
+instance AddAttr VAR STYLE
+instance AddAttr VAR TITLE
diff --git a/WASH/HTML/HTMLPrelude98.hs b/WASH/HTML/HTMLPrelude98.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLPrelude98.hs
@@ -0,0 +1,6195 @@
+-- © 2001, 2002 Peter Thiemann
+-- this file is generated -- do not edit
+module WASH.HTML.HTMLPrelude98
+  (module WASH.HTML.HTMLPrelude98,module WASH.HTML.HTMLTypedBase98)
+  where
+import Prelude hiding (div,head,map,span)
+import WASH.HTML.HTMLTypedBase98
+-- identity function
+empty x = x
+-- reverse function application
+( # ) = flip ($)	-- DON'T REMOVE THE SPACES
+-- reverse function composition
+( ## ) = flip (.)	-- DON'T REMOVE THE SPACES
+-- 
+instance AdmitChildHTML DOCUMENT
+build_document :: (ELT HTML -> ELT HTML) -> ELT DOCUMENT
+build_document addToHTML = make DOCUMENT # html addToHTML
+-- end fixed prologue
+class AdmitAttrVERSION e where
+  uaVERSION :: String -> ELT e -> ELT e
+  uaVERSION str into = add_attr into (mkUAttr VERSION str)
+  atVERSION :: AttrValueVERSION v => v -> ELT e -> ELT e
+  atVERSION v into = add_attr into (mkUAttr VERSION (av $ show v))
+class AdmitAttrDIR e where
+  uaDIR :: String -> ELT e -> ELT e
+  uaDIR str into = add_attr into (mkUAttr DIR str)
+  atDIR :: AttrValueDIR v => v -> ELT e -> ELT e
+  atDIR v into = add_attr into (mkUAttr DIR (av $ show v))
+class AdmitAttrLANG e where
+  uaLANG :: String -> ELT e -> ELT e
+  uaLANG str into = add_attr into (mkUAttr LANG str)
+  atLANG :: AttrValueLANG v => v -> ELT e -> ELT e
+  atLANG v into = add_attr into (mkUAttr LANG (av $ show v))
+class AdmitAttrONKEYUP e where
+  uaONKEYUP :: String -> ELT e -> ELT e
+  uaONKEYUP str into = add_attr into (mkUAttr ONKEYUP str)
+  atONKEYUP :: AttrValueONKEYUP v => v -> ELT e -> ELT e
+  atONKEYUP v into = add_attr into (mkUAttr ONKEYUP (av $ show v))
+class AdmitAttrONKEYDOWN e where
+  uaONKEYDOWN :: String -> ELT e -> ELT e
+  uaONKEYDOWN str into = add_attr into (mkUAttr ONKEYDOWN str)
+  atONKEYDOWN :: AttrValueONKEYDOWN v => v -> ELT e -> ELT e
+  atONKEYDOWN v into = add_attr into (mkUAttr ONKEYDOWN (av $ show v))
+class AdmitAttrONKEYPRESS e where
+  uaONKEYPRESS :: String -> ELT e -> ELT e
+  uaONKEYPRESS str into = add_attr into (mkUAttr ONKEYPRESS str)
+  atONKEYPRESS :: AttrValueONKEYPRESS v => v -> ELT e -> ELT e
+  atONKEYPRESS v into = add_attr into (mkUAttr ONKEYPRESS (av $ show v))
+class AdmitAttrONMOUSEOUT e where
+  uaONMOUSEOUT :: String -> ELT e -> ELT e
+  uaONMOUSEOUT str into = add_attr into (mkUAttr ONMOUSEOUT str)
+  atONMOUSEOUT :: AttrValueONMOUSEOUT v => v -> ELT e -> ELT e
+  atONMOUSEOUT v into = add_attr into (mkUAttr ONMOUSEOUT (av $ show v))
+class AdmitAttrONMOUSEMOVE e where
+  uaONMOUSEMOVE :: String -> ELT e -> ELT e
+  uaONMOUSEMOVE str into = add_attr into (mkUAttr ONMOUSEMOVE str)
+  atONMOUSEMOVE :: AttrValueONMOUSEMOVE v => v -> ELT e -> ELT e
+  atONMOUSEMOVE v into = add_attr into (mkUAttr ONMOUSEMOVE (av $ show v))
+class AdmitAttrONMOUSEOVER e where
+  uaONMOUSEOVER :: String -> ELT e -> ELT e
+  uaONMOUSEOVER str into = add_attr into (mkUAttr ONMOUSEOVER str)
+  atONMOUSEOVER :: AttrValueONMOUSEOVER v => v -> ELT e -> ELT e
+  atONMOUSEOVER v into = add_attr into (mkUAttr ONMOUSEOVER (av $ show v))
+class AdmitAttrONMOUSEUP e where
+  uaONMOUSEUP :: String -> ELT e -> ELT e
+  uaONMOUSEUP str into = add_attr into (mkUAttr ONMOUSEUP str)
+  atONMOUSEUP :: AttrValueONMOUSEUP v => v -> ELT e -> ELT e
+  atONMOUSEUP v into = add_attr into (mkUAttr ONMOUSEUP (av $ show v))
+class AdmitAttrONMOUSEDOWN e where
+  uaONMOUSEDOWN :: String -> ELT e -> ELT e
+  uaONMOUSEDOWN str into = add_attr into (mkUAttr ONMOUSEDOWN str)
+  atONMOUSEDOWN :: AttrValueONMOUSEDOWN v => v -> ELT e -> ELT e
+  atONMOUSEDOWN v into = add_attr into (mkUAttr ONMOUSEDOWN (av $ show v))
+class AdmitAttrONDBLCLICK e where
+  uaONDBLCLICK :: String -> ELT e -> ELT e
+  uaONDBLCLICK str into = add_attr into (mkUAttr ONDBLCLICK str)
+  atONDBLCLICK :: AttrValueONDBLCLICK v => v -> ELT e -> ELT e
+  atONDBLCLICK v into = add_attr into (mkUAttr ONDBLCLICK (av $ show v))
+class AdmitAttrONCLICK e where
+  uaONCLICK :: String -> ELT e -> ELT e
+  uaONCLICK str into = add_attr into (mkUAttr ONCLICK str)
+  atONCLICK :: AttrValueONCLICK v => v -> ELT e -> ELT e
+  atONCLICK v into = add_attr into (mkUAttr ONCLICK (av $ show v))
+class AdmitAttrTITLE e where
+  uaTITLE :: String -> ELT e -> ELT e
+  uaTITLE str into = add_attr into (mkUAttr TITLE str)
+  atTITLE :: AttrValueTITLE v => v -> ELT e -> ELT e
+  atTITLE v into = add_attr into (mkUAttr TITLE (av $ show v))
+class AdmitAttrSTYLE e where
+  uaSTYLE :: String -> ELT e -> ELT e
+  uaSTYLE str into = add_attr into (mkUAttr STYLE str)
+  atSTYLE :: AttrValueSTYLE v => v -> ELT e -> ELT e
+  atSTYLE v into = add_attr into (mkUAttr STYLE (av $ show v))
+class AdmitAttrCLASS e where
+  uaCLASS :: String -> ELT e -> ELT e
+  uaCLASS str into = add_attr into (mkUAttr CLASS str)
+  atCLASS :: AttrValueCLASS v => v -> ELT e -> ELT e
+  atCLASS v into = add_attr into (mkUAttr CLASS (av $ show v))
+class AdmitAttrID e where
+  uaID :: String -> ELT e -> ELT e
+  uaID str into = add_attr into (mkUAttr ID str)
+  atID :: AttrValueID v => v -> ELT e -> ELT e
+  atID v into = add_attr into (mkUAttr ID (av $ show v))
+class AdmitAttrFOR e where
+  uaFOR :: String -> ELT e -> ELT e
+  uaFOR str into = add_attr into (mkUAttr FOR str)
+  atFOR :: AttrValueFOR v => v -> ELT e -> ELT e
+  atFOR v into = add_attr into (mkUAttr FOR (av $ show v))
+class AdmitAttrEVENT e where
+  uaEVENT :: String -> ELT e -> ELT e
+  uaEVENT str into = add_attr into (mkUAttr EVENT str)
+  atEVENT :: AttrValueEVENT v => v -> ELT e -> ELT e
+  atEVENT v into = add_attr into (mkUAttr EVENT (av $ show v))
+class AdmitAttrDEFER e where
+  uaDEFER :: String -> ELT e -> ELT e
+  uaDEFER str into = add_attr into (mkUAttr DEFER str)
+  atDEFER :: AttrValueDEFER v => v -> ELT e -> ELT e
+  atDEFER v into = add_attr into (mkUAttr DEFER (av $ show v))
+class AdmitAttrSRC e where
+  uaSRC :: String -> ELT e -> ELT e
+  uaSRC str into = add_attr into (mkUAttr SRC str)
+  atSRC :: AttrValueSRC v => v -> ELT e -> ELT e
+  atSRC v into = add_attr into (mkUAttr SRC (av $ show v))
+class AdmitAttrLANGUAGE e where
+  uaLANGUAGE :: String -> ELT e -> ELT e
+  uaLANGUAGE str into = add_attr into (mkUAttr LANGUAGE str)
+  atLANGUAGE :: AttrValueLANGUAGE v => v -> ELT e -> ELT e
+  atLANGUAGE v into = add_attr into (mkUAttr LANGUAGE (av $ show v))
+class AdmitAttrTYPE e where
+  uaTYPE :: String -> ELT e -> ELT e
+  uaTYPE str into = add_attr into (mkUAttr TYPE str)
+  atTYPE :: AttrValueTYPE v => v -> ELT e -> ELT e
+  atTYPE v into = add_attr into (mkUAttr TYPE (av $ show v))
+class AdmitAttrCHARSET e where
+  uaCHARSET :: String -> ELT e -> ELT e
+  uaCHARSET str into = add_attr into (mkUAttr CHARSET str)
+  atCHARSET :: AttrValueCHARSET v => v -> ELT e -> ELT e
+  atCHARSET v into = add_attr into (mkUAttr CHARSET (av $ show v))
+class AdmitAttrMEDIA e where
+  uaMEDIA :: String -> ELT e -> ELT e
+  uaMEDIA str into = add_attr into (mkUAttr MEDIA str)
+  atMEDIA :: AttrValueMEDIA v => v -> ELT e -> ELT e
+  atMEDIA v into = add_attr into (mkUAttr MEDIA (av $ show v))
+class AdmitAttrSCHEME e where
+  uaSCHEME :: String -> ELT e -> ELT e
+  uaSCHEME str into = add_attr into (mkUAttr SCHEME str)
+  atSCHEME :: AttrValueSCHEME v => v -> ELT e -> ELT e
+  atSCHEME v into = add_attr into (mkUAttr SCHEME (av $ show v))
+class AdmitAttrCONTENT e where
+  uaCONTENT :: String -> ELT e -> ELT e
+  uaCONTENT str into = add_attr into (mkUAttr CONTENT str)
+  atCONTENT :: AttrValueCONTENT v => v -> ELT e -> ELT e
+  atCONTENT v into = add_attr into (mkUAttr CONTENT (av $ show v))
+class AdmitAttrNAME e where
+  uaNAME :: String -> ELT e -> ELT e
+  uaNAME str into = add_attr into (mkUAttr NAME str)
+  atNAME :: AttrValueNAME v => v -> ELT e -> ELT e
+  atNAME v into = add_attr into (mkUAttr NAME (av $ show v))
+class AdmitAttrHTTP_EQUIV e where
+  uaHTTP_EQUIV :: String -> ELT e -> ELT e
+  uaHTTP_EQUIV str into = add_attr into (mkUAttr HTTP_EQUIV str)
+  atHTTP_EQUIV :: AttrValueHTTP_EQUIV v => v -> ELT e -> ELT e
+  atHTTP_EQUIV v into = add_attr into (mkUAttr HTTP_EQUIV (av $ show v))
+class AdmitAttrTARGET e where
+  uaTARGET :: String -> ELT e -> ELT e
+  uaTARGET str into = add_attr into (mkUAttr TARGET str)
+  atTARGET :: AttrValueTARGET v => v -> ELT e -> ELT e
+  atTARGET v into = add_attr into (mkUAttr TARGET (av $ show v))
+class AdmitAttrHREF e where
+  uaHREF :: String -> ELT e -> ELT e
+  uaHREF str into = add_attr into (mkUAttr HREF str)
+  atHREF :: AttrValueHREF v => v -> ELT e -> ELT e
+  atHREF v into = add_attr into (mkUAttr HREF (av $ show v))
+class AdmitAttrPROMPT e where
+  uaPROMPT :: String -> ELT e -> ELT e
+  uaPROMPT str into = add_attr into (mkUAttr PROMPT str)
+  atPROMPT :: AttrValuePROMPT v => v -> ELT e -> ELT e
+  atPROMPT v into = add_attr into (mkUAttr PROMPT (av $ show v))
+class AdmitAttrPROFILE e where
+  uaPROFILE :: String -> ELT e -> ELT e
+  uaPROFILE str into = add_attr into (mkUAttr PROFILE str)
+  atPROFILE :: AttrValuePROFILE v => v -> ELT e -> ELT e
+  atPROFILE v into = add_attr into (mkUAttr PROFILE (av $ show v))
+class AdmitAttrWIDTH e where
+  uaWIDTH :: String -> ELT e -> ELT e
+  uaWIDTH str into = add_attr into (mkUAttr WIDTH str)
+  atWIDTH :: AttrValueWIDTH v => v -> ELT e -> ELT e
+  atWIDTH v into = add_attr into (mkUAttr WIDTH (av $ show v))
+class AdmitAttrHEIGHT e where
+  uaHEIGHT :: String -> ELT e -> ELT e
+  uaHEIGHT str into = add_attr into (mkUAttr HEIGHT str)
+  atHEIGHT :: AttrValueHEIGHT v => v -> ELT e -> ELT e
+  atHEIGHT v into = add_attr into (mkUAttr HEIGHT (av $ show v))
+class AdmitAttrALIGN e where
+  uaALIGN :: String -> ELT e -> ELT e
+  uaALIGN str into = add_attr into (mkUAttr ALIGN str)
+  atALIGN :: AttrValueALIGN v => v -> ELT e -> ELT e
+  atALIGN v into = add_attr into (mkUAttr ALIGN (av $ show v))
+class AdmitAttrSCROLLING e where
+  uaSCROLLING :: String -> ELT e -> ELT e
+  uaSCROLLING str into = add_attr into (mkUAttr SCROLLING str)
+  atSCROLLING :: AttrValueSCROLLING v => v -> ELT e -> ELT e
+  atSCROLLING v into = add_attr into (mkUAttr SCROLLING (av $ show v))
+class AdmitAttrMARGINHEIGHT e where
+  uaMARGINHEIGHT :: String -> ELT e -> ELT e
+  uaMARGINHEIGHT str into = add_attr into (mkUAttr MARGINHEIGHT str)
+  atMARGINHEIGHT :: AttrValueMARGINHEIGHT v => v -> ELT e -> ELT e
+  atMARGINHEIGHT v into = add_attr into (mkUAttr MARGINHEIGHT (av $ show v))
+class AdmitAttrMARGINWIDTH e where
+  uaMARGINWIDTH :: String -> ELT e -> ELT e
+  uaMARGINWIDTH str into = add_attr into (mkUAttr MARGINWIDTH str)
+  atMARGINWIDTH :: AttrValueMARGINWIDTH v => v -> ELT e -> ELT e
+  atMARGINWIDTH v into = add_attr into (mkUAttr MARGINWIDTH (av $ show v))
+class AdmitAttrFRAMEBORDER e where
+  uaFRAMEBORDER :: String -> ELT e -> ELT e
+  uaFRAMEBORDER str into = add_attr into (mkUAttr FRAMEBORDER str)
+  atFRAMEBORDER :: AttrValueFRAMEBORDER v => v -> ELT e -> ELT e
+  atFRAMEBORDER v into = add_attr into (mkUAttr FRAMEBORDER (av $ show v))
+class AdmitAttrLONGDESC e where
+  uaLONGDESC :: String -> ELT e -> ELT e
+  uaLONGDESC str into = add_attr into (mkUAttr LONGDESC str)
+  atLONGDESC :: AttrValueLONGDESC v => v -> ELT e -> ELT e
+  atLONGDESC v into = add_attr into (mkUAttr LONGDESC (av $ show v))
+class AdmitAttrBGCOLOR e where
+  uaBGCOLOR :: String -> ELT e -> ELT e
+  uaBGCOLOR str into = add_attr into (mkUAttr BGCOLOR str)
+  atBGCOLOR :: AttrValueBGCOLOR v => v -> ELT e -> ELT e
+  atBGCOLOR v into = add_attr into (mkUAttr BGCOLOR (av $ show v))
+class AdmitAttrNOWRAP e where
+  uaNOWRAP :: String -> ELT e -> ELT e
+  uaNOWRAP str into = add_attr into (mkUAttr NOWRAP str)
+  atNOWRAP :: AttrValueNOWRAP v => v -> ELT e -> ELT e
+  atNOWRAP v into = add_attr into (mkUAttr NOWRAP (av $ show v))
+class AdmitAttrVALIGN e where
+  uaVALIGN :: String -> ELT e -> ELT e
+  uaVALIGN str into = add_attr into (mkUAttr VALIGN str)
+  atVALIGN :: AttrValueVALIGN v => v -> ELT e -> ELT e
+  atVALIGN v into = add_attr into (mkUAttr VALIGN (av $ show v))
+class AdmitAttrCHAROFF e where
+  uaCHAROFF :: String -> ELT e -> ELT e
+  uaCHAROFF str into = add_attr into (mkUAttr CHAROFF str)
+  atCHAROFF :: AttrValueCHAROFF v => v -> ELT e -> ELT e
+  atCHAROFF v into = add_attr into (mkUAttr CHAROFF (av $ show v))
+class AdmitAttrCHAR e where
+  uaCHAR :: String -> ELT e -> ELT e
+  uaCHAR str into = add_attr into (mkUAttr CHAR str)
+  atCHAR :: AttrValueCHAR v => v -> ELT e -> ELT e
+  atCHAR v into = add_attr into (mkUAttr CHAR (av $ show v))
+class AdmitAttrCOLSPAN e where
+  uaCOLSPAN :: String -> ELT e -> ELT e
+  uaCOLSPAN str into = add_attr into (mkUAttr COLSPAN str)
+  atCOLSPAN :: AttrValueCOLSPAN v => v -> ELT e -> ELT e
+  atCOLSPAN v into = add_attr into (mkUAttr COLSPAN (av $ show v))
+class AdmitAttrROWSPAN e where
+  uaROWSPAN :: String -> ELT e -> ELT e
+  uaROWSPAN str into = add_attr into (mkUAttr ROWSPAN str)
+  atROWSPAN :: AttrValueROWSPAN v => v -> ELT e -> ELT e
+  atROWSPAN v into = add_attr into (mkUAttr ROWSPAN (av $ show v))
+class AdmitAttrSCOPE e where
+  uaSCOPE :: String -> ELT e -> ELT e
+  uaSCOPE str into = add_attr into (mkUAttr SCOPE str)
+  atSCOPE :: AttrValueSCOPE v => v -> ELT e -> ELT e
+  atSCOPE v into = add_attr into (mkUAttr SCOPE (av $ show v))
+class AdmitAttrHEADERS e where
+  uaHEADERS :: String -> ELT e -> ELT e
+  uaHEADERS str into = add_attr into (mkUAttr HEADERS str)
+  atHEADERS :: AttrValueHEADERS v => v -> ELT e -> ELT e
+  atHEADERS v into = add_attr into (mkUAttr HEADERS (av $ show v))
+class AdmitAttrAXIS e where
+  uaAXIS :: String -> ELT e -> ELT e
+  uaAXIS str into = add_attr into (mkUAttr AXIS str)
+  atAXIS :: AttrValueAXIS v => v -> ELT e -> ELT e
+  atAXIS v into = add_attr into (mkUAttr AXIS (av $ show v))
+class AdmitAttrABBR e where
+  uaABBR :: String -> ELT e -> ELT e
+  uaABBR str into = add_attr into (mkUAttr ABBR str)
+  atABBR :: AttrValueABBR v => v -> ELT e -> ELT e
+  atABBR v into = add_attr into (mkUAttr ABBR (av $ show v))
+class AdmitAttrSPAN e where
+  uaSPAN :: String -> ELT e -> ELT e
+  uaSPAN str into = add_attr into (mkUAttr SPAN str)
+  atSPAN :: AttrValueSPAN v => v -> ELT e -> ELT e
+  atSPAN v into = add_attr into (mkUAttr SPAN (av $ show v))
+class AdmitAttrDATAPAGESIZE e where
+  uaDATAPAGESIZE :: String -> ELT e -> ELT e
+  uaDATAPAGESIZE str into = add_attr into (mkUAttr DATAPAGESIZE str)
+  atDATAPAGESIZE :: AttrValueDATAPAGESIZE v => v -> ELT e -> ELT e
+  atDATAPAGESIZE v into = add_attr into (mkUAttr DATAPAGESIZE (av $ show v))
+class AdmitAttrCELLPADDING e where
+  uaCELLPADDING :: String -> ELT e -> ELT e
+  uaCELLPADDING str into = add_attr into (mkUAttr CELLPADDING str)
+  atCELLPADDING :: AttrValueCELLPADDING v => v -> ELT e -> ELT e
+  atCELLPADDING v into = add_attr into (mkUAttr CELLPADDING (av $ show v))
+class AdmitAttrCELLSPACING e where
+  uaCELLSPACING :: String -> ELT e -> ELT e
+  uaCELLSPACING str into = add_attr into (mkUAttr CELLSPACING str)
+  atCELLSPACING :: AttrValueCELLSPACING v => v -> ELT e -> ELT e
+  atCELLSPACING v into = add_attr into (mkUAttr CELLSPACING (av $ show v))
+class AdmitAttrRULES e where
+  uaRULES :: String -> ELT e -> ELT e
+  uaRULES str into = add_attr into (mkUAttr RULES str)
+  atRULES :: AttrValueRULES v => v -> ELT e -> ELT e
+  atRULES v into = add_attr into (mkUAttr RULES (av $ show v))
+class AdmitAttrFRAME e where
+  uaFRAME :: String -> ELT e -> ELT e
+  uaFRAME str into = add_attr into (mkUAttr FRAME str)
+  atFRAME :: AttrValueFRAME v => v -> ELT e -> ELT e
+  atFRAME v into = add_attr into (mkUAttr FRAME (av $ show v))
+class AdmitAttrBORDER e where
+  uaBORDER :: String -> ELT e -> ELT e
+  uaBORDER str into = add_attr into (mkUAttr BORDER str)
+  atBORDER :: AttrValueBORDER v => v -> ELT e -> ELT e
+  atBORDER v into = add_attr into (mkUAttr BORDER (av $ show v))
+class AdmitAttrSUMMARY e where
+  uaSUMMARY :: String -> ELT e -> ELT e
+  uaSUMMARY str into = add_attr into (mkUAttr SUMMARY str)
+  atSUMMARY :: AttrValueSUMMARY v => v -> ELT e -> ELT e
+  atSUMMARY v into = add_attr into (mkUAttr SUMMARY (av $ show v))
+class AdmitAttrONBLUR e where
+  uaONBLUR :: String -> ELT e -> ELT e
+  uaONBLUR str into = add_attr into (mkUAttr ONBLUR str)
+  atONBLUR :: AttrValueONBLUR v => v -> ELT e -> ELT e
+  atONBLUR v into = add_attr into (mkUAttr ONBLUR (av $ show v))
+class AdmitAttrONFOCUS e where
+  uaONFOCUS :: String -> ELT e -> ELT e
+  uaONFOCUS str into = add_attr into (mkUAttr ONFOCUS str)
+  atONFOCUS :: AttrValueONFOCUS v => v -> ELT e -> ELT e
+  atONFOCUS v into = add_attr into (mkUAttr ONFOCUS (av $ show v))
+class AdmitAttrACCESSKEY e where
+  uaACCESSKEY :: String -> ELT e -> ELT e
+  uaACCESSKEY str into = add_attr into (mkUAttr ACCESSKEY str)
+  atACCESSKEY :: AttrValueACCESSKEY v => v -> ELT e -> ELT e
+  atACCESSKEY v into = add_attr into (mkUAttr ACCESSKEY (av $ show v))
+class AdmitAttrTABINDEX e where
+  uaTABINDEX :: String -> ELT e -> ELT e
+  uaTABINDEX str into = add_attr into (mkUAttr TABINDEX str)
+  atTABINDEX :: AttrValueTABINDEX v => v -> ELT e -> ELT e
+  atTABINDEX v into = add_attr into (mkUAttr TABINDEX (av $ show v))
+class AdmitAttrDISABLED e where
+  uaDISABLED :: String -> ELT e -> ELT e
+  uaDISABLED str into = add_attr into (mkUAttr DISABLED str)
+  atDISABLED :: AttrValueDISABLED v => v -> ELT e -> ELT e
+  atDISABLED v into = add_attr into (mkUAttr DISABLED (av $ show v))
+class AdmitAttrVALUE e where
+  uaVALUE :: String -> ELT e -> ELT e
+  uaVALUE str into = add_attr into (mkUAttr VALUE str)
+  atVALUE :: AttrValueVALUE v => v -> ELT e -> ELT e
+  atVALUE v into = add_attr into (mkUAttr VALUE (av $ show v))
+class AdmitAttrONCHANGE e where
+  uaONCHANGE :: String -> ELT e -> ELT e
+  uaONCHANGE str into = add_attr into (mkUAttr ONCHANGE str)
+  atONCHANGE :: AttrValueONCHANGE v => v -> ELT e -> ELT e
+  atONCHANGE v into = add_attr into (mkUAttr ONCHANGE (av $ show v))
+class AdmitAttrONSELECT e where
+  uaONSELECT :: String -> ELT e -> ELT e
+  uaONSELECT str into = add_attr into (mkUAttr ONSELECT str)
+  atONSELECT :: AttrValueONSELECT v => v -> ELT e -> ELT e
+  atONSELECT v into = add_attr into (mkUAttr ONSELECT (av $ show v))
+class AdmitAttrREADONLY e where
+  uaREADONLY :: String -> ELT e -> ELT e
+  uaREADONLY str into = add_attr into (mkUAttr READONLY str)
+  atREADONLY :: AttrValueREADONLY v => v -> ELT e -> ELT e
+  atREADONLY v into = add_attr into (mkUAttr READONLY (av $ show v))
+class AdmitAttrCOLS e where
+  uaCOLS :: String -> ELT e -> ELT e
+  uaCOLS str into = add_attr into (mkUAttr COLS str)
+  atCOLS :: AttrValueCOLS v => v -> ELT e -> ELT e
+  atCOLS v into = add_attr into (mkUAttr COLS (av $ show v))
+class AdmitAttrROWS e where
+  uaROWS :: String -> ELT e -> ELT e
+  uaROWS str into = add_attr into (mkUAttr ROWS str)
+  atROWS :: AttrValueROWS v => v -> ELT e -> ELT e
+  atROWS v into = add_attr into (mkUAttr ROWS (av $ show v))
+class AdmitAttrLABEL e where
+  uaLABEL :: String -> ELT e -> ELT e
+  uaLABEL str into = add_attr into (mkUAttr LABEL str)
+  atLABEL :: AttrValueLABEL v => v -> ELT e -> ELT e
+  atLABEL v into = add_attr into (mkUAttr LABEL (av $ show v))
+class AdmitAttrSELECTED e where
+  uaSELECTED :: String -> ELT e -> ELT e
+  uaSELECTED str into = add_attr into (mkUAttr SELECTED str)
+  atSELECTED :: AttrValueSELECTED v => v -> ELT e -> ELT e
+  atSELECTED v into = add_attr into (mkUAttr SELECTED (av $ show v))
+class AdmitAttrMULTIPLE e where
+  uaMULTIPLE :: String -> ELT e -> ELT e
+  uaMULTIPLE str into = add_attr into (mkUAttr MULTIPLE str)
+  atMULTIPLE :: AttrValueMULTIPLE v => v -> ELT e -> ELT e
+  atMULTIPLE v into = add_attr into (mkUAttr MULTIPLE (av $ show v))
+class AdmitAttrSIZE e where
+  uaSIZE :: String -> ELT e -> ELT e
+  uaSIZE str into = add_attr into (mkUAttr SIZE str)
+  atSIZE :: AttrValueSIZE v => v -> ELT e -> ELT e
+  atSIZE v into = add_attr into (mkUAttr SIZE (av $ show v))
+class AdmitAttrACCEPT e where
+  uaACCEPT :: String -> ELT e -> ELT e
+  uaACCEPT str into = add_attr into (mkUAttr ACCEPT str)
+  atACCEPT :: AttrValueACCEPT v => v -> ELT e -> ELT e
+  atACCEPT v into = add_attr into (mkUAttr ACCEPT (av $ show v))
+class AdmitAttrUSEMAP e where
+  uaUSEMAP :: String -> ELT e -> ELT e
+  uaUSEMAP str into = add_attr into (mkUAttr USEMAP str)
+  atUSEMAP :: AttrValueUSEMAP v => v -> ELT e -> ELT e
+  atUSEMAP v into = add_attr into (mkUAttr USEMAP (av $ show v))
+class AdmitAttrALT e where
+  uaALT :: String -> ELT e -> ELT e
+  uaALT str into = add_attr into (mkUAttr ALT str)
+  atALT :: AttrValueALT v => v -> ELT e -> ELT e
+  atALT v into = add_attr into (mkUAttr ALT (av $ show v))
+class AdmitAttrMAXLENGTH e where
+  uaMAXLENGTH :: String -> ELT e -> ELT e
+  uaMAXLENGTH str into = add_attr into (mkUAttr MAXLENGTH str)
+  atMAXLENGTH :: AttrValueMAXLENGTH v => v -> ELT e -> ELT e
+  atMAXLENGTH v into = add_attr into (mkUAttr MAXLENGTH (av $ show v))
+class AdmitAttrCHECKED e where
+  uaCHECKED :: String -> ELT e -> ELT e
+  uaCHECKED str into = add_attr into (mkUAttr CHECKED str)
+  atCHECKED :: AttrValueCHECKED v => v -> ELT e -> ELT e
+  atCHECKED v into = add_attr into (mkUAttr CHECKED (av $ show v))
+class AdmitAttrACCEPT_CHARSET e where
+  uaACCEPT_CHARSET :: String -> ELT e -> ELT e
+  uaACCEPT_CHARSET str into = add_attr into (mkUAttr ACCEPT_CHARSET str)
+  atACCEPT_CHARSET :: AttrValueACCEPT_CHARSET v => v -> ELT e -> ELT e
+  atACCEPT_CHARSET v into = add_attr into (mkUAttr ACCEPT_CHARSET (av $ show v))
+class AdmitAttrONRESET e where
+  uaONRESET :: String -> ELT e -> ELT e
+  uaONRESET str into = add_attr into (mkUAttr ONRESET str)
+  atONRESET :: AttrValueONRESET v => v -> ELT e -> ELT e
+  atONRESET v into = add_attr into (mkUAttr ONRESET (av $ show v))
+class AdmitAttrONSUBMIT e where
+  uaONSUBMIT :: String -> ELT e -> ELT e
+  uaONSUBMIT str into = add_attr into (mkUAttr ONSUBMIT str)
+  atONSUBMIT :: AttrValueONSUBMIT v => v -> ELT e -> ELT e
+  atONSUBMIT v into = add_attr into (mkUAttr ONSUBMIT (av $ show v))
+class AdmitAttrENCTYPE e where
+  uaENCTYPE :: String -> ELT e -> ELT e
+  uaENCTYPE str into = add_attr into (mkUAttr ENCTYPE str)
+  atENCTYPE :: AttrValueENCTYPE v => v -> ELT e -> ELT e
+  atENCTYPE v into = add_attr into (mkUAttr ENCTYPE (av $ show v))
+class AdmitAttrMETHOD e where
+  uaMETHOD :: String -> ELT e -> ELT e
+  uaMETHOD str into = add_attr into (mkUAttr METHOD str)
+  atMETHOD :: AttrValueMETHOD v => v -> ELT e -> ELT e
+  atMETHOD v into = add_attr into (mkUAttr METHOD (av $ show v))
+class AdmitAttrACTION e where
+  uaACTION :: String -> ELT e -> ELT e
+  uaACTION str into = add_attr into (mkUAttr ACTION str)
+  atACTION :: AttrValueACTION v => v -> ELT e -> ELT e
+  atACTION v into = add_attr into (mkUAttr ACTION (av $ show v))
+class AdmitAttrCOMPACT e where
+  uaCOMPACT :: String -> ELT e -> ELT e
+  uaCOMPACT str into = add_attr into (mkUAttr COMPACT str)
+  atCOMPACT :: AttrValueCOMPACT v => v -> ELT e -> ELT e
+  atCOMPACT v into = add_attr into (mkUAttr COMPACT (av $ show v))
+class AdmitAttrSTART e where
+  uaSTART :: String -> ELT e -> ELT e
+  uaSTART str into = add_attr into (mkUAttr START str)
+  atSTART :: AttrValueSTART v => v -> ELT e -> ELT e
+  atSTART v into = add_attr into (mkUAttr START (av $ show v))
+class AdmitAttrDATETIME e where
+  uaDATETIME :: String -> ELT e -> ELT e
+  uaDATETIME str into = add_attr into (mkUAttr DATETIME str)
+  atDATETIME :: AttrValueDATETIME v => v -> ELT e -> ELT e
+  atDATETIME v into = add_attr into (mkUAttr DATETIME (av $ show v))
+class AdmitAttrCITE e where
+  uaCITE :: String -> ELT e -> ELT e
+  uaCITE str into = add_attr into (mkUAttr CITE str)
+  atCITE :: AttrValueCITE v => v -> ELT e -> ELT e
+  atCITE v into = add_attr into (mkUAttr CITE (av $ show v))
+class AdmitAttrNOSHADE e where
+  uaNOSHADE :: String -> ELT e -> ELT e
+  uaNOSHADE str into = add_attr into (mkUAttr NOSHADE str)
+  atNOSHADE :: AttrValueNOSHADE v => v -> ELT e -> ELT e
+  atNOSHADE v into = add_attr into (mkUAttr NOSHADE (av $ show v))
+class AdmitAttrVSPACE e where
+  uaVSPACE :: String -> ELT e -> ELT e
+  uaVSPACE str into = add_attr into (mkUAttr VSPACE str)
+  atVSPACE :: AttrValueVSPACE v => v -> ELT e -> ELT e
+  atVSPACE v into = add_attr into (mkUAttr VSPACE (av $ show v))
+class AdmitAttrHSPACE e where
+  uaHSPACE :: String -> ELT e -> ELT e
+  uaHSPACE str into = add_attr into (mkUAttr HSPACE str)
+  atHSPACE :: AttrValueHSPACE v => v -> ELT e -> ELT e
+  atHSPACE v into = add_attr into (mkUAttr HSPACE (av $ show v))
+class AdmitAttrOBJECT e where
+  uaOBJECT :: String -> ELT e -> ELT e
+  uaOBJECT str into = add_attr into (mkUAttr OBJECT str)
+  atOBJECT :: AttrValueOBJECT v => v -> ELT e -> ELT e
+  atOBJECT v into = add_attr into (mkUAttr OBJECT (av $ show v))
+class AdmitAttrCODE e where
+  uaCODE :: String -> ELT e -> ELT e
+  uaCODE str into = add_attr into (mkUAttr CODE str)
+  atCODE :: AttrValueCODE v => v -> ELT e -> ELT e
+  atCODE v into = add_attr into (mkUAttr CODE (av $ show v))
+class AdmitAttrARCHIVE e where
+  uaARCHIVE :: String -> ELT e -> ELT e
+  uaARCHIVE str into = add_attr into (mkUAttr ARCHIVE str)
+  atARCHIVE :: AttrValueARCHIVE v => v -> ELT e -> ELT e
+  atARCHIVE v into = add_attr into (mkUAttr ARCHIVE (av $ show v))
+class AdmitAttrCODEBASE e where
+  uaCODEBASE :: String -> ELT e -> ELT e
+  uaCODEBASE str into = add_attr into (mkUAttr CODEBASE str)
+  atCODEBASE :: AttrValueCODEBASE v => v -> ELT e -> ELT e
+  atCODEBASE v into = add_attr into (mkUAttr CODEBASE (av $ show v))
+class AdmitAttrVALUETYPE e where
+  uaVALUETYPE :: String -> ELT e -> ELT e
+  uaVALUETYPE str into = add_attr into (mkUAttr VALUETYPE str)
+  atVALUETYPE :: AttrValueVALUETYPE v => v -> ELT e -> ELT e
+  atVALUETYPE v into = add_attr into (mkUAttr VALUETYPE (av $ show v))
+class AdmitAttrSTANDBY e where
+  uaSTANDBY :: String -> ELT e -> ELT e
+  uaSTANDBY str into = add_attr into (mkUAttr STANDBY str)
+  atSTANDBY :: AttrValueSTANDBY v => v -> ELT e -> ELT e
+  atSTANDBY v into = add_attr into (mkUAttr STANDBY (av $ show v))
+class AdmitAttrCODETYPE e where
+  uaCODETYPE :: String -> ELT e -> ELT e
+  uaCODETYPE str into = add_attr into (mkUAttr CODETYPE str)
+  atCODETYPE :: AttrValueCODETYPE v => v -> ELT e -> ELT e
+  atCODETYPE v into = add_attr into (mkUAttr CODETYPE (av $ show v))
+class AdmitAttrDATA e where
+  uaDATA :: String -> ELT e -> ELT e
+  uaDATA str into = add_attr into (mkUAttr DATA str)
+  atDATA :: AttrValueDATA v => v -> ELT e -> ELT e
+  atDATA v into = add_attr into (mkUAttr DATA (av $ show v))
+class AdmitAttrCLASSID e where
+  uaCLASSID :: String -> ELT e -> ELT e
+  uaCLASSID str into = add_attr into (mkUAttr CLASSID str)
+  atCLASSID :: AttrValueCLASSID v => v -> ELT e -> ELT e
+  atCLASSID v into = add_attr into (mkUAttr CLASSID (av $ show v))
+class AdmitAttrDECLARE e where
+  uaDECLARE :: String -> ELT e -> ELT e
+  uaDECLARE str into = add_attr into (mkUAttr DECLARE str)
+  atDECLARE :: AttrValueDECLARE v => v -> ELT e -> ELT e
+  atDECLARE v into = add_attr into (mkUAttr DECLARE (av $ show v))
+class AdmitAttrISMAP e where
+  uaISMAP :: String -> ELT e -> ELT e
+  uaISMAP str into = add_attr into (mkUAttr ISMAP str)
+  atISMAP :: AttrValueISMAP v => v -> ELT e -> ELT e
+  atISMAP v into = add_attr into (mkUAttr ISMAP (av $ show v))
+class AdmitAttrREV e where
+  uaREV :: String -> ELT e -> ELT e
+  uaREV str into = add_attr into (mkUAttr REV str)
+  atREV :: AttrValueREV v => v -> ELT e -> ELT e
+  atREV v into = add_attr into (mkUAttr REV (av $ show v))
+class AdmitAttrREL e where
+  uaREL :: String -> ELT e -> ELT e
+  uaREL str into = add_attr into (mkUAttr REL str)
+  atREL :: AttrValueREL v => v -> ELT e -> ELT e
+  atREL v into = add_attr into (mkUAttr REL (av $ show v))
+class AdmitAttrHREFLANG e where
+  uaHREFLANG :: String -> ELT e -> ELT e
+  uaHREFLANG str into = add_attr into (mkUAttr HREFLANG str)
+  atHREFLANG :: AttrValueHREFLANG v => v -> ELT e -> ELT e
+  atHREFLANG v into = add_attr into (mkUAttr HREFLANG (av $ show v))
+class AdmitAttrNOHREF e where
+  uaNOHREF :: String -> ELT e -> ELT e
+  uaNOHREF str into = add_attr into (mkUAttr NOHREF str)
+  atNOHREF :: AttrValueNOHREF v => v -> ELT e -> ELT e
+  atNOHREF v into = add_attr into (mkUAttr NOHREF (av $ show v))
+class AdmitAttrCOORDS e where
+  uaCOORDS :: String -> ELT e -> ELT e
+  uaCOORDS str into = add_attr into (mkUAttr COORDS str)
+  atCOORDS :: AttrValueCOORDS v => v -> ELT e -> ELT e
+  atCOORDS v into = add_attr into (mkUAttr COORDS (av $ show v))
+class AdmitAttrSHAPE e where
+  uaSHAPE :: String -> ELT e -> ELT e
+  uaSHAPE str into = add_attr into (mkUAttr SHAPE str)
+  atSHAPE :: AttrValueSHAPE v => v -> ELT e -> ELT e
+  atSHAPE v into = add_attr into (mkUAttr SHAPE (av $ show v))
+class AdmitAttrALINK e where
+  uaALINK :: String -> ELT e -> ELT e
+  uaALINK str into = add_attr into (mkUAttr ALINK str)
+  atALINK :: AttrValueALINK v => v -> ELT e -> ELT e
+  atALINK v into = add_attr into (mkUAttr ALINK (av $ show v))
+class AdmitAttrVLINK e where
+  uaVLINK :: String -> ELT e -> ELT e
+  uaVLINK str into = add_attr into (mkUAttr VLINK str)
+  atVLINK :: AttrValueVLINK v => v -> ELT e -> ELT e
+  atVLINK v into = add_attr into (mkUAttr VLINK (av $ show v))
+class AdmitAttrLINK e where
+  uaLINK :: String -> ELT e -> ELT e
+  uaLINK str into = add_attr into (mkUAttr LINK str)
+  atLINK :: AttrValueLINK v => v -> ELT e -> ELT e
+  atLINK v into = add_attr into (mkUAttr LINK (av $ show v))
+class AdmitAttrTEXT e where
+  uaTEXT :: String -> ELT e -> ELT e
+  uaTEXT str into = add_attr into (mkUAttr TEXT str)
+  atTEXT :: AttrValueTEXT v => v -> ELT e -> ELT e
+  atTEXT v into = add_attr into (mkUAttr TEXT (av $ show v))
+class AdmitAttrBACKGROUND e where
+  uaBACKGROUND :: String -> ELT e -> ELT e
+  uaBACKGROUND str into = add_attr into (mkUAttr BACKGROUND str)
+  atBACKGROUND :: AttrValueBACKGROUND v => v -> ELT e -> ELT e
+  atBACKGROUND v into = add_attr into (mkUAttr BACKGROUND (av $ show v))
+class AdmitAttrONUNLOAD e where
+  uaONUNLOAD :: String -> ELT e -> ELT e
+  uaONUNLOAD str into = add_attr into (mkUAttr ONUNLOAD str)
+  atONUNLOAD :: AttrValueONUNLOAD v => v -> ELT e -> ELT e
+  atONUNLOAD v into = add_attr into (mkUAttr ONUNLOAD (av $ show v))
+class AdmitAttrONLOAD e where
+  uaONLOAD :: String -> ELT e -> ELT e
+  uaONLOAD str into = add_attr into (mkUAttr ONLOAD str)
+  atONLOAD :: AttrValueONLOAD v => v -> ELT e -> ELT e
+  atONLOAD v into = add_attr into (mkUAttr ONLOAD (av $ show v))
+class AdmitAttrCLEAR e where
+  uaCLEAR :: String -> ELT e -> ELT e
+  uaCLEAR str into = add_attr into (mkUAttr CLEAR str)
+  atCLEAR :: AttrValueCLEAR v => v -> ELT e -> ELT e
+  atCLEAR v into = add_attr into (mkUAttr CLEAR (av $ show v))
+class AdmitAttrFACE e where
+  uaFACE :: String -> ELT e -> ELT e
+  uaFACE str into = add_attr into (mkUAttr FACE str)
+  atFACE :: AttrValueFACE v => v -> ELT e -> ELT e
+  atFACE v into = add_attr into (mkUAttr FACE (av $ show v))
+class AdmitAttrCOLOR e where
+  uaCOLOR :: String -> ELT e -> ELT e
+  uaCOLOR str into = add_attr into (mkUAttr COLOR str)
+  atCOLOR :: AttrValueCOLOR v => v -> ELT e -> ELT e
+  atCOLOR v into = add_attr into (mkUAttr COLOR (av $ show v))
+class Show v => AttrValueABBR v
+class Show v => AttrValueACCEPT v
+class Show v => AttrValueACCEPT_CHARSET v
+class Show v => AttrValueACCESSKEY v
+class Show v => AttrValueACTION v
+class Show v => AttrValueALIGN v
+class Show v => AttrValueALINK v
+class Show v => AttrValueALT v
+class Show v => AttrValueARCHIVE v
+class Show v => AttrValueAXIS v
+class Show v => AttrValueBACKGROUND v
+class Show v => AttrValueBGCOLOR v
+class Show v => AttrValueBORDER v
+class Show v => AttrValueCELLPADDING v
+class Show v => AttrValueCELLSPACING v
+class Show v => AttrValueCHAR v
+class Show v => AttrValueCHAROFF v
+class Show v => AttrValueCHARSET v
+class Show v => AttrValueCHECKED v
+class Show v => AttrValueCITE v
+class Show v => AttrValueCLASS v
+class Show v => AttrValueCLASSID v
+class Show v => AttrValueCLEAR v
+class Show v => AttrValueCODE v
+class Show v => AttrValueCODEBASE v
+class Show v => AttrValueCODETYPE v
+class Show v => AttrValueCOLOR v
+class Show v => AttrValueCOLS v
+class Show v => AttrValueCOLSPAN v
+class Show v => AttrValueCOMPACT v
+class Show v => AttrValueCONTENT v
+class Show v => AttrValueCOORDS v
+class Show v => AttrValueDATA v
+class Show v => AttrValueDATAPAGESIZE v
+class Show v => AttrValueDATETIME v
+class Show v => AttrValueDECLARE v
+class Show v => AttrValueDEFER v
+class Show v => AttrValueDIR v
+class Show v => AttrValueDISABLED v
+class Show v => AttrValueENCTYPE v
+class Show v => AttrValueEVENT v
+class Show v => AttrValueFACE v
+class Show v => AttrValueFOR v
+class Show v => AttrValueFRAME v
+class Show v => AttrValueFRAMEBORDER v
+class Show v => AttrValueHEADERS v
+class Show v => AttrValueHEIGHT v
+class Show v => AttrValueHREF v
+class Show v => AttrValueHREFLANG v
+class Show v => AttrValueHSPACE v
+class Show v => AttrValueHTTP_EQUIV v
+class Show v => AttrValueID v
+class Show v => AttrValueISMAP v
+class Show v => AttrValueLABEL v
+class Show v => AttrValueLANG v
+class Show v => AttrValueLANGUAGE v
+class Show v => AttrValueLINK v
+class Show v => AttrValueLONGDESC v
+class Show v => AttrValueMARGINHEIGHT v
+class Show v => AttrValueMARGINWIDTH v
+class Show v => AttrValueMAXLENGTH v
+class Show v => AttrValueMEDIA v
+class Show v => AttrValueMETHOD v
+class Show v => AttrValueMULTIPLE v
+class Show v => AttrValueNAME v
+class Show v => AttrValueNOHREF v
+class Show v => AttrValueNOSHADE v
+class Show v => AttrValueNOWRAP v
+class Show v => AttrValueOBJECT v
+class Show v => AttrValueONBLUR v
+class Show v => AttrValueONCHANGE v
+class Show v => AttrValueONCLICK v
+class Show v => AttrValueONDBLCLICK v
+class Show v => AttrValueONFOCUS v
+class Show v => AttrValueONKEYDOWN v
+class Show v => AttrValueONKEYPRESS v
+class Show v => AttrValueONKEYUP v
+class Show v => AttrValueONLOAD v
+class Show v => AttrValueONMOUSEDOWN v
+class Show v => AttrValueONMOUSEMOVE v
+class Show v => AttrValueONMOUSEOUT v
+class Show v => AttrValueONMOUSEOVER v
+class Show v => AttrValueONMOUSEUP v
+class Show v => AttrValueONRESET v
+class Show v => AttrValueONSELECT v
+class Show v => AttrValueONSUBMIT v
+class Show v => AttrValueONUNLOAD v
+class Show v => AttrValuePROFILE v
+class Show v => AttrValuePROMPT v
+class Show v => AttrValueREADONLY v
+class Show v => AttrValueREL v
+class Show v => AttrValueREV v
+class Show v => AttrValueROWS v
+class Show v => AttrValueROWSPAN v
+class Show v => AttrValueRULES v
+class Show v => AttrValueSCHEME v
+class Show v => AttrValueSCOPE v
+class Show v => AttrValueSCROLLING v
+class Show v => AttrValueSELECTED v
+class Show v => AttrValueSHAPE v
+class Show v => AttrValueSIZE v
+class Show v => AttrValueSPAN v
+class Show v => AttrValueSRC v
+class Show v => AttrValueSTANDBY v
+class Show v => AttrValueSTART v
+class Show v => AttrValueSTYLE v
+class Show v => AttrValueSUMMARY v
+class Show v => AttrValueTABINDEX v
+class Show v => AttrValueTARGET v
+class Show v => AttrValueTEXT v
+class Show v => AttrValueTITLE v
+class Show v => AttrValueTYPE v
+class Show v => AttrValueUSEMAP v
+class Show v => AttrValueVALIGN v
+class Show v => AttrValueVALUE v
+class Show v => AttrValueVALUETYPE v
+class Show v => AttrValueVERSION v
+class Show v => AttrValueVLINK v
+class Show v => AttrValueVSPACE v
+class Show v => AttrValueWIDTH v
+class AdmitChildA e where
+  a :: (ELT A -> ELT A) -> ELT e -> ELT e
+  a f elt = elt `add` f (make A)
+class AdmitChildABBR e where
+  abbr :: (ELT ABBR -> ELT ABBR) -> ELT e -> ELT e
+  abbr f elt = elt `add` f (make ABBR)
+class AdmitChildACRONYM e where
+  acronym :: (ELT ACRONYM -> ELT ACRONYM) -> ELT e -> ELT e
+  acronym f elt = elt `add` f (make ACRONYM)
+class AdmitChildADDRESS e where
+  address :: (ELT ADDRESS -> ELT ADDRESS) -> ELT e -> ELT e
+  address f elt = elt `add` f (make ADDRESS)
+class AdmitChildAPPLET e where
+  applet :: (ELT APPLET -> ELT APPLET) -> ELT e -> ELT e
+  applet f elt = elt `add` f (make APPLET)
+class AdmitChildAREA e where
+  area :: (ELT AREA -> ELT AREA) -> ELT e -> ELT e
+  area f elt = elt `add` f (make AREA)
+class AdmitChildB e where
+  b :: (ELT B -> ELT B) -> ELT e -> ELT e
+  b f elt = elt `add` f (make B)
+class AdmitChildBASE e where
+  base :: (ELT BASE -> ELT BASE) -> ELT e -> ELT e
+  base f elt = elt `add` f (make BASE)
+class AdmitChildBASEFONT e where
+  basefont :: (ELT BASEFONT -> ELT BASEFONT) -> ELT e -> ELT e
+  basefont f elt = elt `add` f (make BASEFONT)
+class AdmitChildBDO e where
+  bdo :: (ELT BDO -> ELT BDO) -> ELT e -> ELT e
+  bdo f elt = elt `add` f (make BDO)
+class AdmitChildBIG e where
+  big :: (ELT BIG -> ELT BIG) -> ELT e -> ELT e
+  big f elt = elt `add` f (make BIG)
+class AdmitChildBLOCKQUOTE e where
+  blockquote :: (ELT BLOCKQUOTE -> ELT BLOCKQUOTE) -> ELT e -> ELT e
+  blockquote f elt = elt `add` f (make BLOCKQUOTE)
+class AdmitChildBODY e where
+  body :: (ELT BODY -> ELT BODY) -> ELT e -> ELT e
+  body f elt = elt `add` f (make BODY)
+class AdmitChildBR e where
+  br :: (ELT BR -> ELT BR) -> ELT e -> ELT e
+  br f elt = elt `add` f (make BR)
+class AdmitChildBUTTON e where
+  button :: (ELT BUTTON -> ELT BUTTON) -> ELT e -> ELT e
+  button f elt = elt `add` f (make BUTTON)
+class AdmitChildCAPTION e where
+  caption :: (ELT CAPTION -> ELT CAPTION) -> ELT e -> ELT e
+  caption f elt = elt `add` f (make CAPTION)
+class AdmitChildCENTER e where
+  center :: (ELT CENTER -> ELT CENTER) -> ELT e -> ELT e
+  center f elt = elt `add` f (make CENTER)
+class AdmitChildCITE e where
+  cite :: (ELT CITE -> ELT CITE) -> ELT e -> ELT e
+  cite f elt = elt `add` f (make CITE)
+class AdmitChildCODE e where
+  code :: (ELT CODE -> ELT CODE) -> ELT e -> ELT e
+  code f elt = elt `add` f (make CODE)
+class AdmitChildCOL e where
+  col :: (ELT COL -> ELT COL) -> ELT e -> ELT e
+  col f elt = elt `add` f (make COL)
+class AdmitChildCOLGROUP e where
+  colgroup :: (ELT COLGROUP -> ELT COLGROUP) -> ELT e -> ELT e
+  colgroup f elt = elt `add` f (make COLGROUP)
+class AdmitChildDD e where
+  dd :: (ELT DD -> ELT DD) -> ELT e -> ELT e
+  dd f elt = elt `add` f (make DD)
+class AdmitChildDEL e where
+  del :: (ELT DEL -> ELT DEL) -> ELT e -> ELT e
+  del f elt = elt `add` f (make DEL)
+class AdmitChildDFN e where
+  dfn :: (ELT DFN -> ELT DFN) -> ELT e -> ELT e
+  dfn f elt = elt `add` f (make DFN)
+class AdmitChildDIR e where
+  dir :: (ELT DIR -> ELT DIR) -> ELT e -> ELT e
+  dir f elt = elt `add` f (make DIR)
+class AdmitChildDIV e where
+  div :: (ELT DIV -> ELT DIV) -> ELT e -> ELT e
+  div f elt = elt `add` f (make DIV)
+class AdmitChildDL e where
+  dl :: (ELT DL -> ELT DL) -> ELT e -> ELT e
+  dl f elt = elt `add` f (make DL)
+class AdmitChildDT e where
+  dt :: (ELT DT -> ELT DT) -> ELT e -> ELT e
+  dt f elt = elt `add` f (make DT)
+class AdmitChildEM e where
+  em :: (ELT EM -> ELT EM) -> ELT e -> ELT e
+  em f elt = elt `add` f (make EM)
+class AdmitChildFIELDSET e where
+  fieldset :: (ELT FIELDSET -> ELT FIELDSET) -> ELT e -> ELT e
+  fieldset f elt = elt `add` f (make FIELDSET)
+class AdmitChildFONT e where
+  font :: (ELT FONT -> ELT FONT) -> ELT e -> ELT e
+  font f elt = elt `add` f (make FONT)
+class AdmitChildFORM e where
+  form :: (ELT FORM -> ELT FORM) -> ELT e -> ELT e
+  form f elt = elt `add` f (make FORM)
+class AdmitChildH1 e where
+  h1 :: (ELT H1 -> ELT H1) -> ELT e -> ELT e
+  h1 f elt = elt `add` f (make H1)
+class AdmitChildH2 e where
+  h2 :: (ELT H2 -> ELT H2) -> ELT e -> ELT e
+  h2 f elt = elt `add` f (make H2)
+class AdmitChildH3 e where
+  h3 :: (ELT H3 -> ELT H3) -> ELT e -> ELT e
+  h3 f elt = elt `add` f (make H3)
+class AdmitChildH4 e where
+  h4 :: (ELT H4 -> ELT H4) -> ELT e -> ELT e
+  h4 f elt = elt `add` f (make H4)
+class AdmitChildH5 e where
+  h5 :: (ELT H5 -> ELT H5) -> ELT e -> ELT e
+  h5 f elt = elt `add` f (make H5)
+class AdmitChildH6 e where
+  h6 :: (ELT H6 -> ELT H6) -> ELT e -> ELT e
+  h6 f elt = elt `add` f (make H6)
+class AdmitChildHEAD e where
+  head :: (ELT HEAD -> ELT HEAD) -> ELT e -> ELT e
+  head f elt = elt `add` f (make HEAD)
+class AdmitChildHR e where
+  hr :: (ELT HR -> ELT HR) -> ELT e -> ELT e
+  hr f elt = elt `add` f (make HR)
+class AdmitChildHTML e where
+  html :: (ELT HTML -> ELT HTML) -> ELT e -> ELT e
+  html f elt = elt `add` f (make HTML)
+class AdmitChildI e where
+  i :: (ELT I -> ELT I) -> ELT e -> ELT e
+  i f elt = elt `add` f (make I)
+class AdmitChildIFRAME e where
+  iframe :: (ELT IFRAME -> ELT IFRAME) -> ELT e -> ELT e
+  iframe f elt = elt `add` f (make IFRAME)
+class AdmitChildIMG e where
+  img :: (ELT IMG -> ELT IMG) -> ELT e -> ELT e
+  img f elt = elt `add` f (make IMG)
+class AdmitChildINPUT e where
+  input :: (ELT INPUT -> ELT INPUT) -> ELT e -> ELT e
+  input f elt = elt `add` f (make INPUT)
+class AdmitChildINS e where
+  ins :: (ELT INS -> ELT INS) -> ELT e -> ELT e
+  ins f elt = elt `add` f (make INS)
+class AdmitChildISINDEX e where
+  isindex :: (ELT ISINDEX -> ELT ISINDEX) -> ELT e -> ELT e
+  isindex f elt = elt `add` f (make ISINDEX)
+class AdmitChildKBD e where
+  kbd :: (ELT KBD -> ELT KBD) -> ELT e -> ELT e
+  kbd f elt = elt `add` f (make KBD)
+class AdmitChildLABEL e where
+  label :: (ELT LABEL -> ELT LABEL) -> ELT e -> ELT e
+  label f elt = elt `add` f (make LABEL)
+class AdmitChildLEGEND e where
+  legend :: (ELT LEGEND -> ELT LEGEND) -> ELT e -> ELT e
+  legend f elt = elt `add` f (make LEGEND)
+class AdmitChildLI e where
+  li :: (ELT LI -> ELT LI) -> ELT e -> ELT e
+  li f elt = elt `add` f (make LI)
+class AdmitChildLINK e where
+  link :: (ELT LINK -> ELT LINK) -> ELT e -> ELT e
+  link f elt = elt `add` f (make LINK)
+class AdmitChildMAP e where
+  map :: (ELT MAP -> ELT MAP) -> ELT e -> ELT e
+  map f elt = elt `add` f (make MAP)
+class AdmitChildMENU e where
+  menu :: (ELT MENU -> ELT MENU) -> ELT e -> ELT e
+  menu f elt = elt `add` f (make MENU)
+class AdmitChildMETA e where
+  meta :: (ELT META -> ELT META) -> ELT e -> ELT e
+  meta f elt = elt `add` f (make META)
+class AdmitChildNOFRAMES e where
+  noframes :: (ELT NOFRAMES -> ELT NOFRAMES) -> ELT e -> ELT e
+  noframes f elt = elt `add` f (make NOFRAMES)
+class AdmitChildNOSCRIPT e where
+  noscript :: (ELT NOSCRIPT -> ELT NOSCRIPT) -> ELT e -> ELT e
+  noscript f elt = elt `add` f (make NOSCRIPT)
+class AdmitChildOBJECT e where
+  object :: (ELT OBJECT -> ELT OBJECT) -> ELT e -> ELT e
+  object f elt = elt `add` f (make OBJECT)
+class AdmitChildOL e where
+  ol :: (ELT OL -> ELT OL) -> ELT e -> ELT e
+  ol f elt = elt `add` f (make OL)
+class AdmitChildOPTGROUP e where
+  optgroup :: (ELT OPTGROUP -> ELT OPTGROUP) -> ELT e -> ELT e
+  optgroup f elt = elt `add` f (make OPTGROUP)
+class AdmitChildOPTION e where
+  option :: (ELT OPTION -> ELT OPTION) -> ELT e -> ELT e
+  option f elt = elt `add` f (make OPTION)
+class AdmitChildP e where
+  p :: (ELT P -> ELT P) -> ELT e -> ELT e
+  p f elt = elt `add` f (make P)
+class AdmitChildPARAM e where
+  param :: (ELT PARAM -> ELT PARAM) -> ELT e -> ELT e
+  param f elt = elt `add` f (make PARAM)
+class AdmitChildPRE e where
+  pre :: (ELT PRE -> ELT PRE) -> ELT e -> ELT e
+  pre f elt = elt `add` f (make PRE)
+class AdmitChildQ e where
+  q :: (ELT Q -> ELT Q) -> ELT e -> ELT e
+  q f elt = elt `add` f (make Q)
+class AdmitChildS e where
+  s :: (ELT S -> ELT S) -> ELT e -> ELT e
+  s f elt = elt `add` f (make S)
+class AdmitChildSAMP e where
+  samp :: (ELT SAMP -> ELT SAMP) -> ELT e -> ELT e
+  samp f elt = elt `add` f (make SAMP)
+class AdmitChildSCRIPT e where
+  script :: (ELT SCRIPT -> ELT SCRIPT) -> ELT e -> ELT e
+  script f elt = elt `add` f (make SCRIPT)
+class AdmitChildSELECT e where
+  select :: (ELT SELECT -> ELT SELECT) -> ELT e -> ELT e
+  select f elt = elt `add` f (make SELECT)
+class AdmitChildSMALL e where
+  small :: (ELT SMALL -> ELT SMALL) -> ELT e -> ELT e
+  small f elt = elt `add` f (make SMALL)
+class AdmitChildSPAN e where
+  span :: (ELT SPAN -> ELT SPAN) -> ELT e -> ELT e
+  span f elt = elt `add` f (make SPAN)
+class AdmitChildSTRIKE e where
+  strike :: (ELT STRIKE -> ELT STRIKE) -> ELT e -> ELT e
+  strike f elt = elt `add` f (make STRIKE)
+class AdmitChildSTRONG e where
+  strong :: (ELT STRONG -> ELT STRONG) -> ELT e -> ELT e
+  strong f elt = elt `add` f (make STRONG)
+class AdmitChildSTYLE e where
+  style :: (ELT STYLE -> ELT STYLE) -> ELT e -> ELT e
+  style f elt = elt `add` f (make STYLE)
+class AdmitChildSUB e where
+  sub :: (ELT SUB -> ELT SUB) -> ELT e -> ELT e
+  sub f elt = elt `add` f (make SUB)
+class AdmitChildSUP e where
+  sup :: (ELT SUP -> ELT SUP) -> ELT e -> ELT e
+  sup f elt = elt `add` f (make SUP)
+class AdmitChildTABLE e where
+  table :: (ELT TABLE -> ELT TABLE) -> ELT e -> ELT e
+  table f elt = elt `add` f (make TABLE)
+class AdmitChildTBODY e where
+  tbody :: (ELT TBODY -> ELT TBODY) -> ELT e -> ELT e
+  tbody f elt = elt `add` f (make TBODY)
+class AdmitChildTD e where
+  td :: (ELT TD -> ELT TD) -> ELT e -> ELT e
+  td f elt = elt `add` f (make TD)
+class AdmitChildTEXTAREA e where
+  textarea :: (ELT TEXTAREA -> ELT TEXTAREA) -> ELT e -> ELT e
+  textarea f elt = elt `add` f (make TEXTAREA)
+class AdmitChildTFOOT e where
+  tfoot :: (ELT TFOOT -> ELT TFOOT) -> ELT e -> ELT e
+  tfoot f elt = elt `add` f (make TFOOT)
+class AdmitChildTH e where
+  th :: (ELT TH -> ELT TH) -> ELT e -> ELT e
+  th f elt = elt `add` f (make TH)
+class AdmitChildTHEAD e where
+  thead :: (ELT THEAD -> ELT THEAD) -> ELT e -> ELT e
+  thead f elt = elt `add` f (make THEAD)
+class AdmitChildTITLE e where
+  title :: (ELT TITLE -> ELT TITLE) -> ELT e -> ELT e
+  title f elt = elt `add` f (make TITLE)
+class AdmitChildTR e where
+  tr :: (ELT TR -> ELT TR) -> ELT e -> ELT e
+  tr f elt = elt `add` f (make TR)
+class AdmitChildTT e where
+  tt :: (ELT TT -> ELT TT) -> ELT e -> ELT e
+  tt f elt = elt `add` f (make TT)
+class AdmitChildU e where
+  u :: (ELT U -> ELT U) -> ELT e -> ELT e
+  u f elt = elt `add` f (make U)
+class AdmitChildUL e where
+  ul :: (ELT UL -> ELT UL) -> ELT e -> ELT e
+  ul f elt = elt `add` f (make UL)
+class AdmitChildVAR e where
+  var :: (ELT VAR -> ELT VAR) -> ELT e -> ELT e
+  var f elt = elt `add` f (make VAR)
+data A = A
+instance Show A where show A = "A"
+data ABBR = ABBR
+instance Show ABBR where show ABBR = "ABBR"
+data ACRONYM = ACRONYM
+instance Show ACRONYM where show ACRONYM = "ACRONYM"
+data ADDRESS = ADDRESS
+instance Show ADDRESS where show ADDRESS = "ADDRESS"
+data APPLET = APPLET
+instance Show APPLET where show APPLET = "APPLET"
+data AREA = AREA
+instance Show AREA where show AREA = "AREA"
+data B = B
+instance Show B where show B = "B"
+data BASE = BASE
+instance Show BASE where show BASE = "BASE"
+data BASEFONT = BASEFONT
+instance Show BASEFONT where show BASEFONT = "BASEFONT"
+data BDO = BDO
+instance Show BDO where show BDO = "BDO"
+data BIG = BIG
+instance Show BIG where show BIG = "BIG"
+data BLOCKQUOTE = BLOCKQUOTE
+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"
+data BODY = BODY
+instance Show BODY where show BODY = "BODY"
+data BR = BR
+instance Show BR where show BR = "BR"
+data BUTTON = BUTTON
+instance Show BUTTON where show BUTTON = "BUTTON"
+data CAPTION = CAPTION
+instance Show CAPTION where show CAPTION = "CAPTION"
+data CENTER = CENTER
+instance Show CENTER where show CENTER = "CENTER"
+data CITE = CITE
+instance Show CITE where show CITE = "CITE"
+data CODE = CODE
+instance Show CODE where show CODE = "CODE"
+data COL = COL
+instance Show COL where show COL = "COL"
+data COLGROUP = COLGROUP
+instance Show COLGROUP where show COLGROUP = "COLGROUP"
+data DD = DD
+instance Show DD where show DD = "DD"
+data DEL = DEL
+instance Show DEL where show DEL = "DEL"
+data DFN = DFN
+instance Show DFN where show DFN = "DFN"
+data DIR = DIR
+instance Show DIR where show DIR = "DIR"
+data DIV = DIV
+instance Show DIV where show DIV = "DIV"
+data DL = DL
+instance Show DL where show DL = "DL"
+data DT = DT
+instance Show DT where show DT = "DT"
+data EM = EM
+instance Show EM where show EM = "EM"
+data FIELDSET = FIELDSET
+instance Show FIELDSET where show FIELDSET = "FIELDSET"
+data FONT = FONT
+instance Show FONT where show FONT = "FONT"
+data FORM = FORM
+instance Show FORM where show FORM = "FORM"
+data H1 = H1
+instance Show H1 where show H1 = "H1"
+data H2 = H2
+instance Show H2 where show H2 = "H2"
+data H3 = H3
+instance Show H3 where show H3 = "H3"
+data H4 = H4
+instance Show H4 where show H4 = "H4"
+data H5 = H5
+instance Show H5 where show H5 = "H5"
+data H6 = H6
+instance Show H6 where show H6 = "H6"
+data HEAD = HEAD
+instance Show HEAD where show HEAD = "HEAD"
+data HR = HR
+instance Show HR where show HR = "HR"
+data HTML = HTML
+instance Show HTML where show HTML = "HTML"
+data I = I
+instance Show I where show I = "I"
+data IFRAME = IFRAME
+instance Show IFRAME where show IFRAME = "IFRAME"
+data IMG = IMG
+instance Show IMG where show IMG = "IMG"
+data INPUT = INPUT
+instance Show INPUT where show INPUT = "INPUT"
+data INS = INS
+instance Show INS where show INS = "INS"
+data ISINDEX = ISINDEX
+instance Show ISINDEX where show ISINDEX = "ISINDEX"
+data KBD = KBD
+instance Show KBD where show KBD = "KBD"
+data LABEL = LABEL
+instance Show LABEL where show LABEL = "LABEL"
+data LEGEND = LEGEND
+instance Show LEGEND where show LEGEND = "LEGEND"
+data LI = LI
+instance Show LI where show LI = "LI"
+data LINK = LINK
+instance Show LINK where show LINK = "LINK"
+data MAP = MAP
+instance Show MAP where show MAP = "MAP"
+data MENU = MENU
+instance Show MENU where show MENU = "MENU"
+data META = META
+instance Show META where show META = "META"
+data NOFRAMES = NOFRAMES
+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"
+data NOSCRIPT = NOSCRIPT
+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"
+data OBJECT = OBJECT
+instance Show OBJECT where show OBJECT = "OBJECT"
+data OL = OL
+instance Show OL where show OL = "OL"
+data OPTGROUP = OPTGROUP
+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"
+data OPTION = OPTION
+instance Show OPTION where show OPTION = "OPTION"
+data P = P
+instance Show P where show P = "P"
+data PARAM = PARAM
+instance Show PARAM where show PARAM = "PARAM"
+data PRE = PRE
+instance Show PRE where show PRE = "PRE"
+data Q = Q
+instance Show Q where show Q = "Q"
+data S = S
+instance Show S where show S = "S"
+data SAMP = SAMP
+instance Show SAMP where show SAMP = "SAMP"
+data SCRIPT = SCRIPT
+instance Show SCRIPT where show SCRIPT = "SCRIPT"
+data SELECT = SELECT
+instance Show SELECT where show SELECT = "SELECT"
+data SMALL = SMALL
+instance Show SMALL where show SMALL = "SMALL"
+data SPAN = SPAN
+instance Show SPAN where show SPAN = "SPAN"
+data STRIKE = STRIKE
+instance Show STRIKE where show STRIKE = "STRIKE"
+data STRONG = STRONG
+instance Show STRONG where show STRONG = "STRONG"
+data STYLE = STYLE
+instance Show STYLE where show STYLE = "STYLE"
+data SUB = SUB
+instance Show SUB where show SUB = "SUB"
+data SUP = SUP
+instance Show SUP where show SUP = "SUP"
+data TABLE = TABLE
+instance Show TABLE where show TABLE = "TABLE"
+data TBODY = TBODY
+instance Show TBODY where show TBODY = "TBODY"
+data TD = TD
+instance Show TD where show TD = "TD"
+data TEXTAREA = TEXTAREA
+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"
+data TFOOT = TFOOT
+instance Show TFOOT where show TFOOT = "TFOOT"
+data TH = TH
+instance Show TH where show TH = "TH"
+data THEAD = THEAD
+instance Show THEAD where show THEAD = "THEAD"
+data TITLE = TITLE
+instance Show TITLE where show TITLE = "TITLE"
+data TR = TR
+instance Show TR where show TR = "TR"
+data TT = TT
+instance Show TT where show TT = "TT"
+data U = U
+instance Show U where show U = "U"
+data UL = UL
+instance Show UL where show UL = "UL"
+data VAR = VAR
+instance Show VAR where show VAR = "VAR"
+data VERSION = VERSION
+instance Show VERSION where show VERSION = "VERSION"
+data LANG = LANG
+instance Show LANG where show LANG = "LANG"
+data ONKEYUP = ONKEYUP
+instance Show ONKEYUP where show ONKEYUP = "ONKEYUP"
+data ONKEYDOWN = ONKEYDOWN
+instance Show ONKEYDOWN where show ONKEYDOWN = "ONKEYDOWN"
+data ONKEYPRESS = ONKEYPRESS
+instance Show ONKEYPRESS where show ONKEYPRESS = "ONKEYPRESS"
+data ONMOUSEOUT = ONMOUSEOUT
+instance Show ONMOUSEOUT where show ONMOUSEOUT = "ONMOUSEOUT"
+data ONMOUSEMOVE = ONMOUSEMOVE
+instance Show ONMOUSEMOVE where show ONMOUSEMOVE = "ONMOUSEMOVE"
+data ONMOUSEOVER = ONMOUSEOVER
+instance Show ONMOUSEOVER where show ONMOUSEOVER = "ONMOUSEOVER"
+data ONMOUSEUP = ONMOUSEUP
+instance Show ONMOUSEUP where show ONMOUSEUP = "ONMOUSEUP"
+data ONMOUSEDOWN = ONMOUSEDOWN
+instance Show ONMOUSEDOWN where show ONMOUSEDOWN = "ONMOUSEDOWN"
+data ONDBLCLICK = ONDBLCLICK
+instance Show ONDBLCLICK where show ONDBLCLICK = "ONDBLCLICK"
+data ONCLICK = ONCLICK
+instance Show ONCLICK where show ONCLICK = "ONCLICK"
+data CLASS = CLASS
+instance Show CLASS where show CLASS = "CLASS"
+data ID = ID
+instance Show ID where show ID = "ID"
+data FOR = FOR
+instance Show FOR where show FOR = "FOR"
+data EVENT = EVENT
+instance Show EVENT where show EVENT = "EVENT"
+data DEFER = DEFER
+instance Show DEFER where show DEFER = "DEFER"
+data SRC = SRC
+instance Show SRC where show SRC = "SRC"
+data LANGUAGE = LANGUAGE
+instance Show LANGUAGE where show LANGUAGE = "LANGUAGE"
+data TYPE = TYPE
+instance Show TYPE where show TYPE = "TYPE"
+data CHARSET = CHARSET
+instance Show CHARSET where show CHARSET = "CHARSET"
+data MEDIA = MEDIA
+instance Show MEDIA where show MEDIA = "MEDIA"
+data SCHEME = SCHEME
+instance Show SCHEME where show SCHEME = "SCHEME"
+data CONTENT = CONTENT
+instance Show CONTENT where show CONTENT = "CONTENT"
+data NAME = NAME
+instance Show NAME where show NAME = "NAME"
+data HTTP_EQUIV = HTTP_EQUIV
+instance Show HTTP_EQUIV where show HTTP_EQUIV = "HTTP_EQUIV"
+data TARGET = TARGET
+instance Show TARGET where show TARGET = "TARGET"
+data HREF = HREF
+instance Show HREF where show HREF = "HREF"
+data PROMPT = PROMPT
+instance Show PROMPT where show PROMPT = "PROMPT"
+data PROFILE = PROFILE
+instance Show PROFILE where show PROFILE = "PROFILE"
+data WIDTH = WIDTH
+instance Show WIDTH where show WIDTH = "WIDTH"
+data HEIGHT = HEIGHT
+instance Show HEIGHT where show HEIGHT = "HEIGHT"
+data ALIGN = ALIGN
+instance Show ALIGN where show ALIGN = "ALIGN"
+data SCROLLING = SCROLLING
+instance Show SCROLLING where show SCROLLING = "SCROLLING"
+data MARGINHEIGHT = MARGINHEIGHT
+instance Show MARGINHEIGHT where show MARGINHEIGHT = "MARGINHEIGHT"
+data MARGINWIDTH = MARGINWIDTH
+instance Show MARGINWIDTH where show MARGINWIDTH = "MARGINWIDTH"
+data FRAMEBORDER = FRAMEBORDER
+instance Show FRAMEBORDER where show FRAMEBORDER = "FRAMEBORDER"
+data LONGDESC = LONGDESC
+instance Show LONGDESC where show LONGDESC = "LONGDESC"
+data BGCOLOR = BGCOLOR
+instance Show BGCOLOR where show BGCOLOR = "BGCOLOR"
+data NOWRAP = NOWRAP
+instance Show NOWRAP where show NOWRAP = "NOWRAP"
+data VALIGN = VALIGN
+instance Show VALIGN where show VALIGN = "VALIGN"
+data CHAROFF = CHAROFF
+instance Show CHAROFF where show CHAROFF = "CHAROFF"
+data CHAR = CHAR
+instance Show CHAR where show CHAR = "CHAR"
+data COLSPAN = COLSPAN
+instance Show COLSPAN where show COLSPAN = "COLSPAN"
+data ROWSPAN = ROWSPAN
+instance Show ROWSPAN where show ROWSPAN = "ROWSPAN"
+data SCOPE = SCOPE
+instance Show SCOPE where show SCOPE = "SCOPE"
+data HEADERS = HEADERS
+instance Show HEADERS where show HEADERS = "HEADERS"
+data AXIS = AXIS
+instance Show AXIS where show AXIS = "AXIS"
+data DATAPAGESIZE = DATAPAGESIZE
+instance Show DATAPAGESIZE where show DATAPAGESIZE = "DATAPAGESIZE"
+data CELLPADDING = CELLPADDING
+instance Show CELLPADDING where show CELLPADDING = "CELLPADDING"
+data CELLSPACING = CELLSPACING
+instance Show CELLSPACING where show CELLSPACING = "CELLSPACING"
+data RULES = RULES
+instance Show RULES where show RULES = "RULES"
+data FRAME = FRAME
+instance Show FRAME where show FRAME = "FRAME"
+data BORDER = BORDER
+instance Show BORDER where show BORDER = "BORDER"
+data SUMMARY = SUMMARY
+instance Show SUMMARY where show SUMMARY = "SUMMARY"
+data ONBLUR = ONBLUR
+instance Show ONBLUR where show ONBLUR = "ONBLUR"
+data ONFOCUS = ONFOCUS
+instance Show ONFOCUS where show ONFOCUS = "ONFOCUS"
+data ACCESSKEY = ACCESSKEY
+instance Show ACCESSKEY where show ACCESSKEY = "ACCESSKEY"
+data TABINDEX = TABINDEX
+instance Show TABINDEX where show TABINDEX = "TABINDEX"
+data DISABLED = DISABLED
+instance Show DISABLED where show DISABLED = "DISABLED"
+data VALUE = VALUE
+instance Show VALUE where show VALUE = "VALUE"
+data ONCHANGE = ONCHANGE
+instance Show ONCHANGE where show ONCHANGE = "ONCHANGE"
+data ONSELECT = ONSELECT
+instance Show ONSELECT where show ONSELECT = "ONSELECT"
+data READONLY = READONLY
+instance Show READONLY where show READONLY = "READONLY"
+data COLS = COLS
+instance Show COLS where show COLS = "COLS"
+data ROWS = ROWS
+instance Show ROWS where show ROWS = "ROWS"
+data SELECTED = SELECTED
+instance Show SELECTED where show SELECTED = "SELECTED"
+data MULTIPLE = MULTIPLE
+instance Show MULTIPLE where show MULTIPLE = "MULTIPLE"
+data SIZE = SIZE
+instance Show SIZE where show SIZE = "SIZE"
+data ACCEPT = ACCEPT
+instance Show ACCEPT where show ACCEPT = "ACCEPT"
+data USEMAP = USEMAP
+instance Show USEMAP where show USEMAP = "USEMAP"
+data ALT = ALT
+instance Show ALT where show ALT = "ALT"
+data MAXLENGTH = MAXLENGTH
+instance Show MAXLENGTH where show MAXLENGTH = "MAXLENGTH"
+data CHECKED = CHECKED
+instance Show CHECKED where show CHECKED = "CHECKED"
+data ACCEPT_CHARSET = ACCEPT_CHARSET
+instance Show ACCEPT_CHARSET where show ACCEPT_CHARSET = "ACCEPT_CHARSET"
+data ONRESET = ONRESET
+instance Show ONRESET where show ONRESET = "ONRESET"
+data ONSUBMIT = ONSUBMIT
+instance Show ONSUBMIT where show ONSUBMIT = "ONSUBMIT"
+data ENCTYPE = ENCTYPE
+instance Show ENCTYPE where show ENCTYPE = "ENCTYPE"
+data METHOD = METHOD
+instance Show METHOD where show METHOD = "METHOD"
+data ACTION = ACTION
+instance Show ACTION where show ACTION = "ACTION"
+data COMPACT = COMPACT
+instance Show COMPACT where show COMPACT = "COMPACT"
+data START = START
+instance Show START where show START = "START"
+data DATETIME = DATETIME
+instance Show DATETIME where show DATETIME = "DATETIME"
+data NOSHADE = NOSHADE
+instance Show NOSHADE where show NOSHADE = "NOSHADE"
+data VSPACE = VSPACE
+instance Show VSPACE where show VSPACE = "VSPACE"
+data HSPACE = HSPACE
+instance Show HSPACE where show HSPACE = "HSPACE"
+data ARCHIVE = ARCHIVE
+instance Show ARCHIVE where show ARCHIVE = "ARCHIVE"
+data CODEBASE = CODEBASE
+instance Show CODEBASE where show CODEBASE = "CODEBASE"
+data VALUETYPE = VALUETYPE
+instance Show VALUETYPE where show VALUETYPE = "VALUETYPE"
+data STANDBY = STANDBY
+instance Show STANDBY where show STANDBY = "STANDBY"
+data CODETYPE = CODETYPE
+instance Show CODETYPE where show CODETYPE = "CODETYPE"
+data DATA = DATA
+instance Show DATA where show DATA = "DATA"
+data CLASSID = CLASSID
+instance Show CLASSID where show CLASSID = "CLASSID"
+data DECLARE = DECLARE
+instance Show DECLARE where show DECLARE = "DECLARE"
+data ISMAP = ISMAP
+instance Show ISMAP where show ISMAP = "ISMAP"
+data REV = REV
+instance Show REV where show REV = "REV"
+data REL = REL
+instance Show REL where show REL = "REL"
+data HREFLANG = HREFLANG
+instance Show HREFLANG where show HREFLANG = "HREFLANG"
+data NOHREF = NOHREF
+instance Show NOHREF where show NOHREF = "NOHREF"
+data COORDS = COORDS
+instance Show COORDS where show COORDS = "COORDS"
+data SHAPE = SHAPE
+instance Show SHAPE where show SHAPE = "SHAPE"
+data ALINK = ALINK
+instance Show ALINK where show ALINK = "ALINK"
+data VLINK = VLINK
+instance Show VLINK where show VLINK = "VLINK"
+data TEXT = TEXT
+instance Show TEXT where show TEXT = "TEXT"
+data BACKGROUND = BACKGROUND
+instance Show BACKGROUND where show BACKGROUND = "BACKGROUND"
+data ONUNLOAD = ONUNLOAD
+instance Show ONUNLOAD where show ONUNLOAD = "ONUNLOAD"
+data ONLOAD = ONLOAD
+instance Show ONLOAD where show ONLOAD = "ONLOAD"
+data CLEAR = CLEAR
+instance Show CLEAR where show CLEAR = "CLEAR"
+data FACE = FACE
+instance Show FACE where show FACE = "FACE"
+data COLOR = COLOR
+instance Show COLOR where show COLOR = "COLOR"
+instance TAG HTML
+instance AdmitChildHEAD HTML
+instance AdmitChildBODY HTML
+instance TAG NOSCRIPT
+instance AdmitChildP NOSCRIPT
+instance AdmitChildH1 NOSCRIPT
+instance AdmitChildH2 NOSCRIPT
+instance AdmitChildH3 NOSCRIPT
+instance AdmitChildH4 NOSCRIPT
+instance AdmitChildH5 NOSCRIPT
+instance AdmitChildH6 NOSCRIPT
+instance AdmitChildUL NOSCRIPT
+instance AdmitChildOL NOSCRIPT
+instance AdmitChildDIR NOSCRIPT
+instance AdmitChildMENU NOSCRIPT
+instance AdmitChildPRE NOSCRIPT
+instance AdmitChildDL NOSCRIPT
+instance AdmitChildDIV NOSCRIPT
+instance AdmitChildCENTER NOSCRIPT
+instance AdmitChildNOSCRIPT NOSCRIPT
+instance AdmitChildNOFRAMES NOSCRIPT
+instance AdmitChildBLOCKQUOTE NOSCRIPT
+instance AdmitChildFORM NOSCRIPT
+instance AdmitChildISINDEX NOSCRIPT
+instance AdmitChildHR NOSCRIPT
+instance AdmitChildTABLE NOSCRIPT
+instance AdmitChildFIELDSET NOSCRIPT
+instance AdmitChildADDRESS NOSCRIPT
+instance AdmitChildCDATA NOSCRIPT
+instance AdmitChildTT NOSCRIPT
+instance AdmitChildI NOSCRIPT
+instance AdmitChildB NOSCRIPT
+instance AdmitChildU NOSCRIPT
+instance AdmitChildS NOSCRIPT
+instance AdmitChildSTRIKE NOSCRIPT
+instance AdmitChildBIG NOSCRIPT
+instance AdmitChildSMALL NOSCRIPT
+instance AdmitChildEM NOSCRIPT
+instance AdmitChildSTRONG NOSCRIPT
+instance AdmitChildDFN NOSCRIPT
+instance AdmitChildCODE NOSCRIPT
+instance AdmitChildSAMP NOSCRIPT
+instance AdmitChildKBD NOSCRIPT
+instance AdmitChildVAR NOSCRIPT
+instance AdmitChildCITE NOSCRIPT
+instance AdmitChildABBR NOSCRIPT
+instance AdmitChildACRONYM NOSCRIPT
+instance AdmitChildA NOSCRIPT
+instance AdmitChildIMG NOSCRIPT
+instance AdmitChildAPPLET NOSCRIPT
+instance AdmitChildOBJECT NOSCRIPT
+instance AdmitChildFONT NOSCRIPT
+instance AdmitChildBASEFONT NOSCRIPT
+instance AdmitChildBR NOSCRIPT
+instance AdmitChildSCRIPT NOSCRIPT
+instance AdmitChildMAP NOSCRIPT
+instance AdmitChildQ NOSCRIPT
+instance AdmitChildSUB NOSCRIPT
+instance AdmitChildSUP NOSCRIPT
+instance AdmitChildSPAN NOSCRIPT
+instance AdmitChildBDO NOSCRIPT
+instance AdmitChildIFRAME NOSCRIPT
+instance AdmitChildINPUT NOSCRIPT
+instance AdmitChildSELECT NOSCRIPT
+instance AdmitChildTEXTAREA NOSCRIPT
+instance AdmitChildLABEL NOSCRIPT
+instance AdmitChildBUTTON NOSCRIPT
+instance TAG SCRIPT
+instance AdmitChildCDATA SCRIPT
+instance TAG STYLE
+instance AdmitChildCDATA STYLE
+instance TAG META where make = make_empty
+instance TAG BASE where make = make_empty
+instance TAG ISINDEX where make = make_empty
+instance TAG TITLE
+instance AdmitChildCDATA TITLE
+instance TAG HEAD
+instance AdmitChildTITLE HEAD
+instance AdmitChildISINDEX HEAD
+instance AdmitChildBASE HEAD
+instance AdmitChildSCRIPT HEAD
+instance AdmitChildSTYLE HEAD
+instance AdmitChildMETA HEAD
+instance AdmitChildLINK HEAD
+instance AdmitChildOBJECT HEAD
+instance TAG NOFRAMES
+instance AdmitChildP NOFRAMES
+instance AdmitChildH1 NOFRAMES
+instance AdmitChildH2 NOFRAMES
+instance AdmitChildH3 NOFRAMES
+instance AdmitChildH4 NOFRAMES
+instance AdmitChildH5 NOFRAMES
+instance AdmitChildH6 NOFRAMES
+instance AdmitChildUL NOFRAMES
+instance AdmitChildOL NOFRAMES
+instance AdmitChildDIR NOFRAMES
+instance AdmitChildMENU NOFRAMES
+instance AdmitChildPRE NOFRAMES
+instance AdmitChildDL NOFRAMES
+instance AdmitChildDIV NOFRAMES
+instance AdmitChildCENTER NOFRAMES
+instance AdmitChildNOSCRIPT NOFRAMES
+instance AdmitChildNOFRAMES NOFRAMES
+instance AdmitChildBLOCKQUOTE NOFRAMES
+instance AdmitChildFORM NOFRAMES
+instance AdmitChildISINDEX NOFRAMES
+instance AdmitChildHR NOFRAMES
+instance AdmitChildTABLE NOFRAMES
+instance AdmitChildFIELDSET NOFRAMES
+instance AdmitChildADDRESS NOFRAMES
+instance AdmitChildCDATA NOFRAMES
+instance AdmitChildTT NOFRAMES
+instance AdmitChildI NOFRAMES
+instance AdmitChildB NOFRAMES
+instance AdmitChildU NOFRAMES
+instance AdmitChildS NOFRAMES
+instance AdmitChildSTRIKE NOFRAMES
+instance AdmitChildBIG NOFRAMES
+instance AdmitChildSMALL NOFRAMES
+instance AdmitChildEM NOFRAMES
+instance AdmitChildSTRONG NOFRAMES
+instance AdmitChildDFN NOFRAMES
+instance AdmitChildCODE NOFRAMES
+instance AdmitChildSAMP NOFRAMES
+instance AdmitChildKBD NOFRAMES
+instance AdmitChildVAR NOFRAMES
+instance AdmitChildCITE NOFRAMES
+instance AdmitChildABBR NOFRAMES
+instance AdmitChildACRONYM NOFRAMES
+instance AdmitChildA NOFRAMES
+instance AdmitChildIMG NOFRAMES
+instance AdmitChildAPPLET NOFRAMES
+instance AdmitChildOBJECT NOFRAMES
+instance AdmitChildFONT NOFRAMES
+instance AdmitChildBASEFONT NOFRAMES
+instance AdmitChildBR NOFRAMES
+instance AdmitChildSCRIPT NOFRAMES
+instance AdmitChildMAP NOFRAMES
+instance AdmitChildQ NOFRAMES
+instance AdmitChildSUB NOFRAMES
+instance AdmitChildSUP NOFRAMES
+instance AdmitChildSPAN NOFRAMES
+instance AdmitChildBDO NOFRAMES
+instance AdmitChildIFRAME NOFRAMES
+instance AdmitChildINPUT NOFRAMES
+instance AdmitChildSELECT NOFRAMES
+instance AdmitChildTEXTAREA NOFRAMES
+instance AdmitChildLABEL NOFRAMES
+instance AdmitChildBUTTON NOFRAMES
+instance TAG IFRAME
+instance AdmitChildP IFRAME
+instance AdmitChildH1 IFRAME
+instance AdmitChildH2 IFRAME
+instance AdmitChildH3 IFRAME
+instance AdmitChildH4 IFRAME
+instance AdmitChildH5 IFRAME
+instance AdmitChildH6 IFRAME
+instance AdmitChildUL IFRAME
+instance AdmitChildOL IFRAME
+instance AdmitChildDIR IFRAME
+instance AdmitChildMENU IFRAME
+instance AdmitChildPRE IFRAME
+instance AdmitChildDL IFRAME
+instance AdmitChildDIV IFRAME
+instance AdmitChildCENTER IFRAME
+instance AdmitChildNOSCRIPT IFRAME
+instance AdmitChildNOFRAMES IFRAME
+instance AdmitChildBLOCKQUOTE IFRAME
+instance AdmitChildFORM IFRAME
+instance AdmitChildISINDEX IFRAME
+instance AdmitChildHR IFRAME
+instance AdmitChildTABLE IFRAME
+instance AdmitChildFIELDSET IFRAME
+instance AdmitChildADDRESS IFRAME
+instance AdmitChildCDATA IFRAME
+instance AdmitChildTT IFRAME
+instance AdmitChildI IFRAME
+instance AdmitChildB IFRAME
+instance AdmitChildU IFRAME
+instance AdmitChildS IFRAME
+instance AdmitChildSTRIKE IFRAME
+instance AdmitChildBIG IFRAME
+instance AdmitChildSMALL IFRAME
+instance AdmitChildEM IFRAME
+instance AdmitChildSTRONG IFRAME
+instance AdmitChildDFN IFRAME
+instance AdmitChildCODE IFRAME
+instance AdmitChildSAMP IFRAME
+instance AdmitChildKBD IFRAME
+instance AdmitChildVAR IFRAME
+instance AdmitChildCITE IFRAME
+instance AdmitChildABBR IFRAME
+instance AdmitChildACRONYM IFRAME
+instance AdmitChildA IFRAME
+instance AdmitChildIMG IFRAME
+instance AdmitChildAPPLET IFRAME
+instance AdmitChildOBJECT IFRAME
+instance AdmitChildFONT IFRAME
+instance AdmitChildBASEFONT IFRAME
+instance AdmitChildBR IFRAME
+instance AdmitChildSCRIPT IFRAME
+instance AdmitChildMAP IFRAME
+instance AdmitChildQ IFRAME
+instance AdmitChildSUB IFRAME
+instance AdmitChildSUP IFRAME
+instance AdmitChildSPAN IFRAME
+instance AdmitChildBDO IFRAME
+instance AdmitChildIFRAME IFRAME
+instance AdmitChildINPUT IFRAME
+instance AdmitChildSELECT IFRAME
+instance AdmitChildTEXTAREA IFRAME
+instance AdmitChildLABEL IFRAME
+instance AdmitChildBUTTON IFRAME
+instance TAG TH
+instance AdmitChildP TH
+instance AdmitChildH1 TH
+instance AdmitChildH2 TH
+instance AdmitChildH3 TH
+instance AdmitChildH4 TH
+instance AdmitChildH5 TH
+instance AdmitChildH6 TH
+instance AdmitChildUL TH
+instance AdmitChildOL TH
+instance AdmitChildDIR TH
+instance AdmitChildMENU TH
+instance AdmitChildPRE TH
+instance AdmitChildDL TH
+instance AdmitChildDIV TH
+instance AdmitChildCENTER TH
+instance AdmitChildNOSCRIPT TH
+instance AdmitChildNOFRAMES TH
+instance AdmitChildBLOCKQUOTE TH
+instance AdmitChildFORM TH
+instance AdmitChildISINDEX TH
+instance AdmitChildHR TH
+instance AdmitChildTABLE TH
+instance AdmitChildFIELDSET TH
+instance AdmitChildADDRESS TH
+instance AdmitChildCDATA TH
+instance AdmitChildTT TH
+instance AdmitChildI TH
+instance AdmitChildB TH
+instance AdmitChildU TH
+instance AdmitChildS TH
+instance AdmitChildSTRIKE TH
+instance AdmitChildBIG TH
+instance AdmitChildSMALL TH
+instance AdmitChildEM TH
+instance AdmitChildSTRONG TH
+instance AdmitChildDFN TH
+instance AdmitChildCODE TH
+instance AdmitChildSAMP TH
+instance AdmitChildKBD TH
+instance AdmitChildVAR TH
+instance AdmitChildCITE TH
+instance AdmitChildABBR TH
+instance AdmitChildACRONYM TH
+instance AdmitChildA TH
+instance AdmitChildIMG TH
+instance AdmitChildAPPLET TH
+instance AdmitChildOBJECT TH
+instance AdmitChildFONT TH
+instance AdmitChildBASEFONT TH
+instance AdmitChildBR TH
+instance AdmitChildSCRIPT TH
+instance AdmitChildMAP TH
+instance AdmitChildQ TH
+instance AdmitChildSUB TH
+instance AdmitChildSUP TH
+instance AdmitChildSPAN TH
+instance AdmitChildBDO TH
+instance AdmitChildIFRAME TH
+instance AdmitChildINPUT TH
+instance AdmitChildSELECT TH
+instance AdmitChildTEXTAREA TH
+instance AdmitChildLABEL TH
+instance AdmitChildBUTTON TH
+instance TAG TD
+instance AdmitChildP TD
+instance AdmitChildH1 TD
+instance AdmitChildH2 TD
+instance AdmitChildH3 TD
+instance AdmitChildH4 TD
+instance AdmitChildH5 TD
+instance AdmitChildH6 TD
+instance AdmitChildUL TD
+instance AdmitChildOL TD
+instance AdmitChildDIR TD
+instance AdmitChildMENU TD
+instance AdmitChildPRE TD
+instance AdmitChildDL TD
+instance AdmitChildDIV TD
+instance AdmitChildCENTER TD
+instance AdmitChildNOSCRIPT TD
+instance AdmitChildNOFRAMES TD
+instance AdmitChildBLOCKQUOTE TD
+instance AdmitChildFORM TD
+instance AdmitChildISINDEX TD
+instance AdmitChildHR TD
+instance AdmitChildTABLE TD
+instance AdmitChildFIELDSET TD
+instance AdmitChildADDRESS TD
+instance AdmitChildCDATA TD
+instance AdmitChildTT TD
+instance AdmitChildI TD
+instance AdmitChildB TD
+instance AdmitChildU TD
+instance AdmitChildS TD
+instance AdmitChildSTRIKE TD
+instance AdmitChildBIG TD
+instance AdmitChildSMALL TD
+instance AdmitChildEM TD
+instance AdmitChildSTRONG TD
+instance AdmitChildDFN TD
+instance AdmitChildCODE TD
+instance AdmitChildSAMP TD
+instance AdmitChildKBD TD
+instance AdmitChildVAR TD
+instance AdmitChildCITE TD
+instance AdmitChildABBR TD
+instance AdmitChildACRONYM TD
+instance AdmitChildA TD
+instance AdmitChildIMG TD
+instance AdmitChildAPPLET TD
+instance AdmitChildOBJECT TD
+instance AdmitChildFONT TD
+instance AdmitChildBASEFONT TD
+instance AdmitChildBR TD
+instance AdmitChildSCRIPT TD
+instance AdmitChildMAP TD
+instance AdmitChildQ TD
+instance AdmitChildSUB TD
+instance AdmitChildSUP TD
+instance AdmitChildSPAN TD
+instance AdmitChildBDO TD
+instance AdmitChildIFRAME TD
+instance AdmitChildINPUT TD
+instance AdmitChildSELECT TD
+instance AdmitChildTEXTAREA TD
+instance AdmitChildLABEL TD
+instance AdmitChildBUTTON TD
+instance TAG TR
+instance AdmitChildTH TR
+instance AdmitChildTD TR
+instance TAG COL where make = make_empty
+instance TAG COLGROUP
+instance AdmitChildCOL COLGROUP
+instance TAG TBODY
+instance AdmitChildTR TBODY
+instance TAG TFOOT
+instance AdmitChildTR TFOOT
+instance TAG THEAD
+instance AdmitChildTR THEAD
+instance TAG CAPTION
+instance AdmitChildCDATA CAPTION
+instance AdmitChildTT CAPTION
+instance AdmitChildI CAPTION
+instance AdmitChildB CAPTION
+instance AdmitChildU CAPTION
+instance AdmitChildS CAPTION
+instance AdmitChildSTRIKE CAPTION
+instance AdmitChildBIG CAPTION
+instance AdmitChildSMALL CAPTION
+instance AdmitChildEM CAPTION
+instance AdmitChildSTRONG CAPTION
+instance AdmitChildDFN CAPTION
+instance AdmitChildCODE CAPTION
+instance AdmitChildSAMP CAPTION
+instance AdmitChildKBD CAPTION
+instance AdmitChildVAR CAPTION
+instance AdmitChildCITE CAPTION
+instance AdmitChildABBR CAPTION
+instance AdmitChildACRONYM CAPTION
+instance AdmitChildA CAPTION
+instance AdmitChildIMG CAPTION
+instance AdmitChildAPPLET CAPTION
+instance AdmitChildOBJECT CAPTION
+instance AdmitChildFONT CAPTION
+instance AdmitChildBASEFONT CAPTION
+instance AdmitChildBR CAPTION
+instance AdmitChildSCRIPT CAPTION
+instance AdmitChildMAP CAPTION
+instance AdmitChildQ CAPTION
+instance AdmitChildSUB CAPTION
+instance AdmitChildSUP CAPTION
+instance AdmitChildSPAN CAPTION
+instance AdmitChildBDO CAPTION
+instance AdmitChildIFRAME CAPTION
+instance AdmitChildINPUT CAPTION
+instance AdmitChildSELECT CAPTION
+instance AdmitChildTEXTAREA CAPTION
+instance AdmitChildLABEL CAPTION
+instance AdmitChildBUTTON CAPTION
+instance TAG TABLE
+instance AdmitChildCAPTION TABLE
+instance AdmitChildCOL TABLE
+instance AdmitChildCOLGROUP TABLE
+instance AdmitChildTHEAD TABLE
+instance AdmitChildTFOOT TABLE
+instance AdmitChildTBODY TABLE
+instance TAG BUTTON
+instance AdmitChildP BUTTON
+instance AdmitChildH1 BUTTON
+instance AdmitChildH2 BUTTON
+instance AdmitChildH3 BUTTON
+instance AdmitChildH4 BUTTON
+instance AdmitChildH5 BUTTON
+instance AdmitChildH6 BUTTON
+instance AdmitChildUL BUTTON
+instance AdmitChildOL BUTTON
+instance AdmitChildDIR BUTTON
+instance AdmitChildMENU BUTTON
+instance AdmitChildPRE BUTTON
+instance AdmitChildDL BUTTON
+instance AdmitChildDIV BUTTON
+instance AdmitChildCENTER BUTTON
+instance AdmitChildNOSCRIPT BUTTON
+instance AdmitChildNOFRAMES BUTTON
+instance AdmitChildBLOCKQUOTE BUTTON
+instance AdmitChildHR BUTTON
+instance AdmitChildTABLE BUTTON
+instance AdmitChildADDRESS BUTTON
+instance AdmitChildCDATA BUTTON
+instance AdmitChildTT BUTTON
+instance AdmitChildI BUTTON
+instance AdmitChildB BUTTON
+instance AdmitChildU BUTTON
+instance AdmitChildS BUTTON
+instance AdmitChildSTRIKE BUTTON
+instance AdmitChildBIG BUTTON
+instance AdmitChildSMALL BUTTON
+instance AdmitChildEM BUTTON
+instance AdmitChildSTRONG BUTTON
+instance AdmitChildDFN BUTTON
+instance AdmitChildCODE BUTTON
+instance AdmitChildSAMP BUTTON
+instance AdmitChildKBD BUTTON
+instance AdmitChildVAR BUTTON
+instance AdmitChildCITE BUTTON
+instance AdmitChildABBR BUTTON
+instance AdmitChildACRONYM BUTTON
+instance AdmitChildIMG BUTTON
+instance AdmitChildAPPLET BUTTON
+instance AdmitChildOBJECT BUTTON
+instance AdmitChildFONT BUTTON
+instance AdmitChildBASEFONT BUTTON
+instance AdmitChildBR BUTTON
+instance AdmitChildSCRIPT BUTTON
+instance AdmitChildMAP BUTTON
+instance AdmitChildQ BUTTON
+instance AdmitChildSUB BUTTON
+instance AdmitChildSUP BUTTON
+instance AdmitChildSPAN BUTTON
+instance AdmitChildBDO BUTTON
+instance TAG LEGEND
+instance AdmitChildCDATA LEGEND
+instance AdmitChildTT LEGEND
+instance AdmitChildI LEGEND
+instance AdmitChildB LEGEND
+instance AdmitChildU LEGEND
+instance AdmitChildS LEGEND
+instance AdmitChildSTRIKE LEGEND
+instance AdmitChildBIG LEGEND
+instance AdmitChildSMALL LEGEND
+instance AdmitChildEM LEGEND
+instance AdmitChildSTRONG LEGEND
+instance AdmitChildDFN LEGEND
+instance AdmitChildCODE LEGEND
+instance AdmitChildSAMP LEGEND
+instance AdmitChildKBD LEGEND
+instance AdmitChildVAR LEGEND
+instance AdmitChildCITE LEGEND
+instance AdmitChildABBR LEGEND
+instance AdmitChildACRONYM LEGEND
+instance AdmitChildA LEGEND
+instance AdmitChildIMG LEGEND
+instance AdmitChildAPPLET LEGEND
+instance AdmitChildOBJECT LEGEND
+instance AdmitChildFONT LEGEND
+instance AdmitChildBASEFONT LEGEND
+instance AdmitChildBR LEGEND
+instance AdmitChildSCRIPT LEGEND
+instance AdmitChildMAP LEGEND
+instance AdmitChildQ LEGEND
+instance AdmitChildSUB LEGEND
+instance AdmitChildSUP LEGEND
+instance AdmitChildSPAN LEGEND
+instance AdmitChildBDO LEGEND
+instance AdmitChildIFRAME LEGEND
+instance AdmitChildINPUT LEGEND
+instance AdmitChildSELECT LEGEND
+instance AdmitChildTEXTAREA LEGEND
+instance AdmitChildLABEL LEGEND
+instance AdmitChildBUTTON LEGEND
+instance TAG FIELDSET
+instance AdmitChildCDATA FIELDSET
+instance AdmitChildLEGEND FIELDSET
+instance AdmitChildP FIELDSET
+instance AdmitChildH1 FIELDSET
+instance AdmitChildH2 FIELDSET
+instance AdmitChildH3 FIELDSET
+instance AdmitChildH4 FIELDSET
+instance AdmitChildH5 FIELDSET
+instance AdmitChildH6 FIELDSET
+instance AdmitChildUL FIELDSET
+instance AdmitChildOL FIELDSET
+instance AdmitChildDIR FIELDSET
+instance AdmitChildMENU FIELDSET
+instance AdmitChildPRE FIELDSET
+instance AdmitChildDL FIELDSET
+instance AdmitChildDIV FIELDSET
+instance AdmitChildCENTER FIELDSET
+instance AdmitChildNOSCRIPT FIELDSET
+instance AdmitChildNOFRAMES FIELDSET
+instance AdmitChildBLOCKQUOTE FIELDSET
+instance AdmitChildFORM FIELDSET
+instance AdmitChildISINDEX FIELDSET
+instance AdmitChildHR FIELDSET
+instance AdmitChildTABLE FIELDSET
+instance AdmitChildFIELDSET FIELDSET
+instance AdmitChildADDRESS FIELDSET
+instance AdmitChildTT FIELDSET
+instance AdmitChildI FIELDSET
+instance AdmitChildB FIELDSET
+instance AdmitChildU FIELDSET
+instance AdmitChildS FIELDSET
+instance AdmitChildSTRIKE FIELDSET
+instance AdmitChildBIG FIELDSET
+instance AdmitChildSMALL FIELDSET
+instance AdmitChildEM FIELDSET
+instance AdmitChildSTRONG FIELDSET
+instance AdmitChildDFN FIELDSET
+instance AdmitChildCODE FIELDSET
+instance AdmitChildSAMP FIELDSET
+instance AdmitChildKBD FIELDSET
+instance AdmitChildVAR FIELDSET
+instance AdmitChildCITE FIELDSET
+instance AdmitChildABBR FIELDSET
+instance AdmitChildACRONYM FIELDSET
+instance AdmitChildA FIELDSET
+instance AdmitChildIMG FIELDSET
+instance AdmitChildAPPLET FIELDSET
+instance AdmitChildOBJECT FIELDSET
+instance AdmitChildFONT FIELDSET
+instance AdmitChildBASEFONT FIELDSET
+instance AdmitChildBR FIELDSET
+instance AdmitChildSCRIPT FIELDSET
+instance AdmitChildMAP FIELDSET
+instance AdmitChildQ FIELDSET
+instance AdmitChildSUB FIELDSET
+instance AdmitChildSUP FIELDSET
+instance AdmitChildSPAN FIELDSET
+instance AdmitChildBDO FIELDSET
+instance AdmitChildIFRAME FIELDSET
+instance AdmitChildINPUT FIELDSET
+instance AdmitChildSELECT FIELDSET
+instance AdmitChildTEXTAREA FIELDSET
+instance AdmitChildLABEL FIELDSET
+instance AdmitChildBUTTON FIELDSET
+instance TAG TEXTAREA
+instance AdmitChildCDATA TEXTAREA
+instance TAG OPTION
+instance AdmitChildCDATA OPTION
+instance TAG OPTGROUP
+instance AdmitChildOPTION OPTGROUP
+instance TAG SELECT
+instance AdmitChildOPTGROUP SELECT
+instance AdmitChildOPTION SELECT
+instance TAG INPUT where make = make_empty
+instance TAG LABEL
+instance AdmitChildCDATA LABEL
+instance AdmitChildTT LABEL
+instance AdmitChildI LABEL
+instance AdmitChildB LABEL
+instance AdmitChildU LABEL
+instance AdmitChildS LABEL
+instance AdmitChildSTRIKE LABEL
+instance AdmitChildBIG LABEL
+instance AdmitChildSMALL LABEL
+instance AdmitChildEM LABEL
+instance AdmitChildSTRONG LABEL
+instance AdmitChildDFN LABEL
+instance AdmitChildCODE LABEL
+instance AdmitChildSAMP LABEL
+instance AdmitChildKBD LABEL
+instance AdmitChildVAR LABEL
+instance AdmitChildCITE LABEL
+instance AdmitChildABBR LABEL
+instance AdmitChildACRONYM LABEL
+instance AdmitChildA LABEL
+instance AdmitChildIMG LABEL
+instance AdmitChildAPPLET LABEL
+instance AdmitChildOBJECT LABEL
+instance AdmitChildFONT LABEL
+instance AdmitChildBASEFONT LABEL
+instance AdmitChildBR LABEL
+instance AdmitChildSCRIPT LABEL
+instance AdmitChildMAP LABEL
+instance AdmitChildQ LABEL
+instance AdmitChildSUB LABEL
+instance AdmitChildSUP LABEL
+instance AdmitChildSPAN LABEL
+instance AdmitChildBDO LABEL
+instance AdmitChildIFRAME LABEL
+instance AdmitChildINPUT LABEL
+instance AdmitChildSELECT LABEL
+instance AdmitChildTEXTAREA LABEL
+instance AdmitChildBUTTON LABEL
+instance TAG FORM
+instance AdmitChildP FORM
+instance AdmitChildH1 FORM
+instance AdmitChildH2 FORM
+instance AdmitChildH3 FORM
+instance AdmitChildH4 FORM
+instance AdmitChildH5 FORM
+instance AdmitChildH6 FORM
+instance AdmitChildUL FORM
+instance AdmitChildOL FORM
+instance AdmitChildDIR FORM
+instance AdmitChildMENU FORM
+instance AdmitChildPRE FORM
+instance AdmitChildDL FORM
+instance AdmitChildDIV FORM
+instance AdmitChildCENTER FORM
+instance AdmitChildNOSCRIPT FORM
+instance AdmitChildNOFRAMES FORM
+instance AdmitChildBLOCKQUOTE FORM
+instance AdmitChildISINDEX FORM
+instance AdmitChildHR FORM
+instance AdmitChildTABLE FORM
+instance AdmitChildFIELDSET FORM
+instance AdmitChildADDRESS FORM
+instance AdmitChildCDATA FORM
+instance AdmitChildTT FORM
+instance AdmitChildI FORM
+instance AdmitChildB FORM
+instance AdmitChildU FORM
+instance AdmitChildS FORM
+instance AdmitChildSTRIKE FORM
+instance AdmitChildBIG FORM
+instance AdmitChildSMALL FORM
+instance AdmitChildEM FORM
+instance AdmitChildSTRONG FORM
+instance AdmitChildDFN FORM
+instance AdmitChildCODE FORM
+instance AdmitChildSAMP FORM
+instance AdmitChildKBD FORM
+instance AdmitChildVAR FORM
+instance AdmitChildCITE FORM
+instance AdmitChildABBR FORM
+instance AdmitChildACRONYM FORM
+instance AdmitChildA FORM
+instance AdmitChildIMG FORM
+instance AdmitChildAPPLET FORM
+instance AdmitChildOBJECT FORM
+instance AdmitChildFONT FORM
+instance AdmitChildBASEFONT FORM
+instance AdmitChildBR FORM
+instance AdmitChildSCRIPT FORM
+instance AdmitChildMAP FORM
+instance AdmitChildQ FORM
+instance AdmitChildSUB FORM
+instance AdmitChildSUP FORM
+instance AdmitChildSPAN FORM
+instance AdmitChildBDO FORM
+instance AdmitChildIFRAME FORM
+instance AdmitChildINPUT FORM
+instance AdmitChildSELECT FORM
+instance AdmitChildTEXTAREA FORM
+instance AdmitChildLABEL FORM
+instance AdmitChildBUTTON FORM
+instance TAG LI
+instance AdmitChildP LI
+instance AdmitChildH1 LI
+instance AdmitChildH2 LI
+instance AdmitChildH3 LI
+instance AdmitChildH4 LI
+instance AdmitChildH5 LI
+instance AdmitChildH6 LI
+instance AdmitChildUL LI
+instance AdmitChildOL LI
+instance AdmitChildDIR LI
+instance AdmitChildMENU LI
+instance AdmitChildPRE LI
+instance AdmitChildDL LI
+instance AdmitChildDIV LI
+instance AdmitChildCENTER LI
+instance AdmitChildNOSCRIPT LI
+instance AdmitChildNOFRAMES LI
+instance AdmitChildBLOCKQUOTE LI
+instance AdmitChildFORM LI
+instance AdmitChildISINDEX LI
+instance AdmitChildHR LI
+instance AdmitChildTABLE LI
+instance AdmitChildFIELDSET LI
+instance AdmitChildADDRESS LI
+instance AdmitChildCDATA LI
+instance AdmitChildTT LI
+instance AdmitChildI LI
+instance AdmitChildB LI
+instance AdmitChildU LI
+instance AdmitChildS LI
+instance AdmitChildSTRIKE LI
+instance AdmitChildBIG LI
+instance AdmitChildSMALL LI
+instance AdmitChildEM LI
+instance AdmitChildSTRONG LI
+instance AdmitChildDFN LI
+instance AdmitChildCODE LI
+instance AdmitChildSAMP LI
+instance AdmitChildKBD LI
+instance AdmitChildVAR LI
+instance AdmitChildCITE LI
+instance AdmitChildABBR LI
+instance AdmitChildACRONYM LI
+instance AdmitChildA LI
+instance AdmitChildIMG LI
+instance AdmitChildAPPLET LI
+instance AdmitChildOBJECT LI
+instance AdmitChildFONT LI
+instance AdmitChildBASEFONT LI
+instance AdmitChildBR LI
+instance AdmitChildSCRIPT LI
+instance AdmitChildMAP LI
+instance AdmitChildQ LI
+instance AdmitChildSUB LI
+instance AdmitChildSUP LI
+instance AdmitChildSPAN LI
+instance AdmitChildBDO LI
+instance AdmitChildIFRAME LI
+instance AdmitChildINPUT LI
+instance AdmitChildSELECT LI
+instance AdmitChildTEXTAREA LI
+instance AdmitChildLABEL LI
+instance AdmitChildBUTTON LI
+instance TAG DIR
+instance AdmitChildLI DIR
+instance TAG MENU
+instance AdmitChildLI MENU
+instance TAG UL
+instance AdmitChildLI UL
+instance TAG OL
+instance AdmitChildLI OL
+instance TAG DD
+instance AdmitChildP DD
+instance AdmitChildH1 DD
+instance AdmitChildH2 DD
+instance AdmitChildH3 DD
+instance AdmitChildH4 DD
+instance AdmitChildH5 DD
+instance AdmitChildH6 DD
+instance AdmitChildUL DD
+instance AdmitChildOL DD
+instance AdmitChildDIR DD
+instance AdmitChildMENU DD
+instance AdmitChildPRE DD
+instance AdmitChildDL DD
+instance AdmitChildDIV DD
+instance AdmitChildCENTER DD
+instance AdmitChildNOSCRIPT DD
+instance AdmitChildNOFRAMES DD
+instance AdmitChildBLOCKQUOTE DD
+instance AdmitChildFORM DD
+instance AdmitChildISINDEX DD
+instance AdmitChildHR DD
+instance AdmitChildTABLE DD
+instance AdmitChildFIELDSET DD
+instance AdmitChildADDRESS DD
+instance AdmitChildCDATA DD
+instance AdmitChildTT DD
+instance AdmitChildI DD
+instance AdmitChildB DD
+instance AdmitChildU DD
+instance AdmitChildS DD
+instance AdmitChildSTRIKE DD
+instance AdmitChildBIG DD
+instance AdmitChildSMALL DD
+instance AdmitChildEM DD
+instance AdmitChildSTRONG DD
+instance AdmitChildDFN DD
+instance AdmitChildCODE DD
+instance AdmitChildSAMP DD
+instance AdmitChildKBD DD
+instance AdmitChildVAR DD
+instance AdmitChildCITE DD
+instance AdmitChildABBR DD
+instance AdmitChildACRONYM DD
+instance AdmitChildA DD
+instance AdmitChildIMG DD
+instance AdmitChildAPPLET DD
+instance AdmitChildOBJECT DD
+instance AdmitChildFONT DD
+instance AdmitChildBASEFONT DD
+instance AdmitChildBR DD
+instance AdmitChildSCRIPT DD
+instance AdmitChildMAP DD
+instance AdmitChildQ DD
+instance AdmitChildSUB DD
+instance AdmitChildSUP DD
+instance AdmitChildSPAN DD
+instance AdmitChildBDO DD
+instance AdmitChildIFRAME DD
+instance AdmitChildINPUT DD
+instance AdmitChildSELECT DD
+instance AdmitChildTEXTAREA DD
+instance AdmitChildLABEL DD
+instance AdmitChildBUTTON DD
+instance TAG DT
+instance AdmitChildCDATA DT
+instance AdmitChildTT DT
+instance AdmitChildI DT
+instance AdmitChildB DT
+instance AdmitChildU DT
+instance AdmitChildS DT
+instance AdmitChildSTRIKE DT
+instance AdmitChildBIG DT
+instance AdmitChildSMALL DT
+instance AdmitChildEM DT
+instance AdmitChildSTRONG DT
+instance AdmitChildDFN DT
+instance AdmitChildCODE DT
+instance AdmitChildSAMP DT
+instance AdmitChildKBD DT
+instance AdmitChildVAR DT
+instance AdmitChildCITE DT
+instance AdmitChildABBR DT
+instance AdmitChildACRONYM DT
+instance AdmitChildA DT
+instance AdmitChildIMG DT
+instance AdmitChildAPPLET DT
+instance AdmitChildOBJECT DT
+instance AdmitChildFONT DT
+instance AdmitChildBASEFONT DT
+instance AdmitChildBR DT
+instance AdmitChildSCRIPT DT
+instance AdmitChildMAP DT
+instance AdmitChildQ DT
+instance AdmitChildSUB DT
+instance AdmitChildSUP DT
+instance AdmitChildSPAN DT
+instance AdmitChildBDO DT
+instance AdmitChildIFRAME DT
+instance AdmitChildINPUT DT
+instance AdmitChildSELECT DT
+instance AdmitChildTEXTAREA DT
+instance AdmitChildLABEL DT
+instance AdmitChildBUTTON DT
+instance TAG DL
+instance AdmitChildDT DL
+instance AdmitChildDD DL
+instance TAG INS
+instance AdmitChildP INS
+instance AdmitChildH1 INS
+instance AdmitChildH2 INS
+instance AdmitChildH3 INS
+instance AdmitChildH4 INS
+instance AdmitChildH5 INS
+instance AdmitChildH6 INS
+instance AdmitChildUL INS
+instance AdmitChildOL INS
+instance AdmitChildDIR INS
+instance AdmitChildMENU INS
+instance AdmitChildPRE INS
+instance AdmitChildDL INS
+instance AdmitChildDIV INS
+instance AdmitChildCENTER INS
+instance AdmitChildNOSCRIPT INS
+instance AdmitChildNOFRAMES INS
+instance AdmitChildBLOCKQUOTE INS
+instance AdmitChildFORM INS
+instance AdmitChildISINDEX INS
+instance AdmitChildHR INS
+instance AdmitChildTABLE INS
+instance AdmitChildFIELDSET INS
+instance AdmitChildADDRESS INS
+instance AdmitChildCDATA INS
+instance AdmitChildTT INS
+instance AdmitChildI INS
+instance AdmitChildB INS
+instance AdmitChildU INS
+instance AdmitChildS INS
+instance AdmitChildSTRIKE INS
+instance AdmitChildBIG INS
+instance AdmitChildSMALL INS
+instance AdmitChildEM INS
+instance AdmitChildSTRONG INS
+instance AdmitChildDFN INS
+instance AdmitChildCODE INS
+instance AdmitChildSAMP INS
+instance AdmitChildKBD INS
+instance AdmitChildVAR INS
+instance AdmitChildCITE INS
+instance AdmitChildABBR INS
+instance AdmitChildACRONYM INS
+instance AdmitChildA INS
+instance AdmitChildIMG INS
+instance AdmitChildAPPLET INS
+instance AdmitChildOBJECT INS
+instance AdmitChildFONT INS
+instance AdmitChildBASEFONT INS
+instance AdmitChildBR INS
+instance AdmitChildSCRIPT INS
+instance AdmitChildMAP INS
+instance AdmitChildQ INS
+instance AdmitChildSUB INS
+instance AdmitChildSUP INS
+instance AdmitChildSPAN INS
+instance AdmitChildBDO INS
+instance AdmitChildIFRAME INS
+instance AdmitChildINPUT INS
+instance AdmitChildSELECT INS
+instance AdmitChildTEXTAREA INS
+instance AdmitChildLABEL INS
+instance AdmitChildBUTTON INS
+instance TAG DEL
+instance AdmitChildP DEL
+instance AdmitChildH1 DEL
+instance AdmitChildH2 DEL
+instance AdmitChildH3 DEL
+instance AdmitChildH4 DEL
+instance AdmitChildH5 DEL
+instance AdmitChildH6 DEL
+instance AdmitChildUL DEL
+instance AdmitChildOL DEL
+instance AdmitChildDIR DEL
+instance AdmitChildMENU DEL
+instance AdmitChildPRE DEL
+instance AdmitChildDL DEL
+instance AdmitChildDIV DEL
+instance AdmitChildCENTER DEL
+instance AdmitChildNOSCRIPT DEL
+instance AdmitChildNOFRAMES DEL
+instance AdmitChildBLOCKQUOTE DEL
+instance AdmitChildFORM DEL
+instance AdmitChildISINDEX DEL
+instance AdmitChildHR DEL
+instance AdmitChildTABLE DEL
+instance AdmitChildFIELDSET DEL
+instance AdmitChildADDRESS DEL
+instance AdmitChildCDATA DEL
+instance AdmitChildTT DEL
+instance AdmitChildI DEL
+instance AdmitChildB DEL
+instance AdmitChildU DEL
+instance AdmitChildS DEL
+instance AdmitChildSTRIKE DEL
+instance AdmitChildBIG DEL
+instance AdmitChildSMALL DEL
+instance AdmitChildEM DEL
+instance AdmitChildSTRONG DEL
+instance AdmitChildDFN DEL
+instance AdmitChildCODE DEL
+instance AdmitChildSAMP DEL
+instance AdmitChildKBD DEL
+instance AdmitChildVAR DEL
+instance AdmitChildCITE DEL
+instance AdmitChildABBR DEL
+instance AdmitChildACRONYM DEL
+instance AdmitChildA DEL
+instance AdmitChildIMG DEL
+instance AdmitChildAPPLET DEL
+instance AdmitChildOBJECT DEL
+instance AdmitChildFONT DEL
+instance AdmitChildBASEFONT DEL
+instance AdmitChildBR DEL
+instance AdmitChildSCRIPT DEL
+instance AdmitChildMAP DEL
+instance AdmitChildQ DEL
+instance AdmitChildSUB DEL
+instance AdmitChildSUP DEL
+instance AdmitChildSPAN DEL
+instance AdmitChildBDO DEL
+instance AdmitChildIFRAME DEL
+instance AdmitChildINPUT DEL
+instance AdmitChildSELECT DEL
+instance AdmitChildTEXTAREA DEL
+instance AdmitChildLABEL DEL
+instance AdmitChildBUTTON DEL
+instance TAG BLOCKQUOTE
+instance AdmitChildP BLOCKQUOTE
+instance AdmitChildH1 BLOCKQUOTE
+instance AdmitChildH2 BLOCKQUOTE
+instance AdmitChildH3 BLOCKQUOTE
+instance AdmitChildH4 BLOCKQUOTE
+instance AdmitChildH5 BLOCKQUOTE
+instance AdmitChildH6 BLOCKQUOTE
+instance AdmitChildUL BLOCKQUOTE
+instance AdmitChildOL BLOCKQUOTE
+instance AdmitChildDIR BLOCKQUOTE
+instance AdmitChildMENU BLOCKQUOTE
+instance AdmitChildPRE BLOCKQUOTE
+instance AdmitChildDL BLOCKQUOTE
+instance AdmitChildDIV BLOCKQUOTE
+instance AdmitChildCENTER BLOCKQUOTE
+instance AdmitChildNOSCRIPT BLOCKQUOTE
+instance AdmitChildNOFRAMES BLOCKQUOTE
+instance AdmitChildBLOCKQUOTE BLOCKQUOTE
+instance AdmitChildFORM BLOCKQUOTE
+instance AdmitChildISINDEX BLOCKQUOTE
+instance AdmitChildHR BLOCKQUOTE
+instance AdmitChildTABLE BLOCKQUOTE
+instance AdmitChildFIELDSET BLOCKQUOTE
+instance AdmitChildADDRESS BLOCKQUOTE
+instance AdmitChildCDATA BLOCKQUOTE
+instance AdmitChildTT BLOCKQUOTE
+instance AdmitChildI BLOCKQUOTE
+instance AdmitChildB BLOCKQUOTE
+instance AdmitChildU BLOCKQUOTE
+instance AdmitChildS BLOCKQUOTE
+instance AdmitChildSTRIKE BLOCKQUOTE
+instance AdmitChildBIG BLOCKQUOTE
+instance AdmitChildSMALL BLOCKQUOTE
+instance AdmitChildEM BLOCKQUOTE
+instance AdmitChildSTRONG BLOCKQUOTE
+instance AdmitChildDFN BLOCKQUOTE
+instance AdmitChildCODE BLOCKQUOTE
+instance AdmitChildSAMP BLOCKQUOTE
+instance AdmitChildKBD BLOCKQUOTE
+instance AdmitChildVAR BLOCKQUOTE
+instance AdmitChildCITE BLOCKQUOTE
+instance AdmitChildABBR BLOCKQUOTE
+instance AdmitChildACRONYM BLOCKQUOTE
+instance AdmitChildA BLOCKQUOTE
+instance AdmitChildIMG BLOCKQUOTE
+instance AdmitChildAPPLET BLOCKQUOTE
+instance AdmitChildOBJECT BLOCKQUOTE
+instance AdmitChildFONT BLOCKQUOTE
+instance AdmitChildBASEFONT BLOCKQUOTE
+instance AdmitChildBR BLOCKQUOTE
+instance AdmitChildSCRIPT BLOCKQUOTE
+instance AdmitChildMAP BLOCKQUOTE
+instance AdmitChildQ BLOCKQUOTE
+instance AdmitChildSUB BLOCKQUOTE
+instance AdmitChildSUP BLOCKQUOTE
+instance AdmitChildSPAN BLOCKQUOTE
+instance AdmitChildBDO BLOCKQUOTE
+instance AdmitChildIFRAME BLOCKQUOTE
+instance AdmitChildINPUT BLOCKQUOTE
+instance AdmitChildSELECT BLOCKQUOTE
+instance AdmitChildTEXTAREA BLOCKQUOTE
+instance AdmitChildLABEL BLOCKQUOTE
+instance AdmitChildBUTTON BLOCKQUOTE
+instance TAG Q
+instance AdmitChildCDATA Q
+instance AdmitChildTT Q
+instance AdmitChildI Q
+instance AdmitChildB Q
+instance AdmitChildU Q
+instance AdmitChildS Q
+instance AdmitChildSTRIKE Q
+instance AdmitChildBIG Q
+instance AdmitChildSMALL Q
+instance AdmitChildEM Q
+instance AdmitChildSTRONG Q
+instance AdmitChildDFN Q
+instance AdmitChildCODE Q
+instance AdmitChildSAMP Q
+instance AdmitChildKBD Q
+instance AdmitChildVAR Q
+instance AdmitChildCITE Q
+instance AdmitChildABBR Q
+instance AdmitChildACRONYM Q
+instance AdmitChildA Q
+instance AdmitChildIMG Q
+instance AdmitChildAPPLET Q
+instance AdmitChildOBJECT Q
+instance AdmitChildFONT Q
+instance AdmitChildBASEFONT Q
+instance AdmitChildBR Q
+instance AdmitChildSCRIPT Q
+instance AdmitChildMAP Q
+instance AdmitChildQ Q
+instance AdmitChildSUB Q
+instance AdmitChildSUP Q
+instance AdmitChildSPAN Q
+instance AdmitChildBDO Q
+instance AdmitChildIFRAME Q
+instance AdmitChildINPUT Q
+instance AdmitChildSELECT Q
+instance AdmitChildTEXTAREA Q
+instance AdmitChildLABEL Q
+instance AdmitChildBUTTON Q
+instance TAG PRE
+instance AdmitChildCDATA PRE
+instance AdmitChildTT PRE
+instance AdmitChildI PRE
+instance AdmitChildB PRE
+instance AdmitChildU PRE
+instance AdmitChildS PRE
+instance AdmitChildSTRIKE PRE
+instance AdmitChildEM PRE
+instance AdmitChildSTRONG PRE
+instance AdmitChildDFN PRE
+instance AdmitChildCODE PRE
+instance AdmitChildSAMP PRE
+instance AdmitChildKBD PRE
+instance AdmitChildVAR PRE
+instance AdmitChildCITE PRE
+instance AdmitChildABBR PRE
+instance AdmitChildACRONYM PRE
+instance AdmitChildA PRE
+instance AdmitChildBR PRE
+instance AdmitChildSCRIPT PRE
+instance AdmitChildMAP PRE
+instance AdmitChildQ PRE
+instance AdmitChildSPAN PRE
+instance AdmitChildBDO PRE
+instance AdmitChildIFRAME PRE
+instance AdmitChildINPUT PRE
+instance AdmitChildSELECT PRE
+instance AdmitChildTEXTAREA PRE
+instance AdmitChildLABEL PRE
+instance AdmitChildBUTTON PRE
+instance TAG H1
+instance AdmitChildCDATA H1
+instance AdmitChildTT H1
+instance AdmitChildI H1
+instance AdmitChildB H1
+instance AdmitChildU H1
+instance AdmitChildS H1
+instance AdmitChildSTRIKE H1
+instance AdmitChildBIG H1
+instance AdmitChildSMALL H1
+instance AdmitChildEM H1
+instance AdmitChildSTRONG H1
+instance AdmitChildDFN H1
+instance AdmitChildCODE H1
+instance AdmitChildSAMP H1
+instance AdmitChildKBD H1
+instance AdmitChildVAR H1
+instance AdmitChildCITE H1
+instance AdmitChildABBR H1
+instance AdmitChildACRONYM H1
+instance AdmitChildA H1
+instance AdmitChildIMG H1
+instance AdmitChildAPPLET H1
+instance AdmitChildOBJECT H1
+instance AdmitChildFONT H1
+instance AdmitChildBASEFONT H1
+instance AdmitChildBR H1
+instance AdmitChildSCRIPT H1
+instance AdmitChildMAP H1
+instance AdmitChildQ H1
+instance AdmitChildSUB H1
+instance AdmitChildSUP H1
+instance AdmitChildSPAN H1
+instance AdmitChildBDO H1
+instance AdmitChildIFRAME H1
+instance AdmitChildINPUT H1
+instance AdmitChildSELECT H1
+instance AdmitChildTEXTAREA H1
+instance AdmitChildLABEL H1
+instance AdmitChildBUTTON H1
+instance TAG H2
+instance AdmitChildCDATA H2
+instance AdmitChildTT H2
+instance AdmitChildI H2
+instance AdmitChildB H2
+instance AdmitChildU H2
+instance AdmitChildS H2
+instance AdmitChildSTRIKE H2
+instance AdmitChildBIG H2
+instance AdmitChildSMALL H2
+instance AdmitChildEM H2
+instance AdmitChildSTRONG H2
+instance AdmitChildDFN H2
+instance AdmitChildCODE H2
+instance AdmitChildSAMP H2
+instance AdmitChildKBD H2
+instance AdmitChildVAR H2
+instance AdmitChildCITE H2
+instance AdmitChildABBR H2
+instance AdmitChildACRONYM H2
+instance AdmitChildA H2
+instance AdmitChildIMG H2
+instance AdmitChildAPPLET H2
+instance AdmitChildOBJECT H2
+instance AdmitChildFONT H2
+instance AdmitChildBASEFONT H2
+instance AdmitChildBR H2
+instance AdmitChildSCRIPT H2
+instance AdmitChildMAP H2
+instance AdmitChildQ H2
+instance AdmitChildSUB H2
+instance AdmitChildSUP H2
+instance AdmitChildSPAN H2
+instance AdmitChildBDO H2
+instance AdmitChildIFRAME H2
+instance AdmitChildINPUT H2
+instance AdmitChildSELECT H2
+instance AdmitChildTEXTAREA H2
+instance AdmitChildLABEL H2
+instance AdmitChildBUTTON H2
+instance TAG H3
+instance AdmitChildCDATA H3
+instance AdmitChildTT H3
+instance AdmitChildI H3
+instance AdmitChildB H3
+instance AdmitChildU H3
+instance AdmitChildS H3
+instance AdmitChildSTRIKE H3
+instance AdmitChildBIG H3
+instance AdmitChildSMALL H3
+instance AdmitChildEM H3
+instance AdmitChildSTRONG H3
+instance AdmitChildDFN H3
+instance AdmitChildCODE H3
+instance AdmitChildSAMP H3
+instance AdmitChildKBD H3
+instance AdmitChildVAR H3
+instance AdmitChildCITE H3
+instance AdmitChildABBR H3
+instance AdmitChildACRONYM H3
+instance AdmitChildA H3
+instance AdmitChildIMG H3
+instance AdmitChildAPPLET H3
+instance AdmitChildOBJECT H3
+instance AdmitChildFONT H3
+instance AdmitChildBASEFONT H3
+instance AdmitChildBR H3
+instance AdmitChildSCRIPT H3
+instance AdmitChildMAP H3
+instance AdmitChildQ H3
+instance AdmitChildSUB H3
+instance AdmitChildSUP H3
+instance AdmitChildSPAN H3
+instance AdmitChildBDO H3
+instance AdmitChildIFRAME H3
+instance AdmitChildINPUT H3
+instance AdmitChildSELECT H3
+instance AdmitChildTEXTAREA H3
+instance AdmitChildLABEL H3
+instance AdmitChildBUTTON H3
+instance TAG H4
+instance AdmitChildCDATA H4
+instance AdmitChildTT H4
+instance AdmitChildI H4
+instance AdmitChildB H4
+instance AdmitChildU H4
+instance AdmitChildS H4
+instance AdmitChildSTRIKE H4
+instance AdmitChildBIG H4
+instance AdmitChildSMALL H4
+instance AdmitChildEM H4
+instance AdmitChildSTRONG H4
+instance AdmitChildDFN H4
+instance AdmitChildCODE H4
+instance AdmitChildSAMP H4
+instance AdmitChildKBD H4
+instance AdmitChildVAR H4
+instance AdmitChildCITE H4
+instance AdmitChildABBR H4
+instance AdmitChildACRONYM H4
+instance AdmitChildA H4
+instance AdmitChildIMG H4
+instance AdmitChildAPPLET H4
+instance AdmitChildOBJECT H4
+instance AdmitChildFONT H4
+instance AdmitChildBASEFONT H4
+instance AdmitChildBR H4
+instance AdmitChildSCRIPT H4
+instance AdmitChildMAP H4
+instance AdmitChildQ H4
+instance AdmitChildSUB H4
+instance AdmitChildSUP H4
+instance AdmitChildSPAN H4
+instance AdmitChildBDO H4
+instance AdmitChildIFRAME H4
+instance AdmitChildINPUT H4
+instance AdmitChildSELECT H4
+instance AdmitChildTEXTAREA H4
+instance AdmitChildLABEL H4
+instance AdmitChildBUTTON H4
+instance TAG H5
+instance AdmitChildCDATA H5
+instance AdmitChildTT H5
+instance AdmitChildI H5
+instance AdmitChildB H5
+instance AdmitChildU H5
+instance AdmitChildS H5
+instance AdmitChildSTRIKE H5
+instance AdmitChildBIG H5
+instance AdmitChildSMALL H5
+instance AdmitChildEM H5
+instance AdmitChildSTRONG H5
+instance AdmitChildDFN H5
+instance AdmitChildCODE H5
+instance AdmitChildSAMP H5
+instance AdmitChildKBD H5
+instance AdmitChildVAR H5
+instance AdmitChildCITE H5
+instance AdmitChildABBR H5
+instance AdmitChildACRONYM H5
+instance AdmitChildA H5
+instance AdmitChildIMG H5
+instance AdmitChildAPPLET H5
+instance AdmitChildOBJECT H5
+instance AdmitChildFONT H5
+instance AdmitChildBASEFONT H5
+instance AdmitChildBR H5
+instance AdmitChildSCRIPT H5
+instance AdmitChildMAP H5
+instance AdmitChildQ H5
+instance AdmitChildSUB H5
+instance AdmitChildSUP H5
+instance AdmitChildSPAN H5
+instance AdmitChildBDO H5
+instance AdmitChildIFRAME H5
+instance AdmitChildINPUT H5
+instance AdmitChildSELECT H5
+instance AdmitChildTEXTAREA H5
+instance AdmitChildLABEL H5
+instance AdmitChildBUTTON H5
+instance TAG H6
+instance AdmitChildCDATA H6
+instance AdmitChildTT H6
+instance AdmitChildI H6
+instance AdmitChildB H6
+instance AdmitChildU H6
+instance AdmitChildS H6
+instance AdmitChildSTRIKE H6
+instance AdmitChildBIG H6
+instance AdmitChildSMALL H6
+instance AdmitChildEM H6
+instance AdmitChildSTRONG H6
+instance AdmitChildDFN H6
+instance AdmitChildCODE H6
+instance AdmitChildSAMP H6
+instance AdmitChildKBD H6
+instance AdmitChildVAR H6
+instance AdmitChildCITE H6
+instance AdmitChildABBR H6
+instance AdmitChildACRONYM H6
+instance AdmitChildA H6
+instance AdmitChildIMG H6
+instance AdmitChildAPPLET H6
+instance AdmitChildOBJECT H6
+instance AdmitChildFONT H6
+instance AdmitChildBASEFONT H6
+instance AdmitChildBR H6
+instance AdmitChildSCRIPT H6
+instance AdmitChildMAP H6
+instance AdmitChildQ H6
+instance AdmitChildSUB H6
+instance AdmitChildSUP H6
+instance AdmitChildSPAN H6
+instance AdmitChildBDO H6
+instance AdmitChildIFRAME H6
+instance AdmitChildINPUT H6
+instance AdmitChildSELECT H6
+instance AdmitChildTEXTAREA H6
+instance AdmitChildLABEL H6
+instance AdmitChildBUTTON H6
+instance TAG P
+instance AdmitChildCDATA P
+instance AdmitChildTT P
+instance AdmitChildI P
+instance AdmitChildB P
+instance AdmitChildU P
+instance AdmitChildS P
+instance AdmitChildSTRIKE P
+instance AdmitChildBIG P
+instance AdmitChildSMALL P
+instance AdmitChildEM P
+instance AdmitChildSTRONG P
+instance AdmitChildDFN P
+instance AdmitChildCODE P
+instance AdmitChildSAMP P
+instance AdmitChildKBD P
+instance AdmitChildVAR P
+instance AdmitChildCITE P
+instance AdmitChildABBR P
+instance AdmitChildACRONYM P
+instance AdmitChildA P
+instance AdmitChildIMG P
+instance AdmitChildAPPLET P
+instance AdmitChildOBJECT P
+instance AdmitChildFONT P
+instance AdmitChildBASEFONT P
+instance AdmitChildBR P
+instance AdmitChildSCRIPT P
+instance AdmitChildMAP P
+instance AdmitChildQ P
+instance AdmitChildSUB P
+instance AdmitChildSUP P
+instance AdmitChildSPAN P
+instance AdmitChildBDO P
+instance AdmitChildIFRAME P
+instance AdmitChildINPUT P
+instance AdmitChildSELECT P
+instance AdmitChildTEXTAREA P
+instance AdmitChildLABEL P
+instance AdmitChildBUTTON P
+instance TAG HR where make = make_empty
+instance TAG APPLET
+instance AdmitChildPARAM APPLET
+instance AdmitChildP APPLET
+instance AdmitChildH1 APPLET
+instance AdmitChildH2 APPLET
+instance AdmitChildH3 APPLET
+instance AdmitChildH4 APPLET
+instance AdmitChildH5 APPLET
+instance AdmitChildH6 APPLET
+instance AdmitChildUL APPLET
+instance AdmitChildOL APPLET
+instance AdmitChildDIR APPLET
+instance AdmitChildMENU APPLET
+instance AdmitChildPRE APPLET
+instance AdmitChildDL APPLET
+instance AdmitChildDIV APPLET
+instance AdmitChildCENTER APPLET
+instance AdmitChildNOSCRIPT APPLET
+instance AdmitChildNOFRAMES APPLET
+instance AdmitChildBLOCKQUOTE APPLET
+instance AdmitChildFORM APPLET
+instance AdmitChildISINDEX APPLET
+instance AdmitChildHR APPLET
+instance AdmitChildTABLE APPLET
+instance AdmitChildFIELDSET APPLET
+instance AdmitChildADDRESS APPLET
+instance AdmitChildCDATA APPLET
+instance AdmitChildTT APPLET
+instance AdmitChildI APPLET
+instance AdmitChildB APPLET
+instance AdmitChildU APPLET
+instance AdmitChildS APPLET
+instance AdmitChildSTRIKE APPLET
+instance AdmitChildBIG APPLET
+instance AdmitChildSMALL APPLET
+instance AdmitChildEM APPLET
+instance AdmitChildSTRONG APPLET
+instance AdmitChildDFN APPLET
+instance AdmitChildCODE APPLET
+instance AdmitChildSAMP APPLET
+instance AdmitChildKBD APPLET
+instance AdmitChildVAR APPLET
+instance AdmitChildCITE APPLET
+instance AdmitChildABBR APPLET
+instance AdmitChildACRONYM APPLET
+instance AdmitChildA APPLET
+instance AdmitChildIMG APPLET
+instance AdmitChildAPPLET APPLET
+instance AdmitChildOBJECT APPLET
+instance AdmitChildFONT APPLET
+instance AdmitChildBASEFONT APPLET
+instance AdmitChildBR APPLET
+instance AdmitChildSCRIPT APPLET
+instance AdmitChildMAP APPLET
+instance AdmitChildQ APPLET
+instance AdmitChildSUB APPLET
+instance AdmitChildSUP APPLET
+instance AdmitChildSPAN APPLET
+instance AdmitChildBDO APPLET
+instance AdmitChildIFRAME APPLET
+instance AdmitChildINPUT APPLET
+instance AdmitChildSELECT APPLET
+instance AdmitChildTEXTAREA APPLET
+instance AdmitChildLABEL APPLET
+instance AdmitChildBUTTON APPLET
+instance TAG PARAM where make = make_empty
+instance TAG OBJECT
+instance AdmitChildPARAM OBJECT
+instance AdmitChildP OBJECT
+instance AdmitChildH1 OBJECT
+instance AdmitChildH2 OBJECT
+instance AdmitChildH3 OBJECT
+instance AdmitChildH4 OBJECT
+instance AdmitChildH5 OBJECT
+instance AdmitChildH6 OBJECT
+instance AdmitChildUL OBJECT
+instance AdmitChildOL OBJECT
+instance AdmitChildDIR OBJECT
+instance AdmitChildMENU OBJECT
+instance AdmitChildPRE OBJECT
+instance AdmitChildDL OBJECT
+instance AdmitChildDIV OBJECT
+instance AdmitChildCENTER OBJECT
+instance AdmitChildNOSCRIPT OBJECT
+instance AdmitChildNOFRAMES OBJECT
+instance AdmitChildBLOCKQUOTE OBJECT
+instance AdmitChildFORM OBJECT
+instance AdmitChildISINDEX OBJECT
+instance AdmitChildHR OBJECT
+instance AdmitChildTABLE OBJECT
+instance AdmitChildFIELDSET OBJECT
+instance AdmitChildADDRESS OBJECT
+instance AdmitChildCDATA OBJECT
+instance AdmitChildTT OBJECT
+instance AdmitChildI OBJECT
+instance AdmitChildB OBJECT
+instance AdmitChildU OBJECT
+instance AdmitChildS OBJECT
+instance AdmitChildSTRIKE OBJECT
+instance AdmitChildBIG OBJECT
+instance AdmitChildSMALL OBJECT
+instance AdmitChildEM OBJECT
+instance AdmitChildSTRONG OBJECT
+instance AdmitChildDFN OBJECT
+instance AdmitChildCODE OBJECT
+instance AdmitChildSAMP OBJECT
+instance AdmitChildKBD OBJECT
+instance AdmitChildVAR OBJECT
+instance AdmitChildCITE OBJECT
+instance AdmitChildABBR OBJECT
+instance AdmitChildACRONYM OBJECT
+instance AdmitChildA OBJECT
+instance AdmitChildIMG OBJECT
+instance AdmitChildAPPLET OBJECT
+instance AdmitChildOBJECT OBJECT
+instance AdmitChildFONT OBJECT
+instance AdmitChildBASEFONT OBJECT
+instance AdmitChildBR OBJECT
+instance AdmitChildSCRIPT OBJECT
+instance AdmitChildMAP OBJECT
+instance AdmitChildQ OBJECT
+instance AdmitChildSUB OBJECT
+instance AdmitChildSUP OBJECT
+instance AdmitChildSPAN OBJECT
+instance AdmitChildBDO OBJECT
+instance AdmitChildIFRAME OBJECT
+instance AdmitChildINPUT OBJECT
+instance AdmitChildSELECT OBJECT
+instance AdmitChildTEXTAREA OBJECT
+instance AdmitChildLABEL OBJECT
+instance AdmitChildBUTTON OBJECT
+instance TAG IMG where make = make_empty
+instance TAG LINK where make = make_empty
+instance TAG AREA where make = make_empty
+instance TAG MAP
+instance AdmitChildP MAP
+instance AdmitChildH1 MAP
+instance AdmitChildH2 MAP
+instance AdmitChildH3 MAP
+instance AdmitChildH4 MAP
+instance AdmitChildH5 MAP
+instance AdmitChildH6 MAP
+instance AdmitChildUL MAP
+instance AdmitChildOL MAP
+instance AdmitChildDIR MAP
+instance AdmitChildMENU MAP
+instance AdmitChildPRE MAP
+instance AdmitChildDL MAP
+instance AdmitChildDIV MAP
+instance AdmitChildCENTER MAP
+instance AdmitChildNOSCRIPT MAP
+instance AdmitChildNOFRAMES MAP
+instance AdmitChildBLOCKQUOTE MAP
+instance AdmitChildFORM MAP
+instance AdmitChildISINDEX MAP
+instance AdmitChildHR MAP
+instance AdmitChildTABLE MAP
+instance AdmitChildFIELDSET MAP
+instance AdmitChildADDRESS MAP
+instance AdmitChildAREA MAP
+instance TAG A
+instance AdmitChildCDATA A
+instance AdmitChildTT A
+instance AdmitChildI A
+instance AdmitChildB A
+instance AdmitChildU A
+instance AdmitChildS A
+instance AdmitChildSTRIKE A
+instance AdmitChildBIG A
+instance AdmitChildSMALL A
+instance AdmitChildEM A
+instance AdmitChildSTRONG A
+instance AdmitChildDFN A
+instance AdmitChildCODE A
+instance AdmitChildSAMP A
+instance AdmitChildKBD A
+instance AdmitChildVAR A
+instance AdmitChildCITE A
+instance AdmitChildABBR A
+instance AdmitChildACRONYM A
+instance AdmitChildIMG A
+instance AdmitChildAPPLET A
+instance AdmitChildOBJECT A
+instance AdmitChildFONT A
+instance AdmitChildBASEFONT A
+instance AdmitChildBR A
+instance AdmitChildSCRIPT A
+instance AdmitChildMAP A
+instance AdmitChildQ A
+instance AdmitChildSUB A
+instance AdmitChildSUP A
+instance AdmitChildSPAN A
+instance AdmitChildBDO A
+instance AdmitChildIFRAME A
+instance AdmitChildINPUT A
+instance AdmitChildSELECT A
+instance AdmitChildTEXTAREA A
+instance AdmitChildLABEL A
+instance AdmitChildBUTTON A
+instance TAG CENTER
+instance AdmitChildP CENTER
+instance AdmitChildH1 CENTER
+instance AdmitChildH2 CENTER
+instance AdmitChildH3 CENTER
+instance AdmitChildH4 CENTER
+instance AdmitChildH5 CENTER
+instance AdmitChildH6 CENTER
+instance AdmitChildUL CENTER
+instance AdmitChildOL CENTER
+instance AdmitChildDIR CENTER
+instance AdmitChildMENU CENTER
+instance AdmitChildPRE CENTER
+instance AdmitChildDL CENTER
+instance AdmitChildDIV CENTER
+instance AdmitChildCENTER CENTER
+instance AdmitChildNOSCRIPT CENTER
+instance AdmitChildNOFRAMES CENTER
+instance AdmitChildBLOCKQUOTE CENTER
+instance AdmitChildFORM CENTER
+instance AdmitChildISINDEX CENTER
+instance AdmitChildHR CENTER
+instance AdmitChildTABLE CENTER
+instance AdmitChildFIELDSET CENTER
+instance AdmitChildADDRESS CENTER
+instance AdmitChildCDATA CENTER
+instance AdmitChildTT CENTER
+instance AdmitChildI CENTER
+instance AdmitChildB CENTER
+instance AdmitChildU CENTER
+instance AdmitChildS CENTER
+instance AdmitChildSTRIKE CENTER
+instance AdmitChildBIG CENTER
+instance AdmitChildSMALL CENTER
+instance AdmitChildEM CENTER
+instance AdmitChildSTRONG CENTER
+instance AdmitChildDFN CENTER
+instance AdmitChildCODE CENTER
+instance AdmitChildSAMP CENTER
+instance AdmitChildKBD CENTER
+instance AdmitChildVAR CENTER
+instance AdmitChildCITE CENTER
+instance AdmitChildABBR CENTER
+instance AdmitChildACRONYM CENTER
+instance AdmitChildA CENTER
+instance AdmitChildIMG CENTER
+instance AdmitChildAPPLET CENTER
+instance AdmitChildOBJECT CENTER
+instance AdmitChildFONT CENTER
+instance AdmitChildBASEFONT CENTER
+instance AdmitChildBR CENTER
+instance AdmitChildSCRIPT CENTER
+instance AdmitChildMAP CENTER
+instance AdmitChildQ CENTER
+instance AdmitChildSUB CENTER
+instance AdmitChildSUP CENTER
+instance AdmitChildSPAN CENTER
+instance AdmitChildBDO CENTER
+instance AdmitChildIFRAME CENTER
+instance AdmitChildINPUT CENTER
+instance AdmitChildSELECT CENTER
+instance AdmitChildTEXTAREA CENTER
+instance AdmitChildLABEL CENTER
+instance AdmitChildBUTTON CENTER
+instance TAG DIV
+instance AdmitChildP DIV
+instance AdmitChildH1 DIV
+instance AdmitChildH2 DIV
+instance AdmitChildH3 DIV
+instance AdmitChildH4 DIV
+instance AdmitChildH5 DIV
+instance AdmitChildH6 DIV
+instance AdmitChildUL DIV
+instance AdmitChildOL DIV
+instance AdmitChildDIR DIV
+instance AdmitChildMENU DIV
+instance AdmitChildPRE DIV
+instance AdmitChildDL DIV
+instance AdmitChildDIV DIV
+instance AdmitChildCENTER DIV
+instance AdmitChildNOSCRIPT DIV
+instance AdmitChildNOFRAMES DIV
+instance AdmitChildBLOCKQUOTE DIV
+instance AdmitChildFORM DIV
+instance AdmitChildISINDEX DIV
+instance AdmitChildHR DIV
+instance AdmitChildTABLE DIV
+instance AdmitChildFIELDSET DIV
+instance AdmitChildADDRESS DIV
+instance AdmitChildCDATA DIV
+instance AdmitChildTT DIV
+instance AdmitChildI DIV
+instance AdmitChildB DIV
+instance AdmitChildU DIV
+instance AdmitChildS DIV
+instance AdmitChildSTRIKE DIV
+instance AdmitChildBIG DIV
+instance AdmitChildSMALL DIV
+instance AdmitChildEM DIV
+instance AdmitChildSTRONG DIV
+instance AdmitChildDFN DIV
+instance AdmitChildCODE DIV
+instance AdmitChildSAMP DIV
+instance AdmitChildKBD DIV
+instance AdmitChildVAR DIV
+instance AdmitChildCITE DIV
+instance AdmitChildABBR DIV
+instance AdmitChildACRONYM DIV
+instance AdmitChildA DIV
+instance AdmitChildIMG DIV
+instance AdmitChildAPPLET DIV
+instance AdmitChildOBJECT DIV
+instance AdmitChildFONT DIV
+instance AdmitChildBASEFONT DIV
+instance AdmitChildBR DIV
+instance AdmitChildSCRIPT DIV
+instance AdmitChildMAP DIV
+instance AdmitChildQ DIV
+instance AdmitChildSUB DIV
+instance AdmitChildSUP DIV
+instance AdmitChildSPAN DIV
+instance AdmitChildBDO DIV
+instance AdmitChildIFRAME DIV
+instance AdmitChildINPUT DIV
+instance AdmitChildSELECT DIV
+instance AdmitChildTEXTAREA DIV
+instance AdmitChildLABEL DIV
+instance AdmitChildBUTTON DIV
+instance TAG ADDRESS
+instance AdmitChildCDATA ADDRESS
+instance AdmitChildTT ADDRESS
+instance AdmitChildI ADDRESS
+instance AdmitChildB ADDRESS
+instance AdmitChildU ADDRESS
+instance AdmitChildS ADDRESS
+instance AdmitChildSTRIKE ADDRESS
+instance AdmitChildBIG ADDRESS
+instance AdmitChildSMALL ADDRESS
+instance AdmitChildEM ADDRESS
+instance AdmitChildSTRONG ADDRESS
+instance AdmitChildDFN ADDRESS
+instance AdmitChildCODE ADDRESS
+instance AdmitChildSAMP ADDRESS
+instance AdmitChildKBD ADDRESS
+instance AdmitChildVAR ADDRESS
+instance AdmitChildCITE ADDRESS
+instance AdmitChildABBR ADDRESS
+instance AdmitChildACRONYM ADDRESS
+instance AdmitChildA ADDRESS
+instance AdmitChildIMG ADDRESS
+instance AdmitChildAPPLET ADDRESS
+instance AdmitChildOBJECT ADDRESS
+instance AdmitChildFONT ADDRESS
+instance AdmitChildBASEFONT ADDRESS
+instance AdmitChildBR ADDRESS
+instance AdmitChildSCRIPT ADDRESS
+instance AdmitChildMAP ADDRESS
+instance AdmitChildQ ADDRESS
+instance AdmitChildSUB ADDRESS
+instance AdmitChildSUP ADDRESS
+instance AdmitChildSPAN ADDRESS
+instance AdmitChildBDO ADDRESS
+instance AdmitChildIFRAME ADDRESS
+instance AdmitChildINPUT ADDRESS
+instance AdmitChildSELECT ADDRESS
+instance AdmitChildTEXTAREA ADDRESS
+instance AdmitChildLABEL ADDRESS
+instance AdmitChildBUTTON ADDRESS
+instance AdmitChildP ADDRESS
+instance TAG BODY
+instance AdmitChildP BODY
+instance AdmitChildH1 BODY
+instance AdmitChildH2 BODY
+instance AdmitChildH3 BODY
+instance AdmitChildH4 BODY
+instance AdmitChildH5 BODY
+instance AdmitChildH6 BODY
+instance AdmitChildUL BODY
+instance AdmitChildOL BODY
+instance AdmitChildDIR BODY
+instance AdmitChildMENU BODY
+instance AdmitChildPRE BODY
+instance AdmitChildDL BODY
+instance AdmitChildDIV BODY
+instance AdmitChildCENTER BODY
+instance AdmitChildNOSCRIPT BODY
+instance AdmitChildNOFRAMES BODY
+instance AdmitChildBLOCKQUOTE BODY
+instance AdmitChildFORM BODY
+instance AdmitChildISINDEX BODY
+instance AdmitChildHR BODY
+instance AdmitChildTABLE BODY
+instance AdmitChildFIELDSET BODY
+instance AdmitChildADDRESS BODY
+instance AdmitChildCDATA BODY
+instance AdmitChildTT BODY
+instance AdmitChildI BODY
+instance AdmitChildB BODY
+instance AdmitChildU BODY
+instance AdmitChildS BODY
+instance AdmitChildSTRIKE BODY
+instance AdmitChildBIG BODY
+instance AdmitChildSMALL BODY
+instance AdmitChildEM BODY
+instance AdmitChildSTRONG BODY
+instance AdmitChildDFN BODY
+instance AdmitChildCODE BODY
+instance AdmitChildSAMP BODY
+instance AdmitChildKBD BODY
+instance AdmitChildVAR BODY
+instance AdmitChildCITE BODY
+instance AdmitChildABBR BODY
+instance AdmitChildACRONYM BODY
+instance AdmitChildA BODY
+instance AdmitChildIMG BODY
+instance AdmitChildAPPLET BODY
+instance AdmitChildOBJECT BODY
+instance AdmitChildFONT BODY
+instance AdmitChildBASEFONT BODY
+instance AdmitChildBR BODY
+instance AdmitChildSCRIPT BODY
+instance AdmitChildMAP BODY
+instance AdmitChildQ BODY
+instance AdmitChildSUB BODY
+instance AdmitChildSUP BODY
+instance AdmitChildSPAN BODY
+instance AdmitChildBDO BODY
+instance AdmitChildIFRAME BODY
+instance AdmitChildINPUT BODY
+instance AdmitChildSELECT BODY
+instance AdmitChildTEXTAREA BODY
+instance AdmitChildLABEL BODY
+instance AdmitChildBUTTON BODY
+instance AdmitChildINS BODY
+instance AdmitChildDEL BODY
+instance TAG BR where make = make_empty
+instance TAG FONT
+instance AdmitChildCDATA FONT
+instance AdmitChildTT FONT
+instance AdmitChildI FONT
+instance AdmitChildB FONT
+instance AdmitChildU FONT
+instance AdmitChildS FONT
+instance AdmitChildSTRIKE FONT
+instance AdmitChildBIG FONT
+instance AdmitChildSMALL FONT
+instance AdmitChildEM FONT
+instance AdmitChildSTRONG FONT
+instance AdmitChildDFN FONT
+instance AdmitChildCODE FONT
+instance AdmitChildSAMP FONT
+instance AdmitChildKBD FONT
+instance AdmitChildVAR FONT
+instance AdmitChildCITE FONT
+instance AdmitChildABBR FONT
+instance AdmitChildACRONYM FONT
+instance AdmitChildA FONT
+instance AdmitChildIMG FONT
+instance AdmitChildAPPLET FONT
+instance AdmitChildOBJECT FONT
+instance AdmitChildFONT FONT
+instance AdmitChildBASEFONT FONT
+instance AdmitChildBR FONT
+instance AdmitChildSCRIPT FONT
+instance AdmitChildMAP FONT
+instance AdmitChildQ FONT
+instance AdmitChildSUB FONT
+instance AdmitChildSUP FONT
+instance AdmitChildSPAN FONT
+instance AdmitChildBDO FONT
+instance AdmitChildIFRAME FONT
+instance AdmitChildINPUT FONT
+instance AdmitChildSELECT FONT
+instance AdmitChildTEXTAREA FONT
+instance AdmitChildLABEL FONT
+instance AdmitChildBUTTON FONT
+instance TAG BASEFONT where make = make_empty
+instance TAG BDO
+instance AdmitChildCDATA BDO
+instance AdmitChildTT BDO
+instance AdmitChildI BDO
+instance AdmitChildB BDO
+instance AdmitChildU BDO
+instance AdmitChildS BDO
+instance AdmitChildSTRIKE BDO
+instance AdmitChildBIG BDO
+instance AdmitChildSMALL BDO
+instance AdmitChildEM BDO
+instance AdmitChildSTRONG BDO
+instance AdmitChildDFN BDO
+instance AdmitChildCODE BDO
+instance AdmitChildSAMP BDO
+instance AdmitChildKBD BDO
+instance AdmitChildVAR BDO
+instance AdmitChildCITE BDO
+instance AdmitChildABBR BDO
+instance AdmitChildACRONYM BDO
+instance AdmitChildA BDO
+instance AdmitChildIMG BDO
+instance AdmitChildAPPLET BDO
+instance AdmitChildOBJECT BDO
+instance AdmitChildFONT BDO
+instance AdmitChildBASEFONT BDO
+instance AdmitChildBR BDO
+instance AdmitChildSCRIPT BDO
+instance AdmitChildMAP BDO
+instance AdmitChildQ BDO
+instance AdmitChildSUB BDO
+instance AdmitChildSUP BDO
+instance AdmitChildSPAN BDO
+instance AdmitChildBDO BDO
+instance AdmitChildIFRAME BDO
+instance AdmitChildINPUT BDO
+instance AdmitChildSELECT BDO
+instance AdmitChildTEXTAREA BDO
+instance AdmitChildLABEL BDO
+instance AdmitChildBUTTON BDO
+instance TAG SPAN
+instance AdmitChildCDATA SPAN
+instance AdmitChildTT SPAN
+instance AdmitChildI SPAN
+instance AdmitChildB SPAN
+instance AdmitChildU SPAN
+instance AdmitChildS SPAN
+instance AdmitChildSTRIKE SPAN
+instance AdmitChildBIG SPAN
+instance AdmitChildSMALL SPAN
+instance AdmitChildEM SPAN
+instance AdmitChildSTRONG SPAN
+instance AdmitChildDFN SPAN
+instance AdmitChildCODE SPAN
+instance AdmitChildSAMP SPAN
+instance AdmitChildKBD SPAN
+instance AdmitChildVAR SPAN
+instance AdmitChildCITE SPAN
+instance AdmitChildABBR SPAN
+instance AdmitChildACRONYM SPAN
+instance AdmitChildA SPAN
+instance AdmitChildIMG SPAN
+instance AdmitChildAPPLET SPAN
+instance AdmitChildOBJECT SPAN
+instance AdmitChildFONT SPAN
+instance AdmitChildBASEFONT SPAN
+instance AdmitChildBR SPAN
+instance AdmitChildSCRIPT SPAN
+instance AdmitChildMAP SPAN
+instance AdmitChildQ SPAN
+instance AdmitChildSUB SPAN
+instance AdmitChildSUP SPAN
+instance AdmitChildSPAN SPAN
+instance AdmitChildBDO SPAN
+instance AdmitChildIFRAME SPAN
+instance AdmitChildINPUT SPAN
+instance AdmitChildSELECT SPAN
+instance AdmitChildTEXTAREA SPAN
+instance AdmitChildLABEL SPAN
+instance AdmitChildBUTTON SPAN
+instance TAG SUB
+instance AdmitChildCDATA SUB
+instance AdmitChildTT SUB
+instance AdmitChildI SUB
+instance AdmitChildB SUB
+instance AdmitChildU SUB
+instance AdmitChildS SUB
+instance AdmitChildSTRIKE SUB
+instance AdmitChildBIG SUB
+instance AdmitChildSMALL SUB
+instance AdmitChildEM SUB
+instance AdmitChildSTRONG SUB
+instance AdmitChildDFN SUB
+instance AdmitChildCODE SUB
+instance AdmitChildSAMP SUB
+instance AdmitChildKBD SUB
+instance AdmitChildVAR SUB
+instance AdmitChildCITE SUB
+instance AdmitChildABBR SUB
+instance AdmitChildACRONYM SUB
+instance AdmitChildA SUB
+instance AdmitChildIMG SUB
+instance AdmitChildAPPLET SUB
+instance AdmitChildOBJECT SUB
+instance AdmitChildFONT SUB
+instance AdmitChildBASEFONT SUB
+instance AdmitChildBR SUB
+instance AdmitChildSCRIPT SUB
+instance AdmitChildMAP SUB
+instance AdmitChildQ SUB
+instance AdmitChildSUB SUB
+instance AdmitChildSUP SUB
+instance AdmitChildSPAN SUB
+instance AdmitChildBDO SUB
+instance AdmitChildIFRAME SUB
+instance AdmitChildINPUT SUB
+instance AdmitChildSELECT SUB
+instance AdmitChildTEXTAREA SUB
+instance AdmitChildLABEL SUB
+instance AdmitChildBUTTON SUB
+instance TAG SUP
+instance AdmitChildCDATA SUP
+instance AdmitChildTT SUP
+instance AdmitChildI SUP
+instance AdmitChildB SUP
+instance AdmitChildU SUP
+instance AdmitChildS SUP
+instance AdmitChildSTRIKE SUP
+instance AdmitChildBIG SUP
+instance AdmitChildSMALL SUP
+instance AdmitChildEM SUP
+instance AdmitChildSTRONG SUP
+instance AdmitChildDFN SUP
+instance AdmitChildCODE SUP
+instance AdmitChildSAMP SUP
+instance AdmitChildKBD SUP
+instance AdmitChildVAR SUP
+instance AdmitChildCITE SUP
+instance AdmitChildABBR SUP
+instance AdmitChildACRONYM SUP
+instance AdmitChildA SUP
+instance AdmitChildIMG SUP
+instance AdmitChildAPPLET SUP
+instance AdmitChildOBJECT SUP
+instance AdmitChildFONT SUP
+instance AdmitChildBASEFONT SUP
+instance AdmitChildBR SUP
+instance AdmitChildSCRIPT SUP
+instance AdmitChildMAP SUP
+instance AdmitChildQ SUP
+instance AdmitChildSUB SUP
+instance AdmitChildSUP SUP
+instance AdmitChildSPAN SUP
+instance AdmitChildBDO SUP
+instance AdmitChildIFRAME SUP
+instance AdmitChildINPUT SUP
+instance AdmitChildSELECT SUP
+instance AdmitChildTEXTAREA SUP
+instance AdmitChildLABEL SUP
+instance AdmitChildBUTTON SUP
+instance TAG TT
+instance AdmitChildCDATA TT
+instance AdmitChildTT TT
+instance AdmitChildI TT
+instance AdmitChildB TT
+instance AdmitChildU TT
+instance AdmitChildS TT
+instance AdmitChildSTRIKE TT
+instance AdmitChildBIG TT
+instance AdmitChildSMALL TT
+instance AdmitChildEM TT
+instance AdmitChildSTRONG TT
+instance AdmitChildDFN TT
+instance AdmitChildCODE TT
+instance AdmitChildSAMP TT
+instance AdmitChildKBD TT
+instance AdmitChildVAR TT
+instance AdmitChildCITE TT
+instance AdmitChildABBR TT
+instance AdmitChildACRONYM TT
+instance AdmitChildA TT
+instance AdmitChildIMG TT
+instance AdmitChildAPPLET TT
+instance AdmitChildOBJECT TT
+instance AdmitChildFONT TT
+instance AdmitChildBASEFONT TT
+instance AdmitChildBR TT
+instance AdmitChildSCRIPT TT
+instance AdmitChildMAP TT
+instance AdmitChildQ TT
+instance AdmitChildSUB TT
+instance AdmitChildSUP TT
+instance AdmitChildSPAN TT
+instance AdmitChildBDO TT
+instance AdmitChildIFRAME TT
+instance AdmitChildINPUT TT
+instance AdmitChildSELECT TT
+instance AdmitChildTEXTAREA TT
+instance AdmitChildLABEL TT
+instance AdmitChildBUTTON TT
+instance TAG I
+instance AdmitChildCDATA I
+instance AdmitChildTT I
+instance AdmitChildI I
+instance AdmitChildB I
+instance AdmitChildU I
+instance AdmitChildS I
+instance AdmitChildSTRIKE I
+instance AdmitChildBIG I
+instance AdmitChildSMALL I
+instance AdmitChildEM I
+instance AdmitChildSTRONG I
+instance AdmitChildDFN I
+instance AdmitChildCODE I
+instance AdmitChildSAMP I
+instance AdmitChildKBD I
+instance AdmitChildVAR I
+instance AdmitChildCITE I
+instance AdmitChildABBR I
+instance AdmitChildACRONYM I
+instance AdmitChildA I
+instance AdmitChildIMG I
+instance AdmitChildAPPLET I
+instance AdmitChildOBJECT I
+instance AdmitChildFONT I
+instance AdmitChildBASEFONT I
+instance AdmitChildBR I
+instance AdmitChildSCRIPT I
+instance AdmitChildMAP I
+instance AdmitChildQ I
+instance AdmitChildSUB I
+instance AdmitChildSUP I
+instance AdmitChildSPAN I
+instance AdmitChildBDO I
+instance AdmitChildIFRAME I
+instance AdmitChildINPUT I
+instance AdmitChildSELECT I
+instance AdmitChildTEXTAREA I
+instance AdmitChildLABEL I
+instance AdmitChildBUTTON I
+instance TAG B
+instance AdmitChildCDATA B
+instance AdmitChildTT B
+instance AdmitChildI B
+instance AdmitChildB B
+instance AdmitChildU B
+instance AdmitChildS B
+instance AdmitChildSTRIKE B
+instance AdmitChildBIG B
+instance AdmitChildSMALL B
+instance AdmitChildEM B
+instance AdmitChildSTRONG B
+instance AdmitChildDFN B
+instance AdmitChildCODE B
+instance AdmitChildSAMP B
+instance AdmitChildKBD B
+instance AdmitChildVAR B
+instance AdmitChildCITE B
+instance AdmitChildABBR B
+instance AdmitChildACRONYM B
+instance AdmitChildA B
+instance AdmitChildIMG B
+instance AdmitChildAPPLET B
+instance AdmitChildOBJECT B
+instance AdmitChildFONT B
+instance AdmitChildBASEFONT B
+instance AdmitChildBR B
+instance AdmitChildSCRIPT B
+instance AdmitChildMAP B
+instance AdmitChildQ B
+instance AdmitChildSUB B
+instance AdmitChildSUP B
+instance AdmitChildSPAN B
+instance AdmitChildBDO B
+instance AdmitChildIFRAME B
+instance AdmitChildINPUT B
+instance AdmitChildSELECT B
+instance AdmitChildTEXTAREA B
+instance AdmitChildLABEL B
+instance AdmitChildBUTTON B
+instance TAG U
+instance AdmitChildCDATA U
+instance AdmitChildTT U
+instance AdmitChildI U
+instance AdmitChildB U
+instance AdmitChildU U
+instance AdmitChildS U
+instance AdmitChildSTRIKE U
+instance AdmitChildBIG U
+instance AdmitChildSMALL U
+instance AdmitChildEM U
+instance AdmitChildSTRONG U
+instance AdmitChildDFN U
+instance AdmitChildCODE U
+instance AdmitChildSAMP U
+instance AdmitChildKBD U
+instance AdmitChildVAR U
+instance AdmitChildCITE U
+instance AdmitChildABBR U
+instance AdmitChildACRONYM U
+instance AdmitChildA U
+instance AdmitChildIMG U
+instance AdmitChildAPPLET U
+instance AdmitChildOBJECT U
+instance AdmitChildFONT U
+instance AdmitChildBASEFONT U
+instance AdmitChildBR U
+instance AdmitChildSCRIPT U
+instance AdmitChildMAP U
+instance AdmitChildQ U
+instance AdmitChildSUB U
+instance AdmitChildSUP U
+instance AdmitChildSPAN U
+instance AdmitChildBDO U
+instance AdmitChildIFRAME U
+instance AdmitChildINPUT U
+instance AdmitChildSELECT U
+instance AdmitChildTEXTAREA U
+instance AdmitChildLABEL U
+instance AdmitChildBUTTON U
+instance TAG S
+instance AdmitChildCDATA S
+instance AdmitChildTT S
+instance AdmitChildI S
+instance AdmitChildB S
+instance AdmitChildU S
+instance AdmitChildS S
+instance AdmitChildSTRIKE S
+instance AdmitChildBIG S
+instance AdmitChildSMALL S
+instance AdmitChildEM S
+instance AdmitChildSTRONG S
+instance AdmitChildDFN S
+instance AdmitChildCODE S
+instance AdmitChildSAMP S
+instance AdmitChildKBD S
+instance AdmitChildVAR S
+instance AdmitChildCITE S
+instance AdmitChildABBR S
+instance AdmitChildACRONYM S
+instance AdmitChildA S
+instance AdmitChildIMG S
+instance AdmitChildAPPLET S
+instance AdmitChildOBJECT S
+instance AdmitChildFONT S
+instance AdmitChildBASEFONT S
+instance AdmitChildBR S
+instance AdmitChildSCRIPT S
+instance AdmitChildMAP S
+instance AdmitChildQ S
+instance AdmitChildSUB S
+instance AdmitChildSUP S
+instance AdmitChildSPAN S
+instance AdmitChildBDO S
+instance AdmitChildIFRAME S
+instance AdmitChildINPUT S
+instance AdmitChildSELECT S
+instance AdmitChildTEXTAREA S
+instance AdmitChildLABEL S
+instance AdmitChildBUTTON S
+instance TAG STRIKE
+instance AdmitChildCDATA STRIKE
+instance AdmitChildTT STRIKE
+instance AdmitChildI STRIKE
+instance AdmitChildB STRIKE
+instance AdmitChildU STRIKE
+instance AdmitChildS STRIKE
+instance AdmitChildSTRIKE STRIKE
+instance AdmitChildBIG STRIKE
+instance AdmitChildSMALL STRIKE
+instance AdmitChildEM STRIKE
+instance AdmitChildSTRONG STRIKE
+instance AdmitChildDFN STRIKE
+instance AdmitChildCODE STRIKE
+instance AdmitChildSAMP STRIKE
+instance AdmitChildKBD STRIKE
+instance AdmitChildVAR STRIKE
+instance AdmitChildCITE STRIKE
+instance AdmitChildABBR STRIKE
+instance AdmitChildACRONYM STRIKE
+instance AdmitChildA STRIKE
+instance AdmitChildIMG STRIKE
+instance AdmitChildAPPLET STRIKE
+instance AdmitChildOBJECT STRIKE
+instance AdmitChildFONT STRIKE
+instance AdmitChildBASEFONT STRIKE
+instance AdmitChildBR STRIKE
+instance AdmitChildSCRIPT STRIKE
+instance AdmitChildMAP STRIKE
+instance AdmitChildQ STRIKE
+instance AdmitChildSUB STRIKE
+instance AdmitChildSUP STRIKE
+instance AdmitChildSPAN STRIKE
+instance AdmitChildBDO STRIKE
+instance AdmitChildIFRAME STRIKE
+instance AdmitChildINPUT STRIKE
+instance AdmitChildSELECT STRIKE
+instance AdmitChildTEXTAREA STRIKE
+instance AdmitChildLABEL STRIKE
+instance AdmitChildBUTTON STRIKE
+instance TAG BIG
+instance AdmitChildCDATA BIG
+instance AdmitChildTT BIG
+instance AdmitChildI BIG
+instance AdmitChildB BIG
+instance AdmitChildU BIG
+instance AdmitChildS BIG
+instance AdmitChildSTRIKE BIG
+instance AdmitChildBIG BIG
+instance AdmitChildSMALL BIG
+instance AdmitChildEM BIG
+instance AdmitChildSTRONG BIG
+instance AdmitChildDFN BIG
+instance AdmitChildCODE BIG
+instance AdmitChildSAMP BIG
+instance AdmitChildKBD BIG
+instance AdmitChildVAR BIG
+instance AdmitChildCITE BIG
+instance AdmitChildABBR BIG
+instance AdmitChildACRONYM BIG
+instance AdmitChildA BIG
+instance AdmitChildIMG BIG
+instance AdmitChildAPPLET BIG
+instance AdmitChildOBJECT BIG
+instance AdmitChildFONT BIG
+instance AdmitChildBASEFONT BIG
+instance AdmitChildBR BIG
+instance AdmitChildSCRIPT BIG
+instance AdmitChildMAP BIG
+instance AdmitChildQ BIG
+instance AdmitChildSUB BIG
+instance AdmitChildSUP BIG
+instance AdmitChildSPAN BIG
+instance AdmitChildBDO BIG
+instance AdmitChildIFRAME BIG
+instance AdmitChildINPUT BIG
+instance AdmitChildSELECT BIG
+instance AdmitChildTEXTAREA BIG
+instance AdmitChildLABEL BIG
+instance AdmitChildBUTTON BIG
+instance TAG SMALL
+instance AdmitChildCDATA SMALL
+instance AdmitChildTT SMALL
+instance AdmitChildI SMALL
+instance AdmitChildB SMALL
+instance AdmitChildU SMALL
+instance AdmitChildS SMALL
+instance AdmitChildSTRIKE SMALL
+instance AdmitChildBIG SMALL
+instance AdmitChildSMALL SMALL
+instance AdmitChildEM SMALL
+instance AdmitChildSTRONG SMALL
+instance AdmitChildDFN SMALL
+instance AdmitChildCODE SMALL
+instance AdmitChildSAMP SMALL
+instance AdmitChildKBD SMALL
+instance AdmitChildVAR SMALL
+instance AdmitChildCITE SMALL
+instance AdmitChildABBR SMALL
+instance AdmitChildACRONYM SMALL
+instance AdmitChildA SMALL
+instance AdmitChildIMG SMALL
+instance AdmitChildAPPLET SMALL
+instance AdmitChildOBJECT SMALL
+instance AdmitChildFONT SMALL
+instance AdmitChildBASEFONT SMALL
+instance AdmitChildBR SMALL
+instance AdmitChildSCRIPT SMALL
+instance AdmitChildMAP SMALL
+instance AdmitChildQ SMALL
+instance AdmitChildSUB SMALL
+instance AdmitChildSUP SMALL
+instance AdmitChildSPAN SMALL
+instance AdmitChildBDO SMALL
+instance AdmitChildIFRAME SMALL
+instance AdmitChildINPUT SMALL
+instance AdmitChildSELECT SMALL
+instance AdmitChildTEXTAREA SMALL
+instance AdmitChildLABEL SMALL
+instance AdmitChildBUTTON SMALL
+instance TAG EM
+instance AdmitChildCDATA EM
+instance AdmitChildTT EM
+instance AdmitChildI EM
+instance AdmitChildB EM
+instance AdmitChildU EM
+instance AdmitChildS EM
+instance AdmitChildSTRIKE EM
+instance AdmitChildBIG EM
+instance AdmitChildSMALL EM
+instance AdmitChildEM EM
+instance AdmitChildSTRONG EM
+instance AdmitChildDFN EM
+instance AdmitChildCODE EM
+instance AdmitChildSAMP EM
+instance AdmitChildKBD EM
+instance AdmitChildVAR EM
+instance AdmitChildCITE EM
+instance AdmitChildABBR EM
+instance AdmitChildACRONYM EM
+instance AdmitChildA EM
+instance AdmitChildIMG EM
+instance AdmitChildAPPLET EM
+instance AdmitChildOBJECT EM
+instance AdmitChildFONT EM
+instance AdmitChildBASEFONT EM
+instance AdmitChildBR EM
+instance AdmitChildSCRIPT EM
+instance AdmitChildMAP EM
+instance AdmitChildQ EM
+instance AdmitChildSUB EM
+instance AdmitChildSUP EM
+instance AdmitChildSPAN EM
+instance AdmitChildBDO EM
+instance AdmitChildIFRAME EM
+instance AdmitChildINPUT EM
+instance AdmitChildSELECT EM
+instance AdmitChildTEXTAREA EM
+instance AdmitChildLABEL EM
+instance AdmitChildBUTTON EM
+instance TAG STRONG
+instance AdmitChildCDATA STRONG
+instance AdmitChildTT STRONG
+instance AdmitChildI STRONG
+instance AdmitChildB STRONG
+instance AdmitChildU STRONG
+instance AdmitChildS STRONG
+instance AdmitChildSTRIKE STRONG
+instance AdmitChildBIG STRONG
+instance AdmitChildSMALL STRONG
+instance AdmitChildEM STRONG
+instance AdmitChildSTRONG STRONG
+instance AdmitChildDFN STRONG
+instance AdmitChildCODE STRONG
+instance AdmitChildSAMP STRONG
+instance AdmitChildKBD STRONG
+instance AdmitChildVAR STRONG
+instance AdmitChildCITE STRONG
+instance AdmitChildABBR STRONG
+instance AdmitChildACRONYM STRONG
+instance AdmitChildA STRONG
+instance AdmitChildIMG STRONG
+instance AdmitChildAPPLET STRONG
+instance AdmitChildOBJECT STRONG
+instance AdmitChildFONT STRONG
+instance AdmitChildBASEFONT STRONG
+instance AdmitChildBR STRONG
+instance AdmitChildSCRIPT STRONG
+instance AdmitChildMAP STRONG
+instance AdmitChildQ STRONG
+instance AdmitChildSUB STRONG
+instance AdmitChildSUP STRONG
+instance AdmitChildSPAN STRONG
+instance AdmitChildBDO STRONG
+instance AdmitChildIFRAME STRONG
+instance AdmitChildINPUT STRONG
+instance AdmitChildSELECT STRONG
+instance AdmitChildTEXTAREA STRONG
+instance AdmitChildLABEL STRONG
+instance AdmitChildBUTTON STRONG
+instance TAG DFN
+instance AdmitChildCDATA DFN
+instance AdmitChildTT DFN
+instance AdmitChildI DFN
+instance AdmitChildB DFN
+instance AdmitChildU DFN
+instance AdmitChildS DFN
+instance AdmitChildSTRIKE DFN
+instance AdmitChildBIG DFN
+instance AdmitChildSMALL DFN
+instance AdmitChildEM DFN
+instance AdmitChildSTRONG DFN
+instance AdmitChildDFN DFN
+instance AdmitChildCODE DFN
+instance AdmitChildSAMP DFN
+instance AdmitChildKBD DFN
+instance AdmitChildVAR DFN
+instance AdmitChildCITE DFN
+instance AdmitChildABBR DFN
+instance AdmitChildACRONYM DFN
+instance AdmitChildA DFN
+instance AdmitChildIMG DFN
+instance AdmitChildAPPLET DFN
+instance AdmitChildOBJECT DFN
+instance AdmitChildFONT DFN
+instance AdmitChildBASEFONT DFN
+instance AdmitChildBR DFN
+instance AdmitChildSCRIPT DFN
+instance AdmitChildMAP DFN
+instance AdmitChildQ DFN
+instance AdmitChildSUB DFN
+instance AdmitChildSUP DFN
+instance AdmitChildSPAN DFN
+instance AdmitChildBDO DFN
+instance AdmitChildIFRAME DFN
+instance AdmitChildINPUT DFN
+instance AdmitChildSELECT DFN
+instance AdmitChildTEXTAREA DFN
+instance AdmitChildLABEL DFN
+instance AdmitChildBUTTON DFN
+instance TAG CODE
+instance AdmitChildCDATA CODE
+instance AdmitChildTT CODE
+instance AdmitChildI CODE
+instance AdmitChildB CODE
+instance AdmitChildU CODE
+instance AdmitChildS CODE
+instance AdmitChildSTRIKE CODE
+instance AdmitChildBIG CODE
+instance AdmitChildSMALL CODE
+instance AdmitChildEM CODE
+instance AdmitChildSTRONG CODE
+instance AdmitChildDFN CODE
+instance AdmitChildCODE CODE
+instance AdmitChildSAMP CODE
+instance AdmitChildKBD CODE
+instance AdmitChildVAR CODE
+instance AdmitChildCITE CODE
+instance AdmitChildABBR CODE
+instance AdmitChildACRONYM CODE
+instance AdmitChildA CODE
+instance AdmitChildIMG CODE
+instance AdmitChildAPPLET CODE
+instance AdmitChildOBJECT CODE
+instance AdmitChildFONT CODE
+instance AdmitChildBASEFONT CODE
+instance AdmitChildBR CODE
+instance AdmitChildSCRIPT CODE
+instance AdmitChildMAP CODE
+instance AdmitChildQ CODE
+instance AdmitChildSUB CODE
+instance AdmitChildSUP CODE
+instance AdmitChildSPAN CODE
+instance AdmitChildBDO CODE
+instance AdmitChildIFRAME CODE
+instance AdmitChildINPUT CODE
+instance AdmitChildSELECT CODE
+instance AdmitChildTEXTAREA CODE
+instance AdmitChildLABEL CODE
+instance AdmitChildBUTTON CODE
+instance TAG SAMP
+instance AdmitChildCDATA SAMP
+instance AdmitChildTT SAMP
+instance AdmitChildI SAMP
+instance AdmitChildB SAMP
+instance AdmitChildU SAMP
+instance AdmitChildS SAMP
+instance AdmitChildSTRIKE SAMP
+instance AdmitChildBIG SAMP
+instance AdmitChildSMALL SAMP
+instance AdmitChildEM SAMP
+instance AdmitChildSTRONG SAMP
+instance AdmitChildDFN SAMP
+instance AdmitChildCODE SAMP
+instance AdmitChildSAMP SAMP
+instance AdmitChildKBD SAMP
+instance AdmitChildVAR SAMP
+instance AdmitChildCITE SAMP
+instance AdmitChildABBR SAMP
+instance AdmitChildACRONYM SAMP
+instance AdmitChildA SAMP
+instance AdmitChildIMG SAMP
+instance AdmitChildAPPLET SAMP
+instance AdmitChildOBJECT SAMP
+instance AdmitChildFONT SAMP
+instance AdmitChildBASEFONT SAMP
+instance AdmitChildBR SAMP
+instance AdmitChildSCRIPT SAMP
+instance AdmitChildMAP SAMP
+instance AdmitChildQ SAMP
+instance AdmitChildSUB SAMP
+instance AdmitChildSUP SAMP
+instance AdmitChildSPAN SAMP
+instance AdmitChildBDO SAMP
+instance AdmitChildIFRAME SAMP
+instance AdmitChildINPUT SAMP
+instance AdmitChildSELECT SAMP
+instance AdmitChildTEXTAREA SAMP
+instance AdmitChildLABEL SAMP
+instance AdmitChildBUTTON SAMP
+instance TAG KBD
+instance AdmitChildCDATA KBD
+instance AdmitChildTT KBD
+instance AdmitChildI KBD
+instance AdmitChildB KBD
+instance AdmitChildU KBD
+instance AdmitChildS KBD
+instance AdmitChildSTRIKE KBD
+instance AdmitChildBIG KBD
+instance AdmitChildSMALL KBD
+instance AdmitChildEM KBD
+instance AdmitChildSTRONG KBD
+instance AdmitChildDFN KBD
+instance AdmitChildCODE KBD
+instance AdmitChildSAMP KBD
+instance AdmitChildKBD KBD
+instance AdmitChildVAR KBD
+instance AdmitChildCITE KBD
+instance AdmitChildABBR KBD
+instance AdmitChildACRONYM KBD
+instance AdmitChildA KBD
+instance AdmitChildIMG KBD
+instance AdmitChildAPPLET KBD
+instance AdmitChildOBJECT KBD
+instance AdmitChildFONT KBD
+instance AdmitChildBASEFONT KBD
+instance AdmitChildBR KBD
+instance AdmitChildSCRIPT KBD
+instance AdmitChildMAP KBD
+instance AdmitChildQ KBD
+instance AdmitChildSUB KBD
+instance AdmitChildSUP KBD
+instance AdmitChildSPAN KBD
+instance AdmitChildBDO KBD
+instance AdmitChildIFRAME KBD
+instance AdmitChildINPUT KBD
+instance AdmitChildSELECT KBD
+instance AdmitChildTEXTAREA KBD
+instance AdmitChildLABEL KBD
+instance AdmitChildBUTTON KBD
+instance TAG VAR
+instance AdmitChildCDATA VAR
+instance AdmitChildTT VAR
+instance AdmitChildI VAR
+instance AdmitChildB VAR
+instance AdmitChildU VAR
+instance AdmitChildS VAR
+instance AdmitChildSTRIKE VAR
+instance AdmitChildBIG VAR
+instance AdmitChildSMALL VAR
+instance AdmitChildEM VAR
+instance AdmitChildSTRONG VAR
+instance AdmitChildDFN VAR
+instance AdmitChildCODE VAR
+instance AdmitChildSAMP VAR
+instance AdmitChildKBD VAR
+instance AdmitChildVAR VAR
+instance AdmitChildCITE VAR
+instance AdmitChildABBR VAR
+instance AdmitChildACRONYM VAR
+instance AdmitChildA VAR
+instance AdmitChildIMG VAR
+instance AdmitChildAPPLET VAR
+instance AdmitChildOBJECT VAR
+instance AdmitChildFONT VAR
+instance AdmitChildBASEFONT VAR
+instance AdmitChildBR VAR
+instance AdmitChildSCRIPT VAR
+instance AdmitChildMAP VAR
+instance AdmitChildQ VAR
+instance AdmitChildSUB VAR
+instance AdmitChildSUP VAR
+instance AdmitChildSPAN VAR
+instance AdmitChildBDO VAR
+instance AdmitChildIFRAME VAR
+instance AdmitChildINPUT VAR
+instance AdmitChildSELECT VAR
+instance AdmitChildTEXTAREA VAR
+instance AdmitChildLABEL VAR
+instance AdmitChildBUTTON VAR
+instance TAG CITE
+instance AdmitChildCDATA CITE
+instance AdmitChildTT CITE
+instance AdmitChildI CITE
+instance AdmitChildB CITE
+instance AdmitChildU CITE
+instance AdmitChildS CITE
+instance AdmitChildSTRIKE CITE
+instance AdmitChildBIG CITE
+instance AdmitChildSMALL CITE
+instance AdmitChildEM CITE
+instance AdmitChildSTRONG CITE
+instance AdmitChildDFN CITE
+instance AdmitChildCODE CITE
+instance AdmitChildSAMP CITE
+instance AdmitChildKBD CITE
+instance AdmitChildVAR CITE
+instance AdmitChildCITE CITE
+instance AdmitChildABBR CITE
+instance AdmitChildACRONYM CITE
+instance AdmitChildA CITE
+instance AdmitChildIMG CITE
+instance AdmitChildAPPLET CITE
+instance AdmitChildOBJECT CITE
+instance AdmitChildFONT CITE
+instance AdmitChildBASEFONT CITE
+instance AdmitChildBR CITE
+instance AdmitChildSCRIPT CITE
+instance AdmitChildMAP CITE
+instance AdmitChildQ CITE
+instance AdmitChildSUB CITE
+instance AdmitChildSUP CITE
+instance AdmitChildSPAN CITE
+instance AdmitChildBDO CITE
+instance AdmitChildIFRAME CITE
+instance AdmitChildINPUT CITE
+instance AdmitChildSELECT CITE
+instance AdmitChildTEXTAREA CITE
+instance AdmitChildLABEL CITE
+instance AdmitChildBUTTON CITE
+instance TAG ABBR
+instance AdmitChildCDATA ABBR
+instance AdmitChildTT ABBR
+instance AdmitChildI ABBR
+instance AdmitChildB ABBR
+instance AdmitChildU ABBR
+instance AdmitChildS ABBR
+instance AdmitChildSTRIKE ABBR
+instance AdmitChildBIG ABBR
+instance AdmitChildSMALL ABBR
+instance AdmitChildEM ABBR
+instance AdmitChildSTRONG ABBR
+instance AdmitChildDFN ABBR
+instance AdmitChildCODE ABBR
+instance AdmitChildSAMP ABBR
+instance AdmitChildKBD ABBR
+instance AdmitChildVAR ABBR
+instance AdmitChildCITE ABBR
+instance AdmitChildABBR ABBR
+instance AdmitChildACRONYM ABBR
+instance AdmitChildA ABBR
+instance AdmitChildIMG ABBR
+instance AdmitChildAPPLET ABBR
+instance AdmitChildOBJECT ABBR
+instance AdmitChildFONT ABBR
+instance AdmitChildBASEFONT ABBR
+instance AdmitChildBR ABBR
+instance AdmitChildSCRIPT ABBR
+instance AdmitChildMAP ABBR
+instance AdmitChildQ ABBR
+instance AdmitChildSUB ABBR
+instance AdmitChildSUP ABBR
+instance AdmitChildSPAN ABBR
+instance AdmitChildBDO ABBR
+instance AdmitChildIFRAME ABBR
+instance AdmitChildINPUT ABBR
+instance AdmitChildSELECT ABBR
+instance AdmitChildTEXTAREA ABBR
+instance AdmitChildLABEL ABBR
+instance AdmitChildBUTTON ABBR
+instance TAG ACRONYM
+instance AdmitChildCDATA ACRONYM
+instance AdmitChildTT ACRONYM
+instance AdmitChildI ACRONYM
+instance AdmitChildB ACRONYM
+instance AdmitChildU ACRONYM
+instance AdmitChildS ACRONYM
+instance AdmitChildSTRIKE ACRONYM
+instance AdmitChildBIG ACRONYM
+instance AdmitChildSMALL ACRONYM
+instance AdmitChildEM ACRONYM
+instance AdmitChildSTRONG ACRONYM
+instance AdmitChildDFN ACRONYM
+instance AdmitChildCODE ACRONYM
+instance AdmitChildSAMP ACRONYM
+instance AdmitChildKBD ACRONYM
+instance AdmitChildVAR ACRONYM
+instance AdmitChildCITE ACRONYM
+instance AdmitChildABBR ACRONYM
+instance AdmitChildACRONYM ACRONYM
+instance AdmitChildA ACRONYM
+instance AdmitChildIMG ACRONYM
+instance AdmitChildAPPLET ACRONYM
+instance AdmitChildOBJECT ACRONYM
+instance AdmitChildFONT ACRONYM
+instance AdmitChildBASEFONT ACRONYM
+instance AdmitChildBR ACRONYM
+instance AdmitChildSCRIPT ACRONYM
+instance AdmitChildMAP ACRONYM
+instance AdmitChildQ ACRONYM
+instance AdmitChildSUB ACRONYM
+instance AdmitChildSUP ACRONYM
+instance AdmitChildSPAN ACRONYM
+instance AdmitChildBDO ACRONYM
+instance AdmitChildIFRAME ACRONYM
+instance AdmitChildINPUT ACRONYM
+instance AdmitChildSELECT ACRONYM
+instance AdmitChildTEXTAREA ACRONYM
+instance AdmitChildLABEL ACRONYM
+instance AdmitChildBUTTON ACRONYM
+data ALIGN_bottom = ALIGN_bottom
+data ALIGN_center = ALIGN_center
+data ALIGN_char = ALIGN_char
+data ALIGN_justify = ALIGN_justify
+data ALIGN_left = ALIGN_left
+data ALIGN_middle = ALIGN_middle
+data ALIGN_right = ALIGN_right
+data ALIGN_top = ALIGN_top
+data CHECKED_checked = CHECKED_checked
+data CLEAR_all = CLEAR_all
+data CLEAR_left = CLEAR_left
+data CLEAR_none = CLEAR_none
+data CLEAR_right = CLEAR_right
+data COMPACT_compact = COMPACT_compact
+data DECLARE_declare = DECLARE_declare
+data DEFER_defer = DEFER_defer
+data DIR_ltr = DIR_ltr
+data DIR_rtl = DIR_rtl
+data DISABLED_disabled = DISABLED_disabled
+data FRAME_above = FRAME_above
+data FRAME_below = FRAME_below
+data FRAME_border = FRAME_border
+data FRAME_box = FRAME_box
+data FRAME_hsides = FRAME_hsides
+data FRAME_lhs = FRAME_lhs
+data FRAME_rhs = FRAME_rhs
+data FRAME_void = FRAME_void
+data FRAME_vsides = FRAME_vsides
+data ISMAP_ismap = ISMAP_ismap
+data METHOD_GET = METHOD_GET
+data METHOD_POST = METHOD_POST
+data MULTIPLE_multiple = MULTIPLE_multiple
+data NOHREF_nohref = NOHREF_nohref
+data NOSHADE_noshade = NOSHADE_noshade
+data NOWRAP_nowrap = NOWRAP_nowrap
+data READONLY_readonly = READONLY_readonly
+data RULES_all = RULES_all
+data RULES_cols = RULES_cols
+data RULES_groups = RULES_groups
+data RULES_none = RULES_none
+data RULES_rows = RULES_rows
+data SCOPE_col = SCOPE_col
+data SCOPE_colgroup = SCOPE_colgroup
+data SCOPE_row = SCOPE_row
+data SCOPE_rowgroup = SCOPE_rowgroup
+data SCROLLING_auto = SCROLLING_auto
+data SCROLLING_no = SCROLLING_no
+data SCROLLING_yes = SCROLLING_yes
+data SELECTED_selected = SELECTED_selected
+data SHAPE_circle = SHAPE_circle
+data SHAPE_default' = SHAPE_default'
+data SHAPE_poly = SHAPE_poly
+data SHAPE_rect = SHAPE_rect
+data TYPE_BUTTON = TYPE_BUTTON
+data TYPE_CHECKBOX = TYPE_CHECKBOX
+data TYPE_FILE = TYPE_FILE
+data TYPE_HIDDEN = TYPE_HIDDEN
+data TYPE_IMAGE = TYPE_IMAGE
+data TYPE_PASSWORD = TYPE_PASSWORD
+data TYPE_RADIO = TYPE_RADIO
+data TYPE_RESET = TYPE_RESET
+data TYPE_SUBMIT = TYPE_SUBMIT
+data TYPE_TEXT = TYPE_TEXT
+data TYPE_button = TYPE_button
+data TYPE_circle = TYPE_circle
+data TYPE_disc = TYPE_disc
+data TYPE_reset = TYPE_reset
+data TYPE_square = TYPE_square
+data TYPE_submit = TYPE_submit
+data VALIGN_baseline = VALIGN_baseline
+data VALIGN_bottom = VALIGN_bottom
+data VALIGN_middle = VALIGN_middle
+data VALIGN_top = VALIGN_top
+data VALUETYPE_DATA = VALUETYPE_DATA
+data VALUETYPE_OBJECT = VALUETYPE_OBJECT
+data VALUETYPE_REF = VALUETYPE_REF
+instance ATTRIBUTE ABBR
+instance ATTRIBUTE ACCEPT
+instance ATTRIBUTE ACCEPT_CHARSET
+instance ATTRIBUTE ACCESSKEY
+instance ATTRIBUTE ACTION
+instance ATTRIBUTE ALIGN
+instance ATTRIBUTE ALINK
+instance ATTRIBUTE ALT
+instance ATTRIBUTE ARCHIVE
+instance ATTRIBUTE AXIS
+instance ATTRIBUTE BACKGROUND
+instance ATTRIBUTE BGCOLOR
+instance ATTRIBUTE BORDER
+instance ATTRIBUTE CELLPADDING
+instance ATTRIBUTE CELLSPACING
+instance ATTRIBUTE CHAR
+instance ATTRIBUTE CHAROFF
+instance ATTRIBUTE CHARSET
+instance ATTRIBUTE CHECKED
+instance ATTRIBUTE CITE
+instance ATTRIBUTE CLASS
+instance ATTRIBUTE CLASSID
+instance ATTRIBUTE CLEAR
+instance ATTRIBUTE CODE
+instance ATTRIBUTE CODEBASE
+instance ATTRIBUTE CODETYPE
+instance ATTRIBUTE COLOR
+instance ATTRIBUTE COLS
+instance ATTRIBUTE COLSPAN
+instance ATTRIBUTE COMPACT
+instance ATTRIBUTE CONTENT
+instance ATTRIBUTE COORDS
+instance ATTRIBUTE DATA
+instance ATTRIBUTE DATAPAGESIZE
+instance ATTRIBUTE DATETIME
+instance ATTRIBUTE DECLARE
+instance ATTRIBUTE DEFER
+instance ATTRIBUTE DIR
+instance ATTRIBUTE DISABLED
+instance ATTRIBUTE ENCTYPE
+instance ATTRIBUTE EVENT
+instance ATTRIBUTE FACE
+instance ATTRIBUTE FOR
+instance ATTRIBUTE FRAME
+instance ATTRIBUTE FRAMEBORDER
+instance ATTRIBUTE HEADERS
+instance ATTRIBUTE HEIGHT
+instance ATTRIBUTE HREF
+instance ATTRIBUTE HREFLANG
+instance ATTRIBUTE HSPACE
+instance ATTRIBUTE HTTP_EQUIV
+instance ATTRIBUTE ID
+instance ATTRIBUTE ISMAP
+instance ATTRIBUTE LABEL
+instance ATTRIBUTE LANG
+instance ATTRIBUTE LANGUAGE
+instance ATTRIBUTE LINK
+instance ATTRIBUTE LONGDESC
+instance ATTRIBUTE MARGINHEIGHT
+instance ATTRIBUTE MARGINWIDTH
+instance ATTRIBUTE MAXLENGTH
+instance ATTRIBUTE MEDIA
+instance ATTRIBUTE METHOD
+instance ATTRIBUTE MULTIPLE
+instance ATTRIBUTE NAME
+instance ATTRIBUTE NOHREF
+instance ATTRIBUTE NOSHADE
+instance ATTRIBUTE NOWRAP
+instance ATTRIBUTE OBJECT
+instance ATTRIBUTE ONBLUR
+instance ATTRIBUTE ONCHANGE
+instance ATTRIBUTE ONCLICK
+instance ATTRIBUTE ONDBLCLICK
+instance ATTRIBUTE ONFOCUS
+instance ATTRIBUTE ONKEYDOWN
+instance ATTRIBUTE ONKEYPRESS
+instance ATTRIBUTE ONKEYUP
+instance ATTRIBUTE ONLOAD
+instance ATTRIBUTE ONMOUSEDOWN
+instance ATTRIBUTE ONMOUSEMOVE
+instance ATTRIBUTE ONMOUSEOUT
+instance ATTRIBUTE ONMOUSEOVER
+instance ATTRIBUTE ONMOUSEUP
+instance ATTRIBUTE ONRESET
+instance ATTRIBUTE ONSELECT
+instance ATTRIBUTE ONSUBMIT
+instance ATTRIBUTE ONUNLOAD
+instance ATTRIBUTE PROFILE
+instance ATTRIBUTE PROMPT
+instance ATTRIBUTE READONLY
+instance ATTRIBUTE REL
+instance ATTRIBUTE REV
+instance ATTRIBUTE ROWS
+instance ATTRIBUTE ROWSPAN
+instance ATTRIBUTE RULES
+instance ATTRIBUTE SCHEME
+instance ATTRIBUTE SCOPE
+instance ATTRIBUTE SCROLLING
+instance ATTRIBUTE SELECTED
+instance ATTRIBUTE SHAPE
+instance ATTRIBUTE SIZE
+instance ATTRIBUTE SPAN
+instance ATTRIBUTE SRC
+instance ATTRIBUTE STANDBY
+instance ATTRIBUTE START
+instance ATTRIBUTE STYLE
+instance ATTRIBUTE SUMMARY
+instance ATTRIBUTE TABINDEX
+instance ATTRIBUTE TARGET
+instance ATTRIBUTE TEXT
+instance ATTRIBUTE TITLE
+instance ATTRIBUTE TYPE
+instance ATTRIBUTE USEMAP
+instance ATTRIBUTE VALIGN
+instance ATTRIBUTE VALUE
+instance ATTRIBUTE VALUETYPE
+instance ATTRIBUTE VERSION
+instance ATTRIBUTE VLINK
+instance ATTRIBUTE VSPACE
+instance ATTRIBUTE WIDTH
+instance AttrValueABBR Char
+instance AttrValueABBR a => AttrValueABBR [a]
+instance AttrValueACCEPT Char
+instance AttrValueACCEPT a => AttrValueACCEPT [a]
+instance AttrValueACCEPT_CHARSET Char
+instance AttrValueACCEPT_CHARSET a => AttrValueACCEPT_CHARSET [a]
+instance AttrValueACCESSKEY Char
+instance AttrValueACCESSKEY a => AttrValueACCESSKEY [a]
+instance AttrValueACTION Char
+instance AttrValueACTION a => AttrValueACTION [a]
+instance AttrValueALIGN ALIGN_bottom
+instance AttrValueALIGN ALIGN_center
+instance AttrValueALIGN ALIGN_char
+instance AttrValueALIGN ALIGN_justify
+instance AttrValueALIGN ALIGN_left
+instance AttrValueALIGN ALIGN_middle
+instance AttrValueALIGN ALIGN_right
+instance AttrValueALIGN ALIGN_top
+instance AttrValueALINK Char
+instance AttrValueALINK a => AttrValueALINK [a]
+instance AttrValueALT Char
+instance AttrValueALT a => AttrValueALT [a]
+instance AttrValueARCHIVE Char
+instance AttrValueARCHIVE a => AttrValueARCHIVE [a]
+instance AttrValueAXIS Char
+instance AttrValueAXIS a => AttrValueAXIS [a]
+instance AttrValueBACKGROUND Char
+instance AttrValueBACKGROUND a => AttrValueBACKGROUND [a]
+instance AttrValueBGCOLOR Char
+instance AttrValueBGCOLOR a => AttrValueBGCOLOR [a]
+instance AttrValueBORDER Char
+instance AttrValueBORDER a => AttrValueBORDER [a]
+instance AttrValueCELLPADDING Char
+instance AttrValueCELLPADDING a => AttrValueCELLPADDING [a]
+instance AttrValueCELLSPACING Char
+instance AttrValueCELLSPACING a => AttrValueCELLSPACING [a]
+instance AttrValueCHAR Char
+instance AttrValueCHAR a => AttrValueCHAR [a]
+instance AttrValueCHAROFF Char
+instance AttrValueCHAROFF a => AttrValueCHAROFF [a]
+instance AttrValueCHARSET Char
+instance AttrValueCHARSET a => AttrValueCHARSET [a]
+instance AttrValueCHECKED CHECKED_checked
+instance AttrValueCITE Char
+instance AttrValueCITE a => AttrValueCITE [a]
+instance AttrValueCLASS Char
+instance AttrValueCLASS a => AttrValueCLASS [a]
+instance AttrValueCLASSID Char
+instance AttrValueCLASSID a => AttrValueCLASSID [a]
+instance AttrValueCLEAR CLEAR_all
+instance AttrValueCLEAR CLEAR_left
+instance AttrValueCLEAR CLEAR_none
+instance AttrValueCLEAR CLEAR_right
+instance AttrValueCODE Char
+instance AttrValueCODE a => AttrValueCODE [a]
+instance AttrValueCODEBASE Char
+instance AttrValueCODEBASE a => AttrValueCODEBASE [a]
+instance AttrValueCODETYPE Char
+instance AttrValueCODETYPE a => AttrValueCODETYPE [a]
+instance AttrValueCOLOR Char
+instance AttrValueCOLOR a => AttrValueCOLOR [a]
+instance AttrValueCOLS Int
+instance AttrValueCOLSPAN Int
+instance AttrValueCOMPACT COMPACT_compact
+instance AttrValueCONTENT Char
+instance AttrValueCONTENT a => AttrValueCONTENT [a]
+instance AttrValueCOORDS Char
+instance AttrValueCOORDS a => AttrValueCOORDS [a]
+instance AttrValueDATA Char
+instance AttrValueDATA a => AttrValueDATA [a]
+instance AttrValueDATAPAGESIZE Char
+instance AttrValueDATAPAGESIZE a => AttrValueDATAPAGESIZE [a]
+instance AttrValueDATETIME Char
+instance AttrValueDATETIME a => AttrValueDATETIME [a]
+instance AttrValueDECLARE DECLARE_declare
+instance AttrValueDEFER DEFER_defer
+instance AttrValueDIR DIR_ltr
+instance AttrValueDIR DIR_rtl
+instance AttrValueDISABLED DISABLED_disabled
+instance AttrValueENCTYPE Char
+instance AttrValueENCTYPE a => AttrValueENCTYPE [a]
+instance AttrValueEVENT Char
+instance AttrValueEVENT a => AttrValueEVENT [a]
+instance AttrValueFACE Char
+instance AttrValueFACE a => AttrValueFACE [a]
+instance AttrValueFOR Char
+instance AttrValueFOR a => AttrValueFOR [a]
+instance AttrValueFRAME FRAME_above
+instance AttrValueFRAME FRAME_below
+instance AttrValueFRAME FRAME_border
+instance AttrValueFRAME FRAME_box
+instance AttrValueFRAME FRAME_hsides
+instance AttrValueFRAME FRAME_lhs
+instance AttrValueFRAME FRAME_rhs
+instance AttrValueFRAME FRAME_void
+instance AttrValueFRAME FRAME_vsides
+instance AttrValueFRAMEBORDER Int
+instance AttrValueHEADERS Char
+instance AttrValueHEADERS a => AttrValueHEADERS [a]
+instance AttrValueHEIGHT Char
+instance AttrValueHEIGHT a => AttrValueHEIGHT [a]
+instance AttrValueHREF Char
+instance AttrValueHREF a => AttrValueHREF [a]
+instance AttrValueHREFLANG Char
+instance AttrValueHREFLANG a => AttrValueHREFLANG [a]
+instance AttrValueHSPACE Char
+instance AttrValueHSPACE a => AttrValueHSPACE [a]
+instance AttrValueHTTP_EQUIV Char
+instance AttrValueHTTP_EQUIV a => AttrValueHTTP_EQUIV [a]
+instance AttrValueID Char
+instance AttrValueID a => AttrValueID [a]
+instance AttrValueISMAP ISMAP_ismap
+instance AttrValueLABEL Char
+instance AttrValueLABEL a => AttrValueLABEL [a]
+instance AttrValueLANG Char
+instance AttrValueLANG a => AttrValueLANG [a]
+instance AttrValueLANGUAGE Char
+instance AttrValueLANGUAGE a => AttrValueLANGUAGE [a]
+instance AttrValueLINK Char
+instance AttrValueLINK a => AttrValueLINK [a]
+instance AttrValueLONGDESC Char
+instance AttrValueLONGDESC a => AttrValueLONGDESC [a]
+instance AttrValueMARGINHEIGHT Char
+instance AttrValueMARGINHEIGHT a => AttrValueMARGINHEIGHT [a]
+instance AttrValueMARGINWIDTH Char
+instance AttrValueMARGINWIDTH a => AttrValueMARGINWIDTH [a]
+instance AttrValueMAXLENGTH Int
+instance AttrValueMEDIA Char
+instance AttrValueMEDIA a => AttrValueMEDIA [a]
+instance AttrValueMETHOD METHOD_GET
+instance AttrValueMETHOD METHOD_POST
+instance AttrValueMULTIPLE MULTIPLE_multiple
+instance AttrValueNAME Char
+instance AttrValueNAME a => AttrValueNAME [a]
+instance AttrValueNOHREF NOHREF_nohref
+instance AttrValueNOSHADE NOSHADE_noshade
+instance AttrValueNOWRAP NOWRAP_nowrap
+instance AttrValueOBJECT Char
+instance AttrValueOBJECT a => AttrValueOBJECT [a]
+instance AttrValueONBLUR Char
+instance AttrValueONBLUR a => AttrValueONBLUR [a]
+instance AttrValueONCHANGE Char
+instance AttrValueONCHANGE a => AttrValueONCHANGE [a]
+instance AttrValueONCLICK Char
+instance AttrValueONCLICK a => AttrValueONCLICK [a]
+instance AttrValueONDBLCLICK Char
+instance AttrValueONDBLCLICK a => AttrValueONDBLCLICK [a]
+instance AttrValueONFOCUS Char
+instance AttrValueONFOCUS a => AttrValueONFOCUS [a]
+instance AttrValueONKEYDOWN Char
+instance AttrValueONKEYDOWN a => AttrValueONKEYDOWN [a]
+instance AttrValueONKEYPRESS Char
+instance AttrValueONKEYPRESS a => AttrValueONKEYPRESS [a]
+instance AttrValueONKEYUP Char
+instance AttrValueONKEYUP a => AttrValueONKEYUP [a]
+instance AttrValueONLOAD Char
+instance AttrValueONLOAD a => AttrValueONLOAD [a]
+instance AttrValueONMOUSEDOWN Char
+instance AttrValueONMOUSEDOWN a => AttrValueONMOUSEDOWN [a]
+instance AttrValueONMOUSEMOVE Char
+instance AttrValueONMOUSEMOVE a => AttrValueONMOUSEMOVE [a]
+instance AttrValueONMOUSEOUT Char
+instance AttrValueONMOUSEOUT a => AttrValueONMOUSEOUT [a]
+instance AttrValueONMOUSEOVER Char
+instance AttrValueONMOUSEOVER a => AttrValueONMOUSEOVER [a]
+instance AttrValueONMOUSEUP Char
+instance AttrValueONMOUSEUP a => AttrValueONMOUSEUP [a]
+instance AttrValueONRESET Char
+instance AttrValueONRESET a => AttrValueONRESET [a]
+instance AttrValueONSELECT Char
+instance AttrValueONSELECT a => AttrValueONSELECT [a]
+instance AttrValueONSUBMIT Char
+instance AttrValueONSUBMIT a => AttrValueONSUBMIT [a]
+instance AttrValueONUNLOAD Char
+instance AttrValueONUNLOAD a => AttrValueONUNLOAD [a]
+instance AttrValuePROFILE Char
+instance AttrValuePROFILE a => AttrValuePROFILE [a]
+instance AttrValuePROMPT Char
+instance AttrValuePROMPT a => AttrValuePROMPT [a]
+instance AttrValueREADONLY READONLY_readonly
+instance AttrValueREL Char
+instance AttrValueREL a => AttrValueREL [a]
+instance AttrValueREV Char
+instance AttrValueREV a => AttrValueREV [a]
+instance AttrValueROWS Int
+instance AttrValueROWSPAN Int
+instance AttrValueRULES RULES_all
+instance AttrValueRULES RULES_cols
+instance AttrValueRULES RULES_groups
+instance AttrValueRULES RULES_none
+instance AttrValueRULES RULES_rows
+instance AttrValueSCHEME Char
+instance AttrValueSCHEME a => AttrValueSCHEME [a]
+instance AttrValueSCOPE SCOPE_col
+instance AttrValueSCOPE SCOPE_colgroup
+instance AttrValueSCOPE SCOPE_row
+instance AttrValueSCOPE SCOPE_rowgroup
+instance AttrValueSCROLLING SCROLLING_auto
+instance AttrValueSCROLLING SCROLLING_no
+instance AttrValueSCROLLING SCROLLING_yes
+instance AttrValueSELECTED SELECTED_selected
+instance AttrValueSHAPE SHAPE_circle
+instance AttrValueSHAPE SHAPE_default'
+instance AttrValueSHAPE SHAPE_poly
+instance AttrValueSHAPE SHAPE_rect
+instance AttrValueSIZE Char
+instance AttrValueSIZE Int
+instance AttrValueSIZE a => AttrValueSIZE [a]
+instance AttrValueSPAN Int
+instance AttrValueSRC Char
+instance AttrValueSRC a => AttrValueSRC [a]
+instance AttrValueSTANDBY Char
+instance AttrValueSTANDBY a => AttrValueSTANDBY [a]
+instance AttrValueSTART Int
+instance AttrValueSTYLE Char
+instance AttrValueSTYLE a => AttrValueSTYLE [a]
+instance AttrValueSUMMARY Char
+instance AttrValueSUMMARY a => AttrValueSUMMARY [a]
+instance AttrValueTABINDEX Int
+instance AttrValueTARGET Char
+instance AttrValueTARGET a => AttrValueTARGET [a]
+instance AttrValueTEXT Char
+instance AttrValueTEXT a => AttrValueTEXT [a]
+instance AttrValueTITLE Char
+instance AttrValueTITLE a => AttrValueTITLE [a]
+instance AttrValueTYPE Char
+instance AttrValueTYPE TYPE_BUTTON
+instance AttrValueTYPE TYPE_CHECKBOX
+instance AttrValueTYPE TYPE_FILE
+instance AttrValueTYPE TYPE_HIDDEN
+instance AttrValueTYPE TYPE_IMAGE
+instance AttrValueTYPE TYPE_PASSWORD
+instance AttrValueTYPE TYPE_RADIO
+instance AttrValueTYPE TYPE_RESET
+instance AttrValueTYPE TYPE_SUBMIT
+instance AttrValueTYPE TYPE_TEXT
+instance AttrValueTYPE TYPE_button
+instance AttrValueTYPE TYPE_circle
+instance AttrValueTYPE TYPE_disc
+instance AttrValueTYPE TYPE_reset
+instance AttrValueTYPE TYPE_square
+instance AttrValueTYPE TYPE_submit
+instance AttrValueTYPE a => AttrValueTYPE [a]
+instance AttrValueUSEMAP Char
+instance AttrValueUSEMAP a => AttrValueUSEMAP [a]
+instance AttrValueVALIGN VALIGN_baseline
+instance AttrValueVALIGN VALIGN_bottom
+instance AttrValueVALIGN VALIGN_middle
+instance AttrValueVALIGN VALIGN_top
+instance AttrValueVALUE Char
+instance AttrValueVALUE Int
+instance AttrValueVALUE a => AttrValueVALUE [a]
+instance AttrValueVALUETYPE VALUETYPE_DATA
+instance AttrValueVALUETYPE VALUETYPE_OBJECT
+instance AttrValueVALUETYPE VALUETYPE_REF
+instance AttrValueVERSION Char
+instance AttrValueVERSION a => AttrValueVERSION [a]
+instance AttrValueVLINK Char
+instance AttrValueVLINK a => AttrValueVLINK [a]
+instance AttrValueVSPACE Char
+instance AttrValueVSPACE a => AttrValueVSPACE [a]
+instance AttrValueWIDTH Char
+instance AttrValueWIDTH Int
+instance AttrValueWIDTH a => AttrValueWIDTH [a]
+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"
+instance Show ALIGN_center where show ALIGN_center = "center"
+instance Show ALIGN_char where show ALIGN_char = "char"
+instance Show ALIGN_justify where show ALIGN_justify = "justify"
+instance Show ALIGN_left where show ALIGN_left = "left"
+instance Show ALIGN_middle where show ALIGN_middle = "middle"
+instance Show ALIGN_right where show ALIGN_right = "right"
+instance Show ALIGN_top where show ALIGN_top = "top"
+instance Show CHECKED_checked where show CHECKED_checked = "checked"
+instance Show CLEAR_all where show CLEAR_all = "all"
+instance Show CLEAR_left where show CLEAR_left = "left"
+instance Show CLEAR_none where show CLEAR_none = "none"
+instance Show CLEAR_right where show CLEAR_right = "right"
+instance Show COMPACT_compact where show COMPACT_compact = "compact"
+instance Show DECLARE_declare where show DECLARE_declare = "declare"
+instance Show DEFER_defer where show DEFER_defer = "defer"
+instance Show DIR_ltr where show DIR_ltr = "ltr"
+instance Show DIR_rtl where show DIR_rtl = "rtl"
+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"
+instance Show FRAME_above where show FRAME_above = "above"
+instance Show FRAME_below where show FRAME_below = "below"
+instance Show FRAME_border where show FRAME_border = "border"
+instance Show FRAME_box where show FRAME_box = "box"
+instance Show FRAME_hsides where show FRAME_hsides = "hsides"
+instance Show FRAME_lhs where show FRAME_lhs = "lhs"
+instance Show FRAME_rhs where show FRAME_rhs = "rhs"
+instance Show FRAME_void where show FRAME_void = "void"
+instance Show FRAME_vsides where show FRAME_vsides = "vsides"
+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"
+instance Show METHOD_GET where show METHOD_GET = "GET"
+instance Show METHOD_POST where show METHOD_POST = "POST"
+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"
+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"
+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"
+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"
+instance Show READONLY_readonly where show READONLY_readonly = "readonly"
+instance Show RULES_all where show RULES_all = "all"
+instance Show RULES_cols where show RULES_cols = "cols"
+instance Show RULES_groups where show RULES_groups = "groups"
+instance Show RULES_none where show RULES_none = "none"
+instance Show RULES_rows where show RULES_rows = "rows"
+instance Show SCOPE_col where show SCOPE_col = "col"
+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"
+instance Show SCOPE_row where show SCOPE_row = "row"
+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"
+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"
+instance Show SCROLLING_no where show SCROLLING_no = "no"
+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"
+instance Show SELECTED_selected where show SELECTED_selected = "selected"
+instance Show SHAPE_circle where show SHAPE_circle = "circle"
+instance Show SHAPE_default' where show SHAPE_default' = "default"
+instance Show SHAPE_poly where show SHAPE_poly = "poly"
+instance Show SHAPE_rect where show SHAPE_rect = "rect"
+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"
+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"
+instance Show TYPE_FILE where show TYPE_FILE = "FILE"
+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"
+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"
+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"
+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"
+instance Show TYPE_RESET where show TYPE_RESET = "RESET"
+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"
+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"
+instance Show TYPE_button where show TYPE_button = "button"
+instance Show TYPE_circle where show TYPE_circle = "circle"
+instance Show TYPE_disc where show TYPE_disc = "disc"
+instance Show TYPE_reset where show TYPE_reset = "reset"
+instance Show TYPE_square where show TYPE_square = "square"
+instance Show TYPE_submit where show TYPE_submit = "submit"
+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"
+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"
+instance Show VALIGN_middle where show VALIGN_middle = "middle"
+instance Show VALIGN_top where show VALIGN_top = "top"
+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"
+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"
+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"
+instance AdmitAttrABBR TD
+instance AdmitAttrABBR TH
+instance AdmitAttrACCEPT INPUT
+instance AdmitAttrACCEPT_CHARSET FORM
+instance AdmitAttrACCESSKEY A
+instance AdmitAttrACCESSKEY AREA
+instance AdmitAttrACCESSKEY BUTTON
+instance AdmitAttrACCESSKEY INPUT
+instance AdmitAttrACCESSKEY LABEL
+instance AdmitAttrACCESSKEY LEGEND
+instance AdmitAttrACCESSKEY TEXTAREA
+instance AdmitAttrACTION FORM
+instance AdmitAttrALIGN APPLET
+instance AdmitAttrALIGN CAPTION
+instance AdmitAttrALIGN COL
+instance AdmitAttrALIGN COLGROUP
+instance AdmitAttrALIGN DIV
+instance AdmitAttrALIGN H1
+instance AdmitAttrALIGN H2
+instance AdmitAttrALIGN H3
+instance AdmitAttrALIGN H4
+instance AdmitAttrALIGN H5
+instance AdmitAttrALIGN H6
+instance AdmitAttrALIGN HR
+instance AdmitAttrALIGN IFRAME
+instance AdmitAttrALIGN IMG
+instance AdmitAttrALIGN INPUT
+instance AdmitAttrALIGN LEGEND
+instance AdmitAttrALIGN OBJECT
+instance AdmitAttrALIGN P
+instance AdmitAttrALIGN TABLE
+instance AdmitAttrALIGN TBODY
+instance AdmitAttrALIGN TD
+instance AdmitAttrALIGN TFOOT
+instance AdmitAttrALIGN TH
+instance AdmitAttrALIGN THEAD
+instance AdmitAttrALIGN TR
+instance AdmitAttrALINK BODY
+instance AdmitAttrALT APPLET
+instance AdmitAttrALT AREA
+instance AdmitAttrALT IMG
+instance AdmitAttrALT INPUT
+instance AdmitAttrARCHIVE APPLET
+instance AdmitAttrARCHIVE OBJECT
+instance AdmitAttrAXIS TD
+instance AdmitAttrAXIS TH
+instance AdmitAttrBACKGROUND BODY
+instance AdmitAttrBGCOLOR BODY
+instance AdmitAttrBGCOLOR TABLE
+instance AdmitAttrBGCOLOR TD
+instance AdmitAttrBGCOLOR TH
+instance AdmitAttrBGCOLOR TR
+instance AdmitAttrBORDER IMG
+instance AdmitAttrBORDER OBJECT
+instance AdmitAttrBORDER TABLE
+instance AdmitAttrCELLPADDING TABLE
+instance AdmitAttrCELLSPACING TABLE
+instance AdmitAttrCHAR COL
+instance AdmitAttrCHAR COLGROUP
+instance AdmitAttrCHAR TBODY
+instance AdmitAttrCHAR TD
+instance AdmitAttrCHAR TFOOT
+instance AdmitAttrCHAR TH
+instance AdmitAttrCHAR THEAD
+instance AdmitAttrCHAR TR
+instance AdmitAttrCHAROFF COL
+instance AdmitAttrCHAROFF COLGROUP
+instance AdmitAttrCHAROFF TBODY
+instance AdmitAttrCHAROFF TD
+instance AdmitAttrCHAROFF TFOOT
+instance AdmitAttrCHAROFF TH
+instance AdmitAttrCHAROFF THEAD
+instance AdmitAttrCHAROFF TR
+instance AdmitAttrCHARSET A
+instance AdmitAttrCHARSET LINK
+instance AdmitAttrCHARSET SCRIPT
+instance AdmitAttrCHECKED INPUT
+instance AdmitAttrCITE BLOCKQUOTE
+instance AdmitAttrCITE DEL
+instance AdmitAttrCITE INS
+instance AdmitAttrCITE Q
+instance AdmitAttrCLASS A
+instance AdmitAttrCLASS ABBR
+instance AdmitAttrCLASS ACRONYM
+instance AdmitAttrCLASS ADDRESS
+instance AdmitAttrCLASS APPLET
+instance AdmitAttrCLASS AREA
+instance AdmitAttrCLASS B
+instance AdmitAttrCLASS BDO
+instance AdmitAttrCLASS BIG
+instance AdmitAttrCLASS BLOCKQUOTE
+instance AdmitAttrCLASS BODY
+instance AdmitAttrCLASS BR
+instance AdmitAttrCLASS BUTTON
+instance AdmitAttrCLASS CAPTION
+instance AdmitAttrCLASS CENTER
+instance AdmitAttrCLASS CITE
+instance AdmitAttrCLASS CODE
+instance AdmitAttrCLASS COL
+instance AdmitAttrCLASS COLGROUP
+instance AdmitAttrCLASS DD
+instance AdmitAttrCLASS DEL
+instance AdmitAttrCLASS DFN
+instance AdmitAttrCLASS DIR
+instance AdmitAttrCLASS DIV
+instance AdmitAttrCLASS DL
+instance AdmitAttrCLASS DT
+instance AdmitAttrCLASS EM
+instance AdmitAttrCLASS FIELDSET
+instance AdmitAttrCLASS FONT
+instance AdmitAttrCLASS FORM
+instance AdmitAttrCLASS H1
+instance AdmitAttrCLASS H2
+instance AdmitAttrCLASS H3
+instance AdmitAttrCLASS H4
+instance AdmitAttrCLASS H5
+instance AdmitAttrCLASS H6
+instance AdmitAttrCLASS HR
+instance AdmitAttrCLASS I
+instance AdmitAttrCLASS IFRAME
+instance AdmitAttrCLASS IMG
+instance AdmitAttrCLASS INPUT
+instance AdmitAttrCLASS INS
+instance AdmitAttrCLASS ISINDEX
+instance AdmitAttrCLASS KBD
+instance AdmitAttrCLASS LABEL
+instance AdmitAttrCLASS LEGEND
+instance AdmitAttrCLASS LI
+instance AdmitAttrCLASS LINK
+instance AdmitAttrCLASS MAP
+instance AdmitAttrCLASS MENU
+instance AdmitAttrCLASS NOFRAMES
+instance AdmitAttrCLASS NOSCRIPT
+instance AdmitAttrCLASS OBJECT
+instance AdmitAttrCLASS OL
+instance AdmitAttrCLASS OPTGROUP
+instance AdmitAttrCLASS OPTION
+instance AdmitAttrCLASS P
+instance AdmitAttrCLASS PRE
+instance AdmitAttrCLASS Q
+instance AdmitAttrCLASS S
+instance AdmitAttrCLASS SAMP
+instance AdmitAttrCLASS SELECT
+instance AdmitAttrCLASS SMALL
+instance AdmitAttrCLASS SPAN
+instance AdmitAttrCLASS STRIKE
+instance AdmitAttrCLASS STRONG
+instance AdmitAttrCLASS SUB
+instance AdmitAttrCLASS SUP
+instance AdmitAttrCLASS TABLE
+instance AdmitAttrCLASS TBODY
+instance AdmitAttrCLASS TD
+instance AdmitAttrCLASS TEXTAREA
+instance AdmitAttrCLASS TFOOT
+instance AdmitAttrCLASS TH
+instance AdmitAttrCLASS THEAD
+instance AdmitAttrCLASS TR
+instance AdmitAttrCLASS TT
+instance AdmitAttrCLASS U
+instance AdmitAttrCLASS UL
+instance AdmitAttrCLASS VAR
+instance AdmitAttrCLASSID OBJECT
+instance AdmitAttrCLEAR BR
+instance AdmitAttrCODE APPLET
+instance AdmitAttrCODEBASE APPLET
+instance AdmitAttrCODEBASE OBJECT
+instance AdmitAttrCODETYPE OBJECT
+instance AdmitAttrCOLOR BASEFONT
+instance AdmitAttrCOLOR FONT
+instance AdmitAttrCOLS TEXTAREA
+instance AdmitAttrCOLSPAN TD
+instance AdmitAttrCOLSPAN TH
+instance AdmitAttrCOMPACT DIR
+instance AdmitAttrCOMPACT DL
+instance AdmitAttrCOMPACT MENU
+instance AdmitAttrCOMPACT OL
+instance AdmitAttrCOMPACT UL
+instance AdmitAttrCONTENT META
+instance AdmitAttrCOORDS A
+instance AdmitAttrCOORDS AREA
+instance AdmitAttrDATA OBJECT
+instance AdmitAttrDATAPAGESIZE TABLE
+instance AdmitAttrDATETIME DEL
+instance AdmitAttrDATETIME INS
+instance AdmitAttrDECLARE OBJECT
+instance AdmitAttrDEFER SCRIPT
+instance AdmitAttrDIR A
+instance AdmitAttrDIR ABBR
+instance AdmitAttrDIR ACRONYM
+instance AdmitAttrDIR ADDRESS
+instance AdmitAttrDIR AREA
+instance AdmitAttrDIR B
+instance AdmitAttrDIR BDO
+instance AdmitAttrDIR BIG
+instance AdmitAttrDIR BLOCKQUOTE
+instance AdmitAttrDIR BODY
+instance AdmitAttrDIR BUTTON
+instance AdmitAttrDIR CAPTION
+instance AdmitAttrDIR CENTER
+instance AdmitAttrDIR CITE
+instance AdmitAttrDIR CODE
+instance AdmitAttrDIR COL
+instance AdmitAttrDIR COLGROUP
+instance AdmitAttrDIR DD
+instance AdmitAttrDIR DEL
+instance AdmitAttrDIR DFN
+instance AdmitAttrDIR DIR
+instance AdmitAttrDIR DIV
+instance AdmitAttrDIR DL
+instance AdmitAttrDIR DT
+instance AdmitAttrDIR EM
+instance AdmitAttrDIR FIELDSET
+instance AdmitAttrDIR FONT
+instance AdmitAttrDIR FORM
+instance AdmitAttrDIR H1
+instance AdmitAttrDIR H2
+instance AdmitAttrDIR H3
+instance AdmitAttrDIR H4
+instance AdmitAttrDIR H5
+instance AdmitAttrDIR H6
+instance AdmitAttrDIR HEAD
+instance AdmitAttrDIR HTML
+instance AdmitAttrDIR I
+instance AdmitAttrDIR IMG
+instance AdmitAttrDIR INPUT
+instance AdmitAttrDIR INS
+instance AdmitAttrDIR ISINDEX
+instance AdmitAttrDIR KBD
+instance AdmitAttrDIR LABEL
+instance AdmitAttrDIR LEGEND
+instance AdmitAttrDIR LI
+instance AdmitAttrDIR LINK
+instance AdmitAttrDIR MAP
+instance AdmitAttrDIR MENU
+instance AdmitAttrDIR META
+instance AdmitAttrDIR NOFRAMES
+instance AdmitAttrDIR NOSCRIPT
+instance AdmitAttrDIR OBJECT
+instance AdmitAttrDIR OL
+instance AdmitAttrDIR OPTGROUP
+instance AdmitAttrDIR OPTION
+instance AdmitAttrDIR P
+instance AdmitAttrDIR PRE
+instance AdmitAttrDIR Q
+instance AdmitAttrDIR S
+instance AdmitAttrDIR SAMP
+instance AdmitAttrDIR SELECT
+instance AdmitAttrDIR SMALL
+instance AdmitAttrDIR SPAN
+instance AdmitAttrDIR STRIKE
+instance AdmitAttrDIR STRONG
+instance AdmitAttrDIR STYLE
+instance AdmitAttrDIR SUB
+instance AdmitAttrDIR SUP
+instance AdmitAttrDIR TABLE
+instance AdmitAttrDIR TBODY
+instance AdmitAttrDIR TD
+instance AdmitAttrDIR TEXTAREA
+instance AdmitAttrDIR TFOOT
+instance AdmitAttrDIR TH
+instance AdmitAttrDIR THEAD
+instance AdmitAttrDIR TITLE
+instance AdmitAttrDIR TR
+instance AdmitAttrDIR TT
+instance AdmitAttrDIR U
+instance AdmitAttrDIR UL
+instance AdmitAttrDIR VAR
+instance AdmitAttrDISABLED BUTTON
+instance AdmitAttrDISABLED INPUT
+instance AdmitAttrDISABLED OPTGROUP
+instance AdmitAttrDISABLED OPTION
+instance AdmitAttrDISABLED SELECT
+instance AdmitAttrDISABLED TEXTAREA
+instance AdmitAttrENCTYPE FORM
+instance AdmitAttrEVENT SCRIPT
+instance AdmitAttrFACE BASEFONT
+instance AdmitAttrFACE FONT
+instance AdmitAttrFOR LABEL
+instance AdmitAttrFOR SCRIPT
+instance AdmitAttrFRAME TABLE
+instance AdmitAttrFRAMEBORDER IFRAME
+instance AdmitAttrHEADERS TD
+instance AdmitAttrHEADERS TH
+instance AdmitAttrHEIGHT APPLET
+instance AdmitAttrHEIGHT IFRAME
+instance AdmitAttrHEIGHT IMG
+instance AdmitAttrHEIGHT OBJECT
+instance AdmitAttrHEIGHT TD
+instance AdmitAttrHEIGHT TH
+instance AdmitAttrHREF A
+instance AdmitAttrHREF AREA
+instance AdmitAttrHREF BASE
+instance AdmitAttrHREF LINK
+instance AdmitAttrHREFLANG A
+instance AdmitAttrHREFLANG LINK
+instance AdmitAttrHSPACE APPLET
+instance AdmitAttrHSPACE IMG
+instance AdmitAttrHSPACE OBJECT
+instance AdmitAttrHTTP_EQUIV META
+instance AdmitAttrID A
+instance AdmitAttrID ABBR
+instance AdmitAttrID ACRONYM
+instance AdmitAttrID ADDRESS
+instance AdmitAttrID APPLET
+instance AdmitAttrID AREA
+instance AdmitAttrID B
+instance AdmitAttrID BASEFONT
+instance AdmitAttrID BDO
+instance AdmitAttrID BIG
+instance AdmitAttrID BLOCKQUOTE
+instance AdmitAttrID BODY
+instance AdmitAttrID BR
+instance AdmitAttrID BUTTON
+instance AdmitAttrID CAPTION
+instance AdmitAttrID CENTER
+instance AdmitAttrID CITE
+instance AdmitAttrID CODE
+instance AdmitAttrID COL
+instance AdmitAttrID COLGROUP
+instance AdmitAttrID DD
+instance AdmitAttrID DEL
+instance AdmitAttrID DFN
+instance AdmitAttrID DIR
+instance AdmitAttrID DIV
+instance AdmitAttrID DL
+instance AdmitAttrID DT
+instance AdmitAttrID EM
+instance AdmitAttrID FIELDSET
+instance AdmitAttrID FONT
+instance AdmitAttrID FORM
+instance AdmitAttrID H1
+instance AdmitAttrID H2
+instance AdmitAttrID H3
+instance AdmitAttrID H4
+instance AdmitAttrID H5
+instance AdmitAttrID H6
+instance AdmitAttrID HR
+instance AdmitAttrID I
+instance AdmitAttrID IFRAME
+instance AdmitAttrID IMG
+instance AdmitAttrID INPUT
+instance AdmitAttrID INS
+instance AdmitAttrID ISINDEX
+instance AdmitAttrID KBD
+instance AdmitAttrID LABEL
+instance AdmitAttrID LEGEND
+instance AdmitAttrID LI
+instance AdmitAttrID LINK
+instance AdmitAttrID MAP
+instance AdmitAttrID MENU
+instance AdmitAttrID NOFRAMES
+instance AdmitAttrID NOSCRIPT
+instance AdmitAttrID OBJECT
+instance AdmitAttrID OL
+instance AdmitAttrID OPTGROUP
+instance AdmitAttrID OPTION
+instance AdmitAttrID P
+instance AdmitAttrID PARAM
+instance AdmitAttrID PRE
+instance AdmitAttrID Q
+instance AdmitAttrID S
+instance AdmitAttrID SAMP
+instance AdmitAttrID SELECT
+instance AdmitAttrID SMALL
+instance AdmitAttrID SPAN
+instance AdmitAttrID STRIKE
+instance AdmitAttrID STRONG
+instance AdmitAttrID SUB
+instance AdmitAttrID SUP
+instance AdmitAttrID TABLE
+instance AdmitAttrID TBODY
+instance AdmitAttrID TD
+instance AdmitAttrID TEXTAREA
+instance AdmitAttrID TFOOT
+instance AdmitAttrID TH
+instance AdmitAttrID THEAD
+instance AdmitAttrID TR
+instance AdmitAttrID TT
+instance AdmitAttrID U
+instance AdmitAttrID UL
+instance AdmitAttrID VAR
+instance AdmitAttrISMAP IMG
+instance AdmitAttrLABEL OPTGROUP
+instance AdmitAttrLABEL OPTION
+instance AdmitAttrLANG A
+instance AdmitAttrLANG ABBR
+instance AdmitAttrLANG ACRONYM
+instance AdmitAttrLANG ADDRESS
+instance AdmitAttrLANG AREA
+instance AdmitAttrLANG B
+instance AdmitAttrLANG BDO
+instance AdmitAttrLANG BIG
+instance AdmitAttrLANG BLOCKQUOTE
+instance AdmitAttrLANG BODY
+instance AdmitAttrLANG BUTTON
+instance AdmitAttrLANG CAPTION
+instance AdmitAttrLANG CENTER
+instance AdmitAttrLANG CITE
+instance AdmitAttrLANG CODE
+instance AdmitAttrLANG COL
+instance AdmitAttrLANG COLGROUP
+instance AdmitAttrLANG DD
+instance AdmitAttrLANG DEL
+instance AdmitAttrLANG DFN
+instance AdmitAttrLANG DIR
+instance AdmitAttrLANG DIV
+instance AdmitAttrLANG DL
+instance AdmitAttrLANG DT
+instance AdmitAttrLANG EM
+instance AdmitAttrLANG FIELDSET
+instance AdmitAttrLANG FONT
+instance AdmitAttrLANG FORM
+instance AdmitAttrLANG H1
+instance AdmitAttrLANG H2
+instance AdmitAttrLANG H3
+instance AdmitAttrLANG H4
+instance AdmitAttrLANG H5
+instance AdmitAttrLANG H6
+instance AdmitAttrLANG HEAD
+instance AdmitAttrLANG HTML
+instance AdmitAttrLANG I
+instance AdmitAttrLANG IMG
+instance AdmitAttrLANG INPUT
+instance AdmitAttrLANG INS
+instance AdmitAttrLANG ISINDEX
+instance AdmitAttrLANG KBD
+instance AdmitAttrLANG LABEL
+instance AdmitAttrLANG LEGEND
+instance AdmitAttrLANG LI
+instance AdmitAttrLANG LINK
+instance AdmitAttrLANG MAP
+instance AdmitAttrLANG MENU
+instance AdmitAttrLANG META
+instance AdmitAttrLANG NOFRAMES
+instance AdmitAttrLANG NOSCRIPT
+instance AdmitAttrLANG OBJECT
+instance AdmitAttrLANG OL
+instance AdmitAttrLANG OPTGROUP
+instance AdmitAttrLANG OPTION
+instance AdmitAttrLANG P
+instance AdmitAttrLANG PRE
+instance AdmitAttrLANG Q
+instance AdmitAttrLANG S
+instance AdmitAttrLANG SAMP
+instance AdmitAttrLANG SELECT
+instance AdmitAttrLANG SMALL
+instance AdmitAttrLANG SPAN
+instance AdmitAttrLANG STRIKE
+instance AdmitAttrLANG STRONG
+instance AdmitAttrLANG STYLE
+instance AdmitAttrLANG SUB
+instance AdmitAttrLANG SUP
+instance AdmitAttrLANG TABLE
+instance AdmitAttrLANG TBODY
+instance AdmitAttrLANG TD
+instance AdmitAttrLANG TEXTAREA
+instance AdmitAttrLANG TFOOT
+instance AdmitAttrLANG TH
+instance AdmitAttrLANG THEAD
+instance AdmitAttrLANG TITLE
+instance AdmitAttrLANG TR
+instance AdmitAttrLANG TT
+instance AdmitAttrLANG U
+instance AdmitAttrLANG UL
+instance AdmitAttrLANG VAR
+instance AdmitAttrLANGUAGE SCRIPT
+instance AdmitAttrLINK BODY
+instance AdmitAttrLONGDESC IFRAME
+instance AdmitAttrLONGDESC IMG
+instance AdmitAttrMARGINHEIGHT IFRAME
+instance AdmitAttrMARGINWIDTH IFRAME
+instance AdmitAttrMAXLENGTH INPUT
+instance AdmitAttrMEDIA LINK
+instance AdmitAttrMEDIA STYLE
+instance AdmitAttrMETHOD FORM
+instance AdmitAttrMULTIPLE SELECT
+instance AdmitAttrNAME A
+instance AdmitAttrNAME APPLET
+instance AdmitAttrNAME BUTTON
+instance AdmitAttrNAME IFRAME
+instance AdmitAttrNAME INPUT
+instance AdmitAttrNAME MAP
+instance AdmitAttrNAME META
+instance AdmitAttrNAME OBJECT
+instance AdmitAttrNAME PARAM
+instance AdmitAttrNAME SELECT
+instance AdmitAttrNAME TEXTAREA
+instance AdmitAttrNOHREF AREA
+instance AdmitAttrNOSHADE HR
+instance AdmitAttrNOWRAP TD
+instance AdmitAttrNOWRAP TH
+instance AdmitAttrOBJECT APPLET
+instance AdmitAttrONBLUR A
+instance AdmitAttrONBLUR AREA
+instance AdmitAttrONBLUR BUTTON
+instance AdmitAttrONBLUR INPUT
+instance AdmitAttrONBLUR LABEL
+instance AdmitAttrONBLUR SELECT
+instance AdmitAttrONBLUR TEXTAREA
+instance AdmitAttrONCHANGE INPUT
+instance AdmitAttrONCHANGE SELECT
+instance AdmitAttrONCHANGE TEXTAREA
+instance AdmitAttrONCLICK A
+instance AdmitAttrONCLICK ABBR
+instance AdmitAttrONCLICK ACRONYM
+instance AdmitAttrONCLICK ADDRESS
+instance AdmitAttrONCLICK AREA
+instance AdmitAttrONCLICK B
+instance AdmitAttrONCLICK BIG
+instance AdmitAttrONCLICK BLOCKQUOTE
+instance AdmitAttrONCLICK BODY
+instance AdmitAttrONCLICK BUTTON
+instance AdmitAttrONCLICK CAPTION
+instance AdmitAttrONCLICK CENTER
+instance AdmitAttrONCLICK CITE
+instance AdmitAttrONCLICK CODE
+instance AdmitAttrONCLICK COL
+instance AdmitAttrONCLICK COLGROUP
+instance AdmitAttrONCLICK DD
+instance AdmitAttrONCLICK DEL
+instance AdmitAttrONCLICK DFN
+instance AdmitAttrONCLICK DIR
+instance AdmitAttrONCLICK DIV
+instance AdmitAttrONCLICK DL
+instance AdmitAttrONCLICK DT
+instance AdmitAttrONCLICK EM
+instance AdmitAttrONCLICK FIELDSET
+instance AdmitAttrONCLICK FORM
+instance AdmitAttrONCLICK H1
+instance AdmitAttrONCLICK H2
+instance AdmitAttrONCLICK H3
+instance AdmitAttrONCLICK H4
+instance AdmitAttrONCLICK H5
+instance AdmitAttrONCLICK H6
+instance AdmitAttrONCLICK HR
+instance AdmitAttrONCLICK I
+instance AdmitAttrONCLICK IMG
+instance AdmitAttrONCLICK INPUT
+instance AdmitAttrONCLICK INS
+instance AdmitAttrONCLICK KBD
+instance AdmitAttrONCLICK LABEL
+instance AdmitAttrONCLICK LEGEND
+instance AdmitAttrONCLICK LI
+instance AdmitAttrONCLICK LINK
+instance AdmitAttrONCLICK MAP
+instance AdmitAttrONCLICK MENU
+instance AdmitAttrONCLICK NOFRAMES
+instance AdmitAttrONCLICK NOSCRIPT
+instance AdmitAttrONCLICK OBJECT
+instance AdmitAttrONCLICK OL
+instance AdmitAttrONCLICK OPTGROUP
+instance AdmitAttrONCLICK OPTION
+instance AdmitAttrONCLICK P
+instance AdmitAttrONCLICK PRE
+instance AdmitAttrONCLICK Q
+instance AdmitAttrONCLICK S
+instance AdmitAttrONCLICK SAMP
+instance AdmitAttrONCLICK SELECT
+instance AdmitAttrONCLICK SMALL
+instance AdmitAttrONCLICK SPAN
+instance AdmitAttrONCLICK STRIKE
+instance AdmitAttrONCLICK STRONG
+instance AdmitAttrONCLICK SUB
+instance AdmitAttrONCLICK SUP
+instance AdmitAttrONCLICK TABLE
+instance AdmitAttrONCLICK TBODY
+instance AdmitAttrONCLICK TD
+instance AdmitAttrONCLICK TEXTAREA
+instance AdmitAttrONCLICK TFOOT
+instance AdmitAttrONCLICK TH
+instance AdmitAttrONCLICK THEAD
+instance AdmitAttrONCLICK TR
+instance AdmitAttrONCLICK TT
+instance AdmitAttrONCLICK U
+instance AdmitAttrONCLICK UL
+instance AdmitAttrONCLICK VAR
+instance AdmitAttrONDBLCLICK A
+instance AdmitAttrONDBLCLICK ABBR
+instance AdmitAttrONDBLCLICK ACRONYM
+instance AdmitAttrONDBLCLICK ADDRESS
+instance AdmitAttrONDBLCLICK AREA
+instance AdmitAttrONDBLCLICK B
+instance AdmitAttrONDBLCLICK BIG
+instance AdmitAttrONDBLCLICK BLOCKQUOTE
+instance AdmitAttrONDBLCLICK BODY
+instance AdmitAttrONDBLCLICK BUTTON
+instance AdmitAttrONDBLCLICK CAPTION
+instance AdmitAttrONDBLCLICK CENTER
+instance AdmitAttrONDBLCLICK CITE
+instance AdmitAttrONDBLCLICK CODE
+instance AdmitAttrONDBLCLICK COL
+instance AdmitAttrONDBLCLICK COLGROUP
+instance AdmitAttrONDBLCLICK DD
+instance AdmitAttrONDBLCLICK DEL
+instance AdmitAttrONDBLCLICK DFN
+instance AdmitAttrONDBLCLICK DIR
+instance AdmitAttrONDBLCLICK DIV
+instance AdmitAttrONDBLCLICK DL
+instance AdmitAttrONDBLCLICK DT
+instance AdmitAttrONDBLCLICK EM
+instance AdmitAttrONDBLCLICK FIELDSET
+instance AdmitAttrONDBLCLICK FORM
+instance AdmitAttrONDBLCLICK H1
+instance AdmitAttrONDBLCLICK H2
+instance AdmitAttrONDBLCLICK H3
+instance AdmitAttrONDBLCLICK H4
+instance AdmitAttrONDBLCLICK H5
+instance AdmitAttrONDBLCLICK H6
+instance AdmitAttrONDBLCLICK HR
+instance AdmitAttrONDBLCLICK I
+instance AdmitAttrONDBLCLICK IMG
+instance AdmitAttrONDBLCLICK INPUT
+instance AdmitAttrONDBLCLICK INS
+instance AdmitAttrONDBLCLICK KBD
+instance AdmitAttrONDBLCLICK LABEL
+instance AdmitAttrONDBLCLICK LEGEND
+instance AdmitAttrONDBLCLICK LI
+instance AdmitAttrONDBLCLICK LINK
+instance AdmitAttrONDBLCLICK MAP
+instance AdmitAttrONDBLCLICK MENU
+instance AdmitAttrONDBLCLICK NOFRAMES
+instance AdmitAttrONDBLCLICK NOSCRIPT
+instance AdmitAttrONDBLCLICK OBJECT
+instance AdmitAttrONDBLCLICK OL
+instance AdmitAttrONDBLCLICK OPTGROUP
+instance AdmitAttrONDBLCLICK OPTION
+instance AdmitAttrONDBLCLICK P
+instance AdmitAttrONDBLCLICK PRE
+instance AdmitAttrONDBLCLICK Q
+instance AdmitAttrONDBLCLICK S
+instance AdmitAttrONDBLCLICK SAMP
+instance AdmitAttrONDBLCLICK SELECT
+instance AdmitAttrONDBLCLICK SMALL
+instance AdmitAttrONDBLCLICK SPAN
+instance AdmitAttrONDBLCLICK STRIKE
+instance AdmitAttrONDBLCLICK STRONG
+instance AdmitAttrONDBLCLICK SUB
+instance AdmitAttrONDBLCLICK SUP
+instance AdmitAttrONDBLCLICK TABLE
+instance AdmitAttrONDBLCLICK TBODY
+instance AdmitAttrONDBLCLICK TD
+instance AdmitAttrONDBLCLICK TEXTAREA
+instance AdmitAttrONDBLCLICK TFOOT
+instance AdmitAttrONDBLCLICK TH
+instance AdmitAttrONDBLCLICK THEAD
+instance AdmitAttrONDBLCLICK TR
+instance AdmitAttrONDBLCLICK TT
+instance AdmitAttrONDBLCLICK U
+instance AdmitAttrONDBLCLICK UL
+instance AdmitAttrONDBLCLICK VAR
+instance AdmitAttrONFOCUS A
+instance AdmitAttrONFOCUS AREA
+instance AdmitAttrONFOCUS BUTTON
+instance AdmitAttrONFOCUS INPUT
+instance AdmitAttrONFOCUS LABEL
+instance AdmitAttrONFOCUS SELECT
+instance AdmitAttrONFOCUS TEXTAREA
+instance AdmitAttrONKEYDOWN A
+instance AdmitAttrONKEYDOWN ABBR
+instance AdmitAttrONKEYDOWN ACRONYM
+instance AdmitAttrONKEYDOWN ADDRESS
+instance AdmitAttrONKEYDOWN AREA
+instance AdmitAttrONKEYDOWN B
+instance AdmitAttrONKEYDOWN BIG
+instance AdmitAttrONKEYDOWN BLOCKQUOTE
+instance AdmitAttrONKEYDOWN BODY
+instance AdmitAttrONKEYDOWN BUTTON
+instance AdmitAttrONKEYDOWN CAPTION
+instance AdmitAttrONKEYDOWN CENTER
+instance AdmitAttrONKEYDOWN CITE
+instance AdmitAttrONKEYDOWN CODE
+instance AdmitAttrONKEYDOWN COL
+instance AdmitAttrONKEYDOWN COLGROUP
+instance AdmitAttrONKEYDOWN DD
+instance AdmitAttrONKEYDOWN DEL
+instance AdmitAttrONKEYDOWN DFN
+instance AdmitAttrONKEYDOWN DIR
+instance AdmitAttrONKEYDOWN DIV
+instance AdmitAttrONKEYDOWN DL
+instance AdmitAttrONKEYDOWN DT
+instance AdmitAttrONKEYDOWN EM
+instance AdmitAttrONKEYDOWN FIELDSET
+instance AdmitAttrONKEYDOWN FORM
+instance AdmitAttrONKEYDOWN H1
+instance AdmitAttrONKEYDOWN H2
+instance AdmitAttrONKEYDOWN H3
+instance AdmitAttrONKEYDOWN H4
+instance AdmitAttrONKEYDOWN H5
+instance AdmitAttrONKEYDOWN H6
+instance AdmitAttrONKEYDOWN HR
+instance AdmitAttrONKEYDOWN I
+instance AdmitAttrONKEYDOWN IMG
+instance AdmitAttrONKEYDOWN INPUT
+instance AdmitAttrONKEYDOWN INS
+instance AdmitAttrONKEYDOWN KBD
+instance AdmitAttrONKEYDOWN LABEL
+instance AdmitAttrONKEYDOWN LEGEND
+instance AdmitAttrONKEYDOWN LI
+instance AdmitAttrONKEYDOWN LINK
+instance AdmitAttrONKEYDOWN MAP
+instance AdmitAttrONKEYDOWN MENU
+instance AdmitAttrONKEYDOWN NOFRAMES
+instance AdmitAttrONKEYDOWN NOSCRIPT
+instance AdmitAttrONKEYDOWN OBJECT
+instance AdmitAttrONKEYDOWN OL
+instance AdmitAttrONKEYDOWN OPTGROUP
+instance AdmitAttrONKEYDOWN OPTION
+instance AdmitAttrONKEYDOWN P
+instance AdmitAttrONKEYDOWN PRE
+instance AdmitAttrONKEYDOWN Q
+instance AdmitAttrONKEYDOWN S
+instance AdmitAttrONKEYDOWN SAMP
+instance AdmitAttrONKEYDOWN SELECT
+instance AdmitAttrONKEYDOWN SMALL
+instance AdmitAttrONKEYDOWN SPAN
+instance AdmitAttrONKEYDOWN STRIKE
+instance AdmitAttrONKEYDOWN STRONG
+instance AdmitAttrONKEYDOWN SUB
+instance AdmitAttrONKEYDOWN SUP
+instance AdmitAttrONKEYDOWN TABLE
+instance AdmitAttrONKEYDOWN TBODY
+instance AdmitAttrONKEYDOWN TD
+instance AdmitAttrONKEYDOWN TEXTAREA
+instance AdmitAttrONKEYDOWN TFOOT
+instance AdmitAttrONKEYDOWN TH
+instance AdmitAttrONKEYDOWN THEAD
+instance AdmitAttrONKEYDOWN TR
+instance AdmitAttrONKEYDOWN TT
+instance AdmitAttrONKEYDOWN U
+instance AdmitAttrONKEYDOWN UL
+instance AdmitAttrONKEYDOWN VAR
+instance AdmitAttrONKEYPRESS A
+instance AdmitAttrONKEYPRESS ABBR
+instance AdmitAttrONKEYPRESS ACRONYM
+instance AdmitAttrONKEYPRESS ADDRESS
+instance AdmitAttrONKEYPRESS AREA
+instance AdmitAttrONKEYPRESS B
+instance AdmitAttrONKEYPRESS BIG
+instance AdmitAttrONKEYPRESS BLOCKQUOTE
+instance AdmitAttrONKEYPRESS BODY
+instance AdmitAttrONKEYPRESS BUTTON
+instance AdmitAttrONKEYPRESS CAPTION
+instance AdmitAttrONKEYPRESS CENTER
+instance AdmitAttrONKEYPRESS CITE
+instance AdmitAttrONKEYPRESS CODE
+instance AdmitAttrONKEYPRESS COL
+instance AdmitAttrONKEYPRESS COLGROUP
+instance AdmitAttrONKEYPRESS DD
+instance AdmitAttrONKEYPRESS DEL
+instance AdmitAttrONKEYPRESS DFN
+instance AdmitAttrONKEYPRESS DIR
+instance AdmitAttrONKEYPRESS DIV
+instance AdmitAttrONKEYPRESS DL
+instance AdmitAttrONKEYPRESS DT
+instance AdmitAttrONKEYPRESS EM
+instance AdmitAttrONKEYPRESS FIELDSET
+instance AdmitAttrONKEYPRESS FORM
+instance AdmitAttrONKEYPRESS H1
+instance AdmitAttrONKEYPRESS H2
+instance AdmitAttrONKEYPRESS H3
+instance AdmitAttrONKEYPRESS H4
+instance AdmitAttrONKEYPRESS H5
+instance AdmitAttrONKEYPRESS H6
+instance AdmitAttrONKEYPRESS HR
+instance AdmitAttrONKEYPRESS I
+instance AdmitAttrONKEYPRESS IMG
+instance AdmitAttrONKEYPRESS INPUT
+instance AdmitAttrONKEYPRESS INS
+instance AdmitAttrONKEYPRESS KBD
+instance AdmitAttrONKEYPRESS LABEL
+instance AdmitAttrONKEYPRESS LEGEND
+instance AdmitAttrONKEYPRESS LI
+instance AdmitAttrONKEYPRESS LINK
+instance AdmitAttrONKEYPRESS MAP
+instance AdmitAttrONKEYPRESS MENU
+instance AdmitAttrONKEYPRESS NOFRAMES
+instance AdmitAttrONKEYPRESS NOSCRIPT
+instance AdmitAttrONKEYPRESS OBJECT
+instance AdmitAttrONKEYPRESS OL
+instance AdmitAttrONKEYPRESS OPTGROUP
+instance AdmitAttrONKEYPRESS OPTION
+instance AdmitAttrONKEYPRESS P
+instance AdmitAttrONKEYPRESS PRE
+instance AdmitAttrONKEYPRESS Q
+instance AdmitAttrONKEYPRESS S
+instance AdmitAttrONKEYPRESS SAMP
+instance AdmitAttrONKEYPRESS SELECT
+instance AdmitAttrONKEYPRESS SMALL
+instance AdmitAttrONKEYPRESS SPAN
+instance AdmitAttrONKEYPRESS STRIKE
+instance AdmitAttrONKEYPRESS STRONG
+instance AdmitAttrONKEYPRESS SUB
+instance AdmitAttrONKEYPRESS SUP
+instance AdmitAttrONKEYPRESS TABLE
+instance AdmitAttrONKEYPRESS TBODY
+instance AdmitAttrONKEYPRESS TD
+instance AdmitAttrONKEYPRESS TEXTAREA
+instance AdmitAttrONKEYPRESS TFOOT
+instance AdmitAttrONKEYPRESS TH
+instance AdmitAttrONKEYPRESS THEAD
+instance AdmitAttrONKEYPRESS TR
+instance AdmitAttrONKEYPRESS TT
+instance AdmitAttrONKEYPRESS U
+instance AdmitAttrONKEYPRESS UL
+instance AdmitAttrONKEYPRESS VAR
+instance AdmitAttrONKEYUP A
+instance AdmitAttrONKEYUP ABBR
+instance AdmitAttrONKEYUP ACRONYM
+instance AdmitAttrONKEYUP ADDRESS
+instance AdmitAttrONKEYUP AREA
+instance AdmitAttrONKEYUP B
+instance AdmitAttrONKEYUP BIG
+instance AdmitAttrONKEYUP BLOCKQUOTE
+instance AdmitAttrONKEYUP BODY
+instance AdmitAttrONKEYUP BUTTON
+instance AdmitAttrONKEYUP CAPTION
+instance AdmitAttrONKEYUP CENTER
+instance AdmitAttrONKEYUP CITE
+instance AdmitAttrONKEYUP CODE
+instance AdmitAttrONKEYUP COL
+instance AdmitAttrONKEYUP COLGROUP
+instance AdmitAttrONKEYUP DD
+instance AdmitAttrONKEYUP DEL
+instance AdmitAttrONKEYUP DFN
+instance AdmitAttrONKEYUP DIR
+instance AdmitAttrONKEYUP DIV
+instance AdmitAttrONKEYUP DL
+instance AdmitAttrONKEYUP DT
+instance AdmitAttrONKEYUP EM
+instance AdmitAttrONKEYUP FIELDSET
+instance AdmitAttrONKEYUP FORM
+instance AdmitAttrONKEYUP H1
+instance AdmitAttrONKEYUP H2
+instance AdmitAttrONKEYUP H3
+instance AdmitAttrONKEYUP H4
+instance AdmitAttrONKEYUP H5
+instance AdmitAttrONKEYUP H6
+instance AdmitAttrONKEYUP HR
+instance AdmitAttrONKEYUP I
+instance AdmitAttrONKEYUP IMG
+instance AdmitAttrONKEYUP INPUT
+instance AdmitAttrONKEYUP INS
+instance AdmitAttrONKEYUP KBD
+instance AdmitAttrONKEYUP LABEL
+instance AdmitAttrONKEYUP LEGEND
+instance AdmitAttrONKEYUP LI
+instance AdmitAttrONKEYUP LINK
+instance AdmitAttrONKEYUP MAP
+instance AdmitAttrONKEYUP MENU
+instance AdmitAttrONKEYUP NOFRAMES
+instance AdmitAttrONKEYUP NOSCRIPT
+instance AdmitAttrONKEYUP OBJECT
+instance AdmitAttrONKEYUP OL
+instance AdmitAttrONKEYUP OPTGROUP
+instance AdmitAttrONKEYUP OPTION
+instance AdmitAttrONKEYUP P
+instance AdmitAttrONKEYUP PRE
+instance AdmitAttrONKEYUP Q
+instance AdmitAttrONKEYUP S
+instance AdmitAttrONKEYUP SAMP
+instance AdmitAttrONKEYUP SELECT
+instance AdmitAttrONKEYUP SMALL
+instance AdmitAttrONKEYUP SPAN
+instance AdmitAttrONKEYUP STRIKE
+instance AdmitAttrONKEYUP STRONG
+instance AdmitAttrONKEYUP SUB
+instance AdmitAttrONKEYUP SUP
+instance AdmitAttrONKEYUP TABLE
+instance AdmitAttrONKEYUP TBODY
+instance AdmitAttrONKEYUP TD
+instance AdmitAttrONKEYUP TEXTAREA
+instance AdmitAttrONKEYUP TFOOT
+instance AdmitAttrONKEYUP TH
+instance AdmitAttrONKEYUP THEAD
+instance AdmitAttrONKEYUP TR
+instance AdmitAttrONKEYUP TT
+instance AdmitAttrONKEYUP U
+instance AdmitAttrONKEYUP UL
+instance AdmitAttrONKEYUP VAR
+instance AdmitAttrONLOAD BODY
+instance AdmitAttrONMOUSEDOWN A
+instance AdmitAttrONMOUSEDOWN ABBR
+instance AdmitAttrONMOUSEDOWN ACRONYM
+instance AdmitAttrONMOUSEDOWN ADDRESS
+instance AdmitAttrONMOUSEDOWN AREA
+instance AdmitAttrONMOUSEDOWN B
+instance AdmitAttrONMOUSEDOWN BIG
+instance AdmitAttrONMOUSEDOWN BLOCKQUOTE
+instance AdmitAttrONMOUSEDOWN BODY
+instance AdmitAttrONMOUSEDOWN BUTTON
+instance AdmitAttrONMOUSEDOWN CAPTION
+instance AdmitAttrONMOUSEDOWN CENTER
+instance AdmitAttrONMOUSEDOWN CITE
+instance AdmitAttrONMOUSEDOWN CODE
+instance AdmitAttrONMOUSEDOWN COL
+instance AdmitAttrONMOUSEDOWN COLGROUP
+instance AdmitAttrONMOUSEDOWN DD
+instance AdmitAttrONMOUSEDOWN DEL
+instance AdmitAttrONMOUSEDOWN DFN
+instance AdmitAttrONMOUSEDOWN DIR
+instance AdmitAttrONMOUSEDOWN DIV
+instance AdmitAttrONMOUSEDOWN DL
+instance AdmitAttrONMOUSEDOWN DT
+instance AdmitAttrONMOUSEDOWN EM
+instance AdmitAttrONMOUSEDOWN FIELDSET
+instance AdmitAttrONMOUSEDOWN FORM
+instance AdmitAttrONMOUSEDOWN H1
+instance AdmitAttrONMOUSEDOWN H2
+instance AdmitAttrONMOUSEDOWN H3
+instance AdmitAttrONMOUSEDOWN H4
+instance AdmitAttrONMOUSEDOWN H5
+instance AdmitAttrONMOUSEDOWN H6
+instance AdmitAttrONMOUSEDOWN HR
+instance AdmitAttrONMOUSEDOWN I
+instance AdmitAttrONMOUSEDOWN IMG
+instance AdmitAttrONMOUSEDOWN INPUT
+instance AdmitAttrONMOUSEDOWN INS
+instance AdmitAttrONMOUSEDOWN KBD
+instance AdmitAttrONMOUSEDOWN LABEL
+instance AdmitAttrONMOUSEDOWN LEGEND
+instance AdmitAttrONMOUSEDOWN LI
+instance AdmitAttrONMOUSEDOWN LINK
+instance AdmitAttrONMOUSEDOWN MAP
+instance AdmitAttrONMOUSEDOWN MENU
+instance AdmitAttrONMOUSEDOWN NOFRAMES
+instance AdmitAttrONMOUSEDOWN NOSCRIPT
+instance AdmitAttrONMOUSEDOWN OBJECT
+instance AdmitAttrONMOUSEDOWN OL
+instance AdmitAttrONMOUSEDOWN OPTGROUP
+instance AdmitAttrONMOUSEDOWN OPTION
+instance AdmitAttrONMOUSEDOWN P
+instance AdmitAttrONMOUSEDOWN PRE
+instance AdmitAttrONMOUSEDOWN Q
+instance AdmitAttrONMOUSEDOWN S
+instance AdmitAttrONMOUSEDOWN SAMP
+instance AdmitAttrONMOUSEDOWN SELECT
+instance AdmitAttrONMOUSEDOWN SMALL
+instance AdmitAttrONMOUSEDOWN SPAN
+instance AdmitAttrONMOUSEDOWN STRIKE
+instance AdmitAttrONMOUSEDOWN STRONG
+instance AdmitAttrONMOUSEDOWN SUB
+instance AdmitAttrONMOUSEDOWN SUP
+instance AdmitAttrONMOUSEDOWN TABLE
+instance AdmitAttrONMOUSEDOWN TBODY
+instance AdmitAttrONMOUSEDOWN TD
+instance AdmitAttrONMOUSEDOWN TEXTAREA
+instance AdmitAttrONMOUSEDOWN TFOOT
+instance AdmitAttrONMOUSEDOWN TH
+instance AdmitAttrONMOUSEDOWN THEAD
+instance AdmitAttrONMOUSEDOWN TR
+instance AdmitAttrONMOUSEDOWN TT
+instance AdmitAttrONMOUSEDOWN U
+instance AdmitAttrONMOUSEDOWN UL
+instance AdmitAttrONMOUSEDOWN VAR
+instance AdmitAttrONMOUSEMOVE A
+instance AdmitAttrONMOUSEMOVE ABBR
+instance AdmitAttrONMOUSEMOVE ACRONYM
+instance AdmitAttrONMOUSEMOVE ADDRESS
+instance AdmitAttrONMOUSEMOVE AREA
+instance AdmitAttrONMOUSEMOVE B
+instance AdmitAttrONMOUSEMOVE BIG
+instance AdmitAttrONMOUSEMOVE BLOCKQUOTE
+instance AdmitAttrONMOUSEMOVE BODY
+instance AdmitAttrONMOUSEMOVE BUTTON
+instance AdmitAttrONMOUSEMOVE CAPTION
+instance AdmitAttrONMOUSEMOVE CENTER
+instance AdmitAttrONMOUSEMOVE CITE
+instance AdmitAttrONMOUSEMOVE CODE
+instance AdmitAttrONMOUSEMOVE COL
+instance AdmitAttrONMOUSEMOVE COLGROUP
+instance AdmitAttrONMOUSEMOVE DD
+instance AdmitAttrONMOUSEMOVE DEL
+instance AdmitAttrONMOUSEMOVE DFN
+instance AdmitAttrONMOUSEMOVE DIR
+instance AdmitAttrONMOUSEMOVE DIV
+instance AdmitAttrONMOUSEMOVE DL
+instance AdmitAttrONMOUSEMOVE DT
+instance AdmitAttrONMOUSEMOVE EM
+instance AdmitAttrONMOUSEMOVE FIELDSET
+instance AdmitAttrONMOUSEMOVE FORM
+instance AdmitAttrONMOUSEMOVE H1
+instance AdmitAttrONMOUSEMOVE H2
+instance AdmitAttrONMOUSEMOVE H3
+instance AdmitAttrONMOUSEMOVE H4
+instance AdmitAttrONMOUSEMOVE H5
+instance AdmitAttrONMOUSEMOVE H6
+instance AdmitAttrONMOUSEMOVE HR
+instance AdmitAttrONMOUSEMOVE I
+instance AdmitAttrONMOUSEMOVE IMG
+instance AdmitAttrONMOUSEMOVE INPUT
+instance AdmitAttrONMOUSEMOVE INS
+instance AdmitAttrONMOUSEMOVE KBD
+instance AdmitAttrONMOUSEMOVE LABEL
+instance AdmitAttrONMOUSEMOVE LEGEND
+instance AdmitAttrONMOUSEMOVE LI
+instance AdmitAttrONMOUSEMOVE LINK
+instance AdmitAttrONMOUSEMOVE MAP
+instance AdmitAttrONMOUSEMOVE MENU
+instance AdmitAttrONMOUSEMOVE NOFRAMES
+instance AdmitAttrONMOUSEMOVE NOSCRIPT
+instance AdmitAttrONMOUSEMOVE OBJECT
+instance AdmitAttrONMOUSEMOVE OL
+instance AdmitAttrONMOUSEMOVE OPTGROUP
+instance AdmitAttrONMOUSEMOVE OPTION
+instance AdmitAttrONMOUSEMOVE P
+instance AdmitAttrONMOUSEMOVE PRE
+instance AdmitAttrONMOUSEMOVE Q
+instance AdmitAttrONMOUSEMOVE S
+instance AdmitAttrONMOUSEMOVE SAMP
+instance AdmitAttrONMOUSEMOVE SELECT
+instance AdmitAttrONMOUSEMOVE SMALL
+instance AdmitAttrONMOUSEMOVE SPAN
+instance AdmitAttrONMOUSEMOVE STRIKE
+instance AdmitAttrONMOUSEMOVE STRONG
+instance AdmitAttrONMOUSEMOVE SUB
+instance AdmitAttrONMOUSEMOVE SUP
+instance AdmitAttrONMOUSEMOVE TABLE
+instance AdmitAttrONMOUSEMOVE TBODY
+instance AdmitAttrONMOUSEMOVE TD
+instance AdmitAttrONMOUSEMOVE TEXTAREA
+instance AdmitAttrONMOUSEMOVE TFOOT
+instance AdmitAttrONMOUSEMOVE TH
+instance AdmitAttrONMOUSEMOVE THEAD
+instance AdmitAttrONMOUSEMOVE TR
+instance AdmitAttrONMOUSEMOVE TT
+instance AdmitAttrONMOUSEMOVE U
+instance AdmitAttrONMOUSEMOVE UL
+instance AdmitAttrONMOUSEMOVE VAR
+instance AdmitAttrONMOUSEOUT A
+instance AdmitAttrONMOUSEOUT ABBR
+instance AdmitAttrONMOUSEOUT ACRONYM
+instance AdmitAttrONMOUSEOUT ADDRESS
+instance AdmitAttrONMOUSEOUT AREA
+instance AdmitAttrONMOUSEOUT B
+instance AdmitAttrONMOUSEOUT BIG
+instance AdmitAttrONMOUSEOUT BLOCKQUOTE
+instance AdmitAttrONMOUSEOUT BODY
+instance AdmitAttrONMOUSEOUT BUTTON
+instance AdmitAttrONMOUSEOUT CAPTION
+instance AdmitAttrONMOUSEOUT CENTER
+instance AdmitAttrONMOUSEOUT CITE
+instance AdmitAttrONMOUSEOUT CODE
+instance AdmitAttrONMOUSEOUT COL
+instance AdmitAttrONMOUSEOUT COLGROUP
+instance AdmitAttrONMOUSEOUT DD
+instance AdmitAttrONMOUSEOUT DEL
+instance AdmitAttrONMOUSEOUT DFN
+instance AdmitAttrONMOUSEOUT DIR
+instance AdmitAttrONMOUSEOUT DIV
+instance AdmitAttrONMOUSEOUT DL
+instance AdmitAttrONMOUSEOUT DT
+instance AdmitAttrONMOUSEOUT EM
+instance AdmitAttrONMOUSEOUT FIELDSET
+instance AdmitAttrONMOUSEOUT FORM
+instance AdmitAttrONMOUSEOUT H1
+instance AdmitAttrONMOUSEOUT H2
+instance AdmitAttrONMOUSEOUT H3
+instance AdmitAttrONMOUSEOUT H4
+instance AdmitAttrONMOUSEOUT H5
+instance AdmitAttrONMOUSEOUT H6
+instance AdmitAttrONMOUSEOUT HR
+instance AdmitAttrONMOUSEOUT I
+instance AdmitAttrONMOUSEOUT IMG
+instance AdmitAttrONMOUSEOUT INPUT
+instance AdmitAttrONMOUSEOUT INS
+instance AdmitAttrONMOUSEOUT KBD
+instance AdmitAttrONMOUSEOUT LABEL
+instance AdmitAttrONMOUSEOUT LEGEND
+instance AdmitAttrONMOUSEOUT LI
+instance AdmitAttrONMOUSEOUT LINK
+instance AdmitAttrONMOUSEOUT MAP
+instance AdmitAttrONMOUSEOUT MENU
+instance AdmitAttrONMOUSEOUT NOFRAMES
+instance AdmitAttrONMOUSEOUT NOSCRIPT
+instance AdmitAttrONMOUSEOUT OBJECT
+instance AdmitAttrONMOUSEOUT OL
+instance AdmitAttrONMOUSEOUT OPTGROUP
+instance AdmitAttrONMOUSEOUT OPTION
+instance AdmitAttrONMOUSEOUT P
+instance AdmitAttrONMOUSEOUT PRE
+instance AdmitAttrONMOUSEOUT Q
+instance AdmitAttrONMOUSEOUT S
+instance AdmitAttrONMOUSEOUT SAMP
+instance AdmitAttrONMOUSEOUT SELECT
+instance AdmitAttrONMOUSEOUT SMALL
+instance AdmitAttrONMOUSEOUT SPAN
+instance AdmitAttrONMOUSEOUT STRIKE
+instance AdmitAttrONMOUSEOUT STRONG
+instance AdmitAttrONMOUSEOUT SUB
+instance AdmitAttrONMOUSEOUT SUP
+instance AdmitAttrONMOUSEOUT TABLE
+instance AdmitAttrONMOUSEOUT TBODY
+instance AdmitAttrONMOUSEOUT TD
+instance AdmitAttrONMOUSEOUT TEXTAREA
+instance AdmitAttrONMOUSEOUT TFOOT
+instance AdmitAttrONMOUSEOUT TH
+instance AdmitAttrONMOUSEOUT THEAD
+instance AdmitAttrONMOUSEOUT TR
+instance AdmitAttrONMOUSEOUT TT
+instance AdmitAttrONMOUSEOUT U
+instance AdmitAttrONMOUSEOUT UL
+instance AdmitAttrONMOUSEOUT VAR
+instance AdmitAttrONMOUSEOVER A
+instance AdmitAttrONMOUSEOVER ABBR
+instance AdmitAttrONMOUSEOVER ACRONYM
+instance AdmitAttrONMOUSEOVER ADDRESS
+instance AdmitAttrONMOUSEOVER AREA
+instance AdmitAttrONMOUSEOVER B
+instance AdmitAttrONMOUSEOVER BIG
+instance AdmitAttrONMOUSEOVER BLOCKQUOTE
+instance AdmitAttrONMOUSEOVER BODY
+instance AdmitAttrONMOUSEOVER BUTTON
+instance AdmitAttrONMOUSEOVER CAPTION
+instance AdmitAttrONMOUSEOVER CENTER
+instance AdmitAttrONMOUSEOVER CITE
+instance AdmitAttrONMOUSEOVER CODE
+instance AdmitAttrONMOUSEOVER COL
+instance AdmitAttrONMOUSEOVER COLGROUP
+instance AdmitAttrONMOUSEOVER DD
+instance AdmitAttrONMOUSEOVER DEL
+instance AdmitAttrONMOUSEOVER DFN
+instance AdmitAttrONMOUSEOVER DIR
+instance AdmitAttrONMOUSEOVER DIV
+instance AdmitAttrONMOUSEOVER DL
+instance AdmitAttrONMOUSEOVER DT
+instance AdmitAttrONMOUSEOVER EM
+instance AdmitAttrONMOUSEOVER FIELDSET
+instance AdmitAttrONMOUSEOVER FORM
+instance AdmitAttrONMOUSEOVER H1
+instance AdmitAttrONMOUSEOVER H2
+instance AdmitAttrONMOUSEOVER H3
+instance AdmitAttrONMOUSEOVER H4
+instance AdmitAttrONMOUSEOVER H5
+instance AdmitAttrONMOUSEOVER H6
+instance AdmitAttrONMOUSEOVER HR
+instance AdmitAttrONMOUSEOVER I
+instance AdmitAttrONMOUSEOVER IMG
+instance AdmitAttrONMOUSEOVER INPUT
+instance AdmitAttrONMOUSEOVER INS
+instance AdmitAttrONMOUSEOVER KBD
+instance AdmitAttrONMOUSEOVER LABEL
+instance AdmitAttrONMOUSEOVER LEGEND
+instance AdmitAttrONMOUSEOVER LI
+instance AdmitAttrONMOUSEOVER LINK
+instance AdmitAttrONMOUSEOVER MAP
+instance AdmitAttrONMOUSEOVER MENU
+instance AdmitAttrONMOUSEOVER NOFRAMES
+instance AdmitAttrONMOUSEOVER NOSCRIPT
+instance AdmitAttrONMOUSEOVER OBJECT
+instance AdmitAttrONMOUSEOVER OL
+instance AdmitAttrONMOUSEOVER OPTGROUP
+instance AdmitAttrONMOUSEOVER OPTION
+instance AdmitAttrONMOUSEOVER P
+instance AdmitAttrONMOUSEOVER PRE
+instance AdmitAttrONMOUSEOVER Q
+instance AdmitAttrONMOUSEOVER S
+instance AdmitAttrONMOUSEOVER SAMP
+instance AdmitAttrONMOUSEOVER SELECT
+instance AdmitAttrONMOUSEOVER SMALL
+instance AdmitAttrONMOUSEOVER SPAN
+instance AdmitAttrONMOUSEOVER STRIKE
+instance AdmitAttrONMOUSEOVER STRONG
+instance AdmitAttrONMOUSEOVER SUB
+instance AdmitAttrONMOUSEOVER SUP
+instance AdmitAttrONMOUSEOVER TABLE
+instance AdmitAttrONMOUSEOVER TBODY
+instance AdmitAttrONMOUSEOVER TD
+instance AdmitAttrONMOUSEOVER TEXTAREA
+instance AdmitAttrONMOUSEOVER TFOOT
+instance AdmitAttrONMOUSEOVER TH
+instance AdmitAttrONMOUSEOVER THEAD
+instance AdmitAttrONMOUSEOVER TR
+instance AdmitAttrONMOUSEOVER TT
+instance AdmitAttrONMOUSEOVER U
+instance AdmitAttrONMOUSEOVER UL
+instance AdmitAttrONMOUSEOVER VAR
+instance AdmitAttrONMOUSEUP A
+instance AdmitAttrONMOUSEUP ABBR
+instance AdmitAttrONMOUSEUP ACRONYM
+instance AdmitAttrONMOUSEUP ADDRESS
+instance AdmitAttrONMOUSEUP AREA
+instance AdmitAttrONMOUSEUP B
+instance AdmitAttrONMOUSEUP BIG
+instance AdmitAttrONMOUSEUP BLOCKQUOTE
+instance AdmitAttrONMOUSEUP BODY
+instance AdmitAttrONMOUSEUP BUTTON
+instance AdmitAttrONMOUSEUP CAPTION
+instance AdmitAttrONMOUSEUP CENTER
+instance AdmitAttrONMOUSEUP CITE
+instance AdmitAttrONMOUSEUP CODE
+instance AdmitAttrONMOUSEUP COL
+instance AdmitAttrONMOUSEUP COLGROUP
+instance AdmitAttrONMOUSEUP DD
+instance AdmitAttrONMOUSEUP DEL
+instance AdmitAttrONMOUSEUP DFN
+instance AdmitAttrONMOUSEUP DIR
+instance AdmitAttrONMOUSEUP DIV
+instance AdmitAttrONMOUSEUP DL
+instance AdmitAttrONMOUSEUP DT
+instance AdmitAttrONMOUSEUP EM
+instance AdmitAttrONMOUSEUP FIELDSET
+instance AdmitAttrONMOUSEUP FORM
+instance AdmitAttrONMOUSEUP H1
+instance AdmitAttrONMOUSEUP H2
+instance AdmitAttrONMOUSEUP H3
+instance AdmitAttrONMOUSEUP H4
+instance AdmitAttrONMOUSEUP H5
+instance AdmitAttrONMOUSEUP H6
+instance AdmitAttrONMOUSEUP HR
+instance AdmitAttrONMOUSEUP I
+instance AdmitAttrONMOUSEUP IMG
+instance AdmitAttrONMOUSEUP INPUT
+instance AdmitAttrONMOUSEUP INS
+instance AdmitAttrONMOUSEUP KBD
+instance AdmitAttrONMOUSEUP LABEL
+instance AdmitAttrONMOUSEUP LEGEND
+instance AdmitAttrONMOUSEUP LI
+instance AdmitAttrONMOUSEUP LINK
+instance AdmitAttrONMOUSEUP MAP
+instance AdmitAttrONMOUSEUP MENU
+instance AdmitAttrONMOUSEUP NOFRAMES
+instance AdmitAttrONMOUSEUP NOSCRIPT
+instance AdmitAttrONMOUSEUP OBJECT
+instance AdmitAttrONMOUSEUP OL
+instance AdmitAttrONMOUSEUP OPTGROUP
+instance AdmitAttrONMOUSEUP OPTION
+instance AdmitAttrONMOUSEUP P
+instance AdmitAttrONMOUSEUP PRE
+instance AdmitAttrONMOUSEUP Q
+instance AdmitAttrONMOUSEUP S
+instance AdmitAttrONMOUSEUP SAMP
+instance AdmitAttrONMOUSEUP SELECT
+instance AdmitAttrONMOUSEUP SMALL
+instance AdmitAttrONMOUSEUP SPAN
+instance AdmitAttrONMOUSEUP STRIKE
+instance AdmitAttrONMOUSEUP STRONG
+instance AdmitAttrONMOUSEUP SUB
+instance AdmitAttrONMOUSEUP SUP
+instance AdmitAttrONMOUSEUP TABLE
+instance AdmitAttrONMOUSEUP TBODY
+instance AdmitAttrONMOUSEUP TD
+instance AdmitAttrONMOUSEUP TEXTAREA
+instance AdmitAttrONMOUSEUP TFOOT
+instance AdmitAttrONMOUSEUP TH
+instance AdmitAttrONMOUSEUP THEAD
+instance AdmitAttrONMOUSEUP TR
+instance AdmitAttrONMOUSEUP TT
+instance AdmitAttrONMOUSEUP U
+instance AdmitAttrONMOUSEUP UL
+instance AdmitAttrONMOUSEUP VAR
+instance AdmitAttrONRESET FORM
+instance AdmitAttrONSELECT INPUT
+instance AdmitAttrONSELECT TEXTAREA
+instance AdmitAttrONSUBMIT FORM
+instance AdmitAttrONUNLOAD BODY
+instance AdmitAttrPROFILE HEAD
+instance AdmitAttrPROMPT ISINDEX
+instance AdmitAttrREADONLY INPUT
+instance AdmitAttrREADONLY TEXTAREA
+instance AdmitAttrREL A
+instance AdmitAttrREL LINK
+instance AdmitAttrREV A
+instance AdmitAttrREV LINK
+instance AdmitAttrROWS TEXTAREA
+instance AdmitAttrROWSPAN TD
+instance AdmitAttrROWSPAN TH
+instance AdmitAttrRULES TABLE
+instance AdmitAttrSCHEME META
+instance AdmitAttrSCOPE TD
+instance AdmitAttrSCOPE TH
+instance AdmitAttrSCROLLING IFRAME
+instance AdmitAttrSELECTED OPTION
+instance AdmitAttrSHAPE A
+instance AdmitAttrSHAPE AREA
+instance AdmitAttrSIZE BASEFONT
+instance AdmitAttrSIZE FONT
+instance AdmitAttrSIZE HR
+instance AdmitAttrSIZE INPUT
+instance AdmitAttrSIZE SELECT
+instance AdmitAttrSPAN COL
+instance AdmitAttrSPAN COLGROUP
+instance AdmitAttrSRC IFRAME
+instance AdmitAttrSRC IMG
+instance AdmitAttrSRC INPUT
+instance AdmitAttrSRC SCRIPT
+instance AdmitAttrSTANDBY OBJECT
+instance AdmitAttrSTART OL
+instance AdmitAttrSTYLE A
+instance AdmitAttrSTYLE ABBR
+instance AdmitAttrSTYLE ACRONYM
+instance AdmitAttrSTYLE ADDRESS
+instance AdmitAttrSTYLE APPLET
+instance AdmitAttrSTYLE AREA
+instance AdmitAttrSTYLE B
+instance AdmitAttrSTYLE BDO
+instance AdmitAttrSTYLE BIG
+instance AdmitAttrSTYLE BLOCKQUOTE
+instance AdmitAttrSTYLE BODY
+instance AdmitAttrSTYLE BR
+instance AdmitAttrSTYLE BUTTON
+instance AdmitAttrSTYLE CAPTION
+instance AdmitAttrSTYLE CENTER
+instance AdmitAttrSTYLE CITE
+instance AdmitAttrSTYLE CODE
+instance AdmitAttrSTYLE COL
+instance AdmitAttrSTYLE COLGROUP
+instance AdmitAttrSTYLE DD
+instance AdmitAttrSTYLE DEL
+instance AdmitAttrSTYLE DFN
+instance AdmitAttrSTYLE DIR
+instance AdmitAttrSTYLE DIV
+instance AdmitAttrSTYLE DL
+instance AdmitAttrSTYLE DT
+instance AdmitAttrSTYLE EM
+instance AdmitAttrSTYLE FIELDSET
+instance AdmitAttrSTYLE FONT
+instance AdmitAttrSTYLE FORM
+instance AdmitAttrSTYLE H1
+instance AdmitAttrSTYLE H2
+instance AdmitAttrSTYLE H3
+instance AdmitAttrSTYLE H4
+instance AdmitAttrSTYLE H5
+instance AdmitAttrSTYLE H6
+instance AdmitAttrSTYLE HR
+instance AdmitAttrSTYLE I
+instance AdmitAttrSTYLE IFRAME
+instance AdmitAttrSTYLE IMG
+instance AdmitAttrSTYLE INPUT
+instance AdmitAttrSTYLE INS
+instance AdmitAttrSTYLE ISINDEX
+instance AdmitAttrSTYLE KBD
+instance AdmitAttrSTYLE LABEL
+instance AdmitAttrSTYLE LEGEND
+instance AdmitAttrSTYLE LI
+instance AdmitAttrSTYLE LINK
+instance AdmitAttrSTYLE MAP
+instance AdmitAttrSTYLE MENU
+instance AdmitAttrSTYLE NOFRAMES
+instance AdmitAttrSTYLE NOSCRIPT
+instance AdmitAttrSTYLE OBJECT
+instance AdmitAttrSTYLE OL
+instance AdmitAttrSTYLE OPTGROUP
+instance AdmitAttrSTYLE OPTION
+instance AdmitAttrSTYLE P
+instance AdmitAttrSTYLE PRE
+instance AdmitAttrSTYLE Q
+instance AdmitAttrSTYLE S
+instance AdmitAttrSTYLE SAMP
+instance AdmitAttrSTYLE SELECT
+instance AdmitAttrSTYLE SMALL
+instance AdmitAttrSTYLE SPAN
+instance AdmitAttrSTYLE STRIKE
+instance AdmitAttrSTYLE STRONG
+instance AdmitAttrSTYLE SUB
+instance AdmitAttrSTYLE SUP
+instance AdmitAttrSTYLE TABLE
+instance AdmitAttrSTYLE TBODY
+instance AdmitAttrSTYLE TD
+instance AdmitAttrSTYLE TEXTAREA
+instance AdmitAttrSTYLE TFOOT
+instance AdmitAttrSTYLE TH
+instance AdmitAttrSTYLE THEAD
+instance AdmitAttrSTYLE TR
+instance AdmitAttrSTYLE TT
+instance AdmitAttrSTYLE U
+instance AdmitAttrSTYLE UL
+instance AdmitAttrSTYLE VAR
+instance AdmitAttrSUMMARY TABLE
+instance AdmitAttrTABINDEX A
+instance AdmitAttrTABINDEX AREA
+instance AdmitAttrTABINDEX BUTTON
+instance AdmitAttrTABINDEX INPUT
+instance AdmitAttrTABINDEX OBJECT
+instance AdmitAttrTABINDEX SELECT
+instance AdmitAttrTABINDEX TEXTAREA
+instance AdmitAttrTARGET A
+instance AdmitAttrTARGET AREA
+instance AdmitAttrTARGET BASE
+instance AdmitAttrTARGET FORM
+instance AdmitAttrTARGET LINK
+instance AdmitAttrTEXT BODY
+instance AdmitAttrTITLE A
+instance AdmitAttrTITLE ABBR
+instance AdmitAttrTITLE ACRONYM
+instance AdmitAttrTITLE ADDRESS
+instance AdmitAttrTITLE APPLET
+instance AdmitAttrTITLE AREA
+instance AdmitAttrTITLE B
+instance AdmitAttrTITLE BDO
+instance AdmitAttrTITLE BIG
+instance AdmitAttrTITLE BLOCKQUOTE
+instance AdmitAttrTITLE BODY
+instance AdmitAttrTITLE BR
+instance AdmitAttrTITLE BUTTON
+instance AdmitAttrTITLE CAPTION
+instance AdmitAttrTITLE CENTER
+instance AdmitAttrTITLE CITE
+instance AdmitAttrTITLE CODE
+instance AdmitAttrTITLE COL
+instance AdmitAttrTITLE COLGROUP
+instance AdmitAttrTITLE DD
+instance AdmitAttrTITLE DEL
+instance AdmitAttrTITLE DFN
+instance AdmitAttrTITLE DIR
+instance AdmitAttrTITLE DIV
+instance AdmitAttrTITLE DL
+instance AdmitAttrTITLE DT
+instance AdmitAttrTITLE EM
+instance AdmitAttrTITLE FIELDSET
+instance AdmitAttrTITLE FONT
+instance AdmitAttrTITLE FORM
+instance AdmitAttrTITLE H1
+instance AdmitAttrTITLE H2
+instance AdmitAttrTITLE H3
+instance AdmitAttrTITLE H4
+instance AdmitAttrTITLE H5
+instance AdmitAttrTITLE H6
+instance AdmitAttrTITLE HR
+instance AdmitAttrTITLE I
+instance AdmitAttrTITLE IFRAME
+instance AdmitAttrTITLE IMG
+instance AdmitAttrTITLE INPUT
+instance AdmitAttrTITLE INS
+instance AdmitAttrTITLE ISINDEX
+instance AdmitAttrTITLE KBD
+instance AdmitAttrTITLE LABEL
+instance AdmitAttrTITLE LEGEND
+instance AdmitAttrTITLE LI
+instance AdmitAttrTITLE LINK
+instance AdmitAttrTITLE MAP
+instance AdmitAttrTITLE MENU
+instance AdmitAttrTITLE NOFRAMES
+instance AdmitAttrTITLE NOSCRIPT
+instance AdmitAttrTITLE OBJECT
+instance AdmitAttrTITLE OL
+instance AdmitAttrTITLE OPTGROUP
+instance AdmitAttrTITLE OPTION
+instance AdmitAttrTITLE P
+instance AdmitAttrTITLE PRE
+instance AdmitAttrTITLE Q
+instance AdmitAttrTITLE S
+instance AdmitAttrTITLE SAMP
+instance AdmitAttrTITLE SELECT
+instance AdmitAttrTITLE SMALL
+instance AdmitAttrTITLE SPAN
+instance AdmitAttrTITLE STRIKE
+instance AdmitAttrTITLE STRONG
+instance AdmitAttrTITLE STYLE
+instance AdmitAttrTITLE SUB
+instance AdmitAttrTITLE SUP
+instance AdmitAttrTITLE TABLE
+instance AdmitAttrTITLE TBODY
+instance AdmitAttrTITLE TD
+instance AdmitAttrTITLE TEXTAREA
+instance AdmitAttrTITLE TFOOT
+instance AdmitAttrTITLE TH
+instance AdmitAttrTITLE THEAD
+instance AdmitAttrTITLE TR
+instance AdmitAttrTITLE TT
+instance AdmitAttrTITLE U
+instance AdmitAttrTITLE UL
+instance AdmitAttrTITLE VAR
+instance AdmitAttrTYPE A
+instance AdmitAttrTYPE BUTTON
+instance AdmitAttrTYPE INPUT
+instance AdmitAttrTYPE LI
+instance AdmitAttrTYPE LINK
+instance AdmitAttrTYPE OBJECT
+instance AdmitAttrTYPE OL
+instance AdmitAttrTYPE PARAM
+instance AdmitAttrTYPE SCRIPT
+instance AdmitAttrTYPE STYLE
+instance AdmitAttrTYPE UL
+instance AdmitAttrUSEMAP IMG
+instance AdmitAttrUSEMAP INPUT
+instance AdmitAttrUSEMAP OBJECT
+instance AdmitAttrVALIGN COL
+instance AdmitAttrVALIGN COLGROUP
+instance AdmitAttrVALIGN TBODY
+instance AdmitAttrVALIGN TD
+instance AdmitAttrVALIGN TFOOT
+instance AdmitAttrVALIGN TH
+instance AdmitAttrVALIGN THEAD
+instance AdmitAttrVALIGN TR
+instance AdmitAttrVALUE BUTTON
+instance AdmitAttrVALUE INPUT
+instance AdmitAttrVALUE LI
+instance AdmitAttrVALUE OPTION
+instance AdmitAttrVALUE PARAM
+instance AdmitAttrVALUETYPE PARAM
+instance AdmitAttrVERSION HTML
+instance AdmitAttrVLINK BODY
+instance AdmitAttrVSPACE APPLET
+instance AdmitAttrVSPACE IMG
+instance AdmitAttrVSPACE OBJECT
+instance AdmitAttrWIDTH APPLET
+instance AdmitAttrWIDTH COL
+instance AdmitAttrWIDTH COLGROUP
+instance AdmitAttrWIDTH HR
+instance AdmitAttrWIDTH IFRAME
+instance AdmitAttrWIDTH IMG
+instance AdmitAttrWIDTH OBJECT
+instance AdmitAttrWIDTH PRE
+instance AdmitAttrWIDTH TABLE
+instance AdmitAttrWIDTH TD
+instance AdmitAttrWIDTH TH
diff --git a/WASH/HTML/HTMLTemplates.hs b/WASH/HTML/HTMLTemplates.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLTemplates.hs
@@ -0,0 +1,516 @@
+module WASH.HTML.HTMLTemplates where
+
+import WASH.HTML.HTMLBase
+import WASH.Utility.SHA1
+import WASH.Utility.JavaScript
+import qualified WASH.Utility.Base32 as Base32
+
+import Monad (unless)
+import List ((\\))
+
+data ST s a =  ST { unST :: s -> (a, s) }
+instance Monad (ST s) where
+  return x = ST (\s -> (x, s))
+  m >>= f  = ST (\s -> let (x', s') = unST m s
+		       in  unST (f x') s')
+
+runST :: s -> ST s a -> a
+runST s m = fst (unST m s)
+
+getST :: ST s s
+getST = ST (\s -> (s, s))
+
+setST :: s -> ST s ()
+setST s = ST (const ((), s))
+
+data Names = Names { ntable :: [(String, Int)], nseen :: [Int] }
+
+----------------------------------------------------------------------
+-- template generation
+----------------------------------------------------------------------
+showTemplatified :: ELEMENT_ -> ShowS
+showTemplatified = showTemplate . analyze
+
+showTemplate :: (Template, Mt) -> ShowS
+showTemplate (tis, mt) =
+  let ts = closed mt
+      ndefs = length ts 
+      at = actuals mt
+      st = buildStringTableArgs at
+      cst = cleanupStringTable ndefs st
+      shownargs = runST (Names { ntable = cst, nseen = [] })
+			(showActualArgs at)
+  in
+  showDefinitions ndefs ts .
+  showString "<script name=\"BODY\">\n" .
+  -- showStringTable cst .
+  showString "S(" . shownargs . showString ",document)" .
+  showString "\n</script>\n"
+
+showDefinitions n [] =
+  let scriptName = "STRINGBASE"
+  in
+  showString "<script name=\"" . showString scriptName . showString "\">\n" .
+  showString "function S (template, out) {\n" .
+  showString "  var ty = typeof template;\n" .
+  showString "  if (ty == \"string\") out.write (template);\n" .
+  showString "  else if (ty == \"object\")\n" .
+  showString "    for (var i = 0; i<template.length; i++)\n" .
+  showString "      S (template[i], out);\n" .
+  showString "}\n" .
+  showString "</script>\n"
+    
+showDefinitions n ((scriptName, (nr, nformals, t1)) :ts) =
+  showString "<script name=\"" . showString scriptName . showString "\">\n" .
+  (if nformals==0 then showString "var " else showString "function ") . showsIdent n . 
+  (if nformals==0 then showString "=" else showString "(" . showFormals nformals . showString ")" .
+  showString "{return") .
+  showString "[" .
+  showBody t1 .
+  showString "]" .
+  (if nformals==0 then id else showString "}\n") .
+  showString "</script>\n" .
+  showDefinitions (n-1) ts
+
+showsIdent n = showString (identlist !! n)
+
+charlist = (['A'..'Z'] ++ ['a'..'z'])
+alphanumlist = ['0'..'9'] ++ charlist
+
+identlist = ([ [c] | c <- charlist ]
+	 ++ [ [c,d] | c <- charlist, d <- alphanumlist ])
+	 \\ ["S","o","v"]
+
+  
+showBody [] = 
+  id
+showBody [ti] =
+  showStatement ti
+showBody (ti:tis) =
+  showBody tis .
+  showString "," .
+  showStatement ti
+
+showStatement (TOut str) =
+  showString (jsShow str)
+showStatement (TVar n) =
+  showsIdent n
+showStatement (TCall fname args) =
+  error "this should not happen"
+
+showFormals 0 =
+  id
+showFormals n =
+  (if n>1 then showFormals (n-1) . showString "," else id) .
+  showsIdent n
+
+showActual (TOut str) =
+  do names <- getST
+     let cst = ntable names
+	 seen = nseen names
+     case lookup str cst of
+       Nothing ->
+	 return $ showString (jsShow str)
+       Just strident ->
+	 if strident `elem` seen
+	 then return $ showsIdent strident
+	 else
+           do setST (names { nseen = strident : seen })
+	      return $
+		(showsIdent strident . showChar '=' . showString (jsShow str))
+showActual (TVar n) =
+  error "this should not happen"
+showActual (TCall fname []) =
+  return $ showsIdent fname
+showActual (TCall fname args) =
+  do saa <- showActualArgs args
+     return (showsIdent fname . showString "(" .
+	     saa .
+	     showString ")")
+
+showActualArgs [] = 
+  return id
+showActualArgs [arg] =
+  showActualArg arg
+showActualArgs (arg: args) =
+  do x1 <- showActualArgs args
+     x2 <- showActualArg arg
+     return (x1 . showString "," . x2)
+
+showActualArg [x] =
+  showActual x
+showActualArg xs = 
+  do hxs <- h xs
+     return (showString "[" . hxs . showString "]")
+  where 
+    h [] = return id
+    h [x] = showActual x
+    h (x:xs) = do sax <- showActual x
+		  hxs <- h xs
+		  return (sax . showChar ',' . hxs)
+
+showStringTable =
+  foldr g id
+  where
+    g (str, n) showrest =
+      showString "var " . showsIdent n . showString "=" . showString (jsShow str) .
+      showString ";\n" . showrest
+
+cleanupStringTable ndefs st =
+  zip [str | (str, n) <- st, n > 3 || length str > 2 && n > 1]
+      [(ndefs+1) ..]
+unite st1 st2 =
+  foldr g st1 st2
+  where g p@(str,i) st1 =
+	  case lookup str st1 of
+	    Nothing -> p:st1
+	    Just j -> (str, i+j):[ p | (p@(str',_)) <- st1, str' /= str ]
+buildStringTableArgs = 
+  foldr unite [] . map buildStringTableArg
+buildStringTableArg =
+  foldr unite [] . map buildStringTableActual
+buildStringTableActual (TOut str) =
+  [(str, 1)]
+buildStringTableActual (TVar n) =
+  error "this should not happen"
+buildStringTableActual (TCall fname args) =
+  buildStringTableArgs args
+	  
+----------------------------------------------------------------------
+-- template analysis
+----------------------------------------------------------------------
+
+analyze :: ELEMENT_ -> (Template, Mt)
+analyze e = unM (collect e STATIC []) mt0
+
+data Mt = Mt
+    { open :: Templates
+    , closed :: [(String, (Int, Int, Template))]
+    , dynamics :: [Templates]
+    , actuals :: Templates
+    , count :: Int
+    }
+    deriving Show
+
+mt0 = Mt { open = []
+	 , closed = []
+	 , dynamics = []
+	 , actuals = []
+	 , count = 0
+	 }
+
+type Templates = [Template]
+
+type Template = [TemplateItem]
+
+data TemplateItem
+  = TOut String
+  | TVar Int
+  | TCall Int [Template]
+  deriving Show
+
+tout :: String -> [TemplateItem] -> [TemplateItem]
+tout s (TOut s' : rest) = (TOut (s'++s) : rest) 
+tout s tis = TOut s : tis
+
+data M a = M { unM :: Mt -> (a, Mt) }
+
+instance Monad M where
+  return a = M (\t -> (a, t))
+  m >>= f  = M (\t -> let (a,t') = unM m t in unM (f a) t')
+
+pushOpen :: Template -> M ()
+pushOpen t = M (\mt -> ((), mt { open = t : open mt
+			       , dynamics = actuals mt : dynamics mt 
+			       , actuals = []
+			       } ))
+popOpen :: M Template
+popOpen = M (\mt -> (head (open mt), mt { open = tail (open mt)
+					, actuals = head (dynamics mt)
+					, dynamics = tail (dynamics mt)
+					}))
+
+pushClosed :: Template -> M Int
+pushClosed tis = 
+  M (\mt -> 
+     let defs = closed mt 
+	 name = Base32.encode (sha1 (show tis)) 
+     in
+     case lookup name defs of
+       Nothing ->
+	 let next = length (closed mt) + 1 in
+	 (next, mt { closed = (name, (next, length (actuals mt), tis)) : defs })
+       Just (last, nargs, _) ->
+	 (last, mt))
+
+pushActuals :: Template -> M Int
+pushActuals tis = 
+  M (\mt -> (length (actuals mt) + 1, mt { actuals = tis : actuals mt }))
+
+getActuals :: M Templates
+getActuals = M (\mt -> (actuals mt, mt))
+
+get :: (Mt -> x) -> M x
+get f = M (\mt -> (f mt, mt))
+
+mergeActuals :: Template -> M ()
+mergeActuals tis =
+  M (\mt -> 
+     let act0 : acts = actuals mt in
+     ((), mt { actuals = (act0 ++ tis) : actuals mt }))
+
+maybePushActuals :: Template -> Template -> M Template
+maybePushActuals cur tis =
+  case cur of
+    TVar _ : _ ->
+      do mergeActuals tis
+	 return cur
+    _ ->
+      do vname <- pushActuals tis
+	 return (TVar vname : cur)
+
+-- |collect takes an element, a list of open templates, a list of finished
+-- templates, and returns a pair (open templates, finished templates).
+collect :: ELEMENT_ -> BT -> Template -> M Template
+collect (EMPTY_ bt tag atts) cbt cur =
+  let t1 = TOut ('<' : tag)
+      t2 = tout "/>"
+  in
+  case bt of 
+    TOPLEVEL -> 
+      do pushOpen cur
+	 ts <- collectAttrs atts STATIC [t1]
+	 fname <- pushClosed (t2 ts)
+	 parms <- get actuals
+	 cur' <- popOpen
+	 maybePushActuals cur' [TCall fname parms]
+    DYNAMIC ->
+      case cbt of
+	STATIC ->
+	  do ts <- collectAttrs atts DYNAMIC [t1]
+	     maybePushActuals cur (t2 ts)
+	DYNAMIC ->
+	  do ts <- collectAttrs atts DYNAMIC (t1 : cur)
+	     return (t2 ts)
+    STATIC ->
+      case cbt of
+	STATIC ->
+	  do ts <- collectAttrs atts STATIC (t1 : cur)
+	     return (t2 ts)
+	DYNAMIC ->
+	  do pushOpen cur
+	     ts <- collectAttrs atts STATIC [t1]
+	     fname <- pushClosed (t2 ts)
+	     parms <- get actuals
+	     cur' <- popOpen
+	     maybePushActuals cur' [TCall fname parms]
+
+collect (ELEMENT_ bt tag atts elems) cbt cur =
+  let t1 = TOut ('<' : tag)
+      t1' = tout ('<' : tag)
+      t2 = tout ">"
+      t3 = tout ("</" ++ tag ++ ">")
+  in
+  case bt of 
+    TOPLEVEL -> 
+      do pushOpen cur
+	 ts1 <- collectAttrs atts STATIC [t1]
+	 ts2 <- collectElems elems STATIC (t2 ts1)
+	 fname <- pushClosed (t3 ts2)
+	 parms <- get actuals
+	 cur' <- popOpen
+	 maybePushActuals cur' [TCall fname parms]
+    DYNAMIC ->
+      case cbt of
+	STATIC ->
+	  do ts1 <- collectAttrs atts DYNAMIC [t1]
+	     ts2 <- collectElems elems DYNAMIC (t2 ts1)
+	     maybePushActuals cur (t3 ts2)
+	DYNAMIC ->
+	  do ts1 <- collectAttrs atts DYNAMIC (t1' cur)
+	     ts2 <- collectElems elems DYNAMIC (t2 ts1)
+	     return (t3 ts2)
+    STATIC ->
+      case cbt of
+	STATIC ->
+	  do ts1 <- collectAttrs atts STATIC (t1' cur)
+	     ts2 <- collectElems elems STATIC (t2 ts1)
+	     return (t3 ts2)
+	DYNAMIC ->
+	  do pushOpen cur
+	     ts1 <- collectAttrs atts STATIC [t1]
+	     ts2 <- collectElems elems STATIC (t2 ts1)
+	     fname <- pushClosed (t3 ts2)
+	     parms <- get actuals
+	     cur' <- popOpen
+	     maybePushActuals cur' [TCall fname parms]
+
+collect (DOCTYPE_ bt strs elems) cbt cur =
+  let t1 = TOut ("<!DOCTYPE" ++
+		 (foldr (\str f -> showChar ' ' . showString str . f) id strs .
+		  showString ">")
+		 "<!-- generated by WASH/HTML 0.11\n-->")
+  in
+  case bt of 
+    TOPLEVEL -> 
+      do pushOpen cur
+	 ts2 <- collectElems elems STATIC [t1]
+	 fname <- pushClosed ts2
+	 parms <- get actuals
+	 cur' <- popOpen
+	 maybePushActuals cur' [TCall fname parms]
+    DYNAMIC ->
+      case cbt of
+	STATIC ->
+	  do ts2 <- collectElems elems DYNAMIC [t1]
+	     maybePushActuals cur ts2
+	DYNAMIC ->
+	  do collectElems elems DYNAMIC (t1 : cur)
+    STATIC ->
+      case cbt of
+	STATIC ->
+	  do collectElems elems STATIC (t1 : cur)
+	DYNAMIC ->
+	  do pushOpen cur
+	     ts2 <- collectElems elems STATIC [t1]
+	     fname <- pushClosed ts2
+	     parms <- get actuals
+	     cur' <- popOpen
+	     maybePushActuals cur' [TCall fname parms]
+
+collect (CDATA_ bt str) cbt cur =
+  let t0 = TOut str
+      t0' = tout str in
+  case bt of 
+    TOPLEVEL -> 
+      do pushOpen cur
+	 fname <- pushClosed [t0]
+	 parms <- get actuals
+	 cur' <- popOpen
+	 maybePushActuals cur' [TCall fname parms]
+    DYNAMIC ->
+      case cbt of
+	STATIC ->
+	  do maybePushActuals cur [t0]
+	DYNAMIC ->
+	  do return [t0]
+    STATIC ->
+      case cbt of
+	STATIC ->
+	  do return (t0' cur)
+	DYNAMIC ->
+	  do pushOpen cur
+	     fname <- pushClosed [t0]
+	     parms <- get actuals
+	     cur' <- popOpen
+	     maybePushActuals cur' [TCall fname parms]
+
+collect (COMMENT_ bt str) cbt cur =
+  let t0 = TOut str
+      t0' = tout str in
+  case bt of 
+    TOPLEVEL -> 
+      do pushOpen cur
+	 fname <- pushClosed [t0]
+	 parms <- get actuals
+	 cur' <- popOpen
+	 maybePushActuals cur' [TCall fname parms]
+    DYNAMIC ->
+      case cbt of
+	STATIC ->
+	  do maybePushActuals cur [t0]
+	DYNAMIC ->
+	  do return [t0]
+    STATIC ->
+      case cbt of
+	STATIC ->
+	  do return (t0' cur)
+	DYNAMIC ->
+	  do pushOpen cur
+	     fname <- pushClosed [t0]
+	     parms <- get actuals
+	     cur' <- popOpen
+	     maybePushActuals cur' [TCall fname parms]
+
+collectElems [] cbt cur =
+  return cur
+collectElems (at:ats) cbt cur =
+  do ts <- collectElems ats cbt cur
+     collect at cbt ts
+
+collectAttrs [] cbt cur =
+  return cur
+collectAttrs (at:ats) cbt cur =
+  do ts <- collectAttr at cbt cur
+     collectAttrs ats cbt ts
+
+collectAttr
+  ATTR_ { attr_BT = bt
+	, attr_value_BT = vbt
+	, attr_name = aname
+        , attr_value = aval
+	} 
+  cbt
+  cur = let { t1 = TOut (' ' : aname ++ "=\"") ; t2 = TOut "\"";
+	      t1' = tout (' ' : aname ++ "=\"") ; t2' = tout "\""; } in
+  case bt of
+    TOPLEVEL ->
+      do pushOpen cur
+	 ts <- collectAttrValue aval vbt STATIC [t1]
+	 fname <- pushClosed (t2' ts)
+	 parms <- get actuals
+	 cur' <- popOpen
+	 maybePushActuals cur' [TCall fname parms]
+    DYNAMIC ->
+      case cbt of
+	STATIC ->
+	  do ts <- collectAttrValue aval vbt DYNAMIC [t1]
+	     maybePushActuals cur (t2' ts)
+	DYNAMIC ->
+	  do ts <- collectAttrValue aval vbt DYNAMIC (t1' cur)
+	     return (t2' ts)
+    STATIC ->
+      case cbt of
+	STATIC ->
+	  do ts <- collectAttrValue aval vbt STATIC (t1' cur)
+	     return (t2' ts)
+	DYNAMIC ->
+	  do pushOpen cur
+	     ts <- collectAttrValue aval vbt STATIC [t1]
+	     fname <- pushClosed (t2' ts)
+	     parms <- get actuals
+	     cur' <- popOpen
+	     maybePushActuals cur' [TCall fname parms]
+
+collectAttrValue aval bt cbt cur =
+  let encVal = (htmlAttr aval "")
+      t0 = TOut encVal
+      t0' = tout encVal in
+  case bt of
+    TOPLEVEL ->
+      do pushOpen cur
+	 fname <- pushClosed [t0]
+	 parms <- get actuals
+	 cur' <- popOpen
+	 maybePushActuals cur' [TCall fname parms]
+    DYNAMIC ->
+      case cbt of
+	STATIC ->
+	  do maybePushActuals cur [t0]
+	DYNAMIC ->
+	  do return [t0]
+    STATIC ->
+      case cbt of
+	STATIC ->
+	  do return (t0' cur)
+	DYNAMIC ->
+	  do pushOpen cur
+	     fname <- pushClosed [t0]
+	     parms <- get actuals
+	     cur' <- popOpen
+	     maybePushActuals cur' [TCall fname parms]
+
+
+-- Local Variables: 
+-- haskell-prog-switches: ("/home/thiemann/src/haskell/Utility/sha1lib.o")
+-- End: 
diff --git a/WASH/HTML/HTMLTypedBase.hs b/WASH/HTML/HTMLTypedBase.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLTypedBase.hs
@@ -0,0 +1,109 @@
+{-# OPTIONS -fglasgow-exts #-}
+-- © 2001 Peter Thiemann
+module WASH.HTML.HTMLTypedBase
+  (module WASH.HTML.HTMLBase, module WASH.HTML.HTMLTypedBase) 
+  where
+
+import Char
+import WASH.HTML.HTMLBase
+
+-- typed layer
+-- attributes
+
+data ATTRIBUTE a => ATTR a =				    -- a phantom type
+  ATTR { unATTR :: ATTR_ }
+
+class Show a => ATTRIBUTE a where
+  show_name :: a -> String
+-- 
+  show_name = map toLower . show
+
+-- attribute values
+
+class (ATTRIBUTE a, Show v) => AttrValue a v
+
+mkUAttr :: ATTRIBUTE a => a -> String -> ATTR a
+mkUAttr a vstr = ATTR (attr_ (show_name a) vstr)
+
+mkAttr :: (AttrValue a v) => a -> v -> ATTR a
+mkAttr a v = 
+  mkUAttr a (av raw)
+  where raw = show v
+	av (str@('\"':_)) = let str1 = read str :: String in str1
+	av str = str
+
+attr a v into = add_attr into (mkAttr a v)
+
+uattr a vstr into = add_attr into (mkUAttr a vstr)
+
+--  elements
+
+data TAG t => ELT t =
+    ELT { unELT :: ELEMENT_ }
+
+class Show t => TAG t where
+  make :: t -> ELT t
+  show_tag :: t -> String
+--
+  make = make_standard
+  show_tag = map toLower . show
+
+make_standard t = ELT (element_ (show_tag t) [] [])
+make_empty    t = ELT (empty_   (show_tag t) [])
+
+--
+class (TAG s, TAG t) => AddTo s t
+
+add :: (AddTo s t) => ELT s -> ELT t -> ELT s
+add (ELT e_) (ELT e'_) =
+  ELT (add_ e_ e'_)
+
+add' :: (AddTo s t) => ELT t -> ELT s -> ELT s
+add' = flip add
+
+class (TAG t) => AddAttr t a
+
+add_attr :: (AddAttr t a) => ELT t -> ATTR a -> ELT t
+add_attr (ELT e_) (ATTR att) =
+  ELT (add_attr_ e_ att)
+
+attr' :: (AddAttr t a) => ATTR a -> ELT t -> ELT t
+attr' = flip add_attr
+ 
+-- --================= FUNCTIONS =================----
+
+-- --show functions------------------
+
+show_html (ELT e_) = show e_
+
+-- creating text elements
+
+text, rawtext, formattedtext :: (AddTo a CDATA) => String -> ELT a -> ELT a
+text str = add' (ELT (cdata_ [] str) :: ELT CDATA)
+rawtext str = add' (ELT (cdata_ [CDATA_ENCODED] str) :: ELT CDATA)
+formattedtext str = add' (ELT (cdata_ [CDATA_FORMATTED] str) :: ELT CDATA)
+
+data CDATA = CDATA deriving Show
+instance TAG CDATA
+
+-- creating comment elements
+
+comment :: String -> ELT a -> ELT a
+comment str (ELT e_) = ELT (add_ e_ (comment_ str))
+
+-- creating the main document
+
+data DOCUMENT = DOCUMENT deriving Show
+instance TAG DOCUMENT where
+  make DOCUMENT = 
+    ELT (doctype_
+  	  ["HTML"
+          ,"PUBLIC"
+	  ,"\"-//W3C//DTD HTML 4.01//EN\""
+	  ,"\"http://www.w3.org/TR/html4/strict.dtd\""]
+	  [])
+
+-- instance AddTo DOCUMENT HTML -- must be in HTMLPrelude
+
+show_document :: ELT DOCUMENT -> String
+show_document = show_html
diff --git a/WASH/HTML/HTMLTypedBase98.hs b/WASH/HTML/HTMLTypedBase98.hs
new file mode 100644
--- /dev/null
+++ b/WASH/HTML/HTMLTypedBase98.hs
@@ -0,0 +1,110 @@
+-- © 2002 Peter Thiemann
+module WASH.HTML.HTMLTypedBase98 
+  (module WASH.HTML.HTMLBase, module WASH.HTML.HTMLTypedBase98)
+  where
+
+import Char
+import WASH.HTML.HTMLBase
+
+-- typed layer
+-- attributes
+
+data ATTRIBUTE a => ATTR a =				    -- a phantom type
+  ATTR { unATTR :: ATTR_ }
+
+class Show a => ATTRIBUTE a where
+  show_name :: a -> String
+-- 
+  show_name = map toLower . show
+
+-- attribute values
+
+-- class (ATTRIBUTE a, Show v) => AttrValue a v
+
+mkUAttr :: ATTRIBUTE a => a -> String -> ATTR a
+mkUAttr a vstr = ATTR (attr_ (show_name a) vstr)
+
+-- mkAttr :: (AttrValue a v) => a -> v -> ATTR a
+-- mkAttr a v = 
+--   mkUAttr a (av raw)
+--   where raw = show v
+
+av (str@('\"':_)) = let str1 = read str :: String in str1
+av str = str
+
+-- attr a v into = add_attr into (mkAttr a v)
+
+uattr a vstr into = add_attr into (mkUAttr a vstr)
+
+--  elements
+
+data TAG t => ELT t =
+    ELT { unELT :: ELEMENT_ }
+
+class Show t => TAG t where
+  make :: t -> ELT t
+  show_tag :: t -> String
+--
+  make = make_standard
+  show_tag = map toLower . show
+
+make_standard t = ELT (element_ (show_tag t) [] [])
+make_empty    t = ELT (empty_   (show_tag t) [])
+
+--
+-- class (TAG s, TAG t) => AddTo s t
+
+-- add :: (AddTo s t) => ELT s -> ELT t -> ELT s
+add (ELT e_) (ELT e'_) =
+  ELT (add_ e_ e'_)
+
+-- add' :: (AddTo s t) => ELT t -> ELT s -> ELT s
+add' = flip add
+
+-- class (TAG t) => AddAttr t a
+
+-- add_attr :: (AddAttr t a) => ELT t -> ATTR a -> ELT t
+add_attr (ELT e_) (ATTR att) =
+  ELT (add_attr_ e_ att)
+
+-- attr' :: (AddAttr t a) => ATTR a -> ELT t -> ELT t
+attr' = flip add_attr
+
+-- --================= FUNCTIONS =================----
+
+-- --show functions------------------
+
+show_html (ELT e_) = show e_
+
+-- creating text elements
+
+class AdmitChildCDATA a where
+  text, rawtext, formattedtext :: String -> ELT a -> ELT a
+  text str = add' (ELT (cdata_ [] str) :: ELT CDATA)
+  rawtext str = add' (ELT (cdata_ [CDATA_ENCODED] str) :: ELT CDATA)
+  formattedtext str = add' (ELT (cdata_ [CDATA_FORMATTED] str) :: ELT CDATA)
+
+data CDATA = CDATA deriving Show
+instance TAG CDATA
+
+-- creating comment elements
+
+comment :: String -> ELT a -> ELT a
+comment str (ELT e_) = ELT (add_ e_ (comment_ str))
+
+-- creating the main document
+
+data DOCUMENT = DOCUMENT deriving Show
+instance TAG DOCUMENT where
+  make DOCUMENT = 
+    ELT (doctype_
+  	  ["HTML"
+          ,"PUBLIC"
+	  ,"\"-//W3C//DTD HTML 4.01//EN\""
+	  ,"\"http://www.w3.org/TR/html4/strict.dtd\""]
+	  [])
+
+-- instance AddTo DOCUMENT HTML -- must be in HTMLPrelude
+
+show_document :: ELT DOCUMENT -> String
+show_document = show_html
diff --git a/WASH/Mail/ContentDisposition.hs b/WASH/Mail/ContentDisposition.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Mail/ContentDisposition.hs
@@ -0,0 +1,38 @@
+module WASH.Mail.ContentDisposition where
+
+import WASH.Mail.RFC2822
+			  
+data ContentDisposition =
+    None
+  | Inline     { parameters :: [ContentDispositionParm] }
+  | Attachment { parameters :: [ContentDispositionParm] }
+
+data ContentDispositionParm =
+    FileNameParm String
+  | CreationDateParm DateTime2822
+  | ModificationDateParm DateTime2822
+  | ReadDateParm DateTime2822
+  | SizeParm Int
+
+hasContentDisposition None = False
+hasContentDisposition _ = True
+
+toString (None) =
+  ""
+toString (Inline { parameters = cdps }) =
+  "inline" ++ cdpsToString cdps
+toString (Attachment { parameters = cdps }) =
+  "attachment" ++ cdpsToString cdps
+
+cdpsToString = concatMap cdpToString
+cdpToString (FileNameParm file) =
+  "; filename=\""++file++"\""
+cdpToString (CreationDateParm dt) =
+  "; creation-date=\""++shows dt "\""
+cdpToString (ModificationDateParm dt) =
+  "; modification-date=\""++shows dt "\""
+cdpToString (ReadDateParm dt) =
+  "; read-date=\""++shows dt "\""
+cdpToString (SizeParm n) =
+  "; size="++show n
+
diff --git a/WASH/Mail/Email.hs b/WASH/Mail/Email.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Mail/Email.hs
@@ -0,0 +1,110 @@
+-- © 2001, 2002 Peter Thiemann
+module WASH.Mail.Email (
+	sendmail, inventMessageId, exitcodeToSYSEXIT, SYSEXIT(..),
+	module WASH.Mail.MIME, module WASH.Mail.HeaderField) where
+
+-- from standard library
+import IO
+import System
+
+-- from utility
+import WASH.Utility.Auxiliary
+import WASH.Utility.Unique
+
+-- from package
+import WASH.Mail.EmailConfig
+import WASH.Mail.HeaderField
+import WASH.Mail.MIME
+
+-- |from sysexit.h
+data SYSEXIT =
+	EX_OK		--		0	/* successful termination */
+      | EX_USAGE	--		64	/* command line usage error */
+      | EX_DATAERR	--		65	/* data format error */
+      | EX_NOINPUT	--		66	/* cannot open input */
+      | EX_NOUSER	--		67	/* addressee unknown */
+      | EX_NOHOST	--		68	/* host name unknown */
+      | EX_UNAVAILABLE	--		69	/* service unavailable */
+      | EX_SOFTWARE	--		70	/* internal software error */
+      | EX_OSERR	--		71	/* system error (e.g., can't fork) */
+      | EX_OSFILE	--		72	/* critical OS file missing */
+      | EX_CANTCREAT	--		73	/* can't create (user) output file */
+      | EX_IOERR	--		74	/* input/output error */
+      | EX_TEMPFAIL	--		75	/* temp failure; user is invited to retry */
+      | EX_PROTOCOL	--		76	/* remote error in protocol */
+      | EX_NOPERM	--		77	/* permission denied */
+      | EX_CONFIG	--		78	/* configuration error */
+      | EX_UNKNOWN Int
+
+exitcodeToSYSEXIT :: ExitCode -> SYSEXIT
+exitcodeToSYSEXIT exitcode =
+  case exitcode of
+    ExitSuccess -> EX_OK
+    ExitFailure 64 -> EX_USAGE
+    ExitFailure 65 -> EX_DATAERR
+    ExitFailure 66 -> EX_NOINPUT
+    ExitFailure 67 -> EX_NOUSER
+    ExitFailure 68 -> EX_NOHOST
+    ExitFailure 69 -> EX_UNAVAILABLE
+    ExitFailure 70 -> EX_SOFTWARE
+    ExitFailure 71 -> EX_OSERR
+    ExitFailure 72 -> EX_OSFILE
+    ExitFailure 73 -> EX_CANTCREAT
+    ExitFailure 74 -> EX_IOERR
+    ExitFailure 75 -> EX_TEMPFAIL
+    ExitFailure 76 -> EX_PROTOCOL
+    ExitFailure 77 -> EX_NOPERM
+    ExitFailure 78 -> EX_CONFIG
+    ExitFailure sc -> EX_UNKNOWN sc
+
+instance Show SYSEXIT where
+  showsPrec i se = case se of
+      EX_OK	-> showString "successful termination"
+      EX_USAGE	-> showString "command line usage error"
+      EX_DATAERR	-> showString "data format error"
+      EX_NOINPUT	-> showString "cannot open input"
+      EX_NOUSER	-> showString "addressee unknown"
+      EX_NOHOST	-> showString "host name unknown"
+      EX_UNAVAILABLE	-> showString "service unavailable"
+      EX_SOFTWARE	-> showString "internal software error"
+      EX_OSERR	-> showString "system error (e.g., can't fork)"
+      EX_OSFILE	-> showString "critical OS file missing"
+      EX_CANTCREAT	-> showString "can't create (user) output file"
+      EX_IOERR	-> showString "input/output error"
+      EX_TEMPFAIL	-> showString "temp failure; user is invited to retry"
+      EX_PROTOCOL	-> showString "remote error in protocol"
+      EX_NOPERM	-> showString "permission denied"
+      EX_CONFIG	-> showString "configuration error"
+      EX_UNKNOWN sc -> showString "unknown return code: " . shows sc
+
+-- facilities for sending email
+
+sendmailFlags   = 
+	["-i"			    -- ignore dots alone on a line
+	,"-t"			    -- read message for recipients
+	,"--"                       -- end of flag arguments
+	]			    -- , "-v" for verbose mode
+
+sendmail :: Mail -> IO ExitCode
+sendmail mail =
+  do filename <- inventBoundary
+     let tempfilename  = emailTmpDir ++ filename
+         tempfilename2 = emailTmpDir ++ "T" ++ filename
+     h <- openFile tempfilename WriteMode
+     hSend smtpSendControl{ sendH = h } mail
+     hClose h
+     exitcode <- system (sendmailProgram ++ pFlags sendmailFlags ++ " < " ++ tempfilename ++ " > " ++ tempfilename2)
+     system ("rm " ++ tempfilename)
+     system ("rm " ++ tempfilename2)
+     return exitcode
+
+pFlags [] = ""
+pFlags (flag:flags) = ' ' : flag ++ pFlags flags
+
+inventMessageId :: IO Header
+inventMessageId =
+  do randomKey <- inventStdKey
+     hostname  <- protectedGetEnv "SERVER_NAME" "localhost"
+     let messageId = "<" ++ randomKey ++ ".Email@" ++ hostname ++ ">"
+     return (Header ("Message-Id", messageId))
+
diff --git a/WASH/Mail/EmailConfig.hs b/WASH/Mail/EmailConfig.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Mail/EmailConfig.hs
@@ -0,0 +1,13 @@
+module WASH.Mail.EmailConfig where
+
+tmpDir, varDir, emailTmpDir, sendmailProgram :: String
+
+-- |temporary storage
+tmpDir = "/tmp/"
+-- |persistent, mutable storage
+varDir = "/tmp/"
+
+-- |temporary email files
+emailTmpDir 	= tmpDir
+-- |path of sendmail program
+sendmailProgram	= "/usr/sbin/sendmail"
diff --git a/WASH/Mail/HeaderField.hs b/WASH/Mail/HeaderField.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Mail/HeaderField.hs
@@ -0,0 +1,53 @@
+module WASH.Mail.HeaderField where
+
+import WASH.Utility.RFC2047
+
+-- 
+newtype Header = Header (String, String)
+newtype KV = KV (String, String)
+newtype MediaType = MediaType (String, String)
+-- 
+
+instance Show Header where
+  show (Header (key, value)) = 
+    if null value then "" else
+    key ++ ':' : ' ' : encodeValue value ++ "\r\n"
+
+instance Show KV where
+  show (KV (key, value)) =
+    key ++ '=' : value
+
+instance Show MediaType where
+  show (MediaType (ty, subty)) =
+    ty ++ '/' : subty
+
+-- 
+
+mimeHeader = 
+  Header ("MIME-Version", "1.0")
+
+identHeader =
+  Header ("X-Mailer", "WASH/Mail 0.1")
+
+makeContentType mtype subtype parameters = 
+  Header ("Content-Type", mtype ++ "/" ++ subtype ++ p parameters)
+  where p = concat . map p1
+	p1 parameter = ';' : show parameter
+
+makeContentTransferEncoding enc =
+  Header ("Content-Transfer-Encoding", enc)
+
+makeContentDisposition name =
+  Header ("Content-Disposition", name)
+
+makeX what recipients = 
+  Header (what, l recipients)
+  where l [] = []
+	l [xs] = xs
+	l (xs:xss) = xs ++ ", " ++ l xss
+
+makeTO = makeX "To"
+makeCC = makeX "Cc"
+makeBCC = makeX "Bcc"
+makeSubject s = makeX "Subject" [s]
+
diff --git a/WASH/Mail/MIME.hs b/WASH/Mail/MIME.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Mail/MIME.hs
@@ -0,0 +1,192 @@
+-- © 2001, 2002 Peter Thiemann
+module WASH.Mail.MIME where
+-- RFC 2045
+-- RFC 2046
+
+import Char
+import IO
+import Monad
+import Random
+
+import qualified WASH.Utility.Base64 as Base64
+import qualified WASH.Mail.ContentDisposition as CD
+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable
+import WASH.Mail.HeaderField
+import qualified WASH.Utility.RFC2279 as RFC2279	    -- UTF-8
+
+
+-- --------------------------------------------------------------------
+
+textDOC subty docLines =
+  DOC {	mediatype= "text",
+	subtype= subty,
+	textLines= docLines,
+	parameters= [],
+	filename= "",					    -- obsolete
+	contentDisposition = CD.Inline [],
+	messageData="",
+	parts=[]
+      }
+
+binaryDOC ty subty bindata =
+  DOC {	mediatype= ty,
+	subtype= subty,
+	messageData= bindata,
+	textLines= [],
+	parameters= [],
+	filename= "",					    -- obsolete
+	contentDisposition = CD.Attachment [],
+	parts=[]
+      }
+  
+multipartDOC subty subdocs =
+  DOC {	mediatype= "multipart",
+	subtype= subty,
+	messageData= "",
+	textLines= [],
+	parameters= [],
+	filename= "",					    -- obsolete
+	contentDisposition = CD.None,
+	parts= subdocs
+      }
+
+data DOC =
+     DOC {
+	mediatype :: String,			    -- type
+	subtype :: String,			    -- subtype
+	parameters  :: [KV],			    -- ^ parameters of the media type
+	filename :: String,			    -- ^ suggested filename, OBSOLETE
+	contentDisposition :: CD.ContentDisposition,   -- ^ sets Content-Disposition, e.g. for suggesting a filename
+	-- depending on mediatype only one of the following is relevant:
+	messageData :: String,			    -- ^ data, only relevant for binary data
+	textLines :: [String],			    -- ^ lines, only relevant for text mediatypes
+	parts :: [DOC]				    -- ^ data, only relevant for multipart mediatypes
+	}
+
+recommend_cte h doc = 
+  case mediatype doc of
+    "text" -> 
+       case sendMode h of
+         SevenBit -> "quoted-printable"
+	 EightBit -> "8bit"
+    "multipart" -> "7bit"
+    _ ->
+      case sendMode h of 
+	SevenBit -> "base64"
+	EightBit -> "8bit"
+
+inventBoundary =
+  inventKey 10 (init Base64.alphabet_list)
+  where
+    inventKey len chars =
+      do g <- getStdGen
+	 let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g
+	 return ("=_" ++ candidate ++ "=_")
+	 -- see RFC 2045, 6.7 for reasoning about this choice of boundary string
+
+data SendMode =
+  EightBit | SevenBit
+data SendControl = 
+  SendControl {
+    sendH :: Handle,
+    sendMode :: SendMode
+  }
+
+smtpSendControl = 
+  SendControl { sendH = stdout, sendMode = SevenBit }
+
+httpSendControl =
+  SendControl { sendH = stdout, sendMode = EightBit }
+
+instance Send DOC where
+  hSend h doc =
+    let cte = recommend_cte h doc in
+    do boundary <- inventBoundary
+       let extraParameter 
+	     | mediatype doc == "multipart"  = [KV ("boundary", '\"':boundary++"\"")]
+	     | mediatype doc == "text" = [KV ("charset", "utf-8")]
+	     | otherwise = []
+       hSend h (makeContentType (mediatype doc)
+       			     (subtype doc) 
+       			     (extraParameter ++ parameters doc))
+       hSend h (makeContentTransferEncoding cte)
+       when (CD.hasContentDisposition $ contentDisposition doc) $
+	 hSend h (makeContentDisposition (CD.toString (contentDisposition doc)))
+       -- hSend h (makeContentDisposition (filename doc))
+       hSend h CRLF
+       case mediatype doc of 
+	 "text" -> hSendText h doc
+	 "multipart" -> hSendMultipart h boundary doc
+	 _ -> hSendBinary h doc
+
+hSendText h doc =
+  case sendMode h of
+    EightBit -> 
+      hPutStr hdl str
+    SevenBit ->
+      hPutStr hdl (QuotedPrintable.encode str)
+  where hdl = sendH h
+	str = RFC2279.encode $ flat (textLines doc)
+	flat [] = []
+	flat (xs:xss) = xs ++ "\r\n" ++ flat xss
+
+hSendBinary h doc =
+  case sendMode h of
+    SevenBit ->
+      hPutStr (sendH h) (Base64.encode (messageData doc))
+    EightBit ->
+      hPutStr (sendH h) (messageData doc)
+
+hSendMultipart h boundary doc =
+  do -- may send a preamble for non-MIME-able MUAs at this point
+     sendParts (parts doc)
+  where hdl = sendH h
+	sendParts [] = 
+	  do hPutStr hdl "--"
+	     hPutStr hdl boundary
+	     hPutStr hdl "--"
+	     hSend h CRLF
+	sendParts (doc:docs) =
+	  do hPutStr hdl "--"
+	     hPutStr hdl boundary
+	     hSend h CRLF
+	     hSend h doc
+	     sendParts docs
+
+data CRLF = CRLF
+
+instance Send CRLF where
+  hSend h CRLF = hPutStr (sendH h) "\n"
+
+data Mail =
+     Mail {
+	to :: [String],
+	subject :: String,
+	cc :: [String],
+	bcc :: [String],
+	headers :: [Header],
+	contents :: DOC
+        }
+
+simpleMail recipients subj doc =
+  Mail { to= recipients, subject= subj, cc=[], bcc=[], headers=[], contents=doc }
+
+class Send m where
+  send :: m -> IO ()
+  hSend :: SendControl -> m -> IO ()
+  send = hSend smtpSendControl
+
+instance Send Header where
+  hSend h header = hPutStr (sendH h) (show header)
+
+instance Send Mail where
+  hSend h mail =
+    do hSend h (makeTO (to mail))
+       hSend h (makeSubject (subject mail))
+       hSend h (makeCC (cc mail))
+       hSend h (makeBCC (bcc mail))
+       hSend h mimeHeader
+       hSend h identHeader
+       sequence (map (hSend h) (headers mail))
+       hSend h (contents mail)
+
diff --git a/WASH/Mail/MailParser.hs b/WASH/Mail/MailParser.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Mail/MailParser.hs
@@ -0,0 +1,217 @@
+module WASH.Mail.MailParser where
+
+-- see RFC 2822
+-- TODO: check against their definition of token
+import Char
+import List
+import Maybe
+-- 
+import Text.ParserCombinators.Parsec
+-- 
+import qualified WASH.Utility.Base64 as Base64
+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable
+import WASH.Utility.RFC2047  as RFC2047 (p_token)
+import WASH.Mail.RFC2822
+import WASH.Mail.Message
+import WASH.Mail.HeaderField
+
+parseMessageFromFile fname =
+  parseFromFile message fname
+
+parseMessageFromString str =
+  parse message "MailParser" str
+
+parseDateTimeFromString str =
+  parse parseDateTime "DateTimeParser" (' ':str)
+
+data RawMessage =
+     RawMessage
+     	{ rawHeaders	:: [Header]
+	, rawLines	:: [String]
+	}
+  deriving Show
+
+lexeme p = do x <- p; many ws1; return x
+literalString = do char '\"'
+		   str <- many (noneOf "\"\\" <|> quoted_pair)
+		   char '\"'
+		   return str
+
+no_ws_ctl_chars = map chr ([1..8] ++ [11,12] ++ [14..31] ++ [127])
+no_ws_ctl = oneOf no_ws_ctl_chars
+
+text_chars = map chr ([1..9] ++ [11,12] ++ [14..127])
+p_text = oneOf text_chars
+
+quoted_pair = do char '\\'
+		 p_text
+
+-- RFC 2045, 5.1 says: 
+-- "The type, subtype, and parameter names are not case sensitive."
+
+p_parameter =
+  do lexeme $ char ';'
+     p_name <- lexeme $ p_token
+     lexeme $ char '='
+     p_value <- literalString <|> p_token
+     return (map toLower p_name, p_value)
+
+p_contentType = 
+  do many ws1
+     c_type <- p_token
+     lexeme $ char '/'
+     c_subtype <- lexeme $ p_token
+     c_parameters <- many p_parameter
+     return $ ContentType (map toLower c_type) (map toLower c_subtype) c_parameters
+
+-- RFC 2045, 6.1
+-- "these values are not case sensitive"
+
+p_contentTransferEncoding =
+  do many ws1
+     c_cte <- RFC2047.p_token
+     return $ ContentTransferEncoding (map toLower c_cte)
+
+p_contentDisposition =
+  do many ws1
+     c_cd <- RFC2047.p_token
+     c_parameters <- many p_parameter
+     return $ ContentDisposition (map toLower c_cd) c_parameters
+
+p_contentID = 
+  do many ws1
+     c_cid <- RFC2047.p_token
+     return $ ContentID c_cid
+
+p_contentDescription =
+  do many ws1
+     c_desc <- many lineChar
+     return $ ContentDescription c_desc
+
+header = do name <- many1 headerNameChar
+	    char ':'
+	    line <- do many ws1; lineString
+	    crLf
+	    extraLines <- many extraHeaderLine
+	    return (Header (map toLower name, concat (line:extraLines)))
+
+extraHeaderLine = do sp <- ws1
+		     line <- lineString
+		     crLf
+		     return (sp:line)
+
+lineString = many (noneOf "\n\r")
+
+headerBodySep = do crLf; return ()
+
+body = many (do line <- many lineChar; crLf; return line)
+
+message =
+  do hs <- many header
+     headerBodySep
+     b <- body
+     return (RawMessage hs b)
+
+lookupHeader name msg =
+  lookupInHeaders name (getHeaders msg)
+lookupRawHeader name raw =
+  lookupInHeaders name (rawHeaders raw)
+lookupInHeaders name headers = g headers
+  where g [] = Nothing
+	g (Header (name', text):_) | name == name' = Just text
+	g (_:rest) = g rest
+
+parseHeader raw name deflt parser =
+  fromMaybe deflt $
+  do str <- lookupRawHeader name raw
+     case parse parser name str of
+       Right v -> return v
+       Left _  -> Nothing
+
+digestMessage :: RawMessage -> Message
+digestMessage =
+  digestMessage' (ContentType "text" "plain" [( "charset", "us-ascii")])
+
+digestMessage' :: ContentType -> RawMessage -> Message
+digestMessage' defcty raw =
+  let cty = parseHeader raw
+      	"content-type" defcty p_contentType
+      cte = parseHeader raw
+      	"content-transfer-encoding" (ContentTransferEncoding "7bit") p_contentTransferEncoding
+      cdn = parseHeader raw
+      	"content-disposition" (ContentDisposition "inline" []) p_contentDisposition
+      cid = parseHeader raw
+      	"content-id" (ContentID "(none)") p_contentID
+      cdc = parseHeader raw
+      	"content-description" (ContentDescription "(none)") p_contentDescription
+      defaultMessage =
+        Singlepart
+      	{ getHeaders = rawHeaders raw
+	, getLines = rawLines raw
+	, getDecoded = decode cte (unlines (rawLines raw))
+	, getContentType= cty
+	, getContentTransferEncoding= cte
+	, getContentDisposition= cdn
+	}
+  in
+  case cty of
+    ContentType "multipart" c_subtype c_parameters ->
+      case lookup "boundary" c_parameters of
+        Just boundary ->
+	  let defcte 
+	        | c_subtype == "digest" = 
+		  ContentType "message" "rfc822" []
+		| otherwise = 
+		  ContentType "text" "plain" [("charset", "us-ascii")] in
+	  Multipart
+	  	{ getHeaders = rawHeaders raw
+		, getLines = rawLines raw
+		, getParts = map (digestMessage' defcte)
+				 (splitBody boundary (rawLines raw))
+		, getContentType= cty
+		, getContentTransferEncoding= cte
+		, getContentDisposition= cdn
+		}
+	_ ->
+	  defaultMessage
+    _ ->
+      defaultMessage
+
+splitBody boundary lines =
+  g False lines (showChar '\n') []
+  where 
+    finish shower showers =
+      reverse (map (\shower -> parseSuccessfully message "body part" (shower ""))
+                   (shower:showers))
+    g afterPreamble [] shower showers =
+      finish shower showers
+    g afterPreamble (xs : rest) shower showers =
+      if innerboundary `isPrefixOf` xs 
+      then if finalboundary `isPrefixOf` xs 
+           then if afterPreamble 
+	        then finish shower showers
+		else finish (showChar '\n') []
+	   else if afterPreamble
+	        then g afterPreamble rest id (shower : showers)
+		else g True rest (showChar '\n') []
+      else
+      g afterPreamble rest (shower . showString xs . showString "\n") showers
+    innerboundary = '-':'-':boundary
+    finalboundary = innerboundary ++ "--"
+
+decode (ContentTransferEncoding "quoted-printable") rawlines =
+  QuotedPrintable.decode rawlines
+decode (ContentTransferEncoding "base64") rawlines =
+  Base64.decode rawlines
+-- "7bit", "8bit", "binary", and everything else
+decode (ContentTransferEncoding _) rawlines =
+  rawlines
+
+
+parseSuccessfully p n inp =
+  case parse p n inp of
+    Left pError ->
+      error (show pError)
+    Right x ->
+      x
+
diff --git a/WASH/Mail/Message.hs b/WASH/Mail/Message.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Mail/Message.hs
@@ -0,0 +1,78 @@
+module WASH.Mail.Message where
+
+import WASH.Mail.HeaderField
+
+data Message =
+     Singlepart 
+     	{ getHeaders 		:: [Header]
+	, getLines   		:: [String]
+	, getDecoded		:: [Char]
+	, getContentType 	:: ContentType
+	, getContentTransferEncoding :: ContentTransferEncoding
+	, getContentDisposition :: ContentDisposition
+	}
+   | Multipart
+	{ getHeaders		:: [Header]
+	, getLines		:: [String]
+	, getParts		:: [Message]
+	, getContentType 	:: ContentType
+	, getContentTransferEncoding :: ContentTransferEncoding
+	, getContentDisposition :: ContentDisposition
+	}
+    deriving Show
+
+isSinglePart (Singlepart {}) = True
+isSinglePart _ = False
+
+isMultiPart (Multipart {}) = True
+isMultiPart _ = False
+
+showHeader (Header (n, v)) = n ++ ": " ++ v
+
+showParameters c_parameters =
+    foldr (\(n,v) f -> showString " ;" .
+    		       showString n .
+		       showString "=\"" .
+		       showString v .
+		       showChar '\"' . f) id c_parameters
+
+data ContentType = 
+	ContentType String -- type
+		    String -- subtype
+		    [(String, String)] -- parameters
+instance Show ContentType where
+  showsPrec i (ContentType c_type c_subtype c_parameters) =
+    showString "Content-Type: " .
+    showString c_type .
+    showChar '/' .
+    showString c_subtype .
+    showParameters c_parameters
+    
+data ContentTransferEncoding =
+	ContentTransferEncoding String
+instance Show ContentTransferEncoding where
+  showsPrec i (ContentTransferEncoding cte) =
+    showString "Content-Transfer-Encoding: " .
+    showString cte
+
+data ContentDisposition =
+	ContentDisposition String [(String, String)]
+instance Show ContentDisposition where
+  showsPrec i (ContentDisposition cdn c_parameters) =
+    showString "Content-Disposition: " .
+    showString cdn .
+    showParameters c_parameters
+
+data ContentID =
+	ContentID String
+instance Show ContentID where
+  showsPrec i (ContentID cid) =
+    showString "Content-ID: " .
+    showString cid
+
+data ContentDescription =
+	ContentDescription String
+instance Show ContentDescription where
+  showsPrec i (ContentDescription txt) =
+    showString "Content-Description: " .
+    showString txt
diff --git a/WASH/Mail/RFC2822.hs b/WASH/Mail/RFC2822.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Mail/RFC2822.hs
@@ -0,0 +1,196 @@
+module WASH.Mail.RFC2822 where
+
+import Char
+-- 
+import Text.ParserCombinators.Parsec
+
+crLf = try (string "\n\r" <|> string "\r\n") <|> string "\n" <|> string "\r"
+
+fws =
+  do many1 ws1
+     option "" (do crLf
+		   many1 ws1)
+  <|> 
+  do crLf
+     many1 ws1
+
+ws1 = oneOf " \t"
+lineChar = noneOf "\n\r"
+headerNameChar = noneOf "\n\r:"
+
+-- |parse contents of Date field according to RFC2822
+data DateTime2822 =
+  DateTime2822 (Maybe DayOfWeek) Date2822 Time2822
+instance Show DateTime2822 where
+  showsPrec i (DateTime2822 mDayOfWeek date2822 time2822) =
+    (case mDayOfWeek of
+      Just dayOfWeek ->
+	showsDayOfWeek dayOfWeek . showString ", "
+      Nothing ->
+	id) .
+    shows date2822 .
+    showChar ' ' .
+    shows time2822
+
+parseDateTime =
+  do mdow <- option Nothing (try $ do fws
+				      dow <- parseDayOfWeek
+				      char ','
+				      return (Just dow))
+     date <- parseDate
+     fws
+     time <- parseTime
+     return (DateTime2822 mdow date time)
+
+type DayOfWeek = Int
+showsDayOfWeek 1 = showString "Mon"
+showsDayOfWeek 2 = showString "Tue"
+showsDayOfWeek 3 = showString "Wed"
+showsDayOfWeek 4 = showString "Thu"
+showsDayOfWeek 5 = showString "Fri"
+showsDayOfWeek 6 = showString "Sat"
+showsDayOfWeek 7 = showString "Sun"
+parseDayOfWeek =
+      (try (string "Mon") >> return (1 :: DayOfWeek))
+  <|> (try (string "Tue") >> return 2)
+  <|> (try (string "Wed") >> return 3)
+  <|> (try (string "Thu") >> return 4)
+  <|> (try (string "Fri") >> return 5)
+  <|> (try (string "Sat") >> return 6)
+  <|> (try (string "Sun") >> return 7)
+  
+data Date2822 =
+  Date2822 Int Int Int
+
+instance Show Date2822 where
+  showsPrec i (Date2822 d m y) =
+    showsDay d .
+    showChar ' ' .
+    showsMonth m .
+    showChar ' ' .
+    showsYear y
+
+parseDate =
+  do d <- parseDay
+     m <- parseMonth
+     y <- parseYear
+     return (Date2822 d m y)
+
+showsDay i = shows i
+parseDay =
+  do fws
+     d1 <- digit
+     md2 <- option Nothing (digit >>= (return . Just))
+     case md2 of
+       Nothing ->
+	 return (digitToInt d1)
+       Just d2 ->
+	 return (digitToInt d2 + 10 * digitToInt d1)
+
+monthList = 
+  ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
+parseMonthName =
+  foldr1 (<|>) (zipWith g monthList [1::Int ..])
+  where 
+    g mname mnr = try (string mname) >> return mnr
+
+showsMonth m =
+  showString (monthList !! (m-1))
+parseMonth =
+  do fws
+     m <- parseMonthName
+     fws
+     return m
+
+showsYear y =
+  showString (drop 1 (show (10000 + y)))
+parseYear =
+  do y1 <- digit
+     y2 <- digit
+     my3 <- option Nothing (digit >>= (return . Just))
+     my4 <- option Nothing (digit >>= (return . Just))
+     case (my3, my4) of
+       (Just y3, Just y4) ->
+	 return (1000 * digitToInt y1 + 100 * digitToInt y2 
+		 + 10 * digitToInt y3 + digitToInt y4)
+       -- interpretation of obs-year from RFC2822, 4.3
+       (Just y3, Nothing) ->
+         return (1900 + 100 * digitToInt y1 + 10 * digitToInt y2 + digitToInt y3)
+       (Nothing, Nothing) ->
+         let rawVal = 10 * digitToInt y1 + digitToInt y2 in
+	 if rawVal < 50 
+	 then return (2000 + rawVal)
+	 else return (1900 + rawVal)
+       _ ->
+	 fail "parseYear"
+data Time2822 =
+  Time2822 TimeOfDay2822 Zone2822
+instance Show Time2822 where
+  showsPrec i (Time2822 timeOfDay2822 zone2822) =
+    shows timeOfDay2822 .
+    showChar ' ' .
+    shows zone2822
+
+parseTime =
+  do tod <- parseTimeOfDay
+     fws
+     zone <- parseZone
+     return (Time2822 tod zone)
+
+data TimeOfDay2822 =
+  TimeOfDay2822 Int Int Int
+instance Show TimeOfDay2822 where
+  showsPrec i (TimeOfDay2822 hh mm ss) =
+    showString (drop 1 $ show (100+hh)) .
+    showChar ':' .
+    showString (drop 1 $ show (100+mm)) .
+    showChar ':' .
+    showString (drop 1 $ show (100+ss))
+
+parseTimeOfDay =
+  do hh <- parseTwoDigits
+     char ':'
+     mm <- parseTwoDigits
+     ss <- option 0 (try $ do char ':'
+			      parseTwoDigits)
+     return (TimeOfDay2822 hh mm ss)
+
+zoneInfoList =
+  [( "UT",  (Zone2822 '+' 0 0))
+  ,( "GMT", (Zone2822 '+' 0 0))
+  ,( "EDT", (Zone2822 '-' 4 0))
+  ,( "EST", (Zone2822 '-' 5 0))
+  ,( "CDT", (Zone2822 '-' 5 0))
+  ,( "CST", (Zone2822 '-' 6 0))
+  ,( "MDT", (Zone2822 '-' 6 0))
+  ,( "MST", (Zone2822 '-' 7 0))
+  ,( "PDT", (Zone2822 '-' 7 0))
+  ,( "PST", (Zone2822 '-' 8 0))
+  ]
+
+parseZoneInfo =
+  foldr1 (<|>) (map g zoneInfoList)
+  where 
+    g (zname, zinfo) = try (string zname) >> return zinfo
+
+data Zone2822 =
+  Zone2822 Char Int Int
+instance Show Zone2822 where
+  showsPrec i (Zone2822 sign hh mm) =
+    showChar sign .
+    showString (drop 1 $ show (100+hh)) .
+    showString (drop 1 $ show (100+mm))
+    
+parseZone =
+  do sign <- oneOf "+-"
+     hh <- parseTwoDigits
+     mm <- parseTwoDigits
+     return (Zone2822 sign hh mm)
+  <|> parseZoneInfo
+  -- anything else should be mapped to (Zone2822 '-' 0 0)
+
+parseTwoDigits =
+  do d1 <- digit
+     d2 <- digit
+     return (10 * digitToInt d1 + digitToInt d2)
+
diff --git a/WASH/Utility/Auxiliary.hs b/WASH/Utility/Auxiliary.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/Auxiliary.hs
@@ -0,0 +1,49 @@
+module WASH.Utility.Auxiliary where
+
+import IO
+import System
+import Directory
+import WASH.Utility.FileNames
+import qualified WASH.Utility.Shell as Shell
+
+protectedGetEnv :: String -> String -> IO String
+protectedGetEnv var deflt =
+  catch (getEnv var) (const $ return deflt)
+
+readFileNonExistent :: FilePath -> String -> IO String
+readFileNonExistent fileName def =
+  do existent <- doesFileExist fileName
+     if existent then readFile fileName else return def
+
+readFileStrictly :: FilePath -> IO String
+readFileStrictly filePath =
+  do h <- openFile filePath ReadMode
+     contents <- hGetContents h
+     hClose (g contents h)
+     return contents
+  where
+    g [] h = h
+    g (_:rest) h = g rest h
+
+assertDirectoryExists :: FilePath -> IO () -> IO ()
+assertDirectoryExists dirname existsAction =
+  catch (createDirectory dirname)
+        (\ ioe -> 
+	   if isAlreadyExistsError ioe then existsAction
+	   else if isDoesNotExistError ioe then
+	     do assertDirectoryExists (dropLastComponent dirname) (return ())
+		assertDirectoryExists dirname existsAction
+	   else do hPutStrLn stderr ("assertDirectoryExists " ++ show dirname)
+		   ioError ioe)
+
+writeDebugFile :: String -> String -> IO ()
+writeDebugFile filename str =
+  do writeFile filename str
+     system ("chmod 666 " ++ Shell.quote filename)
+     return ()
+
+appendDebugFile :: String -> String -> IO ()
+appendDebugFile filename str =
+  do appendFile filename ('\n':str)
+     system ("chmod 666 " ++ Shell.quote filename)
+     return ()
diff --git a/WASH/Utility/Base32.hs b/WASH/Utility/Base32.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/Base32.hs
@@ -0,0 +1,96 @@
+-- Base32 standard:
+-- http://www.ietf.org/rfc/rfc3548.txt
+-- Author: Niklas Deutschmann
+
+module WASH.Utility.Base32 (encode, decode) where
+
+import Bits
+import Char
+import List
+
+encode :: String -> String
+encode = encBase32
+
+decode :: String -> String
+decode = decBase32
+
+-- Partitions a list into groups of length n.
+makeGroups :: Int -> [a] -> [[a]]
+makeGroups 0 lst = error "makeGroups: Invalid group length"
+makeGroups n [] = []
+makeGroups n lst =  take n lst : makeGroups n (drop n lst)
+
+-- Converts an array of characters to a large number, generalized for
+-- characters of any number of bits and any alphabet.
+-- charLength: Number of bits in a character
+-- ordFunc:	Function that is used for mapping characters to numbers.
+makeBits charLength ordFunc str = foldr (+) 0 bitValues
+	where 
+	bitValues = zipWith (\a b -> intVal a `shiftL` b) (reverse str) [0,charLength..]
+	intVal a = toInteger (ordFunc a)
+	
+makeBitsASCII = makeBits 8 ord
+makeBitsBase32 = makeBits 5 b32Ord
+
+-- Converts an array of characters into a m-bit number, where m is
+-- is smallest multiple of n that is greater or equal to the 
+-- (length of str) * chrSize.
+-- Extension of "makeBits".
+makeMultipleOfNBits bitFunc charSize n str 
+	| len `mod` n == 0	= bitFunc str
+	| otherwise			= (bitFunc str) `shiftL` (remBitCount len)
+	where 
+	remBitCount m = (0 - (m `mod` n) + n) `mod` n
+	len = length str * charSize;
+
+makeMultipleOfNBitsASCII = makeMultipleOfNBits (makeBits 8 ord) 8 
+makeMultipleOfNBitsBase32 = makeMultipleOfNBits (makeBits 5 b32Ord) 5
+
+-- The Base32 alphabet
+-- Int -> Base32 character
+b32Chr n = b32tab !! (fromEnum n)
+	where
+	b32tab = ['A'..'Z'] ++ ['2'..'7']
+
+-- Base32 character -> Int
+b32Ord c 
+	| c >= 'A' && c <= 'Z'	= ord(c) - 65
+	| c >= '2' && c <= '7'	= ord(c) - 24
+	| otherwise = error "b32Ord: No Base character"
+	
+-- Encodes one block (1-5 ASCII Characters)
+encBase32Block str 
+	| len == 0	= ""
+	| len == 1	= concat (b32Map [5,0]) ++ "======"
+	| len == 2	= concat (b32Map [15,10..0]) ++ "===="
+	| len == 3	= concat (b32Map [20,15..0]) ++ "==="
+	| len == 4	= concat (b32Map [30,25..0]) ++ "="
+	| len == 5	= concat (b32Map [35,30..0])
+	| otherwise = error "encBase32Block: Invalid block length"
+ 	where 
+	b32Map = map (\x -> [b32Chr(bitStr `shiftR` x .&. 31)])
+	bitStr = makeMultipleOfNBitsASCII 5 str
+	len = length str
+
+-- Decodes one block (2,4,5,7 or 8 Base32 character + '=' padding character)
+decBase32Block str
+	| len == 0 = ""
+	| len == 2 = concat . (shiftAndMap [0] 2) . makeBitsBase32 $ code
+	| len == 4 = concat . (shiftAndMap [8,0] 4) . makeBitsBase32 $ code
+	| len == 5 = concat . (shiftAndMap [16,8,0] 1) . makeBitsBase32 $ code
+	| len == 7 = concat . (shiftAndMap [24,16..0] 3) . makeBitsBase32 $ code
+	| len == 8 = concat . (shiftAndMap [32,24..0] 0) . makeBitsBase32 $ code
+	| otherwise = error "decBase32Block: Invalid block length"
+	where
+	shiftAndMap sf n = (asciiMap sf) . (`shiftR` n)
+	asciiMap sf c = map (\x -> [chr . fromEnum $ (c `shiftR` x .&. 255)]) sf
+	len = length code
+	code = filter (/= '=') str
+		
+encBase32 :: String -> String
+encBase32 = concat . map encBase32Block . makeGroups 5
+
+decBase32 :: String -> String
+decBase32 = concat . map decBase32Block . makeGroups 8
+
+
diff --git a/WASH/Utility/Base64.hs b/WASH/Utility/Base64.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/Base64.hs
@@ -0,0 +1,124 @@
+-- © 2002 Peter Thiemann
+-- |Implements RFC 2045 MIME coding.
+module WASH.Utility.Base64
+       (encode, encode', decode, decode'
+       ,alphabet_list
+       )
+       where
+
+import Array
+import Char
+
+--
+-- |Yields encoded input cropped to lines of less than 76 characters. Directly
+-- usable as email body.
+encode :: String -> String
+encode = encode_base64
+-- |yields continuous stream of bytes.
+encode' :: String -> String
+encode' = encode_base64'
+-- |Directly applicable to email body.
+decode :: String -> String
+decode = decode_base64
+-- |Only applicable to stream of Base64 characters.
+decode' :: String -> String
+decode' = decode_base64'
+-- |Applicable to list of lines.
+decode_lines :: [String] -> String
+decode_lines = decode_base64_lines
+
+-- --------------------------------------------------------------------
+-- |Base64 alphabet in encoding order.
+alphabet_list :: String
+alphabet_list =
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
+
+encode_base64_alphabet_index =
+  zip [0 .. (63::Int)] alphabet_list
+
+decode_base64_alphabet_index =
+  zip alphabet_list [0 .. (63::Int)]
+
+encode_base64_alphabet =
+  array (0 :: Int, 63 :: Int) encode_base64_alphabet_index
+
+decode_base64_alphabet =
+  array (' ','z') decode_base64_alphabet_index
+
+base64_character =
+  array (chr 0, chr 255) [(c, c `elem` alphabet_list || c == '=') | c <- [chr 0 .. chr 255]]
+
+encode_base64 = linebreak 76 . encode_base64'
+
+linebreak m xs = lb m xs
+  where
+    lb n [] = "\r\n"
+    lb 0 xs = '\r':'\n': lb m xs
+    lb n (x:xs) = x: lb (n-1) xs
+
+encode_base64' [] = []
+
+encode_base64' [ch] = 
+  encode_base64_alphabet!b1 : 
+  encode_base64_alphabet!b2 :
+  "=="
+  where (b1, b2, _, _) = encode_base64_group (ch, chr 0, chr 0)
+
+encode_base64' [ch1, ch2] =
+  encode_base64_alphabet!b1 : 
+  encode_base64_alphabet!b2 :
+  encode_base64_alphabet!b3 :
+  "="
+  where (b1, b2, b3, _) = encode_base64_group (ch1, ch2, chr 0)
+
+encode_base64' (ch1: ch2: ch3: rest) =
+  encode_base64_alphabet!b1 : 
+  encode_base64_alphabet!b2 :
+  encode_base64_alphabet!b3 :
+  encode_base64_alphabet!b4 :
+  encode_base64' rest
+  where (b1, b2, b3, b4) = encode_base64_group (ch1, ch2, ch3)
+
+-- 111111 112222 222233 333333
+encode_base64_group (ch1, ch2, ch3) = (b1, b2, b3, b4)
+  where o1 = ord ch1
+	o2 = ord ch2
+	o3 = ord ch3
+	b1 = o1 `div` 4
+	b2 = (o1 `mod` 4) * 16 + o2 `div` 16
+	b3 = (o2 `mod` 16) * 4 + o3 `div` 64
+	b4 = o3 `mod` 64
+
+decode_base64_group (b1, b2, b3, b4) = (ch1, ch2, ch3)
+  where ch1 = chr (b1 * 4 + b2 `div` 16)
+	ch2 = chr (b2 `mod` 16 * 16 + b3 `div` 4)
+	ch3 = chr (b3 `mod` 4 * 64 + b4)
+
+decode_base64' [] = []
+
+decode_base64' [cin1, cin2, '=', '='] = [cout1]
+  where (cout1, _, _) = 
+          decode_base64_group (decode_base64_alphabet!cin1
+	  		      ,decode_base64_alphabet!cin2
+			      ,0
+			      ,0)
+
+decode_base64' [cin1, cin2, cin3, '='] = [cout1, cout2]
+  where (cout1, cout2, _) = 
+          decode_base64_group (decode_base64_alphabet!cin1
+	  		      ,decode_base64_alphabet!cin2
+			      ,decode_base64_alphabet!cin3
+			      ,0)
+
+decode_base64' (cin1: cin2: cin3: cin4: rest) = 
+  cout1: cout2: cout3: decode_base64' rest
+  where (cout1, cout2, cout3) = 
+          decode_base64_group (decode_base64_alphabet!cin1
+	  		      ,decode_base64_alphabet!cin2
+			      ,decode_base64_alphabet!cin3
+			      ,decode_base64_alphabet!cin4)
+
+decode_base64 = decode_base64' . filter (base64_character!)
+
+decode_base64_lines = decode_base64' . concat
+
diff --git a/WASH/Utility/BulkIO.hs b/WASH/Utility/BulkIO.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/BulkIO.hs
@@ -0,0 +1,33 @@
+module WASH.Utility.BulkIO where
+
+import IO
+
+import Ptr
+import CString
+import CTypes
+import Foreign.Marshal.Alloc (mallocBytes, free)
+import System.IO (hGetBuf, hPutBuf)
+		   
+rawGetBytes :: Handle -> Int -> IO String
+rawGetBytes h n =
+  do buf   <- mallocBytes n 	:: IO (Ptr CChar)
+     count <- hGetBuf h buf n
+     str   <- peekCStringLen (buf, count)
+     free buf
+     return str
+
+bufferSize = 4096 :: Int
+
+-- buffers could be shared at the price of MVars, which are not portable
+rawHandleCopy :: Handle -> Handle -> IO ()
+rawHandleCopy hin hout =
+  do buf <- mallocBytes bufferSize
+     let copy =
+	   hGetBuf hin buf bufferSize >>= \count ->
+	   if count == 0 
+	      then return ()
+	      else do
+	        hPutBuf hout buf count
+		copy
+     copy
+     free buf
diff --git a/WASH/Utility/FileNames.hs b/WASH/Utility/FileNames.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/FileNames.hs
@@ -0,0 +1,49 @@
+-- © 2002-2005 Peter Thiemann
+-- |Collection of function for manipulating file names.
+module WASH.Utility.FileNames where
+
+longestSuffix :: (a -> Bool) -> [a] -> [a]
+longestSuffix p xs =
+  let f [] suffix = suffix
+      f (x : xs) suffix = f xs (if p x then xs else suffix)
+  in  f xs xs
+
+
+-- |longest suffix of path that does not contain '/'
+filePart :: String -> String
+filePart =
+  longestSuffix (=='/')
+
+-- |longest suffix of path that does not contain '.'
+extName :: String -> String
+extName =
+  longestSuffix (=='.')
+
+-- |longest prefix so that the rest contains '.'; entire string if no '.' present
+baseName :: String -> String
+baseName filename =
+  let f "" = ""
+      f ('.':rest) = g rest rest
+      f (x:rest) = x:f rest
+      g "" lst = ""
+      g ('.':rest) lst = '.':f lst
+      g (x:rest) lst = g rest lst
+  in  f filename
+
+-- |splits input at each '/'
+fileToPath :: String -> [String]
+fileToPath filename =
+  let f acc path "" = reverse (reverse acc: path)
+      f acc path ('/':xs) = f "" (reverse acc: path) xs
+      f acc path (x:xs) = f (x:acc) path xs
+  in  f "" [] filename
+
+-- |drop the last component of a file path
+dropLastComponent :: String -> String
+dropLastComponent path =
+  let f "" = ""
+      f rpath = g rpath
+      g ('/':rest) = g rest
+      g "" = "/"
+      g rpath = dropWhile (/='/') rpath
+  in reverse (f (reverse path))
diff --git a/WASH/Utility/Hex.hs b/WASH/Utility/Hex.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/Hex.hs
@@ -0,0 +1,49 @@
+-- © 2001, 2003 Peter Thiemann
+module WASH.Utility.Hex where
+
+import Array
+import Char
+
+hexdigit :: Int -> Char
+hexdigit i = hexdigits ! i
+
+hexdigits' = "0123456789ABCDEF"
+alternative_digits = "abcdef"
+alternative_indices :: [(Int, Char)]
+alternative_indices = zip [10..15] alternative_digits
+hexdigits'_indices :: [(Int, Char)]
+hexdigits'_indices = [(i, hexdigits'!!i) | i <- [0..15]]
+
+hexdigits = array (0, 15) hexdigits'_indices
+
+fromHexdigits =
+  array (chr 0, chr 127) 
+        (map (\ (x,y) -> (y, x)) (hexdigits'_indices ++ alternative_indices))
+
+isHexdigitArray =
+  array (chr 0, chr 127)
+	(map (\ c -> (c, isHexdigit c)) [chr 0 .. chr 127])
+  where
+    isHexdigit :: Char -> Bool
+    isHexdigit x = 
+      (x >= '0' && x <= '9') || 
+      (x >= 'a' && x <= 'f') ||
+      (x >= 'A' && x <= 'F')
+
+isHexdigit :: Char -> Bool
+isHexdigit x = 
+  x <= chr 127 && isHexdigitArray ! x
+
+showHex2 :: Int -> String
+showHex2 ox = showsHex 2 ox ""
+
+showsHex :: Int -> Int -> ShowS
+showsHex 0 x = id
+showsHex i x = let (d,m) = x `divMod` 16 in showsHex (i-1) d . showChar (hexdigits ! m)
+
+hexDigitVal :: Char -> Int
+hexDigitVal x | isHexdigit x = fromHexdigits ! x
+	      | otherwise    = 0
+
+allDigits = hexdigits' ++ alternative_digits
+
diff --git a/WASH/Utility/ISO8601.hs b/WASH/Utility/ISO8601.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/ISO8601.hs
@@ -0,0 +1,758 @@
+-- © 2002 Peter Thiemann
+module WASH.Utility.ISO8601 where
+
+import Char
+import Monad
+import Time
+
+import System.IO.Unsafe
+
+import WASH.Utility.IntToString
+import WASH.Utility.SimpleParser
+
+secondsToString seconds =
+  intToString 20 seconds
+
+isoDateToString isoDate = 
+  let seconds = unsafePerformIO $ isoDateToSeconds isoDate 
+  in secondsToString seconds
+
+isoDateAndTimeToString isoDateAndTime =
+  let seconds = unsafePerformIO $ isoDateAndTimeToSeconds isoDateAndTime 
+  in secondsToString seconds
+
+applyToCalT :: (CalendarTime -> a) -> IO a
+applyToCalT g =
+  do clkT <- getClockTime
+     calT <- toCalendarTime clkT
+     return $ g calT
+
+isoDateAndTimeToSeconds :: ISODateAndTime -> IO Integer
+isoDateAndTimeToSeconds isoDateAndTime =
+  applyToCalT $ toSeconds isoDateAndTime
+
+isoTimeToSeconds :: ISOTime -> IO Integer
+isoTimeToSeconds isoTime =
+  applyToCalT $ toSeconds isoTime
+  
+isoDateToSeconds :: ISODate -> IO Integer
+isoDateToSeconds isoDate =
+  applyToCalT $ toSeconds isoDate
+
+class ToSeconds iso where
+  -- |returns number of seconds since reference point
+  toSeconds :: iso -> CalendarTime -> Integer
+  toRawSeconds :: iso -> CalendarTime -> Integer
+  --
+  toRawSeconds = toSeconds
+
+instance ToSeconds ISODateAndTime where
+  toSeconds isoDateAndTime@(ISODateAndTime isoDate isoTime) calT =
+    let rawseconds = toRawSeconds isoDateAndTime calT in
+    case addLeapSeconds leapSeconds rawseconds of
+      NotLeapSecond seconds -> seconds
+      LeapSecond seconds -> seconds + leapSecondCorrection isoTime
+
+  toRawSeconds (ISODateAndTime isoDate isoTime) calT =
+    toRawSeconds isoDate calT + toRawSeconds isoTime calT
+
+-- |problem: 19720630T235960 and 19720701T000000 are both mapped to the same
+-- number, 78796800, and then addLeapSeconds adds one yielding 78796801. While
+-- this is correct for 19720701T000000, 19720630T235960 must be
+-- 78796800. Implemented solution: if the current second specification is 0 and
+-- the time to convert is the leap second, then add 1.
+leapSecondCorrection (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec) =
+  case isoSecondSpec of
+    Second ss -> if ss == 0 then 1 else 0
+    NoSecond  -> 1
+
+instance ToSeconds ISODate where
+  toSeconds isoDate calT =
+    case addLeapSeconds leapSeconds (toRawSeconds isoDate calT) of
+      NotLeapSecond seconds -> seconds
+      LeapSecond seconds -> seconds + 1			    -- we always mean 00:00:00
+	
+  toRawSeconds (ISODate isoYearSpec isoDayOfYearSpec) calT =
+    let year = isoYearSpecToYear isoYearSpec calT 
+    in
+    secondsPerDay * fromIntegral (yearsToDays year) +
+    isoDaysOfYearToSeconds year isoDayOfYearSpec calT
+
+isoDaysOfYearToSeconds year NoDayOfYear calT =
+  0
+isoDaysOfYearToSeconds year (MonthDay isoMonthSpec isoDayOfMonthSpec) calT =
+  let month = isoMonthSpecToMonth isoMonthSpec calT
+      dayOfMonth = isoDayOfMonthSpecToDayOfMonth isoDayOfMonthSpec calT
+  in
+  fromIntegral(dayOfMonth - 1 + daysUptoMonth year month) * secondsPerDay
+isoDaysOfYearToSeconds year (DayOfYear ddd) calT =
+  fromIntegral ddd * secondsPerDay
+isoDaysOfYearToSeconds year (WeekAndDay (Week ww) NoDayOfWeek) calT =
+  fromIntegral (7 * (ww - 1)) * secondsPerDay
+isoDaysOfYearToSeconds year (WeekAndDay (Week ww) (DayOfWeek d)) calT =
+  let weekdayOfJan1 = yearsToWeekDay year in
+  fromIntegral (7 * (ww - 1) + d - weekdayOfJan1) * secondsPerDay
+isoDaysOfYearToSeconds year (WeekAndDay ImplicitWeek (DayOfWeek d)) calT =
+  let weekdayOfJan1 = yearsToWeekDay year 
+      ww = (ctYDay calT + weekdayOfJan1 + 5) `div` 7 
+  in
+  fromIntegral (7 * (ww - 1) + d - weekdayOfJan1) * secondsPerDay
+isoDaysOfYearToSeconds year (WeekAndDay _ _) calT =
+  error "Sorry, this combination of week and day does not make sense!"
+
+isoMonthSpecToMonth ImplicitMonth calT =
+  fromEnum (ctMonth calT) + 1
+isoMonthSpecToMonth (Month mm) calT =
+  mm
+
+isoDayOfMonthSpecToDayOfMonth NoDayOfMonth calT =
+  1
+isoDayOfMonthSpecToDayOfMonth (DayOfMonth dd) calT =
+  dd
+
+daysUptoMonth year month = 
+  let daysPerMonth = [31, 28 + leapDays year, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] in
+  sum (take (month-1) daysPerMonth)
+
+isoYearSpecToYear ImplicitYear calT = 
+  (ctYear calT)
+isoYearSpecToYear (ImplicitCentury yy) calT =
+  (100 * (ctYear calT `div` 100) + yy)
+isoYearSpecToYear (Century cc) calT =
+  (100 * cc)
+isoYearSpecToYear (ImplicitDecade y) calT =
+  (10 * (ctYear calT `div` 10) + y)
+isoYearSpecToYear (Year ccyy) calT =
+  ccyy
+
+leapDays year =
+  if leapYear year then 1 else 0
+
+leapYear year =
+  year `mod` 4 == 0 && (year `mod` 100 /= 0 || year `mod` 400 == 0)
+
+yearsToDays ccyy =
+  let nrOfYears = ccyy - 1970
+      leapYears = [ year | year <- [1970 .. ccyy-1] , leapYear year ]
+      nrOfLeapDays = length leapYears
+  in 
+  365 * nrOfYears + nrOfLeapDays
+
+-- |compute weekday of Jan 1
+yearsToWeekDay ccyy =
+  let nrOfDays = yearsToDays ccyy
+      jan_1_1970 = 4 -- Thursday
+  in  1 + (nrOfDays + 6) `mod` 7
+
+-- |in seconds from epoch; needs to be updated when time leaps again
+leapSeconds :: [Integer]
+leapSeconds = 
+  [ -- Leap	1972	Jun	30	23:59:60	+	S
+    00000000000078796800,
+    -- Leap	1972	Dec	31	23:59:60	+	S
+    00000000000094694400 + 1,
+    -- Leap	1973	Dec	31	23:59:60	+	S
+    00000000000126230400 + 2,
+    -- Leap	1974	Dec	31	23:59:60	+	S
+    00000000000157766400 + 3,
+    -- Leap	1975	Dec	31	23:59:60	+	S
+    00000000000189302400 + 4,
+    -- Leap	1976	Dec	31	23:59:60	+	S
+    00000000000220924800 + 5,
+    -- Leap	1977	Dec	31	23:59:60	+	S
+    00000000000252460800 + 6,
+    -- Leap	1978	Dec	31	23:59:60	+	S
+    00000000000283996800 + 7,
+    -- Leap	1979	Dec	31	23:59:60	+	S
+    00000000000315532800 + 8,
+    -- Leap	1981	Jun	30	23:59:60	+	S
+    00000000000362793600 + 9,
+    -- Leap	1982	Jun	30	23:59:60	+	S
+    00000000000394329600 + 10,
+    -- Leap	1983	Jun	30	23:59:60	+	S
+    00000000000425865600 + 11,
+    -- Leap	1985	Jun	30	23:59:60	+	S
+    00000000000489024000 + 12,
+    -- Leap	1987	Dec	31	23:59:60	+	S
+    00000000000567993600 + 13,
+    -- Leap	1989	Dec	31	23:59:60	+	S
+    00000000000631152000 + 14,
+    -- Leap	1990	Dec	31	23:59:60	+	S
+    00000000000662688000 + 15,
+    -- Leap	1992	Jun	30	23:59:60	+	S
+    00000000000709948800 + 16,
+    -- Leap	1993	Jun	30	23:59:60	+	S
+    00000000000741484800 + 17,
+    -- Leap	1994	Jun	30	23:59:60	+	S
+    00000000000773020800 + 18,
+    -- Leap	1995	Dec	31	23:59:60	+	S
+    00000000000820454400 + 19,
+    -- Leap	1997	Jun	30	23:59:60	+	S
+    00000000000867715200 + 20,
+    -- Leap	1998	Dec	31	23:59:60	+	S
+    00000000000915148800 + 21
+  ]
+
+data LeapSeconds = LeapSecond Integer | NotLeapSecond Integer
+  deriving Show
+
+addLeapSeconds [] seconds = NotLeapSecond seconds
+addLeapSeconds (ls: rest) seconds =
+  if ls > seconds then NotLeapSecond seconds else
+  if ls == seconds then LeapSecond seconds else
+  addLeapSeconds rest (seconds+1)
+  
+secondsPerMinute = 60
+secondsPerHour = 60 * secondsPerMinute
+secondsPerDay = 24 * secondsPerHour
+secondsPerYear = 365 * secondsPerDay
+
+instance ToSeconds ISOTime where
+  -- seconds to 0:00 UTC
+  -- may become negative to indicate previous day!
+  toSeconds (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec) calT =
+    toSeconds isoHourSpec calT +
+    toSeconds isoMinuteSpec calT +
+    toSeconds isoSecondSpec calT +
+    toSeconds isoTimeZoneSpec calT
+    
+instance ToSeconds ISOHourSpec where
+  toSeconds ImplicitHour calT = fromIntegral (3600 * ctHour calT - ctTZ calT)
+  toSeconds (Hour hh) calT    = fromIntegral (3600 * hh - ctTZ calT)
+
+instance ToSeconds ISOMinuteSpec where
+  toSeconds ImplicitMinute calT = fromIntegral (60 * ctMin calT)
+  toSeconds (Minute mm) calT = fromIntegral (60 * mm)
+  toSeconds NoMinute calT = 0
+
+instance ToSeconds ISOSecondSpec where
+  toSeconds (Second ss) calT = fromIntegral ss
+  toSeconds NoSecond calT = 0
+
+instance ToSeconds ISOTimeZoneSpec where
+  toSeconds LocalTime calT = 0
+  toSeconds UTCTime calT = fromIntegral (ctTZ calT)
+  toSeconds (PlusTime (Hour hh) isoMinuteSpec) calT = 
+    fromIntegral (ctTZ calT - (3600 * hh + 60 * minutes isoMinuteSpec))
+  toSeconds (MinusTime (Hour hh) isoMinuteSpec) calT =
+    fromIntegral (ctTZ calT + (3600 * hh + 60 * minutes isoMinuteSpec))
+
+minutes ImplicitMinute = 0
+minutes (Minute mm) = mm
+minutes NoMinute = 0
+
+isoDateToClockTime :: ISODate -> ClockTime
+isoDateToClockTime isoDate =
+  let seconds = unsafePerformIO $ isoDateToSeconds isoDate 
+  in secondsToClockTime seconds
+
+isoDateAndTimeToClockTime :: ISODateAndTime -> ClockTime
+isoDateAndTimeToClockTime isoDateAndTime =
+  let seconds = unsafePerformIO $ isoDateAndTimeToSeconds isoDateAndTime 
+  in secondsToClockTime seconds
+
+secondsToClockTime seconds =
+  let tdiff = TimeDiff { tdYear =0,
+			 tdMonth =0,
+			 tdDay =0,
+			 tdHour =0,
+			 tdMin =0,
+			 tdSec = fromIntegral seconds,
+			 tdPicosec =0
+		       }
+  in addToClockTime tdiff epochClkT
+      
+epochClkT = toClockTime epoch
+epoch = CalendarTime {  ctYear   = 1970,
+			ctMonth  = January,
+			ctDay    = 1,
+			ctHour   = 0,
+			ctMin    = 0,
+			ctSec    = 0,
+			ctPicosec= 0,
+			ctWDay   = Thursday,		    -- ignored
+			ctYDay   = 0,			    -- ignored
+			ctTZName = "UTC",		    -- ignored
+			ctTZ     = 0,
+			ctIsDST  = False		    -- ignored
+		     }
+
+    
+-- |data type for representing ISO time
+data ISODateAndTime =
+  ISODateAndTime ISODate ISOTime
+  deriving Show
+
+data ISODate =
+  ISODate ISOYearSpec ISODayOfYearSpec
+  deriving Show
+
+data ISOYearSpec
+	= ImplicitYear | ImplicitCentury Int | Century Int | ImplicitDecade Int | Year Int
+  deriving Show
+data ISODayOfYearSpec
+	= NoDayOfYear
+	| MonthDay ISOMonthSpec ISODayOfMonthSpec
+	| DayOfYear Int
+	| WeekAndDay ISOWeekSpec ISODayOfWeekSpec
+  deriving Show
+data ISOMonthSpec
+	= ImplicitMonth | Month Int
+  deriving Show
+data ISODayOfMonthSpec
+	= NoDayOfMonth | DayOfMonth Int
+  deriving Show
+data ISOWeekSpec
+	= ImplicitWeek | AnyWeek | Week Int
+  deriving Show
+data ISODayOfWeekSpec
+	= NoDayOfWeek | DayOfWeek Int
+  deriving Show
+data ISOTime
+	= ISOTime ISOHourSpec ISOMinuteSpec ISOSecondSpec ISOTimeZoneSpec
+  deriving Show
+data ISOHourSpec
+	= ImplicitHour | Hour Int
+  deriving Show
+data ISOMinuteSpec
+	= ImplicitMinute | Minute Int | NoMinute
+  deriving Show
+data ISOSecondSpec
+	= Second Int | NoSecond
+  deriving Show
+data ISOTimeZoneSpec
+	= LocalTime | UTCTime | PlusTime ISOHourSpec ISOMinuteSpec | MinusTime ISOHourSpec ISOMinuteSpec
+  deriving Show
+
+updateTZ (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec _) isoTimeZoneSpec =
+	ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec
+
+digitval = digitToInt
+
+skipHyphen	= char '-' >> return ()
+skipColon	= char ':' >> return ()
+skipSolidus	= char '/' >> return ()
+skipMinus	= char '-' >> return ()
+skipPlus	= char '+' >> return ()
+skipP		= oneOf "pP" >> return ()
+skipT		= oneOf "tT" >> return ()
+skipW		= oneOf "wW" >> return ()
+skipZ		= oneOf "zZ" >> return ()
+
+parseDateFromString :: String -> Maybe ISODate
+parseDateFromString = parseFromString parseDate
+parseTimeFromString :: String -> Maybe ISOTime
+parseTimeFromString = parseFromString parseTime
+parseDateAndTimeFromString :: String -> Maybe ISODateAndTime
+parseDateAndTimeFromString = parseFromString parseDateAndTime
+
+-- |external entry point
+parseDate = 
+  parseBasicOrExtended parseDateInternal
+
+parseTime =
+  parseBasicOrExtended parseTimeInternal
+
+parseDateAndTime =
+  parseBasicOrExtended parseTimeAndDateInternal
+
+parseBasicOrExtended parser = 
+  parser True <|> parser False
+
+parseTimeAndDateInternal extended =
+  do isodate <- parseDateInternal extended
+     isotime <- option (ISOTime (Hour 0) NoMinute NoSecond UTCTime) 
+                       (skipT >> parseTimeInternal extended)
+     return $ ISODateAndTime isodate isotime
+
+-- I was pretty much fed up with the irregular format of ISO 8601. After a few
+-- tries, I decided that the simplest approach was to just list all the
+-- alternatives from the standard.
+
+-- |argument determines whether extended format is parsed
+parseDateInternal False =
+  -- 5.2.1.1, complete representation, basic format: CCYYMMDD
+  (try $ do ccyy <- parseFourDigits
+	    mm <- parseTwoDigits
+	    dd <- parseTwoDigits
+	    return $ ISODate (Year ccyy) $ MonthDay (Month mm) (DayOfMonth dd))
+  <|>
+  -- !!! CHECK THIS !!!
+  -- 5.2.1.2.a, a specific month, basic format: CCYY-MM
+  (try $ do ccyy <- parseFourDigits
+	    skipHyphen
+	    mm <- parseTwoDigits
+	    return $ ISODate (Year ccyy) $ MonthDay (Month mm) NoDayOfMonth)
+  <|>
+  -- 5.2.1.2.b, a specific year, basic format: CCYY
+  (try $ do ccyy <- parseFourDigits
+	    return $ ISODate (Year ccyy) NoDayOfYear)
+  <|>
+  -- 5.2.1.2.c, a specific century, basic format: CC
+  (try $ do cc <- parseTwoDigits
+	    return $ ISODate (Century cc) NoDayOfYear)
+  <|>
+  -- 5.2.1.3.a, truncated representation, specific date in current century, basic format: YYMMDD
+  (try $ do yy <- parseTwoDigits
+	    mm <- parseTwoDigits
+	    dd <- parseTwoDigits
+	    return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) (DayOfMonth dd))
+  <|>
+  -- 5.2.1.3.b, truncated representation, specific year and month in current century, basic format: -YYMM
+  (try $ do skipHyphen
+	    yy <- parseTwoDigits
+	    mm <- parseTwoDigits
+	    return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) NoDayOfMonth)
+  <|>
+  -- 5.2.1.3.c, truncated representation, specific year in current century, basic format: -YY
+  (try $ do skipHyphen
+	    yy <- parseTwoDigits
+	    return $ ISODate (ImplicitCentury yy) NoDayOfYear)
+  <|>
+  -- 5.2.1.3.d, truncated representation, specific day of a month, basic format: --MMDD
+  (try $ do skipHyphen
+	    skipHyphen
+	    mm <- parseTwoDigits
+	    dd <- parseTwoDigits
+	    return $ ISODate ImplicitYear $ MonthDay (Month mm) (DayOfMonth dd))
+  <|>
+  -- 5.2.1.3.e, truncated representation, specific month, basic format: --MM
+  (try $ do skipHyphen
+	    skipHyphen
+	    mm <- parseTwoDigits
+	    return $ ISODate ImplicitYear $ MonthDay (Month mm) NoDayOfMonth)
+  <|>
+  -- 5.2.1.3.f, truncated representation, specific day, basic format: ---DD
+  (try $ do skipHyphen
+	    skipHyphen
+	    skipHyphen
+	    dd <- parseTwoDigits
+	    return $ ISODate ImplicitYear $ MonthDay ImplicitMonth (DayOfMonth dd))
+  <|>
+  -- 5.2.2 Ordinal date
+  -- 5.2.2.1, complete representation, basic format: CCYYDDD
+  (try $ do ccyy <- parseFourDigits
+	    ddd <- parseOrdinalDay
+	    return $ ISODate (Year ccyy) $ DayOfYear ddd)
+  <|>
+  -- 5.2.2.2.a, truncated representation, specific year and day in current century, basic format: YYDDD
+  (try $ do yy <- parseTwoDigits
+	    ddd <- parseOrdinalDay
+	    return $ ISODate (ImplicitCentury yy) $ DayOfYear ddd)
+  <|>
+  -- 5.2.2.2.b, truncated representation, specific day only, basic format: -DDD
+  (try $ do skipHyphen
+	    ddd <- parseOrdinalDay
+	    return $ ISODate ImplicitYear $ DayOfYear ddd)
+  <|>
+  -- 5.2.3 date by calendar week and day number
+  -- 5.2.3.1, complete representation, basic format: CCYYWwwD
+  (try $ do ccyy <- parseFourDigits
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    d <- parseWeekDay
+	    return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) (DayOfWeek d))
+  <|>
+  -- 5.2.3.2, reduced prec representation, basic format: CCYYWww
+  (try $ do ccyy <- parseFourDigits
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) NoDayOfWeek)
+  <|>
+  -- 5.2.3.3.a, truncated representation, current century, basic format: YYWwwD
+  (try $ do yy <- parseTwoDigits
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    d <- parseWeekDay
+	    return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) (DayOfWeek d))
+  <|>
+  -- 5.2.3.3.b, truncated representation, current century, year and week only, basic format: YYWww
+  (try $ do yy <- parseTwoDigits
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) NoDayOfWeek)
+  <|>
+  -- 5.2.3.3.c, truncated representation, current decade, week, and day, basic format: -YWwwD
+  (try $ do skipHyphen
+	    y <- parseOneDigit
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    d <- parseWeekDay
+	    return $ ISODate (ImplicitDecade y) $ WeekAndDay (Week ww) (DayOfWeek d))
+  <|>
+  -- 5.2.3.3.d, truncated representation, current year, week, and day, basic format: -WwwD
+  (try $ do skipHyphen
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    d <- parseWeekDay
+	    return $ ISODate ImplicitYear $ WeekAndDay (Week ww) (DayOfWeek d))
+  <|>
+  -- 5.2.3.3.e, truncated representation, current year, week only, basic format: -Www
+  (try $ do skipHyphen
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    return $ ISODate ImplicitYear $ WeekAndDay (Week ww) NoDayOfWeek)
+  <|>
+  -- 5.2.3.3.f, truncated representation, day only of current week, basic format: -W-D
+  (try $ do skipHyphen
+	    skipW
+	    skipHyphen
+	    d <- parseWeekDay
+	    return $ ISODate ImplicitYear $ WeekAndDay ImplicitWeek (DayOfWeek d))
+  <|>
+  -- 5.2.3.3.g, truncated representation, day only of any week, basic format: ---D
+  (try $ do skipHyphen
+	    skipHyphen
+	    skipHyphen
+	    d <- parseWeekDay
+	    return $ ISODate ImplicitYear $ WeekAndDay AnyWeek (DayOfWeek d))
+
+
+-- ----------------------------------------------------------------------
+-- extended formats  
+parseDateInternal True =
+  -- 5.2.1.1, complete representation, extended format CCYY-MM-DD
+  (try $ do ccyy <- parseFourDigits
+	    skipHyphen
+	    mm <- parseTwoDigits
+	    skipHyphen
+	    dd <- parseTwoDigits
+	    return $ ISODate (Year ccyy) $ MonthDay (Month mm) (DayOfMonth dd))
+  <|>
+  -- 5.2.1.3.a, truncated representation, extended format: YY-MM-DD
+  (try $ do yy <- parseTwoDigits
+	    skipHyphen
+	    mm <- parseTwoDigits
+	    skipHyphen
+	    dd <- parseTwoDigits
+	    return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) (DayOfMonth dd))
+  <|>
+  -- 5.2.1.3.b, truncated representation, specific year and month in current century, extended format: -YY-MM
+  (try $ do skipHyphen
+	    yy <- parseTwoDigits
+	    skipHyphen
+	    mm <- parseTwoDigits
+	    return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) NoDayOfMonth)
+  <|>
+  -- 5.2.1.3.d, truncated representation, specific day of a month, extended format: --MM-DD
+  (try $ do skipHyphen
+	    skipHyphen
+	    mm <- parseTwoDigits
+	    skipHyphen
+	    dd <- parseTwoDigits
+	    return $ ISODate ImplicitYear $ MonthDay (Month mm) (DayOfMonth dd))
+  <|>
+  -- 5.2.2 Ordinal date
+  -- 5.2.2.1, complete representation, extended format: CCYY-DDD
+  (try $ do ccyy <- parseFourDigits
+	    skipHyphen
+	    ddd <- parseOrdinalDay
+	    return $ ISODate (Year ccyy) $ DayOfYear ddd)
+  <|>
+  -- 5.2.2.2.a, truncated representation, specific year and day in current century, extended format: YY-DDD
+  (try $ do yy <- parseTwoDigits
+	    skipHyphen
+	    ddd <- parseOrdinalDay
+	    return $ ISODate (ImplicitCentury yy) $ DayOfYear ddd)
+  <|>
+  -- 5.2.3 date by calendar week and day number
+  -- 5.2.3.1, complete representation, extended format: CCYY-Www-D
+  (try $ do ccyy <- parseFourDigits
+	    skipHyphen
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    skipHyphen
+	    d <- parseWeekDay
+	    return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) (DayOfWeek d))
+  <|>
+  -- 5.2.3.2, reduced prec representation, extended format: CCYY-Www
+  (try $ do ccyy <- parseFourDigits
+	    skipHyphen
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) NoDayOfWeek)
+  <|>
+  -- 5.2.3.3.a, truncated representation, current century, extended format: YY-Www-D
+  (try $ do yy <- parseTwoDigits
+	    skipHyphen
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    skipHyphen
+	    d <- parseWeekDay
+	    return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) (DayOfWeek d))
+  <|>
+  -- 5.2.3.3.b, truncated representation, current century, year and week only, extended format: YY-Www
+  (try $ do yy <- parseTwoDigits
+	    skipHyphen
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) NoDayOfWeek)
+  <|>
+  -- 5.2.3.3.c, truncated representation, current decade, week, and day, extended format: -Y-Www-D
+  (try $ do skipHyphen
+	    y <- parseOneDigit
+	    skipHyphen
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    skipHyphen
+	    d <- parseWeekDay
+	    return $ ISODate (ImplicitDecade y) $ WeekAndDay (Week ww) (DayOfWeek d))
+  <|>
+  -- !!! CHECK THIS
+  -- 5.2.3.3.d, truncated representation, current year, week, and day, extended format: -Www-D
+  (try $ do skipHyphen
+	    skipW
+	    ww <- parseTwoDigits
+	    checkWeeks ww
+	    skipHyphen
+	    d <- parseWeekDay
+	    return $ ISODate ImplicitYear $ WeekAndDay (Week ww) (DayOfWeek d))
+
+-- |time parsers
+parseTimeInternal extended =
+  do localtime <- parseLocalTimeInternal extended
+     tzsuffix  <- option LocalTime $ parseTZsuffix extended
+     return $ updateTZ localtime tzsuffix
+
+parseTZsuffix extended =
+  (do skipZ 
+      return UTCTime)
+  <|>
+  (do skipPlus
+      (hours, minutes) <- parseHoursMinutes extended
+      return $ PlusTime hours minutes)
+  <|>
+  (do skipMinus
+      (hours, minutes) <- parseHoursMinutes extended
+      return $ MinusTime hours minutes)
+
+parseHoursMinutes False =
+  do hh <- parseTwoDigits
+     mm <- option NoMinute $ (liftM Minute) parseTwoDigits
+     return (Hour hh, mm)
+
+parseHoursMinutes True =
+  do hh <- parseTwoDigits
+     mm <- option NoMinute $ (liftM Minute) (skipColon >> parseTwoDigits)
+     return (Hour hh, mm)
+
+parseLocalTimeInternal False =
+  -- 5.3.1.1, local time, basic format: hhmmss
+  (try $ do hh <- parseTwoDigits
+	    mm <- parseTwoDigits
+	    ss <- parseTwoDigits
+	    checkHours hh
+	    checkMinutes mm
+	    checkSeconds ss
+	    return $ ISOTime (Hour hh) (Minute mm) (Second ss) LocalTime)
+  <|>
+  -- 5.3.1.2, local time, reduced precision, basic format: hhmm ; hh
+  (try $ do hh <- parseTwoDigits
+	    mm <- parseTwoDigits
+	    checkHours hh
+	    checkMinutes mm
+	    return $ ISOTime (Hour hh) (Minute mm) NoSecond LocalTime)
+  <|>
+  (try $ do hh <- parseTwoDigits
+	    checkHours hh
+	    return $ ISOTime (Hour hh) NoMinute NoSecond LocalTime)
+  <|>
+  -- 5.3.1.4.a, local time, truncated, basic format: -mmss
+  (try $ do skipHyphen
+	    mm <- parseTwoDigits
+	    ss <- parseTwoDigits
+	    checkMinutes mm
+	    checkSeconds ss
+	    return $ ISOTime ImplicitHour (Minute mm) (Second ss) LocalTime)
+  <|>
+  -- 5.3.1.4.b, local time, truncated, basic format: -mm
+  (try $ do skipHyphen
+	    mm <- parseTwoDigits
+	    checkMinutes mm
+	    return $ ISOTime ImplicitHour (Minute mm) NoSecond LocalTime)
+  <|>
+  -- 5.3.1.4.c, local time, truncated, basic format: --ss
+  (try $ do skipHyphen
+	    skipHyphen
+	    ss <- parseTwoDigits
+	    checkSeconds ss
+	    return $ ISOTime ImplicitHour ImplicitMinute (Second ss) LocalTime)
+  
+
+parseLocalTimeInternal True =
+  -- 5.3.1.1, local time, extended format: hh:mm:ss
+  (try $ do hh <- parseTwoDigits
+	    skipColon
+	    mm <- parseTwoDigits
+	    skipColon
+	    ss <- parseTwoDigits
+	    checkHours hh
+	    checkMinutes mm
+	    checkSeconds ss
+	    return $ ISOTime (Hour hh) (Minute mm) (Second ss) LocalTime)
+  <|>
+  -- 5.3.1.2, local time, reduced precision, extended format: hh:mm
+  (try $ do hh <- parseTwoDigits
+	    skipColon
+	    mm <- parseTwoDigits
+	    checkHours hh
+	    checkMinutes mm
+	    return $ ISOTime (Hour hh) (Minute mm) NoSecond LocalTime)
+  <|>
+  -- 5.3.1.4.a, local time, truncated, extended format: -mm:ss
+  (try $ do skipHyphen
+	    mm <- parseTwoDigits
+	    skipColon
+	    ss <- parseTwoDigits
+	    checkMinutes mm
+	    checkSeconds ss
+	    return $ ISOTime ImplicitHour (Minute mm) (Second ss) LocalTime)
+
+-- make ISOTime, ISODate, ISODateAndTime instances of Read
+instance Read ISOTime where
+  readsPrec i = parserToRead parseTime
+
+instance Read ISODate where
+  readsPrec i = parserToRead parseDate
+
+instance Read ISODateAndTime where
+  readsPrec i = parserToRead parseDateAndTime
+-- auxiliary parsers
+
+checkSeconds ss = if ss > 60 then fail "more than 60 seconds" else return ()
+checkMinutes mm = if mm > 59 then fail "more than 59 minutes" else return ()
+checkHours   hh = if hh > 24 then fail "more than 24 hours" else return ()
+checkDays   ddd = if ddd < 1 || ddd > 366 then fail "illegal ordinal day" else return ()
+checkWeeks   ww = if ww < 1 || ww > 53 then fail "illegal week nr" else return ()
+
+parseWeekDay = do d0 <- oneOf "1234567"
+		  return (digitval d0)
+
+parseOneDigit = do d0 <- digit
+		   return (digitval d0)
+parseTwoDigits = do d1 <- digit
+		    vv <- parseOneDigit
+		    return (10 * digitval d1 + vv)
+parseThreeDigits = do d2 <- digit
+		      vv <- parseTwoDigits
+		      let vvv = 100 * digitval d2 + vv
+		      return vvv
+parseOrdinalDay = do vvv <- parseThreeDigits
+		     checkDays vvv
+		     return vvv
+parseFourDigits = do d3 <- digit
+		     vvv <- parseThreeDigits
+		     return (1000 * digitval d3 + vvv)
+
diff --git a/WASH/Utility/IntToString.hs b/WASH/Utility/IntToString.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/IntToString.hs
@@ -0,0 +1,10 @@
+-- © 2002 Peter Thiemann
+module WASH.Utility.IntToString where
+
+import Char
+
+intToString ndigits i =
+  let g x = h $ divMod x 10
+      h (q,r) = chr (ord '0' + fromInteger r) : g q
+  in
+  reverse $ take ndigits $ g i
diff --git a/WASH/Utility/JavaScript.hs b/WASH/Utility/JavaScript.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/JavaScript.hs
@@ -0,0 +1,27 @@
+-- © 2003 Peter Thiemann
+module WASH.Utility.JavaScript where
+
+import Char
+
+import WASH.Utility.Hex
+
+jsShow :: String -> String
+jsShow xs = '\'' : g xs
+  where
+    g "" = "'"
+    g (x:xs) = 
+      case x of
+	'\'' -> h x xs
+	'\"' -> h x xs
+	'<' -> h x xs
+	'>' -> h x xs
+	'&' -> h x xs
+	x | isPrint x -> x : g xs
+	  | otherwise -> h x xs
+    h x xs =
+      let ox = ord x in
+      if ox < 256 then
+	 '\\' : 'x' : showsHex 2 ox (g xs)
+      else
+	 '\\' : 'u' : showsHex 4 ox (g xs)
+				 
diff --git a/WASH/Utility/Locking.hs b/WASH/Utility/Locking.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/Locking.hs
@@ -0,0 +1,41 @@
+-- © 2003 Peter Thiemann
+{-|
+Implements Locking via directory creation, which seems to be the only portable
+way to do it through Haskell's standard IO library.
+-}
+module WASH.Utility.Locking (obtainLock, releaseLock) where
+
+import WASH.Utility.Auxiliary
+import Directory
+import IO
+import System
+import Time
+
+obtainLock  :: FilePath -> IO ()
+releaseLock :: FilePath -> IO ()
+
+lockPath name = name ++ ".lockdir"
+
+obtainLock name =
+  assertDirectoryExists (lockPath name)
+                        (system "sleep 1" >> obtainLockLoop name)
+
+releaseLock name =
+  removeDirectory (lockPath name)
+
+obtainLockLoop name =
+  let lp = lockPath name in
+  do b <- doesDirectoryExist lp
+     if b then do -- check if lock is stale
+		  mtime <- getModificationTime lp
+		  ftime <- getModificationTime name
+		  ctime <- getClockTime
+		  let td = diffClockTimes ctime mtime
+		      tf = diffClockTimes ctime ftime
+		  if tdSec td > 60 && tdSec tf > 60
+		    then do removeDirectory lp
+			    obtainLock name
+		    else do system "sleep 1"
+			    obtainLockLoop name
+		    
+          else obtainLock name
diff --git a/WASH/Utility/QuotedPrintable.hs b/WASH/Utility/QuotedPrintable.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/QuotedPrintable.hs
@@ -0,0 +1,50 @@
+-- © 2003 Peter Thiemann
+module WASH.Utility.QuotedPrintable 
+       (encode, encode', decode
+       -- deprecated: encode_quoted, encode_quoted', decode_quoted
+       ) where
+
+import Char
+import WASH.Utility.Hex
+
+encode, encode', decode :: String -> String
+encode = encode_quoted
+encode' = encode_quoted'
+decode = decode_quoted
+
+
+encode_hexadecimal c = '=' : showHex2 c
+
+quoted_printable x = 
+  ox >= 33 && ox <= 126 && ox /= 61
+  where ox = ord x
+
+end_of_line [] = True
+end_of_line ('\r':'\n':_) = True
+end_of_line _ = False
+
+encode_quoted' (x:xs) | x `elem` "\t " = 
+  if end_of_line xs then encode_hexadecimal (ord x) ++ encode_quoted' xs
+                    else x : encode_quoted' xs
+encode_quoted' (x:xs) | quoted_printable x = x : encode_quoted' xs
+encode_quoted' ('\r':'\n':xs) = '\r':'\n': encode_quoted' xs
+encode_quoted' (x:xs) = encode_hexadecimal (ord x) ++ encode_quoted' xs
+encode_quoted' [] = ""
+
+encode_quoted = softLineBreak 76 . encode_quoted'
+
+softLineBreak n [] = "\r\n"
+softLineBreak 0 xs | not (end_of_line xs) = '=':'\r':'\n': softLineBreak 76 xs
+softLineBreak n ('\r':'\n':xs) = '\r':'\n': softLineBreak 76 xs
+softLineBreak n (xs@('=':_)) | n < 4 = '=':'\r':'\n': softLineBreak 76 xs
+softLineBreak n (x:xs) = x : softLineBreak (n-1) xs
+
+decode_quoted [] = []
+decode_quoted ('=':'\r':'\n':xs) =
+  decode_quoted xs
+decode_quoted ('=':'\n':xs) =
+  decode_quoted xs
+decode_quoted ('=':upper:lower:xs) | isHexdigit upper && isHexdigit lower = 
+  chr (16 * hexDigitVal upper + hexDigitVal lower) : decode_quoted xs
+decode_quoted (x:xs) = 
+  x : decode_quoted xs
diff --git a/WASH/Utility/RFC2047.hs b/WASH/Utility/RFC2047.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/RFC2047.hs
@@ -0,0 +1,72 @@
+-- © 2003 Peter Thiemann
+module WASH.Utility.RFC2047 where
+-- decoding of header fields
+import Char
+import List
+
+import qualified WASH.Utility.Base64 as Base64
+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable
+import WASH.Utility.Hex
+import Text.ParserCombinators.Parsec
+
+lineString =
+  do initial <- many (noneOf "\n\r=")
+     rest <- option "" (do xs <- try encoded_words <|> string "=" 
+			   ys <- lineString
+			   return (xs ++ ys))
+     return (initial ++ rest)
+
+especials = "()<>@,;:\\\"/[]?.="
+tokenchar = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" \\ especials
+p_token = many1 (oneOf tokenchar)
+p_encoded_text = many1 $ oneOf "!\"#$%&'()*+,-./0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
+allchar = "\NUL\SOH\STX\ETX\EOT\ENQ\ACK\a\b\t\n\v\f\r\SO\SI\DLE\DC1\DC2\DC3\DC4\NAK\SYN\ETB\CAN\EM\SUB\ESC\FS\GS\RS\US !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\DEL"
+
+-- supress linear white space between adjacent encoded_word
+encoded_words =
+  do ew <- encoded_word
+     ws <- many space
+     option (ew++ws) (encoded_words >>= \ews -> return (ew++ews))
+
+encoded_word =
+  do string "=?"
+     charset <- p_token
+     char '?'
+     encoding <- p_token
+     char '?'
+     encoded_text <- p_encoded_text
+     string "?="
+     return $ decode charset (map toUpper encoding) encoded_text
+
+decode charset "B" encoded_text =
+  Base64.decode' encoded_text
+decode charset "Q" encoded_text =
+  decode_quoted encoded_text
+decode charset encoding encoded_text =
+  error ("Unknown encoding: " ++ encoding)
+  
+decode_quoted [] = []
+decode_quoted ('=':upper:lower:xs) = 
+  chr (16 * hexDigitVal upper + hexDigitVal lower) : decode_quoted xs
+decode_quoted ('_':xs) = 
+  ' ' : decode_quoted xs
+decode_quoted (x:xs) = 
+  x : decode_quoted xs
+
+-- --------------------------------------------------------------------
+-- RFC 2047: encoding of header fields
+
+encodeWord w =
+  "=?" ++ charset ++ "?" ++ encoding ++ "?" ++ QuotedPrintable.encode' w ++ "?="
+  where encoding = "q"
+	charset  = "iso-8859-1"
+
+encodeValue v = 
+  case span (not . flip elem " ()<>@.!,") v of
+    ([], []) -> []
+    (word, []) -> maybeEncode word
+    (word, x:rest) -> maybeEncode word ++ x : encodeValue rest
+
+maybeEncode word | all p word = word
+                 | otherwise = encodeWord word
+  where p x = let ox = ord x in ox >= 33 && ox <= 126
diff --git a/WASH/Utility/RFC2279.hs b/WASH/Utility/RFC2279.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/RFC2279.hs
@@ -0,0 +1,110 @@
+-- © 2003 Peter Thiemann
+{-|
+  Implements UTF-8 encoding
+
+  UCS-4 range (hex.)           UTF-8 octet sequence (binary)
+  0000 0000-0000 007F   0xxxxxxx
+  0000 0080-0000 07FF   110xxxxx 10xxxxxx
+  0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx
+  0001 0000-001F FFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+  0020 0000-03FF FFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+  0400 0000-7FFF FFFF   1111110x 10xxxxxx ... 10xxxxxx
+-}
+module WASH.Utility.RFC2279 (encode, decode) where
+
+import Char
+
+
+-- |maps Unicode string to list of octets
+encode :: String -> String
+
+-- |maps list of octets in UTF-8 encoding to Unicode string
+decode :: String -> String
+
+factors = iterate (* 0x40) 1
+f1 = factors !! 1
+f2 = factors !! 2
+f3 = factors !! 3
+f4 = factors !! 4
+f5 = factors !! 5
+
+encode [] = []
+encode (x:xs) = 
+  let r0 = ord x in
+  if r0 < 0x80 then
+    x : encode xs
+  else if r0 < 0x800 then
+    let c1 = 0xC0 + r0 `div` f1
+	c2 = 0x80 + r0 `mod` f1
+    in  chr c1 : chr c2 : encode xs
+  else if r0 < 0x10000 then
+    let c1 = 0xE0 + r0 `div` f2
+	r1 = r0 `mod` f2
+	c2 = 0x80 + r1 `div` f1
+	c3 = 0x80 + r1 `mod` f1
+    in  chr c1 : chr c2 : chr c3 : encode xs
+  else if r0 < 0x200000 then
+    let c1 = 0xF0 + r0 `div` f3
+	r1 = r0 `mod` f3
+	c2 = 0x80 + r1 `div` f2
+	r2 = r1 `mod` f2
+	c3 = 0x80 + r2 `div` f1
+	c4 = 0x80 + r2 `mod` f1
+    in  chr c1 : chr c2 : chr c3 : chr c4 : encode xs
+  else if r0 < 0x4000000 then
+    let c1 = 0xF8 + r0 `div` f4
+	r1 = r0 `mod` f4
+	c2 = 0x80 + r1 `div` f3
+	r2 = r1 `mod` f3
+	c3 = 0x80 + r2 `div` f2
+	r3 = r2 `mod` f2
+	c4 = 0x80 + r3 `div` f1
+	c5 = 0x80 + r3 `mod` f1
+    in  chr c1 : chr c2 : chr c3 : chr c4 : chr c5 : encode xs
+  else 
+    let c1 = 0xFC + r0 `div` f5
+	r1 = r0 `mod` f5
+	c2 = 0x80 + r1 `div` f4
+	r2 = r1 `mod` f4
+	c3 = 0x80 + r2 `div` f3
+	r3 = r2 `mod` f3
+	c4 = 0x80 + r3 `div` f2
+	r4 = r3 `mod` f2
+	c5 = 0x80 + r4 `div` f1
+	c6 = 0x80 + r4 `mod` f1
+    in  chr c1 : chr c2 : chr c3 : chr c4 : chr c5 : chr c6 : encode xs
+
+
+decode [] = []
+decode (x : xs) =
+  let ordx = ord x in 
+  if ordx < 0x80 then
+    x : decode xs
+  else if ordx < 0xC0 then
+    error "UTF-8 decoding out of sync"
+  else if ordx < 0xE0 then
+    decoden 1 (ordx - 0xC0) xs
+  else if ordx < 0xF0 then
+    decoden 2 (ordx - 0xE0) xs
+  else if ordx < 0xF8 then
+    decoden 3 (ordx - 0xF0) xs
+  else if ordx < 0xFC then
+    decoden 4 (ordx - 0xF8) xs
+  else if ordx < 0xFE then
+    decoden 5 (ordx - 0xFC) xs
+  else
+    error "UTF-8 decoding found illegal start octet"
+      
+decoden :: Int -> Int -> String -> String
+decoden 0 v xs =
+  chr v : decode xs
+decoden n v (x : xs) =
+  let ordx = ord x
+      v' = f1 * v + ordx - 0x80
+  in 
+  if ordx >= 0x80 && ordx < 0xC0 then
+    decoden (n-1) v' xs
+  else 
+    error "UTF-8 decoding found illegal continuation octet"
+
+	       
diff --git a/WASH/Utility/RFC2397.hs b/WASH/Utility/RFC2397.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/RFC2397.hs
@@ -0,0 +1,65 @@
+-- © 2002-2005 Peter Thiemann
+module WASH.Utility.RFC2397 where
+
+import WASH.Utility.URLCoding as URLCoding
+import WASH.Utility.Base64 as Base64
+
+data ENC = BASE64 | URL
+  deriving Eq
+
+-- |maps (mediatype, contents) to data URL
+encode :: (String, String) -> String
+encode (mediatype, thedata) =
+  "data:" ++ mediatype ++ ";base64," ++ Base64.encode' thedata
+
+-- |maps data URL to @Just (mediatype, contents)@ or @Nothing@ in case of a
+-- syntax error.
+decode :: String -> Maybe (String, String)
+decode url = 
+  let (scheme, rest) = break (==':') url in
+  case rest of
+    ':' : contents | scheme == "data" -> 
+      decodeContents contents
+    _ -> Nothing
+
+decodeContents xs =
+  let (prefix, restdata) = break (==',') xs in
+  case restdata of
+    ',' : thedata ->
+      decodePrefix prefix thedata
+    _ -> Nothing
+      
+decodePrefix prefix thedata =
+  let fragments = breakList (==';') prefix 
+      enc = case reverse fragments of
+	      ("base64":_) -> BASE64
+	      _ -> URL
+      mediapart | enc == BASE64 = init fragments
+                | otherwise     = fragments
+  in
+  case mediapart of
+    (xs:_) ->
+      case break (=='/') xs of
+	(_, []) -> 
+	  decodeData ("text/plain" : mediapart) enc thedata
+	_ ->
+	  decodeData mediapart enc thedata
+    _ ->  decodeData ["text/plain", "charset=US-ASCII"] enc thedata
+
+decodeData mediatype enc thedata =
+  Just ( unparse mediatype
+       , case enc of
+	   URL    -> URLCoding.decode thedata
+	   BASE64 -> Base64.decode thedata
+       )
+
+breakList :: (x -> Bool) -> [x] -> [[x]]
+breakList p xs =
+  let (pre, post) = break p xs in
+  case post of
+    [] -> [pre]
+    y:ys -> pre : breakList p ys
+
+unparse [] = ""
+unparse [xs] = xs
+unparse (xs:xss) = xs ++ ';' : unparse xss
diff --git a/WASH/Utility/SHA1.hs b/WASH/Utility/SHA1.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/SHA1.hs
@@ -0,0 +1,119 @@
+-- exchanged C-wrapper with Ian Lynagh's code
+-- from http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/sha1/
+-- under permission of license BSD
+
+module WASH.Utility.SHA1 (sha1, sha1_size) where
+
+import Char
+import Bits
+import Word
+
+type ABCDE = (Word32, Word32, Word32, Word32, Word32)
+type XYZ = (Word32, Word32, Word32)
+type Rotation = Int
+
+sha1 :: String -> String
+sha1 s = s5
+ where s1_2 = sha1_step_1_2_pad_length s
+       abcde = sha1_step_3_init
+       abcde' = sha1_step_4_main abcde s1_2
+       s5 = sha1_step_5_display abcde'
+
+sha1_size :: (Integral a) => a -> String -> String
+sha1_size l s = s5
+ where s1_2 = s ++ sha1_step_1_2_work (fromIntegral ((toInteger l) `mod` (2^64))) ""
+       abcde = sha1_step_3_init
+       abcde' = sha1_step_4_main abcde s1_2
+       s5 = sha1_step_5_display abcde'
+
+sha1_step_1_2_pad_length :: String -> String
+sha1_step_1_2_pad_length s = sha1_step_1_2_work 0 s
+
+sha1_step_1_2_work :: Integer -> String -> String
+sha1_step_1_2_work c64 "" = padding ++ len
+ where padding = '\128':replicate' (shiftR (fromIntegral $ (440 - c64) `mod` 512) 3) '\000'
+       len = map chr $ size_split 8 c64
+sha1_step_1_2_work c64 (c:cs) = c:sha1_step_1_2_work ((c64 + 8) `mod` (2^64)) cs
+
+replicate' :: Word16 -> a -> [a]
+replicate' 0 _ = []
+replicate' n x = x:replicate' (n-1) x
+
+size_split :: Int -> Integer -> [Int]
+size_split 0 _ = []
+size_split p n = size_split (p-1) n' ++ [fromIntegral d]
+ where (n', d) = divMod n 256
+
+sha1_step_3_init :: ABCDE
+sha1_step_3_init = (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0)
+
+{- 
+[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
+
+wm3 = [13,14,15]
+wm8 = [8,9,10,11,12,13,14,15]
+wm14 = [2,3,4,5,6,7,8,9,10,11,12,13,14,15]
+wm16 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
+-}
+
+sha1_step_4_main :: ABCDE -> String -> ABCDE
+sha1_step_4_main abcde "" = {- abcde -} abcde
+sha1_step_4_main abcde0 s = sha1_step_4_main abcde5 s'
+ where (s64, s') = takeDrop 64 s
+       s16 = get_word_32s s64
+       s80 = s16 ++ sha1_add_ws 16 (drop 13 s16, drop 8 s16, drop 2 s16, s16)
+       (s20_0, s60) = takeDrop 20 s80
+       (s20_1, s40) = takeDrop 20 s60
+       (s20_2, s20_3) = takeDrop 20 s40
+       abcde1 = foldl (doit f1 0x5a827999) abcde0 s20_0
+       abcde2 = foldl (doit f2 0x6ed9eba1) abcde1 s20_1
+       abcde3 = foldl (doit f3 0x8f1bbcdc) abcde2 s20_2
+       abcde4 = foldl (doit f2 0xca62c1d6) abcde3 s20_3
+       f1 (x, y, z) = (x .&. y) .|. ((complement x) .&. z)
+       f2 (x, y, z) = x `xor` y `xor` z
+       f3 (x, y, z) = (x .&. y) .|. (x .&. z) .|. (y .&. z)
+       (a,  b,  c,  d,  e ) = abcde0
+       (a', b', c', d', e') = abcde4
+       abcde5 = (a + a', b + b', c + c', d + d', e + e')
+
+doit :: (XYZ -> Word32) -> Word32 -> ABCDE -> Word32 -> ABCDE
+doit f k (a, b, c, d, e) w = (a', a, rotL b 30, c, d)
+ where a' = rotL a 5 + f(b, c, d) + e + w + k
+
+sha1_add_ws :: Int -> ([Word32], [Word32], [Word32], [Word32]) -> [Word32]
+sha1_add_ws 80 _ = []
+sha1_add_ws n (w1:w1s, w2:w2s, w3:w3s, w4:w4s)
+ = w:sha1_add_ws (n + 1) (w1s ++ [w], w2s ++ [w], w3s ++ [w], w4s ++ [w])
+ where w = rotL (foldr1 xor [w1, w2, w3, w4]) 1
+
+get_word_32s :: String -> [Word32]
+get_word_32s "" = []
+get_word_32s ss = this:rest
+ where (s, ss') = takeDrop 4 ss
+       this = sum $ zipWith shiftL (map (fromIntegral.ord) s) [24, 16, 8, 0]
+       rest = get_word_32s ss'
+
+takeDrop :: Int -> [a] -> ([a], [a])
+takeDrop _ [] = ([], [])
+takeDrop 0 xs = ([], xs)
+takeDrop n (x:xs) = (x:ys, zs)
+ where (ys, zs) = takeDrop (n-1) xs
+
+sha1_step_5_display :: ABCDE -> String
+sha1_step_5_display (a, b, c, d, e)
+ = foldr (\x y -> display_32bits_as_hex x ++ y) "" [a, b, c, d, e]
+
+display_32bits_as_hex :: Word32 -> String
+display_32bits_as_hex x0 = map getc [y8,y7,y6,y5,y4,y3,y2,y1]
+ where (x1, y1) = divMod x0 16
+       (x2, y2) = divMod x1 16
+       (x3, y3) = divMod x2 16
+       (x4, y4) = divMod x3 16
+       (x5, y5) = divMod x4 16
+       (x6, y6) = divMod x5 16
+       (y8, y7) = divMod x6 16
+       getc n = (['0'..'9'] ++ ['a'..'f']) !! (fromIntegral n)
+
+rotL :: Word32 -> Rotation -> Word32
+rotL a s = shiftL a s .|. shiftL a (s-32)
+
diff --git a/WASH/Utility/Shell.hs b/WASH/Utility/Shell.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/Shell.hs
@@ -0,0 +1,20 @@
+-- © 2002 Peter Thiemann
+-- |Defines functions for shell quotation.
+module WASH.Utility.Shell where
+
+import Char
+
+-- |Shell meta characters are /! & ; \` \' \" | * ? ~ \< \> ^ ( ) [ ] true $ n r/
+metaCharacters :: String
+metaCharacters = " !&;`\'\"|*?~<>^()[]$\\%{}"
+
+-- |Quotes all shell meta characters and removes non printable ones.
+quote :: String -> String
+quote "" = ""
+quote (x:xs) | isPrint x =
+	       if x `elem` metaCharacters 
+	       then '\\' : x : quote xs
+	       else x : quote xs
+	     | otherwise = 
+	       quote xs
+
diff --git a/WASH/Utility/SimpleParser.hs b/WASH/Utility/SimpleParser.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/SimpleParser.hs
@@ -0,0 +1,60 @@
+-- © 2002 Peter Thiemann
+module WASH.Utility.SimpleParser where
+
+import Char
+
+-- very simple parser combinators: Parsec is too sophisticated!
+newtype Parser a b = Parser (a -> [(b, a)])
+unParser (Parser g) = g
+instance Monad (Parser a) where
+  return x = Parser (\ w -> [(x, w)])
+  m >>=  f = let g = unParser m in
+	     Parser (\ w -> [ (y, w'') | (x, w') <- g w, (y, w'') <- unParser (f x) w'])
+  fail str = Parser (\ w -> [])
+
+satisfy p = Parser (\ w -> [(x, w') | x:w' <- [w], p x])
+
+print = satisfy isPrint
+alphaNum = satisfy isAlphaNum
+alpha = satisfy isAlpha
+ascii = satisfy isAscii
+digit = satisfy isDigit
+char c = satisfy (==c)
+string s = foldr (\ x p -> do { c <- char x; cs <- p; return (c:cs); }) (return "") s
+oneOf cs = satisfy (`elem` cs)
+noneOf cs = satisfy (not . (`elem` cs))
+
+eof = Parser (\ w -> if null w then [((),[])] else [])
+try parser = parser
+p1 <|> p2 = let g1 = unParser p1
+		g2 = unParser p2
+	    in  Parser (\w -> g1 w ++ g2 w)
+
+option :: x -> Parser a x -> Parser a x
+option x parser = parser <|> return x
+
+many1 p = 
+  do x <- p
+     xs <- many p
+     return (x : xs)
+
+many p = 
+  option [] (many1 p)
+
+manyn n p =
+  if n <= 0 
+  then return []
+  else do x <- p
+	  xs <- manyn (n-1) p
+	  return (x : xs)
+
+
+parseFromString :: Parser String x -> String -> Maybe x
+parseFromString parser str =
+  let g = unParser (parser >>= (\x -> eof >> return x)) in
+  case g str of
+    (x, ""): _ -> Just x
+    _ -> Nothing
+
+parserToRead :: Parser String x -> ReadS x
+parserToRead parser = unParser parser
diff --git a/WASH/Utility/URLCoding.hs b/WASH/Utility/URLCoding.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/URLCoding.hs
@@ -0,0 +1,38 @@
+-- © 2001, 2002, 2006 Peter Thiemann
+-- |Implements coding of non-alphanumeric characters in URLs and CGI-requests.
+module WASH.Utility.URLCoding (encode, decode) where
+
+import Char
+import WASH.Utility.Hex
+
+-- |Perform URI encoding of a list of bytes. See 
+-- <http://www.w3.org/International/O-URL-code.html>
+-- To encode a list of characters, the string first has to be UTF-8 encoded!
+encode :: String -> String
+encode = urlEncode
+
+-- |Perform URI decoding to a list of bytes.
+decode :: String -> String
+decode = urlDecode
+
+-- implementations
+
+urlEncode :: String -> String
+urlEncode xs =
+  urlEncode' xs ""
+urlEncode' "" = id
+urlEncode' (x:xs) = 
+  (if isAlphaNum x 
+  then showChar x
+  else showChar '%' .
+       showsHex 2 (ord x)) . urlEncode' xs
+
+urlDecode :: String -> String
+urlDecode "" = ""
+urlDecode ('+':xs) =
+	' ' : urlDecode xs
+urlDecode ('%':upper:lower:xs) =
+	chr (16 * hexDigitVal upper + hexDigitVal lower) : urlDecode xs
+urlDecode (x:xs) = 
+	x : urlDecode xs
+
diff --git a/WASH/Utility/Unique.hs b/WASH/Utility/Unique.hs
new file mode 100644
--- /dev/null
+++ b/WASH/Utility/Unique.hs
@@ -0,0 +1,67 @@
+-- © 2001 Peter Thiemann
+module WASH.Utility.Unique (inventStdKey, inventKey, inventFilePath) where
+
+import Random
+import IO
+import Directory
+import WASH.Utility.Auxiliary
+import List
+import Monad
+import WASH.Utility.Locking
+
+registryDir = "/tmp/Unique/"
+
+-- |Creates a random string of 20 letters and digits.
+inventStdKey :: IO String
+inventStdKey = inventKey 20 stdKeyChars
+
+stdKeyChars = ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9']
+
+-- |Creates a unique string from a given length and alphabet.
+inventKey :: Int -> String -> IO String
+inventKey len chars =
+  do g <- newStdGen
+     let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g
+	 dirname = registryDir ++ candidate
+     catch (do createDirectory dirname
+	       return candidate)
+	   (\ ioe -> 
+	   if isAlreadyExistsError ioe then
+	      -- might want to check here for timeout
+	      inventKey len chars
+	   else if isDoesNotExistError ioe then
+	     do assertDirectoryExists registryDir (return ())
+		setPermissions registryDir (Permissions True True True True)
+		inventKey len chars
+	   else do hPutStrLn stderr ("inventKey could not create " ++ show dirname)
+		   ioError ioe)
+
+-- |Create a unique temporary file name
+inventFilePath :: IO String
+inventFilePath =
+  do key <- inventStdKey
+     return (registryDir ++ key ++ "/f")
+
+-- obsolete. registryFile is a bottleneck.
+
+registryFile = registryDir ++ "REGISTRY"
+
+inventKey' :: Int -> String -> IO String
+inventKey' len chars =
+  do g <- newStdGen
+     let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g
+     obtainLock registryFile
+     registry <- readRegistry
+     let passwords = lines registry
+     if candidate `elem` passwords 
+       then do releaseLock registryFile
+	       inventKey' len chars
+       else do appendFile registryFile (candidate ++ "\n")
+	       releaseLock registryFile
+	       return candidate
+
+readRegistry :: IO String
+readRegistry =
+  let registryPath = init registryDir in
+  do assertDirectoryExists registryPath (return ())
+     readFileNonExistent registryFile ""
diff --git a/WashNGo.cabal b/WashNGo.cabal
new file mode 100644
--- /dev/null
+++ b/WashNGo.cabal
@@ -0,0 +1,124 @@
+Name: WashNGo
+Version: 2.12
+License: BSD3
+License-File: LICENSE
+Build-Type : Simple
+
+Author: Peter Thiemann <thiemann@informatik.uni-freiburg.de>
+maintainer: Marc Weber <marco-oweber@gmx.de>
+-- note: CC both: Peter Thiemann and Marc Weber
+
+Copyright: Copyright 2001-2006, Peter Thiemann
+Homepage: http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/
+Category: Web
+Stability: Beta
+Synopsis: WASH is a family of embedded domain specific languages (EDSL) for programming Web applications in Haskell.
+Cabal-Version: >= 1.2
+
+-- source-repository head
+--  type:     darcs
+--  location: http://code.haskell.org/WASH/
+
+Library
+  Build-Depends: base < 5, regex-compat, haskell98, parsec
+  Extensions: ForeignFunctionInterface
+  build-depends: containers
+  Exposed-Modules:
+          WASH.CGI.AbstractSelector
+          WASH.CGI.BaseCombinators
+          WASH.CGI.CGI
+          WASH.CGI.CGIConfig
+          WASH.CGI.CGIGraphics
+          WASH.CGI.CGIHistory
+          WASH.CGI.CGIInternals
+          WASH.CGI.CGIMonad
+          WASH.CGI.CGIOutput
+          WASH.CGI.CGITypes
+          WASH.CGI.CGIXX
+          WASH.CGI.ContentType
+          WASH.CGI.Cookie
+          WASH.CGI.CookieIO
+          WASH.CGI.Debug
+          WASH.CGI.EventHandlers
+          WASH.CGI.Fields
+          WASH.CGI.Frames
+          WASH.CGI.GuaranteedCGI
+          WASH.CGI.HTMLMail
+          WASH.CGI.HTMLWrapper
+          WASH.CGI.HTTP
+          WASH.CGI.Images
+          WASH.CGI.InputHandle
+          WASH.CGI.MakeTypedName
+          WASH.CGI.LogEntry
+          WASH.CGI.PPM
+          WASH.CGI.Persistent2
+          WASH.CGI.RawCGITypes
+          WASH.CGI.RawCGI
+          WASH.CGI.RawCGIInternal
+          WASH.CGI.StateItem
+          WASH.CGI.Style
+          WASH.CGI.Submit98
+          WASH.CGI.SubmitXX
+          WASH.CGI.TCGI
+          WASH.CGI.Transaction
+          WASH.CGI.TransactionUtil
+          WASH.CGI.Types
+          WASH.HTML.HTMLBase
+          WASH.HTML.HTMLMonad
+          WASH.HTML.HTMLMonadAttrs
+          WASH.HTML.HTMLMonad98
+          WASH.HTML.HTMLMonadBase
+          WASH.HTML.HTMLPrelude
+          WASH.HTML.HTMLPrelude98
+          WASH.HTML.HTMLTypedBase
+          WASH.HTML.HTMLTypedBase98
+          WASH.HTML.HTMLTemplates
+          WASH.Mail.ContentDisposition
+          WASH.Mail.Email
+          WASH.Mail.EmailConfig
+          WASH.Mail.HeaderField
+          WASH.Mail.MIME
+          WASH.Mail.MailParser
+          WASH.Mail.Message
+          WASH.Mail.RFC2822
+          WASH.Utility.Auxiliary
+          WASH.Utility.Base32
+          WASH.Utility.Base64
+          WASH.Utility.BulkIO
+          WASH.Utility.FileNames
+          WASH.Utility.Hex
+          WASH.Utility.ISO8601
+          WASH.Utility.IntToString
+          WASH.Utility.JavaScript
+          WASH.Utility.Locking
+          WASH.Utility.QuotedPrintable
+          WASH.Utility.RFC2047
+          WASH.Utility.RFC2279
+          WASH.Utility.RFC2397
+          WASH.Utility.SHA1
+          WASH.Utility.SimpleParser
+          WASH.Utility.Shell
+          WASH.Utility.URLCoding
+          WASH.Utility.Unique
+
+Executable wash2hs
+  Main-Is: WASHMain.hs
+  Other-Modules:
+          WASHFlags
+          WASHUtil
+          WASHOut
+          WASHFlags
+          WASHData
+          WASHClean
+          WASHExpression
+          WASHMain
+          WASHParser
+          WASHGenerator
+
+  Hs-Source-Dirs: washparser/hs
+
+
+Executable washc
+  Main-Is: WASHC.hs
+  Hs-Source-Dirs: washc/hs
+  Build-Depends: ghc-paths, process, directory
diff --git a/washc/hs/WASHC.hs b/washc/hs/WASHC.hs
new file mode 100644
--- /dev/null
+++ b/washc/hs/WASHC.hs
@@ -0,0 +1,40 @@
+module Main where
+import System.IO
+import System.Process
+import System.Environment
+import GHC.Paths
+import System.Exit
+import System.Directory
+
+-- in the past this was a shell script
+-- I didn't know how to get the installation path from Cabal - so I rewrite it
+-- as Haskell application
+
+main = do
+  -- custom addiotional arguments:
+  args <- getArgs
+
+
+  case args of
+    [] -> do
+      n <- getProgName
+      putStrLn $ "usage: " ++ n ++ " --make Main.hs"
+      putStrLn $ "where Main.hs is a file such as the first hello world example found on "
+      putStrLn $ "http://haskell.org/haskellwiki/WASH"
+
+    _ -> do
+
+      mwash2hs <- findExecutable "wash2hs"
+
+      case mwash2hs of
+
+        Nothing -> error "wash2hs not found in PATH"
+
+        Just wash2hs -> do
+              n <- getProgName
+              let allArgs = ["-pgmF", wash2hs, "-F", "-package", "WashNGo" {- TODO: add version ? -}]
+                            ++ args
+
+              p <- runProcess GHC.Paths.ghc allArgs Nothing Nothing Nothing Nothing Nothing
+              ec <- waitForProcess p
+              exitWith ec
diff --git a/washparser/hs/WASHClean.hs b/washparser/hs/WASHClean.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHClean.hs
@@ -0,0 +1,58 @@
+module WASHClean where
+
+import Char
+
+import WASHData
+
+data CM a = CM ([String] -> a)
+instance Monad CM where -- Reader monad
+  return x = CM (const x)
+  m >>= f  = CM (\strs ->
+		 case m of
+		   CM mfun -> 
+		     case f (mfun strs) of
+		       CM ffun ->
+			 ffun strs)
+
+class Clean n where
+  clean :: n -> CM n
+
+cleanCodeFragList :: [CodeFrag] -> [CodeFrag]
+cleanCodeFragList = map g
+  where g (EFrag el) = EFrag (cleanElement el)
+	g (CFrag cs) = CFrag (cleanContentList cs)
+	g cf         = cf
+
+cleanElement :: Element -> Element
+cleanElement e@Element{elemName = en, elemContent = ec} =
+  if en == "pre"
+  then e
+  else let ec' = cleanContentList ec in
+       e{elemContent = ec'}
+
+cleanContentList :: [Content] -> [Content]
+cleanContentList = remove . map g . combine
+  where g c = case c of CElement{celem = el} -> CElement{celem = cleanElement el}
+			CText{ctext = et}    -> CText{ctext = et { textString = cleanText (textString et) }}
+			CCode{ccode = ec}    -> CCode{ccode = cleanCodeFragList ec}
+			_ -> c
+	combine (CText {ctext = t1} : CText {ctext = t2} : rest ) = 
+		combine (CText {ctext = Text {textString = textString t1++ textString t2, textMode = textMode t1}} : rest)
+	combine (x : xs) = x : combine xs
+	combine [] = []
+	remove  (CText{ctext = tt} : rest) | textString tt == " " = remove rest
+	-- remove  (CText{ctext = tt} : rest@(CElement{} : _)) = CText{ctext = dropRight tt} : remove rest
+	-- remove  (e@CElement{} : (CText{ctext = tt} : rest)) = e : remove (CText{ctext = dropLeft tt} : rest)
+	remove  (x : rest) = x : remove rest
+	remove  [] = []
+
+cleanText "" = ""
+cleanText xs@[x] | isSpace x = " "
+		 | otherwise = xs
+cleanText (x : ys@(y : _)) | isSpace x = if isSpace y 
+					 then cleanText ys
+					 else ' ' : cleanText ys
+			   | otherwise = x : cleanText ys
+
+dropRight tt = tt { textString = reverse (dropWhile isSpace (reverse (textString tt))) }
+dropLeft  tt = tt { textString = dropWhile isSpace (textString tt) }
diff --git a/washparser/hs/WASHData.hs b/washparser/hs/WASHData.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHData.hs
@@ -0,0 +1,74 @@
+module WASHData						    -- derived from HSPData
+    ( File (..)
+    , Mode (..)
+    , Element (..)
+    , Text (..)
+    , Content (..)
+    , CodeFrag (..)
+    , Attribute (..)
+    , AttrValue (..)
+    )
+where {
+
+
+-- Data type.
+
+data File = File { 
+    fcode :: [CodeFrag],
+    topElem :: Element
+    } deriving Show;
+
+data Mode = V | S | F 
+  deriving (Eq,Show);
+
+data Element = Element 
+    { elemMode :: Mode
+    , elemName :: String
+    , elemAttrs :: [Attribute]
+    , elemContent :: [Content]
+    , elemEmptyTag :: Bool }
+    deriving Show;
+
+data Text = Text 
+    { textMode :: Mode
+    , textString :: String
+    }
+    deriving Show;
+
+data Content 
+    = CElement { celem :: Element }
+    | CText { ctext :: Text }
+    | CReference { creference :: Text }
+    | CPI { cpi :: String }
+    | CComment { ccomment :: String }
+    | CCode { ccode :: [CodeFrag] }
+    deriving Show;
+    
+data CodeFrag 
+    = HFrag String
+    | EFrag Element
+    | HSFrag String
+    | CFrag [Content]
+    | AFrag [Attribute]
+    | VFrag String
+    deriving Show;
+
+data Attribute
+  = Attribute
+    { attrMode :: Mode
+    , attrName :: String
+    , attrValue :: AttrValue }
+  | AttrPattern
+    { attrPattern :: String }
+    deriving Show;
+
+data AttrValue
+    = AText String
+    | ACode String
+    deriving Show;
+
+data Reference = Reference String deriving Show;
+    
+
+
+}
diff --git a/washparser/hs/WASHExpression.hs b/washparser/hs/WASHExpression.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHExpression.hs
@@ -0,0 +1,418 @@
+module WASHExpression where
+
+import List
+import Monad
+
+import WASHFlags
+import qualified WASHUtil
+import WASHData
+import WASHOut
+
+code :: FLAGS -> [CodeFrag] -> ShowS
+code flags [] = id
+code flags (x:xs) = code' flags x . code flags xs
+
+code' :: FLAGS -> CodeFrag -> ShowS
+code' flags (HFrag h) = 
+  showString h
+code' flags (EFrag e) =
+  runOut $ element flags e
+code' flags (CFrag cnts) =
+  showChar '(' .
+  runOut (contents flags [] cnts) .
+  showChar ')'
+code' flags (AFrag attrs) =
+  showChar '(' .
+  WASHUtil.itemList (attribute flags) "CGI.empty" " >> " attrs .
+  showChar ')'
+code' flags (VFrag var) = 
+  id
+code' flags _ = error "Unknown type: code"
+
+outMode :: Mode -> Out ()
+outMode = outShowS . showMode
+
+showMode :: Mode -> ShowS
+showMode V = id
+showMode S = showString "_T"
+showMode F = showString "_S"
+
+element :: FLAGS -> Element -> Out [String]
+element flags el@(Element mode nm ats cnt et) =
+  case break (==':') nm of
+    (ns, ':' : elnm) ->
+      ns_element flags ns elnm el 
+    ("input", "") ->
+      input_element flags mode nm ats cnt et
+    ("textarea", "") ->
+      textarea_element flags mode nm ats cnt et
+    _ ->
+      do outChar '('
+	 outString "CGI."
+	 outString nm
+	 when (generateBT flags) $ outMode mode
+	 outChar '('
+	 outShowS $ attributes flags ats
+	 rvs <- contents flags [] cnt
+	 outString "))"
+	 return rvs
+
+textarea_element flags mode nm ats cnt et =
+  let at_name = getAttribute ats "name"
+      preset = getTextualContentAsStringExpression cnt
+      processedAttributes = ["name"]
+      cleanedAttributes = removeAttributes (`elem` processedAttributes) ats
+  in
+      do outString "(CGI."
+	 outString "makeTextarea"
+	 -- attention: the preset text is raw so it may contain character references!
+	 outString preset
+	 outChar '('
+	 outShowS $ attributes flags cleanedAttributes
+	 outString "empty))"
+	 return [at_name]
+
+input_element flags mode nm ats cnt et =
+  let at_type = getAttribute ats "type"
+      at_name = getAttribute ats "name"
+      parms    = getAttribute ats "WASH:parms"
+      callback = getAttribute ats "WASH:callback"
+      call     = getAttribute ats "WASH:call"
+      preset = getTextualContent cnt
+      processedAttributes = ["type", "name", "WASH:parms", "WASH:callback", "WASH:call"]
+      cleanedAttributes = removeAttributes (`elem` processedAttributes) ats
+      do_element elnm =
+	do outChar '('
+	   outString "CGI."
+	   outString elnm
+	   outChar '('
+	   outShowS $ attributes flags cleanedAttributes
+	   outString "empty))"
+	   return [at_name]
+  in
+  case at_type of
+    "text" ->
+      do_element "inputField"
+    "password" ->
+      do_element "passwordInputField"
+    "checkbox" ->
+      do_element "checkboxInputField"
+    -- "radio" -> -- use the RB abstraction
+    "submit" ->
+      let Just (funpart, args) = 
+	       parse_WASH_call call `mplus`
+	       parse_WASH_callback callback parms
+	  largs = length args
+      in
+      do outString "(CGI."
+	 outString at_type
+	 foldr (\arg out -> do outString " (CGI.F2 ("
+			       outString arg
+			       outString ") "
+			       out
+			       outString ")")
+	       (outString " CGI.F0") 
+	       args
+	 outString "(\\"
+	 convertArgs largs
+	 outString " -> "
+	 outChar '('
+	 outString funpart -- funpart :: (arg1, ..., argn) -> CGI ()
+	 outChar ')'
+	 unless (null args) $ convertRess '(' largs
+	 outChar ')'
+	 outChar '('
+	 outShowS $ attributes flags cleanedAttributes
+	 outString "empty))"
+	 return []
+    "reset" ->
+      do_element "resetField"
+    "file" ->
+      do_element "fileInputField"
+    -- "hidden" -> -- useless in WASH
+    -- "image" ->  -- ???
+    -- "button" -> -- ???
+
+convertArgs 0 =
+  outString " CGI.F0"
+convertArgs n =
+  do outString "(CGI.F2 xxxx____"
+     outString (show n)
+     convertArgs (n-1)
+     outString ")"
+
+convertRess c 0 =
+  outChar ')'
+convertRess c n =
+  do outString (c:"CGI.value xxxx____")
+     outString (show n)
+     convertRess ',' (n-1)
+
+parse_WASH_callback cb parms =
+  Just (cb, parse_WASH_call_args [] parms)
+
+parse_WASH_call str =
+  case break (=='(') str of
+    (funpart, '(':rest1 ) ->
+      Just (funpart, parse_WASH_call_args [] rest1)
+    ("", "") ->
+      Nothing
+    (funpart, "") ->
+      Just (funpart, [])
+    _ -> Nothing
+
+parse_WASH_call_args acc str =
+  case break (`elem` ",)") str of
+    (arg, ',': rest) ->
+      parse_WASH_call_args (arg:acc) rest
+    (arg, ')': rest) ->
+      reverse (arg:acc)
+    ("", "") ->
+      reverse (acc)
+    (arg, "") ->
+      reverse (arg:acc)
+
+ns_element flags "WASH" elnm (Element mode _ ats cnt et) =
+  let var = getAttribute ats "WASH:name"
+      chk = getAttribute ats "WASH:check"
+      parms    = getAttribute ats "WASH:parms"
+      callback = getAttribute ats "WASH:callback"
+      preset = getTextualContent cnt
+  in
+  if elnm `elem` [ "submit", "submitLink"] then
+      let args     = words parms in
+      do outString "(CGI."
+	 outString elnm
+	 if null args
+	   then outChar '0'
+	   else do outString ("(CGI.F" ++ show (length args))
+		   mapM (\arg -> outString (' ' : arg)) args
+		   outChar ')'
+	 outChar '('
+	 outString callback
+	 outChar ')'
+	 outChar '('
+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)
+	 outString "empty))"
+	 return []
+  else if elnm `elem` [ "inputField", "textInputField"
+		      , "passwordInputField", "checkboxInputField"
+		      , "fileInputField"] then
+      do outChar '('
+	 outString "CGI."
+	 outString elnm
+	 outChar '('
+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)
+	 outString "empty))"
+	 return [var]
+  else if elnm `elem` [ "checkedTextInputField", "checkedFileInputField"] then
+      do outChar '('
+	 outString "CGI."
+	 outString elnm
+	 outChar '('
+	 outString chk
+	 outChar ')'
+	 outChar '('
+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)
+	 outString "empty))"
+	 return [var]
+  else if elnm `elem` ["makeTextarea"] then
+      do outString "(CGI."
+	 outString elnm
+	 -- attention: the preset text is raw so it may contain character references!
+	 outString (show preset)
+	 outChar '('
+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)
+	 outString "empty))"
+	 return [var]
+  else if elnm `elem` ["makeButton"] then
+      do outString "(CGI."
+	 outString elnm
+	 outChar '('
+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)
+	 rvs <- contents flags [] cnt
+	 outString "))"
+	 return (var:rvs)
+  else if elnm `elem` ["makeForm"] then
+      do outString "(CGI."
+	 outString elnm
+	 outChar '('
+	 outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)
+	 rvs <- contents flags [] cnt
+	 outString "))"
+	 return rvs
+  else
+      error ("WASH element "++elnm++" not defined, yet")
+ns_element flags ns elnm (Element mode nm ats cnt et) =
+  do outChar '('
+     outString "CGI.mkElement"
+     when (generateBT flags) $ outMode mode
+     outString (show nm)
+     outChar '('
+     outShowS $ attributes flags ats
+     rvs <- contents flags [] cnt
+     outString "))"
+     return rvs
+
+outRVS :: [String] -> Out ()
+outRVS [] = outString "()"
+outRVS (x:xs) =
+  do outChar '('
+     outString x
+     mapM_ g xs
+     outChar ')'
+  where g x = do { outChar ','; outString x; }
+
+outRVSpat :: [String] -> Out ()
+outRVSpat [] = outString "(_)"
+outRVSpat xs = outRVS xs
+
+contents :: FLAGS -> [String] -> [Content] -> Out [String]
+contents flags inRVS cts =
+  case cts of
+    [] ->
+      do outString "return"
+	 outRVS inRVS
+	 return inRVS
+    ct:cts ->
+      do rvs <- content flags ct
+	 case rvs of
+	   [] ->
+             case (cts, inRVS) of
+	       ([],[]) ->
+	         return []
+	       _ ->
+		 do outString " >> "
+		    contents flags inRVS cts
+	   _ ->
+	     case (cts, inRVS) of
+	       ([],[]) ->
+	         return rvs
+	       _ ->
+		 do outString " >>= \\ "
+		    outRVSpat rvs
+		    outString " -> "
+		    contents flags (rvs ++ inRVS) cts
+
+content :: FLAGS -> Content -> Out [String]
+content flags (CElement elem)  = 
+  element flags elem
+content flags (CText txt) =
+  do text flags txt
+     return []
+content flags (CCode (VFrag var:c)) =
+  do outShowS $ (showChar '(' . code flags c . showChar ')')
+     return [var]
+content flags (CCode c) =
+  do outShowS $ (showChar '(' . code flags c . showChar ')')
+     return []
+content flags (CComment cc) =
+  do outShowS $ (showString "return (const () " . shows cc . showChar ')')
+     return []
+content flags (CReference txt) =
+  do text flags txt
+     return []
+content flags c = 
+  error $ "Unknown type: content -- " ++ (show c)
+
+text :: FLAGS -> Text -> Out [String]
+text flags txt =
+  do outString "CGI.rawtext"
+     when (generateBT flags) $ outMode (textMode txt)
+     outChar ' '
+     outs (textString txt)
+     return []
+
+attributes :: FLAGS -> [Attribute] -> ShowS
+attributes flags atts = 
+  f atts
+    where
+      f [] = id
+      f (att:atts) = 
+	attribute flags att .
+	showString " >> " .
+	f atts
+
+attribute :: FLAGS -> Attribute -> ShowS
+attribute flags (Attribute m n v) = 
+  showString "(CGI.attr" .
+  (if generateBT flags then (attrvalueBT m v) else id) .
+  showChar ' ' .
+  shows n . 
+  showString " " .
+  attrvalue v .
+  showString ")"
+attribute flags (AttrPattern pat) =
+  showString "( " .
+  showString pat .
+  showString " )"
+attribute flags a = error $ "Unknown type: attribute -- " ++ (show a)
+
+attrvalue :: AttrValue -> ShowS
+attrvalue (AText t) = 
+  shows t
+attrvalue (ACode c) =
+  showString "( " .
+  showString c .
+  showString " )"
+attrvalue a = error $ "Unknown type: attrvalue -- " ++ (show a)
+
+raw_attrvalue :: AttrValue -> String
+raw_attrvalue (AText t) = t
+raw_attrvalue (ACode c) = c
+raw_attrvalue a = error $ "Unknown type: raw_attrvalue -- " ++ show a
+
+attrvalueBT :: Mode -> AttrValue -> ShowS
+attrvalueBT V _ = id
+attrvalueBT m (AText _) = showMode m . showChar 'S'
+attrvalueBT m (ACode _) = showMode m . showChar 'D'
+attrvalueBT m a = error $ "Unknown type: attrvalueBT -- " ++ (show a)
+
+getAttribute :: [Attribute] -> String -> String
+getAttribute [] atname = ""
+getAttribute (Attribute m n v : rest) atname 
+  | n == atname = raw_attrvalue v
+  | otherwise   = getAttribute rest atname
+getAttribute (_ : rest) atname =
+  getAttribute rest atname
+
+removeAttributes :: (String -> Bool) -> [Attribute] -> [Attribute]
+removeAttributes p = 
+  filter g
+  where
+    g (Attribute m n v) = not (p n)
+    g (AttrPattern _) = True
+
+getTextualContent :: [Content] -> String
+getTextualContent = concatMap g
+  where
+  g (CElement _)  = "" 
+  g (CText txt) = textString txt
+  g (CCode _) = ""
+  g (CComment _) = ""
+  g (CReference txt) = textString txt
+
+getTextualContentAsStringExpression :: [Content] -> String
+getTextualContentAsStringExpression = 
+  wrap . foldrx h z . map g
+  where
+  foldrx a b [] = b
+  foldrx a b xs = foldr1 a xs
+  z = "\"\""
+  h e1 e2 = e1 ++ " ++ " ++ e2
+  g (CElement _)  = z
+  g (CText txt) = show (textString txt)
+  g (CCode ccode) = getCodeFragsAsStringExpression ccode
+  g (CComment _) = z
+  g (CReference txt) = show (textString txt)
+  wrap s = '(' : s ++ ")"
+
+getCodeFragsAsStringExpression =
+  concatMap g
+  where
+  g (HFrag str) = str
+  g (EFrag element) = ""
+  g (HSFrag str) = str
+  g (CFrag conts) = ""
+  g (AFrag attrs) = ""
+  g (VFrag str) = str
diff --git a/washparser/hs/WASHFlags.hs b/washparser/hs/WASHFlags.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHFlags.hs
@@ -0,0 +1,7 @@
+module WASHFlags where
+-- 
+flags0 = FLAGS { generateBT = False }
+
+data FLAGS = FLAGS { generateBT :: Bool }
+
+
diff --git a/washparser/hs/WASHGenerator.hs b/washparser/hs/WASHGenerator.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHGenerator.hs
@@ -0,0 +1,57 @@
+module WASHGenerator (preprocess, preprocessPIPE) where {
+
+import List;
+import IO;
+
+import WASHData ;
+import Text.ParserCombinators.Parsec hiding (try) ;
+import qualified WASHParser ;
+import qualified WASHExpression ;
+import qualified WASHClean ;
+import WASHFlags ;
+
+-- import Trace;
+
+preprocess :: FLAGS -> String -> String -> String -> IO ();
+preprocess flags srcName dstName globalDefs =
+  bracket (openFile srcName ReadMode)
+    (\ srcHandle -> hClose srcHandle)
+    (\ srcHandle -> 
+       bracket (openFile dstName WriteMode)
+	 (\ dstHandle -> hClose dstHandle)
+	 (\ dstHandle -> 
+	  preprocessPIPE flags srcName srcHandle dstHandle globalDefs));
+
+
+preprocessPIPE :: FLAGS -> String -> Handle -> Handle -> String -> IO ();
+preprocessPIPE flags srcName srcHandle dstHandle globalDefs = do {
+    input <- hGetContents srcHandle;
+    let { parsing = parse WASHParser.washfile srcName input };
+    case parsing of {
+        Left error -> ioError $ userError $ show error;
+        Right washfile ->
+        hPutStrLn dstHandle (postprocess $ file flags globalDefs washfile "");
+    };
+};
+
+file :: FLAGS -> String -> [CodeFrag] -> ShowS ;
+file flags globalDefs fcode = 
+  WASHExpression.code flags (WASHClean.cleanCodeFragList fcode) .
+  showString globalDefs .
+  showString "\n"
+  ;
+
+imports ::  [String] -> String ;
+imports is = concat $ map (\m -> "import " ++ m ++ ";\n") is ;
+
+postprocess :: String -> String ;
+postprocess = unlines . postprocess' . lines ;
+
+postprocess' :: [String] -> [String] ;
+postprocess' [] = [] ;
+postprocess' xs'@(x:xs) = 
+  if "import" `isPrefixOf` x
+  then "import qualified WASH.CGI.CGI as CGI" : xs'
+  else x : postprocess' xs ;
+
+}
diff --git a/washparser/hs/WASHMain.hs b/washparser/hs/WASHMain.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHMain.hs
@@ -0,0 +1,43 @@
+module Main where
+
+-- ghc --make WASHMain -package text -o WASHMain
+
+import Directory
+import IO
+import List
+import System
+import WASHGenerator
+import WASHFlags
+
+main =
+  do args <- getArgs
+     runPreprocessor flags0 args
+
+runPreprocessor flags [washfile] =
+  do fileExists <- doesFileExist washfile
+     if ".wash" `isSuffixOf` washfile 
+	then
+	preprocess flags washfile (take (length washfile - 5) washfile ++ ".hs") ""
+	else if fileExists
+	then
+	bracket (openFile washfile ReadMode)
+	  hClose
+	  (\ inhandle -> preprocessPIPE flags washfile inhandle stdout "")
+	else
+	preprocess flags
+             (washfile ++ ".wash")
+	     (washfile ++ ".hs")
+	     ""
+runPreprocessor flags [washfile, hsfile] =
+  preprocess flags (washfile) (hsfile) ""
+runPreprocessor flags [originalFile, washfile, hsfile] =
+  preprocess flags (washfile) (hsfile) ""
+runPreprocessor flags [] =
+  preprocessPIPE flags "<stdin>" stdin stdout ""
+runPreprocessor flags args =
+  do progName <- getProgName
+     hPutStrLn stderr ("Usage: " ++ progName ++ " washfile [hsfile]")
+     hPutStrLn stderr ("   or: " ++ progName ++ " originalFile infile outfile")
+     hPutStrLn stderr ("   or: " ++ progName)
+     hPutStrLn stderr ("       to run as pipe processor")
+     hPutStrLn stderr ("Actual arguments: " ++ show args)
diff --git a/washparser/hs/WASHOut.hs b/washparser/hs/WASHOut.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHOut.hs
@@ -0,0 +1,30 @@
+module WASHOut where
+
+-- output monad
+
+data Out a = Out a ShowS
+
+instance Monad Out where
+  return a = Out a id
+  m >>= f  = case m of
+	       Out x shw1 ->
+		 case f x of
+                   Out y shw2 ->
+		     Out y (shw1 . shw2)
+
+runOut :: Out a -> ShowS
+runOut (Out a shw) = shw
+
+wrapper = (Out () .)
+
+outString :: String -> Out ()
+outString = wrapper showString
+
+outChar :: Char -> Out ()
+outChar = wrapper showChar
+
+outs :: Show a => a -> Out ()
+outs = wrapper shows
+
+outShowS :: ShowS -> Out ()
+outShowS = Out ()
diff --git a/washparser/hs/WASHParser.hs b/washparser/hs/WASHParser.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHParser.hs
@@ -0,0 +1,624 @@
+module WASHParser ( xmlfile, washfile ) where {
+
+import Char ;
+import Text.ParserCombinators.Parsec hiding (letter) ;
+import WASHData;
+import WASHUtil;
+
+
+notImplemented what = char '\xff' >> return undefined 
+    <?> (what ++ " isn't implemented yet");
+
+f <$> p = do { x <- p; return $ f x; };
+
+testParser p s = 
+    case parse (do { x <- p; eof; return x; }) "bla" s of {
+        Left x -> print x;
+        Right y -> print y;
+    };
+
+washfile :: Parser [CodeFrag] ;
+washfile = 
+  do code <- hBody
+     eof
+     return $ code
+  ;
+
+setMode :: Bool -> Mode ;
+setMode toplevel = if toplevel then S else F ;
+
+-- The numbers given for each parser identify the section and
+-- grammar production within the XML 1.0 definition (W3C 
+-- REC-xml-19980210).
+
+
+-- 2.1 / 1
+xmlfile :: Parser File;
+xmlfile = do { 
+    prolog;
+    code <- option [] (do {
+        hs <- haskell;
+        s0;
+        return hs
+    });
+    elem <- element True;
+    many misc;
+    eof;
+    return $ File { fcode = code, topElem = elem };
+};
+
+
+-- 2.2 / 2
+char' = (char '\t' <|> char '\n' <|> char '\r' <|> 
+    satisfy (>= ' ')) <?> "character";
+
+
+-- 2.3 / 3
+s = (try $ many1 (char ' ' <|> char '\t' <|> 
+    char '\r' <|> char '\n')) <?> "whitespace";
+s0 = option "" s;
+{-
+s0 = (try $ many (char ' ' <|> char '\t' <|> 
+    char '\r' <|> char '\n')) <?> "optional whitespace";
+-}
+
+-- 2.3 / 4
+nameChar = letter <|> digit <|> char '.' <|> char '-' <|> 
+    char '_' <|> char ':' <|> combiningChar <|> extender;
+
+
+-- 2.3 / 5
+name :: Parser String;
+name = do {
+    c <- letter <|> char '_' <|> char ':';
+    cs <- many nameChar;
+    return $ c:cs;
+} <?> "name";
+
+
+-- 2.3 / 6
+names :: Parser [String];
+names = sepBy1 name s;
+
+
+-- 2.3 / 7
+nmtoken :: Parser String;
+nmtoken = many1 nameChar <?> "nmtoken";
+
+
+-- 2.3 / 8
+nmtokens :: Parser [String];
+nmtokens = sepBy1 name s;
+
+
+-- 2.3 / 10
+attValue :: Parser AttrValue;
+attValue = (((AText . concat) <$> (
+        between (char '\"') (char '\"') (many (p '\"')) 
+    <|> between (char '\'') (char '\'') (many (p '\'')) ))
+    <|> ACode <$> haskellAttr) <?> "attvalue"
+where {
+    p end = (\x -> [x]) <$> satisfy (f end) <|> reference;
+    f end = \c -> c /= '<' && c /= '&' && c /= end;
+};
+
+-- 2.3 / 11
+systemLiteral = do{
+  char '\'';
+  sl <- many (satisfy (\c -> c /= '\''));
+  char '\'';
+  return sl;
+} <|> do{
+  char '\"';
+  sl <- many (satisfy (\c -> c /= '\"'));
+  char '\"';
+  return sl;
+};
+
+-- 2.3 / 12
+pubidLiteral = do {
+  char '\'';
+  sl <- many (pubidChar False);
+  char '\'';
+  return sl;
+} <|> do{
+  char '\"';
+  sl <- many (pubidChar True);
+  char '\"';
+  return sl;
+};
+
+-- 2.3 / 13
+pubidChar w = satisfy (\c -> c >= 'A' && c <= 'Z' 
+		          || c >= 'a' && c <= 'z'
+			  || c >= '0' && c <= '9'
+			  || c `elem` " \n\r-()+,./:=?;!*#@$_%"
+			  || w && c == '\'');
+
+-- 2.4 / 14
+charData :: Bool -> Parser Text;
+charData toplevel =
+  do { s <- many1 charData'; return $ Text (setMode toplevel) $ concat s; }
+  <?> "#PCDATA";
+
+charData' :: Parser String;
+charData' = do {
+    c <- satisfy f;
+    return [c];
+} <|> do {
+    string "]]";
+    c <- satisfy (\c -> f c && c /= '>');
+    return $ ']':']':[c];
+}
+where { 
+    f c = c /= '<' && c /= '&' && c /= ']';
+};
+
+
+-- 2.5 / 15
+comment :: Parser String;
+comment = do {
+    try $ string "<!--";
+    comment';
+} <?> "comment";
+
+comment' = 
+    (do {
+        c <- charInComment;
+        cs <- comment';
+        return $ c:cs; 
+    }) <|>
+    (do { 
+        char '-';
+        (do {
+            try $ string "->";
+            return "";
+        }) <|>
+        (do {
+            c <- charInComment;
+            cs <- comment';
+            return $ c:cs;
+        });
+    });
+
+charInComment = 
+   (char '\t' <|> char '\n' <|> char '\r' <|> 
+   satisfy (\c -> c >= ' ' && c /= '-')) <?> "character";
+
+
+-- 2.6 / 16
+pI = notImplemented "processing instruction" >> return "";
+
+
+-- 2.7 / 18
+cdSect = notImplemented "cdsect" >> return "";
+
+
+-- 2.8 / 22
+prolog = do {
+    option ("UTF-8", False) xmlDecl;
+    many misc;
+    option [[]] (docTypeDecl >> many misc);
+    return ();
+};
+
+
+-- 2.8 / 23
+xmlDecl = do {
+  try $ string "<?xml" ;
+  versionInfo ;
+  enc <- option [] encodingDecl ;
+  sdd <- option False sDDecl ;
+  s0;
+  string "?>" ;
+  return (enc, sdd)
+};
+
+-- 2.7 / 24
+versionInfo = do {
+  s ;
+  string "version";
+  eq ;
+  ( do {char '\"'; versionNum; char '\"' } <|>
+    do {char '\''; versionNum; char '\'' } );
+};
+
+-- 2.8 / 25
+eq = do { s0; char '='; s0; };
+
+-- 2.8 / 26
+versionNum = string "1.0" ;
+
+-- 2.8 / 27
+misc = comment <|> pI <|> s;
+
+
+-- 2.8 / 28
+-- [28] doctypedecl ::=
+--        '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'
+docTypeDecl = do{
+  try $ string "<!DOCTYPE";
+  s;
+  name;
+  option [] (do {s; externalID;});
+  s0;
+  option [] (do {char '[';intSubset; char ']'; s0; });
+  char '>';
+};
+
+-- 2.8 / 28b
+-- [28b]    intSubset    ::=    (markupdecl | DeclSep)*
+intSubset = notImplemented "intSubset";
+
+-- 2.9 / 32
+sDDecl = do {
+  s;
+  string "standalone";
+  eq;
+  ( do {char '\"'; x <- yesNo; char '\"'; return x; } <|>
+    do {char '\''; x <- yesNo; char '\''; return x; } ) ;
+};
+
+yesNo = do {string "yes"; return True;} <|> do {string "no" ; return False;};
+
+-- 3 / 39, 3.1 / 40, 3.1 / 42, 3.1 / 44
+element :: Bool -> Parser Element;
+element toplevel = do {
+    name <- try $ do { char '<'; name };
+    attrs <- attributes False;
+    (do {
+        char '>';
+        content <- content False;
+        try $ do { string "</"; string name; s0; char '>'; };
+        return $ Element (setMode toplevel) name attrs content False;
+    }) <|>
+    (do {
+        try $ string "/>";
+        return $ Element (setMode toplevel) name attrs [] True;
+    })
+} <|> do {
+    try $ do { string "<%@" };
+    s;
+    string "include";
+    s;
+    AText filename <- attValue;
+    s;
+    subs <- substitutions;
+    string "%>";
+    let { str = openFile filename; } ;
+    return $ 
+      case parse xmlfile filename str of {
+	Left err ->
+	  Element (setMode toplevel) "include-failed" 
+		  [Attribute (setMode toplevel) "file" (AText filename)]
+		  [CText (Text (setMode toplevel) (show err))]
+		  True;
+	Right file ->
+	  topElem file;
+	}
+} <?> "element";
+
+attributes :: Bool -> Parser [Attribute];
+attributes toplevel = do { s; attributes' toplevel; } <|> return [];
+
+attributes' :: Bool -> Parser [Attribute];
+attributes' toplevel = do { a <- attribute toplevel;
+			    as <- attributes toplevel;
+			    return (a:as);
+			  }
+		       <|> return [];
+
+-- 3.1 / 41
+attribute :: Bool -> Parser Attribute;
+attribute toplevel = try (
+  do { string "<%" ;
+       pat <- hCode ;
+       string "%>" ;
+       return $ AttrPattern pat ;
+    }
+<|> 
+  do {
+    name <- name;
+    eq;
+    value <- attValue;
+    return $ Attribute (setMode toplevel) name value;
+  }
+) <?> "attribute";
+
+
+-- 3.1 / 43
+content :: Bool -> Parser [Content];
+content toplevel = many (
+        (element toplevel  >>= (return . CElement))
+    <|> (charData toplevel  >>= (return . CText))
+    <|> (haskellText>>= (return . CCode))
+    <|> (haskell   >>= (return . CCode))
+    <|> (reference >>= (return . CReference . Text (setMode toplevel)))
+    <|> (cdSect    >>  (return undefined))
+    <|> (pI        >>= (return . CPI))
+    <|> (comment   >>= (return . CComment))
+);
+
+
+-- 4.1 / 66, 4.1 / 68
+reference = do {
+    char '&';
+    r <- (do { 
+        char '#';
+        r <- many1 digit <|> 
+            do { char 'x'; r <- many1 hexDigit; return $ 'x':r; };
+        return $ '#':r;
+    }) <|> name;
+    char ';';
+    return $ "&" ++ r ++ ";";
+} <?> "reference";
+
+-- 4.2.2 / 75
+-- [75]    ExternalID    ::=    'SYSTEM' S SystemLiteral
+--                            | 'PUBLIC' S PubidLiteral S SystemLiteral
+externalID = do{
+  string "SYSTEM";
+  s;
+  systemLiteral;
+} <|>
+do {
+  string "PUBLIC";
+  s;
+  pubidLiteral;
+  s;
+  systemLiteral;
+};
+
+-- 4.3 / 80
+encodingDecl = do {
+  s;
+  string "encoding";
+  eq;
+  ( do {char '\"'; x <- encName; char '\"'; return x;} <|>
+    do {char '\''; x <- encName; char '\''; return x;});
+};
+
+-- 4.3 / 81
+-- [81]    EncName    ::=    [A-Za-z] ([A-Za-z0-9._] | '-')*
+encName = do {
+  c <- satisfy (\c -> c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') ;
+  cs <- many (satisfy (\c -> c >= 'A' && c <= 'Z' 
+		          || c >= 'a' && c <= 'z'
+			  || c >= '0' && c <= '9'
+			  || c `elem` "._-"));
+  return (c:cs)
+};
+
+-- B / 84
+letter = baseChar <|> ideographic;
+
+-- B / 85
+baseChar = 
+    satisfy (\c -> 
+        (c >= '\x41' && c <= '\x5a') || 
+        (c >= '\x61' && c <= '\x7a') || 
+        (c >= '\xc0' && c <= '\xd6') || 
+        (c >= '\xd8' && c <= '\xf6') || 
+        (c >= '\xf8' && c <= '\xff')); -- and some Unicode characters
+
+-- B / 86
+ideographic = notImplemented "ideographic";
+
+-- B / 87
+combiningChar = notImplemented "combiningChar";
+
+-- B / 88
+--digit = digit; -- and some Unicode characters
+
+-- B / 89
+extender = char '\xb7'; -- and some Unicode characters
+
+
+haskell :: Parser [CodeFrag];
+haskell = do {
+    try $ string "<%";
+    frags <- hStmt <|> hBody;
+    try $ string "%>";
+    return frags;
+};
+
+-- Haskell comment to end of line
+-- see chapter 2.2 of report
+hLineComment = do {
+    ds <- try $ do { char '-';
+		     ds <- many1 (char '-');
+		     notFollowedBy (oneOf hAscSymbolString);
+		     return ('-':ds);
+		   };
+    rest <- many (noneOf "\r\n\f");
+    nl <- hNewline;
+    return (ds ++ rest ++ nl);
+};
+
+hAscSymbolString = "!#$%&*+./<=>?@\\^|~";
+
+hNewline = 
+  try (string "\r\n")
+  <|> string "\r"
+  <|> string "\n"
+  <|> string "\f"
+;
+
+hNestedComment = do {
+    let {stuff = "{-";};
+    try (string stuff);
+    hCommentContinuation stuff;
+};
+
+hCommentContinuation stuff = do {
+    b <- many (noneOf "-{");
+    let {moreStuff = stuff ++ b;};
+    hCommentMinus moreStuff <|> hTryNestedComment moreStuff ;
+};
+
+hTryNestedComment stuff = do {
+    nestedStuff <- hNestedComment;
+    hCommentContinuation (stuff ++ nestedStuff);
+} <|> do {
+    char '{';
+    hCommentContinuation (stuff ++ "{");
+};
+
+hCommentMinus stuff = do {
+    char '-';
+    let {moreStuff = stuff ++ "-";};
+    hCommentClosing moreStuff <|> hCommentContinuation moreStuff;
+};
+
+hCommentClosing stuff = do {
+    char '}';
+    return (stuff++"}");
+};
+
+hIdentChar = letter <|> digit <|> char '\'' <|> char '_';
+
+hStmt :: Parser [CodeFrag];
+hStmt = do {
+    var <- try $ do { s0 ;
+		      v0 <- letter ;
+		      vr <- many hIdentChar ;
+		      s0 ;
+		      string "<-" ;
+		      return (v0:vr)
+		    };
+    body <- hBody ;
+    return (VFrag var : body)
+};
+
+hBody :: Parser [CodeFrag];
+hBody = many (
+            (hCode >>= (return . HFrag))
+        <|> (element True >>= (return . EFrag))
+        <|> (nakedAttributes >>= (return . AFrag))
+        <|> (nakedContent >>= (return . CFrag))
+    );
+
+nakedAttributes = do {
+    s0 ;
+    try $ string "<[" ;
+    s0 ;
+    attrs <- attributes' True ;
+    try $ string "]>" ;
+    return attrs;
+};
+
+nakedContent = do {
+    try $ string "<#>" ;
+    cnts <- content True ;
+    try $ string "</#>";
+    return cnts;
+};
+
+haskellAttr :: Parser String;
+haskellAttr = haskellUnnested "<%";
+
+haskellText :: Parser [CodeFrag];
+haskellText = do {
+  str <- haskellUnnested "<%=";
+  return [HFrag "showText(", HFrag str, HFrag ")"]
+};
+
+haskellUnnested :: String -> Parser String;
+haskellUnnested start = do {
+    try $ string start;
+    code <- hCode;
+    try $ string "%>";
+    return code;
+} <?> "haskell code";
+
+hCode = try $ do { sp <- getPosition;
+		   str <- hcode' '%' (not . (`elem` "#[%"));
+		   return (reindent sp str);
+		 };
+hPatt = try $ hcode' '#' (const True);
+
+reindent :: SourcePos -> String -> String;
+reindent sp = 
+  showString "\n{-# LINE " .
+  shows (sourceLine sp) .
+  showChar ' ' .
+  shows (sourceName sp) .
+  showString " #-}" .
+  reindent' (sourceColumn sp - 1) ;
+reindent' 0 = showChar '\n' ;
+reindent' n = reindent' (n-1) . showChar ' ' ;
+
+hSinglePatt = try $ do {
+    s0 ;
+    char '[' ;
+    id <- name ;
+    char ']' ;
+    s0 ;
+    return id ;
+} ;
+    
+
+hcode' escChar patC = 
+  let stopChars = escChar : "<\"'{-" in
+  do { 
+    t <- many1 $ (  hcNorm stopChars
+                <|> hcString
+		<|> hcChar
+		<|> hcLineComment
+		<|> hcNestedComment
+                <|> hcIsTag patC
+                <|> hcIsEnd escChar ) ;
+    return $ concat t
+};
+
+hcNorm stopChars = try . many1 $ noneOf stopChars;
+
+hcLineComment =
+  hLineComment <|> many1 (char '-');
+
+hcNestedComment =
+  hNestedComment <|> string "{";
+
+-- only an approximation...
+hcChar = do {
+    char '\'' ;
+    (try $ do { c <- noneOf "'\\" ;
+	       char '\'' ;
+	       return ['\'', c, '\''] ;
+    }) <|> (try $ do {char '\\' ;
+		    x <- satisfy (not . isSpace) ;
+		    rest <- many (noneOf "'") ;
+		    char '\'' ;
+		    return ("'\\" ++ (x:rest) ++ "\'") ;})
+    <|> return "\'";
+};
+
+hcString = try $ do {
+    char '\"' ;
+    strs <- many ((many1 $ noneOf "\"\\")
+              <|> (char '\\' >> (
+		   (do x <- satisfy (not . isSpace)
+		       return ['\\',x])
+ 	       <|> (do xs <- many1 $ satisfy isSpace
+		       char '\\'
+		       return ('\\' : xs ++ "\\"))))) ;
+    char '\"' ;
+    return ('\"' : concat strs ++ "\"")
+};
+
+hcIsTag patC = try $ do { 
+    char '<' ;
+    t <- satisfy (\c -> (not.isAlpha $ c) && patC c) ;
+    return ('<':t:[]) ;
+};
+
+hcIsEnd escChar = try $ do { 
+    char escChar ;
+    t <- satisfy (/='>') ;
+    return (escChar:t:[]) ;
+};
+
+-- experimental
+substitutions = return [];
+
+}
diff --git a/washparser/hs/WASHUtil.hs b/washparser/hs/WASHUtil.hs
new file mode 100644
--- /dev/null
+++ b/washparser/hs/WASHUtil.hs
@@ -0,0 +1,82 @@
+module WASHUtil 
+    ( normalize
+    , outList
+    , itemList
+    , openFile
+    ) where {
+
+import System.IO.Unsafe ;
+import WASHData ;
+
+itemList :: (item -> ShowS) -> String -> String -> [item] -> ShowS ;
+itemList showsItem empty glue items =
+  f items 
+  where { f []     = showString empty ;
+	  f [item] = showsItem item ;
+	  f (item:items) = showsItem item . showString glue . f items ;
+	};
+
+
+normalize :: [Content] -> [Content] ;
+normalize xs = shortContent.dropEmpty $ xs ;
+
+dropEmpty :: [Content] -> [Content] ;
+dropEmpty [] = [] ;
+dropEmpty (c:cs) = if isWhite c 
+                   then dropEmpty cs 
+                   else c:(dropEmpty cs);
+
+isWhite :: Content -> Bool ;
+isWhite (CText txt) = and $ map isWhite' (textString txt)
+    where { isWhite' c =  c == ' '
+                       || c == '\n'
+                       || c == '\t'
+                       || c == '\r' ;
+    } ;
+isWhite _ = False;
+
+hasText :: Content -> Bool;
+hasText (CText {}) = True ;
+hasText (CReference {}) = True ;
+hasText _ = False ;
+
+textOf :: Content -> Text;
+textOf (CText t) = t;
+textOf (CReference t) = t;
+textOf c = error ("textOf " ++ show c);
+
+joinable :: Text -> Text -> Bool;
+joinable t1 t2 = g (textMode t1) (textMode t2)
+  where { g S F = True;
+	  g S S = False;
+	  g F F = True;
+	  g V V = True;
+	  g _ _ = False;
+	};
+
+joinText :: Text -> Text -> Text;
+joinText t1 t2 = Text (textMode t1) (textString t1 ++ textString t2);
+
+shortContent :: [Content] -> [Content] ;
+shortContent [] = [] ;
+shortContent (CPI pi:cs) = shortContent cs ;
+shortContent (CComment c:cs) = shortContent cs ;
+shortContent (c1:c2:cs) | hasText c1 && hasText c2 =
+	     let { t1 = textOf c1 ; t2 = textOf c2 } in
+	     if joinable t1 t2 then shortContent (CText (joinText t1 t2):cs)
+			       else c1:shortContent (c2:cs);
+shortContent (c:cs) = c:shortContent cs ;
+
+outList :: [String] -> String ;
+outList xs = "[" ++ (outList' $ filter (/= []) xs) ++ "]" ;
+
+outList' ([])     = "" ;
+outList' (x:y:[]) = x ++ ", " ++ y ;
+outList' (x:y:xs) = x ++ ", " ++ outList' (y:xs) ;
+outList' (x:[])   = x ;
+outList' _        = error "ERROR: in processing showList" ;
+
+openFile :: String -> String ;
+openFile fname = unsafePerformIO (readFile fname) ;
+
+}
