packages feed

bidirectionalization-combined (empty) → 0.1

raw patch · 23 files changed

+3445/−0 lines, 23 filesdep +basedep +bytestringdep +cgisetup-changed

Dependencies added: base, bytestring, cgi, containers, directory, hint, mtl, parsec, pretty, template-haskell, unix, utf8-string, xhtml

Files

+ AST.hs view
@@ -0,0 +1,319 @@+module AST where ++import Util +import Text.PrettyPrint+import Data.List (groupBy)++import Debug.Trace +import Control.Monad.State++data AST = AST [ Decl ]++instance Ppr AST where+    ppr (AST ds) = +        let dss = groupBy isSameFunc ds+        in vcat $ punctuate (text "\n") $ map pprDecls dss +        where +          pprDecls (d:ds) =+              ppr d $$ pprDeclsSimp ds +          pprDeclsSimp ds+              = vcat $ map (\(Decl f _ ps e) -> ppr (Decl f FTUndet ps e)) ds++instance Show AST where +    show = show . ppr ++data Name +    = Name     String +    | IName    String [Int]+    | NCmpl    Name +    | NTuple   Name +    | NTupleV  Int      -- Variable Introduced by Tupling +    | NTupleVC Int      -- Variable Introduced by Tupling +    | NBwd     Name+    | NInv     Name +    | NCConF   Name     -- Constructor Name in Complement (1)+    | NCConE   Int      -- Constructor Name in Complement (2)+    | NCConU   Name Int -- After Renaming  +          deriving (Eq,Ord)++instance Ppr Name where+    ppr  (Name s) = text s+    ppr  (IName s is) = text s <> text "_" <> +                        (hcat $ punctuate (text "_") $ map ppr is)+    ppr  (NCmpl n)  = ppr n <> text "_Cmpl" +    ppr  (NTuple n) = ppr n <> text "_T"  +    ppr  (NTupleV i)  = text "tv" <> ppr i+    ppr  (NTupleVC i) = text "tc" <> ppr i+    ppr  (NInv n)     = ppr n <> text "_I" +    ppr  (NBwd n)     = ppr n <> text "_B"+    ppr  (NCConF n)   = text "C" <> ppr n+    ppr  (NCConE i)   = text "C" <> ppr i +    ppr  (NCConU n i) = text "C" <> ppr n <> text "_" <> ppr i++instance Show Name where+    show = show . ppr ++data Decl = Decl Name FType [Pat] Exp++instance Ppr Decl where+    ppr (Decl fname ftype ps e) = +        addSig (ppr fname <+> +                    (hsep $ map pprChildP ps) $$+--                     parens (hsep $ punctuate comma (map ppr ps)) $$+                     nest 4 (text "=") $$+                     nest 6 (ppr e))+        where +          addSig d = +              case ftype of+                FTUndet -> empty <> d+                _       -> ppr fname <+> text "::" <+> ppr ftype $$ d            +instance Show Decl where+    show = show . ppr ++data Exp  = EVar ID Type Name +          | EFun ID Type Name [Exp] -- Exp must be variable (treeless)+          | ECon ID Type Name [Exp]+       deriving (Ord,Eq)++type ID = Maybe Int++addPprType t d = +    case t of +      TUndet -> d+      _      -> parens ( d <> text "::" <> ppr t )+++pprChildE e | isAtomicE e = ppr e +            | otherwise   = parens (ppr e)+isAtomicE (EVar _ _ _)     = True+isAtomicE (EFun _ _ _ [])  = True+isAtomicE (ECon _ _ _ [])  = True+isAtomicE e | isAllListE e = True +isAtomicE _                = False++pprListE (ECon _ _ (Name "Cons") [e1,ECon _ _ (Name "Nil") []]) +    = ppr e1 +pprListE (ECon _ _ (Name "Cons") [e1,e2]) +    = ppr e1 <> comma <+> pprListE e2 +pprListE (ECon _ _ (Name "Nil") []) +    = empty++isAllListE (ECon _ _ (Name "Cons") [e1,e2])+    = isAllListE e2 +isAllListE (ECon _ _ (Name "Nil") []) +    = True+isAllListE _ +    = False ++instance Ppr Exp where+    ppr (EVar _ t vname)     +        = addPprType t (ppr vname)+    ppr (EFun _ t fname es) +        = addPprType t $+            ppr fname <+>+                (hsep $ map pprChildE es)+--            parens (sep $ punctuate comma (map ppr es))          +    ppr e | isAllListE e+        = brackets (pprListE e )+    ppr (ECon _ _ (Name "Cons") [e1,e2]) +        = pprChildE e1 <> text ":" <> ppr e2 +    ppr (ECon _ _ (Name "Unit") []) +        = parens empty +    ppr (ECon _ t cname []) +        = addPprType t $ ppr cname +    ppr (ECon _ t cname es)+        = addPprType t $ +             ppr cname <+>+                 (hsep $ map pprChildE es)+--             parens (sep $ punctuate comma (map ppr es))+++instance Show Exp where+    show = show . ppr ++data Pat  = PVar ID Type Name+          | PCon ID Type Name [Pat] +       deriving (Ord,Eq)+++pprChildP p | isAtomicP p = ppr p+            | otherwise   = parens (ppr p)+isAtomicP (PVar _ _ _)     = True+isAtomicP (PCon _ _ _ [])  = True+isAtomicP p | isAllListP p = True+isAtomicP _                = False++pprListP (PCon _ _ (Name "Cons") [p1, PCon _ _ (Name "Nil") []])+    = ppr p1+pprListP (PCon _ _ (Name "Cons") [p1,p2]) +    = ppr p1 <> comma <+> pprListP p2 +pprListP (PCon _ _ (Name "Nil") []) +    = empty++isAllListP (PCon _ _ (Name "Cons") [p1,p2])+    = isAllListP p2 +isAllListP (PCon _ _ (Name "Nil") []) +    = True+isAllListP _ +    = False +++instance Ppr Pat where+    ppr (PVar _ t vname)     +        = addPprType t (ppr vname)+    ppr e | isAllListP e+        = brackets (pprListP e )+    ppr (PCon _ _ (Name "Cons") [p1,p2]) +        = pprChildP p1 <> text ":" <> ppr p2 +    ppr (PCon _ _ (Name "Unit") []) -- never happens +        = parens empty +    ppr (PCon _ t cname [])+        = addPprType t (ppr cname)+    ppr (PCon _ t cname ps)+        = addPprType t $ ppr cname +           <+> (hsep $ map pprChildP ps)+--           <> parens (sep $ punctuate comma (map ppr ps))+          +instance Show Pat where+    show = show . ppr ++data FType +    = TFun [Int] [Type] Type -- Quantified Vars, Input Types, Output Type.+      -- e.g. forall a. [a] -> a +      --      ==> TFun [TVar 1] [ TCon "[]" [TVar 1] ] (TVar 1)+    | FTUndet+      deriving (Eq,Ord)++instance Ppr FType where+    ppr (FTUndet) = text "??"+    ppr (TFun is ts t) =+        (case is of +          [] -> empty +          _  -> text "forall" <+>+                hsep (map pprTV is) <>+                text ".")+         <+> argType <+>+             ppr t +        where+          argType = +              case ts of +                []  -> empty +                [t] -> ppr t <+> text "->" +                _   -> +                    parens (sep $ punctuate comma (map ppr ts)) +                               <+> text "->"+          pprTV i = text ("t" ++ show i)+             +instance Show FType where+    show = show . ppr ++data Type = TUndet           -- PlaceHolder+          | TVar Int         -- Type Variable+          | TCon Name [Type] -- e.g. [Int], Map Int [Char]+            deriving (Eq,Ord)+            +instance Ppr Type where+    ppr (TUndet)        = text "?"+    ppr (TVar i)        = text ("t" ++ show i) +    ppr (TCon (Name "Unit") []) =+        parens empty +    ppr (TCon (Name "List") [t]) = +        brackets $ ppr t+    ppr (TCon tname ts) =+        ppr tname <+> +             hsep (map (\t -> f t (ppr t)) ts)+        where+          f (TUndet) x = x+          f (TVar i) x = x +          f (TCon tname []) x = x+          f _ x = parens x+instance Show Type where +    show = show . ppr ++++typeofP (PVar _ t _)   = t +typeofP (PCon _ t _ _) = t +typeofE (EVar _ t _)   = t +typeofE (ECon _ t _ _) = t+typeofE (EFun _ t _ _) = t +++idofP (PVar t _ _)   = t +idofP (PCon t _ _ _) = t +idofE (EVar t _ _)   = t +idofE (ECon t _ _ _) = t+idofE (EFun t _ _ _) = t ++varsP p = snub $ vp p+    where vp (PVar _ _ x)    = [x]+          vp (PCon _ _ _ ps) = concatMap vp ps+varsE e = snub $ ve e +    where ve (EVar _ _ x)    = [x]+          ve (ECon _ _ _ es) = concatMap ve es+          ve (EFun _ _ _ es) = concatMap ve es+++-- assignIDsAST :: AST -> AST+assignIDsAST (AST decls) = +    AST $ evalState (mapM assignIDsD decls) 10++assignIDsD :: Decl -> State Int (Decl) +assignIDsD (Decl f t ps e) = +    do { ps' <- mapM assignIDsP ps +       ; e   <- assignIDsE e +       ; return $ Decl f t ps e }+    where+      uniq = do { i <- get; put (i+1) ; return $ Just (i+1) }+      assignIDsE (EVar _ t x) = +          do { i <- uniq+             ; return $ EVar i t x }+      assignIDsE (ECon _ t c es) = +          do { i <- uniq +             ; es' <- mapM assignIDsE es+             ; return $ ECon i t c es' }+      assignIDsE (EFun _ t f es) = +          do { i <- uniq +             ; es' <- mapM assignIDsE es+             ; return $ EFun i t f es' }++      assignIDsP (PVar _ t x) =+          do { i <- uniq+             ; return $ PVar i t x }+      assignIDsP (PCon _ t c ps) = +          do { i <- uniq+             ; ps' <- mapM assignIDsP ps +             ; return $ PCon i t c ps' }++isSameFunc (Decl f _ _ _) (Decl g _ _ _) = f == g +++-- After Tupling++data TAST  = TAST [TDecl]+data TDecl = TDecl Name [Pat] [Exp] [VDecl] -- f(ps) = es where ... +data VDecl = VDecl [Name] Name [Name]          -- vs = f(us)++parensIfMultiple []  = parens empty +parensIfMultiple [p] = p+parensIfMultiple ps  = parens (hsep $ punctuate comma ps)++instance Ppr TAST where +    ppr (TAST tdecls) = +        let tdeclss = groupBy (\(TDecl f _ _ _) (TDecl g _ _ _) -> f == g) tdecls +        in vcat $ punctuate (text "\n") $ map (\tdecls -> vcat $ map ppr tdecls) tdeclss+++instance Ppr TDecl where+    ppr (TDecl f ps es vdecls) =+        ppr f <+> parensIfMultiple (map ppr ps) $$+            nest 4 (text "=" <+> parensIfMultiple (map ppr es)) $$+            if null vdecls then +                empty +            else +                (nest 6 (text "where") $$+                 nest 8 (vcat $ map ppr vdecls))+instance Ppr VDecl where+    ppr (VDecl vs f us) = parensIfMultiple (map ppr vs)+                          <+> text "=" <+> ppr f <>+                          parensIfMultiple (map ppr us)
+ BUtil.hs view
@@ -0,0 +1,80 @@+{-# OPTIONS -XRank2Types -XCPP -XScopedTypeVariables #-}+module BUtil where++import qualified Data.IntMap as IntMap +import Control.Monad ++import System.IO.Unsafe++import Control.Exception++data Nat = S Nat | Z deriving (Eq)++instance Show Nat where+  show = show . fromNat++instance Num Nat where+  (+) = error "No operators defined for Nat"+  (*) = error "No operators defined for Nat"+  abs = error "No operators defined for Nat"+  signum = error "No operators defined for Nat"+  fromInteger n | n < 0  = error "Nat cannot be negative"+                | n >= 0 = toNat n++toNat x = if x == 0 then +              Z+          else +              S (toNat $ x-1)++fromNat Z     = 0+fromNat (S x) = 1 + fromNat x++fromDistinctList = IntMap.fromList ++gen_put_bias :: Bias +                -> (forall a. [a] -> [a]) +                -> (Nat -> Nat -> Maybe Nat) +                -> [a] -> [a] +                -> Maybe [Maybe a]+gen_put_bias bias get sput s v =+    do { let ls = length s  +       ; let g = fromDistinctList (zip (bias ls) s)+       ; l' <- maybe (fail "...")+                     return+                     (sput (toNat ls) (toNat (length v)))+       ; let t = bias (fromNat l')+       ; let h = fromDistinctList (zip (get t) v)+       ; let h'= IntMap.union h g +       ; return (map (flip IntMap.lookup h') t) }++withDefaultBias put bias d s v =+    do { s' <- put bias s v +       ; return (map (maybe d id) s') }++withDefault put d s v =+    do { s' <- put s v +       ; return (map (maybe d id) s') }++gen_put_dbias :: Bias -> (forall a. [a] -> [a]) +                 -> (Nat -> Nat -> Maybe Nat)+                 -> a -> [a] -> [a] -> Maybe [a]+gen_put_dbias bias get sput d s v =+    do { s' <- gen_put_bias bias get sput s v+       ; return (map (maybe d id) s') }++castError :: a -> Maybe a +castError f = unsafePerformIO $ +    do { r <- try (evaluate f)+       ; case r of+#if __GLASGOW_HASKELL__ >= 610 +           Left (e::SomeException) -> return $ Nothing +#else+           Left  e -> return $ Nothing +#endif+           Right r -> return $ Just $ r }++type Bias = Int -> [ Int ]+rear l    = [ 0 .. l - 1 ]+front l   = reverse [ 0 .. l - 1 ]+middle l  = [1,3..l] ++ (reverse [2,4..l])+borders l = (reverse [1,3..l])++[2,4..l]
+ BundledCode.hs view
@@ -0,0 +1,9 @@+{-# LANGUAGE OverloadedStrings #-}+module BundledCode where++import Data.ByteString.Lazy.Char8++bUtilCode :: ByteString+bUtilCode = "{-# OPTIONS -XRank2Types -XCPP -XScopedTypeVariables #-}\nmodule BUtil where\n\nimport qualified Data.IntMap as IntMap \nimport Control.Monad \n\nimport System.IO.Unsafe\n\nimport Control.Exception\n\ndata Nat = S Nat | Z deriving (Eq)\n\ninstance Show Nat where\n  show = show . fromNat\n\ninstance Num Nat where\n  (+) = error \"No operators defined for Nat\"\n  (*) = error \"No operators defined for Nat\"\n  abs = error \"No operators defined for Nat\"\n  signum = error \"No operators defined for Nat\"\n  fromInteger n | n < 0  = error \"Nat cannot be negative\"\n                | n >= 0 = toNat n\n\ntoNat x = if x == 0 then \n              Z\n          else \n              S (toNat $ x-1)\n\nfromNat Z     = 0\nfromNat (S x) = 1 + fromNat x\n\nfromDistinctList = IntMap.fromList \n\ngen_put_bias :: Bias \n                -> (forall a. [a] -> [a]) \n                -> (Nat -> Nat -> Maybe Nat) \n                -> [a] -> [a] \n                -> Maybe [Maybe a]\ngen_put_bias bias get sput s v =\n    do { let ls = length s  \n       ; let g = fromDistinctList (zip (bias ls) s)\n       ; l' <- maybe (fail \"...\")\n                     return\n                     (sput (toNat ls) (toNat (length v)))\n       ; let t = bias (fromNat l')\n       ; let h = fromDistinctList (zip (get t) v)\n       ; let h'= IntMap.union h g \n       ; return (map (flip IntMap.lookup h') t) }\n\nwithDefaultBias put bias d s v =\n    do { s' <- put bias s v \n       ; return (map (maybe d id) s') }\n\nwithDefault put d s v =\n    do { s' <- put s v \n       ; return (map (maybe d id) s') }\n\ngen_put_dbias :: Bias -> (forall a. [a] -> [a]) \n                 -> (Nat -> Nat -> Maybe Nat)\n                 -> a -> [a] -> [a] -> Maybe [a]\ngen_put_dbias bias get sput d s v =\n    do { s' <- gen_put_bias bias get sput s v\n       ; return (map (maybe d id) s') }\n\ncastError :: a -> Maybe a \ncastError f = unsafePerformIO $ \n    do { r <- try (evaluate f)\n       ; case r of\n#if __GLASGOW_HASKELL__ >= 610 \n           Left (e::SomeException) -> return $ Nothing \n#else\n           Left  e -> return $ Nothing \n#endif\n           Right r -> return $ Just $ r }\n\ntype Bias = Int -> [ Int ]\nrear l    = [ 0 .. l - 1 ]\nfront l   = reverse [ 0 .. l - 1 ]\nmiddle l  = [1,3..l] ++ (reverse [2,4..l])\nborders l = (reverse [1,3..l])++[2,4..l]\n"++
+ BundledCode.hsb view
@@ -0,0 +1,8 @@+{-# LANGUAGE OverloadedStrings #-}+module BundledCode where++import Data.ByteString.Lazy.Char8++bUtilCode :: ByteString+bUtilCode = %blob "BUtil.hs"+
+ CodeGen.hs view
@@ -0,0 +1,105 @@+{-# OPTIONS -XMultiParamTypeClasses -XTemplateHaskell #-}++module CodeGen where++import qualified Language.Haskell.TH as TH++import Text.PrettyPrint +import Debug.Trace+import Data.List (groupBy)++import AST+import Util++generateCodeDet :: AST -> [ TH.Dec ] +generateCodeDet = convCmpl+++generateCodeBwd :: (AST, AST, AST, TAST) -> [ TH.Dec ]+generateCodeBwd (orig, bwd, cmpl, tinv) = +    convCmpl orig ++ convBWD bwd ++ convCmpl cmpl ++ convNDet tinv ++convP (PCon _ _ (Name "Cons") [p1,p2]) = +    TH.InfixP (convP p1) (TH.mkName ":") (convP p2)+convP (PCon _ _ (Name "Nil") []) =+    TH.ListP []+convP (PCon _ _ (Name "Unit") []) =+    TH.TupP []+convP (PCon _ _ c cs) = +    TH.ConP (TH.mkName $ show c) $ map convP cs+convP (PVar _ _ v)    = TH.VarP (TH.mkName $ show v) ++returnE e     = TH.AppE (TH.VarE $ TH.mkName "return") e+mplusE  e1 e2 = TH.AppE (TH.AppE (TH.VarE $ TH.mkName "mplus") e1) e2 +mzeroE        = TH.VarE $ TH.mkName "mzero"++name :: Show a => a -> TH.Name+name  = TH.mkName . show +nameE = TH.VarE . name ++apply f es = foldl TH.AppE f es++convBWD (AST decls) = map convBWDD decls +    where+      convBWDD (Decl f _ ps e) = TH.FunD (TH.mkName $ show f)+                                 [ TH.Clause (map convP ps) (TH.NormalB $ convE e) [] ]+      convE (EFun _ _ (NInv f) [EVar _ _ v]) = +          TH.AppE (TH.VarE $ TH.mkName "head") $ +            TH.AppE (nameE (NInv f)) (nameE v)+      convE (EFun _ _ (NInv (NTuple f)) +                      [EVar _ _ v, EFun _ _ (NCmpl _) [EVar _ _ s]]) = +          TH.AppE (TH.VarE $ TH.mkName "head") $ +             apply (nameE (NInv (NTuple f))) +                       [nameE v, TH.AppE (nameE (NCmpl f)) (nameE s)]++convCmpl (AST decls) = map convCmplF $ groupBy isSameFunc decls+    where +      convCmplF (ds@(Decl f _ _ _:_)) =+          TH.FunD (name f) $ map convCmplD ds +      convCmplD (Decl _ _ ps e) = TH.Clause [TH.TupP $ map convP ps] (TH.NormalB $ convE e) []+      convE (EVar _ _ v)    = nameE v+      convE (ECon _ _ (Name "Cons") [e1,e2]) = TH.InfixE (Just $ convE e1) (TH.VarE $ TH.mkName ":") (Just $ convE e2)+      convE (ECon _ _ (Name "Nil")  [])      = TH.ListE []+      convE (ECon _ _ (Name "Unit")  [])     = TH.TupE []+      convE (ECon _ _ c es) = apply (TH.ConE (name c)) $ map convE es +      convE (EFun _ _ f es) = apply (TH.VarE (name f)) $ [TH.TupE $ map convE es ]+++convE (EVar _ _ v)    = nameE v+convE (ECon _ _ (Name "Cons") [e1,e2]) = TH.InfixE (Just $ convE e1) (TH.VarE $ TH.mkName ":") (Just $ convE e2)+convE (ECon _ _ (Name "Nil")  [])      = TH.ListE []+convE (ECon _ _ (Name "Unit") [])      = TH.TupE []+convE (ECon _ _ c es) = apply (TH.ConE (name c)) $ map convE es +convE (EFun _ _ f es) = apply (TH.VarE (name f)) $ map convE es +++convNDet (TAST tdecls) +    = concatMap convNDetF $ groupBy isSameFuncT tdecls +    where+      isSameFuncT (TDecl f _ _ _) (TDecl g _ _ _) = f == g +      vars    = [ TH.mkName $ "x"    ++ show i        | i <- [1..] ]+      funcs f = [ TH.mkName $ show f ++ "_" ++ show i | i <- [1..] ] -- name f = TH.mkName $ show f +      convNDetF (ds@(TDecl f ps _ _:_)) = -- NInj+          [ TH.FunD (name f) +            [ TH.Clause (map TH.VarP $ take (length ps) vars)+                        (TH.NormalB mpluses)+                        [] ] ]+          ++ zipWith convNDetD ds (funcs f)+          where+            mpluses = foldr mplusE mzeroE $+                        map (\f -> apply (TH.VarE f) $ map TH.VarE (take (length ps) vars) ) $+                            take (length ds) (funcs f)+      convNDetD (TDecl _ ps es vs) f =+          TH.FunD f [ TH.Clause (map convP ps)         (TH.NormalB $ convEs es vs) [],+                      TH.Clause [ TH.WildP | _ <- ps]  (TH.NormalB mzeroE) [] ]+      +      convEs es vs = TH.DoE $ (map mkBind vs) ++ [ TH.NoBindS (returnE $ TH.TupE $ map convE es) ]+          where+            mkBind (VDecl us f vs) = TH.BindS (TH.TupP $ map (TH.VarP . name) us)+                                           (apply (nameE f) $ map (TH.VarE . name) vs)+                                           +      ++instance Ppr TH.Dec where+    ppr = text . show . TH.ppr+    pprList vs = vcat $ map ppr vs 
+ JQuery.hs view
@@ -0,0 +1,9 @@+{-# LANGUAGE OverloadedStrings #-}+module JQuery where++import Data.ByteString.Lazy.Char8++jQueryCode :: ByteString+jQueryCode = "/*!\n * jQuery JavaScript Library v1.4.2\n * http://jquery.com/\n *\n * Copyright 2010, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2010, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Sat Feb 13 22:33:48 2010 -0500\n */\n(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll(\"left\")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:\"script\"}):c.globalEval(b.text||b.textContent||b.innerHTML||\"\");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b===\"object\"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?\ne(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,\"events\");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type===\"click\")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,\"\")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=\nj.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType===\"mouseenter\"||i.preType===\"mouseleave\")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return\"live.\"+(a&&a!==\"*\"?a+\".\":\"\")+b.replace(/\\./g,\"`\").replace(/ /g,\n\"&\")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]===\"string\"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=\ntrue;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return\"scrollTo\"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\\w\\W]+>)[^>]*$|^#([\\w-]+)$/,Ua=/^.[^:#\\[\\.,]*$/,Va=/\\S/,\nWa=/^(\\s|\\u00A0)+|(\\s|\\u00A0)+$/g,Xa=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a===\"body\"&&!b){this.context=s;this[0]=s.body;this.selector=\"body\";this.length=1;return this}if(typeof a===\"string\")if((d=Ta.exec(a))&&\n(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,\na)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:\"\",jquery:\"1.4.2\",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===\n\"find\")f.selector=this.selector+(this.selector?\" \":\"\")+d;else if(b)f.selector=this.selector+\".\"+b+\"(\"+d+\")\";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),\"slice\",R.call(arguments).join(\",\"))},map:function(a){return this.pushStack(c.map(this,\nfunction(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a===\"boolean\"){f=a;a=arguments[1]||{};b=2}if(typeof a!==\"object\"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||\nc.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler(\"ready\")}},bindReady:function(){if(!xa){xa=true;if(s.readyState===\"complete\")return c.ready();if(s.addEventListener){s.addEventListener(\"DOMContentLoaded\",\nL,false);A.addEventListener(\"load\",c.ready,false)}else if(s.attachEvent){s.attachEvent(\"onreadystatechange\",L);A.attachEvent(\"onload\",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)===\"[object Function]\"},isArray:function(a){return $.call(a)===\"[object Array]\"},isPlainObject:function(a){if(!a||$.call(a)!==\"[object Object]\"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,\"constructor\")&&!aa.call(a.constructor.prototype,\n\"isPrototypeOf\"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!==\"string\"||!a)return null;a=c.trim(a);if(/^[\\],:{}\\s]*$/.test(a.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function(\"return \"+\na))();else c.error(\"Invalid JSON: \"+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName(\"head\")[0]||s.documentElement,d=s.createElement(\"script\");d.type=\"text/javascript\";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],\nd)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||\"\").replace(Wa,\"\")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a===\"string\"||c.isFunction(a)||typeof a!==\"function\"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===\na)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length===\"number\")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b===\"string\"){d=a;a=d[b];b=w}else if(b&&\n!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \\/]([\\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \\/]([\\w.]+)/.exec(a)||/(msie) ([\\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\\w.]+))?/.exec(a)||[];return{browser:a[1]||\"\",version:a[2]||\"0\"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=\ntrue;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener(\"DOMContentLoaded\",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState===\"complete\"){s.detachEvent(\"onreadystatechange\",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement(\"script\"),d=s.createElement(\"div\"),f=\"script\"+J();d.style.display=\"none\";d.innerHTML=\"   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\nvar e=d.getElementsByTagName(\"*\"),j=d.getElementsByTagName(\"a\")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName(\"tbody\").length,htmlSerialize:!!d.getElementsByTagName(\"link\").length,style:/red/.test(j.getAttribute(\"style\")),hrefNormalized:j.getAttribute(\"href\")===\"/a\",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName(\"input\")[0].value===\"on\",optSelected:s.createElement(\"select\").appendChild(s.createElement(\"option\")).selected,\nparentNode:d.removeChild(d.appendChild(s.createElement(\"div\"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type=\"text/javascript\";try{b.appendChild(s.createTextNode(\"window.\"+f+\"=1;\"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent(\"onclick\",function k(){c.support.noCloneEvent=\nfalse;d.detachEvent(\"onclick\",k)});d.cloneNode(true).fireEvent(\"onclick\")}d=s.createElement(\"div\");d.innerHTML=\"<input type='radio' name='radiotest' checked='checked'/>\";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement(\"div\");k.style.width=k.style.paddingLeft=\"1px\";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display=\"none\"});a=function(k){var n=\ns.createElement(\"div\");k=\"on\"+k;var r=k in n;if(!r){n.setAttribute(k,\"return;\");r=typeof n[k]===\"function\"}return r};c.support.submitBubbles=a(\"submit\");c.support.changeBubbles=a(\"change\");a=b=d=e=j=null}})();c.props={\"for\":\"htmlFor\",\"class\":\"className\",readonly:\"readOnly\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",rowspan:\"rowSpan\",colspan:\"colSpan\",tabindex:\"tabIndex\",usemap:\"useMap\",frameborder:\"frameBorder\"};var G=\"jQuery\"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,\napplet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b===\"string\"&&d===w)return null;f||(f=++Ya);if(typeof b===\"object\"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b===\"string\"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];\nelse a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a===\"undefined\"&&this.length)return c.data(this[0]);else if(typeof a===\"object\")return this.each(function(){c.data(this,a)});var d=a.split(\".\");d[1]=d[1]?\".\"+d[1]:\"\";if(b===w){var f=this.triggerHandler(\"getData\"+d[1]+\"!\",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger(\"setData\"+d[1]+\"!\",[d[0],b]).each(function(){c.data(this,\na,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||\"fx\")+\"queue\";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||\"fx\";var d=c.queue(a,b),f=d.shift();if(f===\"inprogress\")f=d.shift();if(f){b===\"fx\"&&d.unshift(\"inprogress\");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!==\"string\"){b=a;a=\"fx\"}if(b===\nw)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a===\"fx\"&&d[0]!==\"inprogress\"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||\"fx\";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||\"fx\",[])}});var Aa=/[\\n\\t]/g,ca=/\\s+/,Za=/\\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,\ncb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,\"\");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr(\"class\")))});if(a&&typeof a===\"string\")for(var b=(a||\"\").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=\" \"+e.className+\" \",\ni=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(\" \"+b[o]+\" \")<0)i+=\" \"+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr(\"class\")))});if(a&&typeof a===\"string\"||a===w)for(var b=(a||\"\").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(\" \"+e.className+\" \").replace(Aa,\" \"),i=0,o=b.length;i<o;i++)j=j.replace(\" \"+b[i]+\" \",\n\" \");e.className=c.trim(j)}else e.className=\"\"}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b===\"boolean\";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr(\"class\"),b),b)});return this.each(function(){if(d===\"string\")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?\"addClass\":\"removeClass\"](e)}else if(d===\"undefined\"||d===\"boolean\"){this.className&&c.data(this,\"__className__\",this.className);this.className=\nthis.className||a===false?\"\":c.data(this,\"__className__\")||\"\"}})},hasClass:function(a){a=\" \"+a+\" \";for(var b=0,d=this.length;b<d;b++)if((\" \"+this[b].className+\" \").replace(Aa,\" \").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,\"option\"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,\"select\")){var d=b.selectedIndex,f=[],e=b.options;b=b.type===\"select-one\";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=\ne[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute(\"value\")===null?\"on\":b.value;return(b.value||\"\").replace(Za,\"\")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r===\"number\")r+=\"\";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,\"select\")){var u=c.makeArray(r);c(\"option\",this).each(function(){this.selected=\nc.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b===\"type\"&&ab.test(a.nodeName)&&a.parentNode&&c.error(\"type property can't be changed\");\na[b]=d}if(c.nodeName(a,\"form\")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b===\"tabIndex\")return(b=a.getAttributeNode(\"tabIndex\"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b===\"style\"){if(e)a.style.cssText=\"\"+d;return a.style.cssText}e&&a.setAttribute(b,\"\"+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\\.(.*)$/,db=function(a){return a.replace(/[^\\w\\s\\.\\|`]/g,\nfunction(b){return\"\\\\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!==\"undefined\"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(\" \");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(\".\")>-1){r=k.split(\".\");\nk=r.shift();j.namespace=r.slice(0).sort().join(\".\")}else{r=[];j.namespace=\"\"}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent(\"on\"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),\nC=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b===\"string\"&&b.charAt(0)===\".\"){b=b||\"\";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(\" \");e=b[j++];){n=e;i=e.indexOf(\".\")<0;o=[];if(!i){o=e.split(\".\");e=o.shift();k=new RegExp(\"(^|\\\\.)\"+c.map(o.slice(0).sort(),db).join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=\nnull)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a===\"object\"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf(\"!\")>=0){a.type=\ne=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,\"handle\"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d[\"on\"+e]&&d[\"on\"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&\nf)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,\"a\")&&e===\"click\",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f[\"on\"+e])f[\"on\"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f[\"on\"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(\".\")<0&&!a.exclusive;\nif(!b){d=a.type.split(\".\");a.type=d.shift();f=new RegExp(\"(^|\\\\.)\"+d.slice(0).sort().join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\")}e=c.data(this,\"events\");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:\"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which\".split(\" \"),\nfix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||\nd&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,\"\");c.each(c.data(this,\n\"events\").live||[],function(){if(d===this.origType.replace(O,\"\"))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent(\"on\"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=\na;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,\nisImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=\n{setup:function(){if(this.nodeName.toLowerCase()!==\"form\"){c.event.add(this,\"click.specialSubmit\",function(a){var b=a.target,d=b.type;if((d===\"submit\"||d===\"image\")&&c(b).closest(\"form\").length)return na(\"submit\",this,arguments)});c.event.add(this,\"keypress.specialSubmit\",function(a){var b=a.target,d=b.type;if((d===\"text\"||d===\"password\")&&c(b).closest(\"form\").length&&a.keyCode===13)return na(\"submit\",this,arguments)})}else return false},teardown:function(){c.event.remove(this,\".specialSubmit\")}};\nif(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b===\"radio\"||b===\"checkbox\")d=a.checked;else if(b===\"select-multiple\")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join(\"-\"):\"\";else if(a.nodeName.toLowerCase()===\"select\")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,\"_change_data\");e=Fa(d);if(a.type!==\"focusout\"||d.type!==\"radio\")c.data(d,\"_change_data\",\ne);if(!(f===w||e===f))if(f!=null||e){a.type=\"change\";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d===\"radio\"||d===\"checkbox\"||b.nodeName.toLowerCase()===\"select\")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!==\"textarea\"||a.keyCode===32&&(d===\"checkbox\"||d===\"radio\")||d===\"select-multiple\")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,\n\"_change_data\",Fa(a))}},setup:function(){if(this.type===\"file\")return false;for(var a in ea)c.event.add(this,a+\".specialChange\",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,\".specialChange\");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,\nd,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each([\"bind\",\"one\"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d===\"object\"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b===\"one\"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d===\"unload\"&&b!==\"one\")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a===\"object\"&&\n!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind(\"live\"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},\ntoggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,\"lastToggle\"+a.guid)||0)%d;c.data(this,\"lastToggle\"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:\"focusin\",blur:\"focusout\",mouseenter:\"mouseover\",mouseleave:\"mouseout\"};c.each([\"live\",\"die\"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,\nu=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||\"\").split(\" \");(i=d[o++])!=null;){j=O.exec(i);k=\"\";if(j){k=j[0];i=i.replace(O,\"\")}if(i===\"hover\")d.push(\"mouseenter\"+k,\"mouseleave\"+k);else{n=i;if(i===\"focus\"||i===\"blur\"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b===\"live\"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error\".split(\" \"),\nfunction(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent(\"onunload\",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h=\"\",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];\nif(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!==\"string\"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^[\\]]*\\]|['\"][^'\"]*['\"]|[^[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\ne=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!==\"string\")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(\"\"),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();\nt=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]===\"~\"||p[0]===\"+\")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D=\"\";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||\ng);if(j.call(y)===\"[object Array]\")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];\nfor(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!==\"\\\\\"){q[1]=(q[1]||\"\").replace(/\\\\/g,\"\");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],\"\");break}}}}m||(m=h.getElementsByTagName(\"*\"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-\n1)!==\"\\\\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],\"\");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw\"Syntax error, unrecognized expression: \"+g;};var n=k.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)/,\nCLASS:/\\.((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(['\"]*)(.*?)\\3|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\((even|odd|[\\dn+-]*)\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(g){return g.getAttribute(\"href\")}},\nrelative:{\"+\":function(g,h){var l=typeof h===\"string\",m=l&&!/\\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},\">\":function(g,h){var l=typeof h===\"string\";if(l&&!/\\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=\nl?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},\"\":function(g,h,l){var m=e++,q=d;if(typeof h===\"string\"&&!/\\W/.test(h)){var p=h=h.toLowerCase();q=b}q(\"parentNode\",h,m,g,p,l)},\"~\":function(g,h,l){var m=e++,q=d;if(typeof h===\"string\"&&!/\\W/.test(h)){var p=h=h.toLowerCase();q=b}q(\"previousSibling\",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!==\"undefined\"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!==\"undefined\"){var l=[];\nh=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute(\"name\")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=\" \"+g[1].replace(/\\\\/g,\"\")+\" \";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(\" \"+v.className+\" \").replace(/[\\t\\n]/g,\" \").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\\\/g,\"\")},TAG:function(g){return g[1].toLowerCase()},\nCHILD:function(g){if(g[1]===\"nth\"){var h=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.exec(g[2]===\"even\"&&\"2n\"||g[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(g[2])&&\"0n+\"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\\\/g,\"\");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]===\"~=\")g[4]=\" \"+g[4]+\" \";return g},PSEUDO:function(g,h,l,m,q){if(g[1]===\"not\")if((f.exec(g[3])||\"\").length>1||/^\\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,\ng);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!==\"hidden\"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\\d/i.test(g.nodeName)},\ntext:function(g){return\"text\"===g.type},radio:function(g){return\"radio\"===g.type},checkbox:function(g){return\"checkbox\"===g.type},file:function(g){return\"file\"===g.type},password:function(g){return\"password\"===g.type},submit:function(g){return\"submit\"===g.type},image:function(g){return\"image\"===g.type},reset:function(g){return\"reset\"===g.type},button:function(g){return\"button\"===g.type||g.nodeName.toLowerCase()===\"button\"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},\nsetFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q===\"contains\")return(g.textContent||g.innerText||a([g])||\"\").indexOf(h[3])>=0;else if(q===\"not\"){h=\nh[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error(\"Syntax error, unrecognized expression: \"+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case \"only\":case \"first\":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l===\"first\")return true;m=g;case \"last\":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case \"nth\":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=\nm.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute(\"id\")===h},TAG:function(g,h){return h===\"*\"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(\" \"+(g.className||g.getAttribute(\"class\"))+\" \").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+\"\";var m=h[2];h=h[4];return g==null?m===\"!=\":m===\n\"=\"?l===h:m===\"*=\"?l.indexOf(h)>=0:m===\"~=\"?(\" \"+l+\" \").indexOf(h)>=0:!h?l&&g!==false:m===\"!=\"?l!==h:m===\"^=\"?l.indexOf(h)===0:m===\"$=\"?l.substr(l.length-h.length)===h:m===\"|=\"?l===h||l.substr(0,h.length+1)===h+\"-\":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+n.match[u].source.replace(/\\\\(\\d+)/g,function(g,\nh){return\"\\\\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)===\"[object Array]\")Array.prototype.push.apply(h,g);else if(typeof g.length===\"number\")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||\n!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if(\"sourceIndex\"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=\nh.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement(\"div\"),h=\"script\"+(new Date).getTime();g.innerHTML=\"<a name='\"+h+\"'/>\";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!==\"undefined\"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!==\"undefined\"&&\nq.getAttributeNode(\"id\").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!==\"undefined\"&&m.getAttributeNode(\"id\");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement(\"div\");g.appendChild(s.createComment(\"\"));if(g.getElementsByTagName(\"*\").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]===\"*\"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=\"<a href='#'></a>\";\nif(g.firstChild&&typeof g.firstChild.getAttribute!==\"undefined\"&&g.firstChild.getAttribute(\"href\")!==\"#\")n.attrHandle.href=function(h){return h.getAttribute(\"href\",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement(\"div\");h.innerHTML=\"<p class='TEST'></p>\";if(!(h.querySelectorAll&&h.querySelectorAll(\".TEST\").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();\n(function(){var g=s.createElement(\"div\");g.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(!(!g.getElementsByClassName||g.getElementsByClassName(\"e\").length===0)){g.lastChild.className=\"e\";if(g.getElementsByClassName(\"e\").length!==1){n.order.splice(1,0,\"CLASS\");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!==\"undefined\"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:\nfunction(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!==\"HTML\":false},ga=function(g,h){var l=[],m=\"\",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,\"\")}g=n.relative[g]?g+\"*\":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[\":\"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,\ngb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b===\"string\"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack(\"\",\"find\",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;\nc.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),\"not\",a)},filter:function(a){return this.pushStack(Ia(this,a,true),\"filter\",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=\n{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===\n\"string\")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a===\"string\"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,\"parentNode\")},parentsUntil:function(a,b,d){return c.dir(a,\"parentNode\",\nd)},next:function(a){return c.nth(a,2,\"nextSibling\")},prev:function(a){return c.nth(a,2,\"previousSibling\")},nextAll:function(a){return c.dir(a,\"nextSibling\")},prevAll:function(a){return c.dir(a,\"previousSibling\")},nextUntil:function(a,b,d){return c.dir(a,\"nextSibling\",d)},prevUntil:function(a,b,d){return c.dir(a,\"previousSibling\",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,\"iframe\")?\na.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f===\"string\")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(\",\"))}});c.extend({filter:function(a,b,d){if(d)a=\":not(\"+a+\")\";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===\n1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\\d+=\"(?:\\d+|null)\"/g,V=/^\\s+/,Ka=/(<([\\w:]+)[^>]*?)\\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\\w:]+)/,ib=/<tbody/i,jb=/<|&#?\\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\\s*(?:[^=]|=\\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?\na:b+\"></\"+d+\">\"},F={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\"\",\"\"]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,\"div<div>\",\"</div>\"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=\nc(this);d.text(a.call(this,b,d.text()))});if(typeof a!==\"object\"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},\nwrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,\"body\")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},\nprepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,\"before\",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,\nthis.nextSibling)});else if(arguments.length){var a=this.pushStack(this,\"after\",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName(\"*\"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName(\"*\"));b.firstChild;)b.removeChild(b.firstChild);\nreturn this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement(\"div\");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,\"\").replace(/=([^=\"'>\\s]+\\/)>/g,'=\"$1\">').replace(V,\"\")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find(\"*\"),b.find(\"*\"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,\n\"\"):null;else if(typeof a===\"string\"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName(\"*\"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&\nthis[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!==\"string\")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),\"replaceWith\",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,\"table\")?u.getElementsByTagName(\"tbody\")[0]||\nu.appendChild(u.ownerDocument.createElement(\"tbody\")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i===\"string\"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===\n1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,\"tr\");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);\nreturn this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement===\"undefined\")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i===\"number\")i+=\"\";if(i){if(typeof i===\"string\"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i===\"string\"){i=i.replace(Ka,Ma);var o=(La.exec(i)||[\"\",\n\"\"])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement(\"div\");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o===\"table\"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===\"<table>\"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],\"tbody\")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=\nc.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],\"script\")&&(!e[j].type||e[j].type.toLowerCase()===\"text/javascript\"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName(\"script\"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?\nc.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\\([^)]*\\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\\d+(?:px)?$/i,nb=/^-?\\d/,ob={position:\"absolute\",visibility:\"hidden\",display:\"block\"},pb=[\"Left\",\"Right\"],qb=[\"Top\",\"Bottom\"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?\"cssFloat\":\"styleFloat\",ja=\nfunction(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e===\"number\"&&!kb.test(f))e+=\"px\";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b===\"width\"||b===\"height\")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b===\"opacity\"){if(e){f.zoom=1;b=parseInt(d,10)+\"\"===\"NaN\"?\"\":\"alpha(opacity=\"+d*100+\")\";a=f.filter||c.curCSS(a,\"filter\")||\"\";f.filter=\nNa.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf(\"opacity=\")>=0?parseFloat(Oa.exec(f.filter)[1])/100+\"\":\"\"}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b===\"width\"||b===\"height\"){var e,j=b===\"width\"?pb:qb;function i(){e=b===\"width\"?a.offsetWidth:a.offsetHeight;f!==\"border\"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,\"padding\"+this,true))||0);if(f===\"margin\")e+=parseFloat(c.curCSS(a,\"margin\"+this,true))||0;else e-=parseFloat(c.curCSS(a,\n\"border\"+this+\"Width\",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b===\"opacity\"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||\"\")?parseFloat(RegExp.$1)/100+\"\":\"\";return f===\"\"?\"1\":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b=\"float\";b=b.replace(lb,\"-$1\").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=\na.getPropertyValue(b);if(b===\"opacity\"&&f===\"\")f=\"1\"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d===\"fontSize\"?\"1em\":f||0;f=e.pixelLeft+\"px\";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=\na.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()===\"tr\";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,\"display\")===\"none\"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\\s)*?\\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\\?(&|$)/,ka=/\\?/,wb=/(\\?|&)_=.*?(&|$)/,xb=/^(\\w+:)?\\/\\/([^\\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==\n\"string\")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(\" \");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f=\"GET\";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===\"object\"){b=c.param(b,c.ajaxSettings.traditional);f=\"POST\"}var j=this;c.ajax({url:a,type:f,dataType:\"html\",data:b,complete:function(i,o){if(o===\"success\"||o===\"notmodified\")j.html(e?c(\"<div />\").append(i.responseText.replace(tb,\"\")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},\nserialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),\nfunction(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:\"GET\",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,\"script\")},getJSON:function(a,b,d){return c.get(a,b,d,\"json\")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:\"POST\",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,\nglobal:true,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!==\"file:\"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(a){}},accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",script:\"text/javascript, application/javascript\",json:\"application/json, text/javascript\",text:\"text/plain\",_default:\"*/*\"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&\ne.success.call(k,o,i,x);e.global&&f(\"ajaxSuccess\",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f(\"ajaxComplete\",[x,e]);e.global&&!--c.active&&c.event.trigger(\"ajaxStop\")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!==\"string\")e.data=c.param(e.data,e.traditional);if(e.dataType===\"jsonp\"){if(n===\"GET\")N.test(e.url)||(e.url+=(ka.test(e.url)?\n\"&\":\"?\")+(e.jsonp||\"callback\")+\"=?\");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+\"&\":\"\")+(e.jsonp||\"callback\")+\"=?\";e.dataType=\"json\"}if(e.dataType===\"json\"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||\"jsonp\"+sb++;if(e.data)e.data=(e.data+\"\").replace(N,\"=\"+j+\"$1\");e.url=e.url.replace(N,\"=\"+j+\"$1\");e.dataType=\"script\";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType===\"script\"&&e.cache===null)e.cache=false;if(e.cache===\nfalse&&n===\"GET\"){var r=J(),u=e.url.replace(wb,\"$1_=\"+r+\"$2\");e.url=u+(u===e.url?(ka.test(e.url)?\"&\":\"?\")+\"_=\"+r:\"\")}if(e.data&&n===\"GET\")e.url+=(ka.test(e.url)?\"&\":\"?\")+e.data;e.global&&!c.active++&&c.event.trigger(\"ajaxStart\");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType===\"script\"&&n===\"GET\"&&r){var z=s.getElementsByTagName(\"head\")[0]||s.documentElement,C=s.createElement(\"script\");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=\nfalse;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState===\"loaded\"||this.readyState===\"complete\")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader(\"Content-Type\",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader(\"If-Modified-Since\",\nc.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader(\"If-None-Match\",c.etag[e.url])}r||x.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");x.setRequestHeader(\"Accept\",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+\", */*\":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger(\"ajaxStop\");x.abort();return false}e.global&&f(\"ajaxSend\",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q===\"abort\"){E||\nd();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q===\"timeout\")){E=true;x.onreadystatechange=c.noop;i=q===\"timeout\"?\"timeout\":!c.httpSuccess(x)?\"error\":e.ifModified&&c.httpNotModified(x,e.url)?\"notmodified\":\"success\";var p;if(i===\"success\")try{o=c.httpData(x,e.dataType,e)}catch(v){i=\"parsererror\";p=v}if(i===\"success\"||i===\"notmodified\")j||b();else c.handleError(e,x,i,p);d();q===\"timeout\"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);\ng(\"abort\")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g(\"timeout\")},e.timeout);try{x.send(n===\"POST\"||n===\"PUT\"||n===\"DELETE\"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger(\"ajaxError\",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol===\"file:\"||a.status>=200&&a.status<300||a.status===304||a.status===\n1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader(\"Last-Modified\"),f=a.getResponseHeader(\"Etag\");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader(\"content-type\")||\"\",e=b===\"xml\"||!b&&f.indexOf(\"xml\")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName===\"parsererror\"&&c.error(\"parsererror\");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a===\"string\")if(b===\n\"json\"||!b&&f.indexOf(\"json\")>=0)a=c.parseJSON(a);else if(b===\"script\"||!b&&f.indexOf(\"javascript\")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\\[\\]$/.test(i)?f(i,n):d(i+\"[\"+(typeof n===\"object\"||c.isArray(n)?k:\"\")+\"]\",n)});else!b&&o!=null&&typeof o===\"object\"?c.each(o,function(k,n){d(i+\"[\"+k+\"]\",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+\"=\"+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;\nif(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join(\"&\").replace(yb,\"+\")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\\d+-.]+)(.*)$/,W,va=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K(\"show\",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],\"olddisplay\");\nthis[a].style.display=d||\"\";if(c.css(this[a],\"display\")===\"none\"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c(\"<\"+d+\" />\").appendTo(\"body\");f=e.css(\"display\");if(f===\"none\")f=\"block\";e.remove();la[d]=f}c.data(this[a],\"olddisplay\",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],\"olddisplay\")||\"\";return this}},hide:function(a,b){if(a||a===0)return this.animate(K(\"hide\",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],\"olddisplay\");!d&&d!==\"none\"&&c.data(this[a],\n\"olddisplay\",c.css(this[a],\"display\"))}a=0;for(b=this.length;a<b;a++)this[a].style.display=\"none\";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a===\"boolean\";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(\":hidden\");c(this)[f?\"show\":\"hide\"]()}):this.animate(K(\"toggle\",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(\":hidden\").css(\"opacity\",0).show().end().animate({opacity:b},a,d)},\nanimate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?\"each\":\"queue\"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(\":hidden\"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]===\"hide\"&&o||a[i]===\"show\"&&!o)return j.complete.call(this);if((i===\"height\"||i===\"width\")&&this.style){j.display=c.css(this,\"display\");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=\nj.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow=\"hidden\";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u===\"toggle\"?o?\"show\":\"hide\":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||\"px\";if(E!==\"px\"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]===\"-=\"?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,\"\")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);\nthis.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K(\"show\",1),slideUp:K(\"hide\",1),slideToggle:K(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a===\"object\"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===\n\"number\"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||\nc.fx.step._default)(this);if((this.prop===\"height\"||this.prop===\"width\")&&this.elem.style)this.elem.style.display=\"block\"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||\"px\";this.now=this.start;\nthis.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=\nthis.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,\"olddisplay\");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,\"display\")===\"none\")this.elem.style.display=\"block\"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,\ne,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?\"swing\":\"linear\");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||\nc.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,\"opacity\",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop===\"width\"||a.prop===\"height\"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset=\"getBoundingClientRect\"in s.documentElement?\nfunction(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=\nthis[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position===\"fixed\")break;j=e?e.getComputedStyle(b,null):b.currentStyle;\nk-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!==\"visible\"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position===\"relative\"||f.position===\"static\"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&\nf.position===\"fixed\"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement(\"div\"),d,f,e,j=parseFloat(c.curCSS(a,\"marginTop\",true))||0;c.extend(b.style,{position:\"absolute\",top:0,left:0,margin:0,border:0,width:\"1px\",height:\"1px\",visibility:\"hidden\"});b.innerHTML=\"<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>\";\na.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position=\"fixed\";f.style.top=\"20px\";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top=\"\";d.style.overflow=\"hidden\";d.style.position=\"relative\";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);\nc.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,\"marginTop\",true))||0;d+=parseFloat(c.curCSS(a,\"marginLeft\",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,\"position\")))a.style.position=\"relative\";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,\"top\",true),10)||0,i=parseInt(c.curCSS(a,\"left\",true),10)||0;if(c.isFunction(b))b=b.call(a,\nd,e);d={top:b.top-e.top+j,left:b.left-e.left+i};\"using\"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,\"marginTop\",true))||0;d.left-=parseFloat(c.curCSS(a,\"marginLeft\",true))||0;f.top+=parseFloat(c.curCSS(b[0],\"borderTopWidth\",true))||0;f.left+=parseFloat(c.curCSS(b[0],\"borderLeftWidth\",true))||0;return{top:d.top-\nf.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,\"position\")===\"static\";)a=a.offsetParent;return a})}});c.each([\"Left\",\"Top\"],function(a,b){var d=\"scroll\"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?\"pageXOffset\"in j?j[a?\"pageYOffset\":\n\"pageXOffset\"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each([\"Height\",\"Width\"],function(a,b){var d=b.toLowerCase();c.fn[\"inner\"+b]=function(){return this[0]?c.css(this[0],d,false,\"padding\"):null};c.fn[\"outer\"+b]=function(f){return this[0]?c.css(this[0],d,false,f?\"margin\":\"border\"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return\"scrollTo\"in\ne&&e.document?e.document.compatMode===\"CSS1Compat\"&&e.document.documentElement[\"client\"+b]||e.document.body[\"client\"+b]:e.nodeType===9?Math.max(e.documentElement[\"client\"+b],e.body[\"scroll\"+b],e.documentElement[\"scroll\"+b],e.body[\"offset\"+b],e.documentElement[\"offset\"+b]):f===w?c.css(e,d):this.css(d,typeof f===\"string\"?f:f+\"px\")}});A.jQuery=A.$=c})(window);\n"++
+ JQuery.hsb view
@@ -0,0 +1,8 @@+{-# LANGUAGE OverloadedStrings #-}+module JQuery where++import Data.ByteString.Lazy.Char8++jQueryCode :: ByteString+jQueryCode = %blob "jquery.min.js"+
+ Main.hs view
@@ -0,0 +1,256 @@+{-# OPTIONS -XFlexibleInstances #-}++module Main where++import Text.PrettyPrint+import Control.Monad.State+import Control.Monad.Error+import Data.List+import Data.Maybe (fromJust, isNothing, isJust)+import Debug.Trace ++import Data.Function (on)++import Data.Map (Map)+import qualified Data.Map as Map++import Data.Set (Set)+import qualified Data.Set as Set++import Data.Graph ++import Util +import AST++import Parser+import Type+import Shapify+import CodeGen ++import SemSyn++import System.IO+import System.Environment+import System.IO.Unsafe++data OptionAction +    = NullaryAction (Config -> Config)+    | UnaryAction   (String -> Config -> Config)++interpretAction (NullaryAction f) xs c +    = Just (xs, f c)+interpretAction (UnaryAction f) [] c +    = Nothing+interpretAction (UnaryAction f) (x:xs) c +    = Just (xs, f x c) ++      +data Option +    = Option { optionString :: String, +               optionLongString :: Maybe String,+               optionArgDescription :: Doc, +               optionDescription :: Doc, +               optionAction :: OptionAction }++instance Ppr Option where+    ppr (Option s ls argdesc desc _) =+        ppr s <> (case ls of +                    Just ls -> comma <+> ppr ls+                    Nothing -> empty)+              <+> argdesc  $$+              nest 4 desc+    pprList opts =+        vcat $ (punctuate (text "\n") $ map ppr opts)+        ++options = +    [ Option "-f" (Just "--file") (text "FILENAME")+             (text "Specify program's input file")+             (UnaryAction (\x conf -> +                               conf { inputFile = Just x })),+      Option "-s" (Just "--shapify") (empty)+             (text "Convert terms with type \"T a\" to \"T Unit\".")+             (NullaryAction (\conf -> conf {execMode = Shapify})),+      Option "-n" (Just "--natify") empty+             (text "Convert terms with \"List a\" to \"Nat\".")+             (NullaryAction (\conf -> conf {execMode = ShapifyPlus})),+      Option "-h"  (Just "--help") empty+             (text "Show this help message.")+             (NullaryAction (\conf -> conf {execMode = Help})),+      Option "-H"  (Just "--haskell-code") empty+             (text "(Obsolete) Return a Haskell source code of \"put\" function."+              $$ text "This options implies \"-n\".")+             (NullaryAction (\conf -> conf {outputMode = HaskellCode, execMode = ShapifyPlus})),+      Option "-P"  (Just "--pseudo-code") empty+             (text "(Obsolete) Return a pseudo code only after syntatic bidirectionalizatoin."+              $$ text "Note that \"wrapping\" code for semantic bidirectionalization is not produced.")+             (NullaryAction (\conf -> conf {outputMode = PseudoCode })),+      Option "-F"  (Just "--forward-only") empty+             (text"(Obsolete) Return a pseudo code without bidirecionalization.")+             (NullaryAction (\conf -> conf {outputMode = ForwardCode })), +      Option "-U"  (Just "--without-type") empty +             (text"Pseudo code without type. This option affects the output of \"-P\" and \"-F\".")+             (NullaryAction (\conf -> conf {isShowType = False})),+      Option "-T"  (Just "--with-type") empty +             (text"Pseudo code with type. This option affects the output of \"-P\" and \"-F\".")+             (NullaryAction (\conf -> conf {isShowType = True})),+      Option "-no"  (Just "--no-bidrectionalization") empty+             (text"No Bidirectionalization (transformation stops after pre-processing)")+             (NullaryAction (\conf -> conf {b18nMode = NoB18n})),+      Option "-syn" (Just "--syntactic") empty +             (text"Syntatic Bidirectionalization.")+             (NullaryAction (\conf -> conf {b18nMode = SyntacticB18n, outputMode = OM_NotSpecified  })),+      Option "-sem" (Just "--semantic") empty +             (text"Semantic Bidirectionalization.")+             (NullaryAction (\conf -> conf {b18nMode = SemanticB18n, outputMode = OM_NotSpecified  })),+      Option "-comb" (Just "--combined") empty+             (text"Combined Bidirectionalization.")+             (NullaryAction (\conf -> conf {b18nMode = CombinedB18n, outputMode = OM_NotSpecified })),+      Option "-hs"   (Just "--haskell") empty+             (text"Output Haskell-runnable code.")+             (NullaryAction (\conf -> conf {isHaskellify = True}))+--       Option "-d" (Just "--debug-exec") empty+--              (text"Debug Execution (Do not use this option).")+--              (NullaryAction $ \conf -> conf {execMode = Debug})+    ]++      +matchOption optString options +    = foldr f Nothing options +    where f o r = +              if (optionString o == optString) +                 || (isJust (optionLongString o) +                     && (fromJust (optionLongString o) == optString)) then +                  Just o +              else+                  r+           +parseArgs :: [[Char]] -> Config -> Config +parseArgs args conf = +    case args of +      ("-d":xs) -> +          parseArgs xs (conf { execMode = Debug })+      ("--debug":xs) -> +          parseArgs xs (conf { execMode = Debug })+      (x:xs) -> case matchOption x options of +                  Just o -> +                      case  interpretAction (optionAction o) xs conf of +                        Just (rest, c) -> +                            parseArgs rest c +                        Nothing ->+                            error "Error: #Argument of option mismatch." +                  Nothing -> +                      case x of +                        '-':_ -> +                            error $ "Error: Unknown option " ++ show x +                        _ -> +                            if isNothing (inputFile conf) then +                                parseArgs xs (conf { inputFile = Just x })+                            else +                                parseArgs xs conf+      []     -> conf++++-- parseArgs :: [[Char]] -> Config -> Config +-- parseArgs args conf =+--     case args of +--       ("-f":x:xs) ->+--           parseArgs xs (conf { inputFile = Just x })+--       ("-s":xs) ->+--           parseArgs xs (conf { execMode = Shapify })+--       ("-ss":xs) ->+--           parseArgs xs (conf { execMode = ShapifyPlus })+--       ("-h":xs) ->+--           parseArgs xs (conf { execMode = Help })+--       ("-H":xs) ->+--           parseArgs xs (conf { outputMode = HaskellCode, execMode = ShapifyPlus } )+--       ("-P":xs) ->+--           parseArgs xs (conf { outputMode = PseudoCode } )+--       ("-d":xs) ->+--           parseArgs xs (conf { execMode = Debug })+--       (x:xs) | isNothing (inputFile conf) ->+--           parseArgs xs (conf { inputFile = Just x })+--       (x:xs) ->+--           parseArgs xs conf+--       [] ->+--           conf+++progName = unsafePerformIO getProgName++usage = show $ +    text "USAGE" $$+    text "-----" $$+         nest 4 (text $ progName ++ " (-n|-s) (-T|-U) (-no|-sem|-syn|-comb) [-hs] [-f] [FILENAME]\n") $+$ +                  +         text ("This program is a prototype implementation of the paper:\n") $$+         nest 4 (sep [text "Janis Voigtlander, Zhenjiang Hu, Kazutaka Matsuda and Meng Wang:",+                       text "Combining Syntactic and Semantic Bidirectionalization.",+                       text "ICFP 2010.\n"])+         $$+         wrap 80 ( "Given a \"get\" function defined in a file specified by FILENAME, "+                  ++ "the program returns \"put\" function by combining "+                  ++ "semantic bidirectionalization (Janis Voiglander: POPL'09) "+                  ++ "and syntatic bidirectionalization (Kazutaka Matsuda et al.: ICFP'07). A typical usage is \""++ progName ++ " FILENAME\", which correspondes to the paper.\n"+                  ) $+$+    text "OPTIONS" $$+    text "-------" $$+         ppr options+    where+      pprOptions ps = vcat $ concatMap +                      (\(a,b) -> [nest 4 a,nest 8 b]) ps +      wrap n s = wrap' n s [] +          where wrap' 0 (' ':s) buf = wrap' 0 s buf +                wrap' 0 s buf  = (text (reverse buf)) $$ wrap' n s []+                wrap' m [] buf = (text (reverse buf))+                wrap' m (' ':s) buf  +                    | m - lnextSpace s < 0 =+                        text (reverse buf) $$ wrap' n s []+                    | otherwise = +                        wrap' (m-1) s (' ':buf)+                wrap' m (c:s) buf | m > 0 =+                    wrap' (m-1) s (c:buf)+                lnextSpace [] = 0+                lnextSpace (' ':_) = 0+                lnextSpace (c:s)   = 1 + lnextSpace s ++main :: IO ()+main = do { args <- getArgs +          ; let conf = adjustConfig $ parseArgs args defaultConfig+          ; case execMode conf of +              Help -> putStrLn usage +              _ -> +                  do { csterr <- case inputFile conf of+                                   Nothing -> +                                       do cont <- getContents+                                          return $ parseString cont+                                   Just filename ->+                                       parseFile filename+                     ; case csterr of+                         Left err -> hPutStrLn stderr (show err)+                         Right cprog ->  case typeInference cprog of+                            Left err -> hPutStrLn stderr err+                            Right typeChecked -> +                             case execMode conf of +                               Debug ->+                                       putStrLn "Debug mode does nothing."+                               _ | isNormalMode conf ->+                                     let transformed = typeChecked+                                     in checkAndDoBidirectionalize conf False cprog transformed+                               _ | isShapifyMode conf -> +                                     let transformed = shapify $ typeChecked+                                     in checkAndDoBidirectionalize conf False cprog transformed+                               _ | isShapifyPlusMode conf || True -> +                                     let transformed = introNat $ shapify $ typeChecked+                                     in checkAndDoBidirectionalize conf True cprog transformed +                     }+          }+              where checkAndDoBidirectionalize conf isShapify orig ast =+                        if b18nMode conf == NoB18n || b18nMode conf == SemanticB18n then +                            (print $ outputCode conf isShapify orig ast)+                        else+                            maybe (print $ outputCode conf isShapify orig ast)+                                  putStrLn +                                  (checkBidirectionalizability ast)+
+ MyInterpret.hs view
@@ -0,0 +1,136 @@+{-# LANGUAGE DeriveDataTypeable #-}++module MyInterpret+        ( simpleInterpret+	, simpleTypeOf+        , catchInterpreterErrors+        )+         where ++import Language.Haskell.Interpreter+import Language.Haskell.Interpreter.Unsafe++import Prelude hiding (catch)+import Control.Concurrent+import Control.Exception+import Control.Monad+import Control.Monad.Error+import System.Posix.Signals+import Data.Typeable (Typeable)+import Data.List+import Data.Either+++-- Scoped modules+defaultModules = [    "Prelude",+               "Data.List"+        ]++data MyException = MyException String deriving (Show,Typeable)+instance Exception MyException++timeoutIO action = bracket+	(do mainId <- myThreadId+	    installHandler sigXCPU (CatchOnce $ throwTo mainId $ MyException "Time limit exceeded.") Nothing+	    forkIO $ do+		    threadDelay (5 * 1000 * 1000)+		    -- Time's up. It's a good day to die.+		    throwTo mainId (MyException "Time limit exceeded")++		    {- why do we need that here?+ - 		    yield -- give the other thread a chance+		    putStrLn "Killing main thread..."+		    killThread mainId -- Die now, srsly.+		    error "Time expired"+		    -}+	)++	(killThread)+	+	(\_ -> do+	        mainId <- myThreadId+        	mvar <- newEmptyMVar+		forkIO $ (action >>= putMVar mvar) `catch`+			 (\e -> throwTo mainId (e::SomeException))+		ret <- takeMVar mvar+		evaluate (length ret) -- make sure exceptions are handled here+		return ret+	)++myInterpreter :: [String] -> [String] -> (String -> InterpreterT IO [a]) -> String -> IO [a]+myInterpreter mods imports todo exp = timeoutIO $ do+        when (unsafe exp) $ throw (MyException "Indicators for unsafe computations found in exp")++	eResult <- runInterpreter $ do+                set [languageExtensions := []]+		-- Not available in hint-3.2?+                -- setOptimizations All++                reset++                if null mods+                  then do -- no need for temporary files I hope. Used by bff+                       set [installedModulesInScope := True ]+                       setImports defaultModules+                  else do -- Only these modules in scope. No Prelude either!+                       loadModules mods+                       set [installedModulesInScope := False ]+                       setImports imports+	+		unsafeSetGhcOption "-fno-monomorphism-restriction"+                unsafeSetGhcOption "-fno-warn-warnings-deprecations"+                +		--liftIO $ putStrLn exp --this makes it impossible to run at www-ps.uni-bonn.de+                ret <- todo exp++                -- Hopefully removes temporary files+                reset+                +                return ret+	+	case eResult of+		Left exception -> throw exception+		Right result -> return result+        +formatInterpreterError :: InterpreterError -> [Char]+formatInterpreterError (UnknownError s) = "Unknown Interpreter Error:\n" ++ s+formatInterpreterError (WontCompile es) = "Could not compile code:\n" ++ unlines (map errMsg es)+formatInterpreterError (NotAllowed s) = "Not allowed here " ++ s+formatInterpreterError (GhcException e) = "GHC Exception"+        +{- | Return true if the String contains anywhere in it any keywords associated+   with dangerous functions. Unfortunately, this blacklist leaks like a sieve+   and will return many false positives (eg. 'unsafed "id \"unsafed\""' will+   evaluate to True, even though the phrase \"unsafe\" appears only in a String). But it+   will at least catch naive and simplistic invocations of "unsafePerformIO",+   "inlinePerformIO", and "unsafeCoerce". -}+unsafe :: String -> Bool+unsafe = \z -> any (`isInfixOf` z) unsafeNames++unsafeNames :: [String]+unsafeNames = ["unsafe", "inlinePerform", "liftIO", "Coerce", "Foreign",+               "Typeable", "Array", "IOBase", "Handle", "ByteString",+               "Editline", "GLUT", "lock", "ObjectIO", "System.Time",+               "OpenGL", "Control.Concurrent", "System.Posix",+               "throw", "Dyn", "cache", "stdin", "stdout", "stderr"]++catchInterpreterErrors :: IO a -> IO (Either String a)+catchInterpreterErrors action = +        flip catch (return . Left . formatInterpreterError) $+        flip catch (\(MyException s) -> return (Left s))   $+        flip catch (\(ErrorCall s) -> return (Left s))   $+        Right `fmap` action++simpleInterpret :: [String] -> [String] -> String -> String -> IO String +simpleInterpret mods imports defs what = +	myInterpreter mods imports eval $+	   "let \n" +++	    unlines (map (replicate 12 ' '++) (lines defs)) ++ +            replicate 8 ' ' ++ "in " ++ what++simpleTypeOf :: [String] -> [String] -> String -> String -> IO String +simpleTypeOf mods imports defs what = +	myInterpreter mods imports typeOf $+	   "let \n" +++	    unlines (map (replicate 12 ' '++) (lines defs)) ++ +            replicate 8 ' ' ++ "in " ++ what
+ Parser.hs view
@@ -0,0 +1,293 @@+module Parser (parseProgram, parseExpression, parseFile, parseString) where++import Text.ParserCombinators.Parsec+import qualified Text.ParserCombinators.Parsec.Token as Tk+import Text.ParserCombinators.Parsec.Language++import Debug.Trace +import Data.Char (isSpace)+import Data.List (partition)++import AST+++-- cnv f s = case f s of+--            Left  err -> Left $ show err+--            Right r   -> Right $ r ++parseProgram s = +    (parse pProg "") $ insertSemi s++parseExpression = +    (parse pExp "") +++parseString s = +    parseProgram s +++parseFile filename =+    return . parseProgram =<< readFile filename+++-- | |insertSemi| inserts ";" after every "\n".+insertSemi :: String -> String +insertSemi []  = []+insertSemi [x] = [x]+insertSemi ('\r':'\n':x) | not (isSpace $ head x) = ';':'\r':'\n':insertSemi x +insertSemi ('\n':x)      | not (isSpace $ head x) = ';':'\n':insertSemi x +insertSemi ('\r':x)      | not (isSpace $ head x) = ';':'\r':insertSemi x +insertSemi (a:x)    = a:insertSemi x+++                      +varId :: Parser String+varId = do { c <- lower+           ; cs <- many (alphaNum <|> char '_')+           ; return $ (c:cs) }++conId :: Parser String+conId = do { c <- upper +           ; cs <- many (alphaNum <|> char '_')+           ; return $ (c:cs) }++number :: Parser Int+number = do { cs <- many1 digit+            ; return $ read cs }++myLexer = Tk.makeTokenParser haskellDef +--             $ emptyDef {+--                     commentStart = "{-"+--                   , commentEnd   = "-}"+--                   , commentLine  = "--"           +--                   , reservedNames = ["case", "class", "data", "default", "deriving", "do", "else", "if", "import", "in", "infix", "infixl", "infixr", "instance", "let", "module", "newtype", "of", "then", "type", "where", "_" ]+--                  }++++parens = Tk.parens myLexer+symbol = Tk.symbol myLexer+comma  = Tk.comma myLexer+lexeme = Tk.lexeme myLexer+reserved = Tk.reserved myLexer+brackets = Tk.brackets myLexer +whiteSpace = Tk.whiteSpace myLexer+semi = Tk.semi myLexer+++pProg = do { skipMany (whiteSpace >> semi)+           ; ds <- sepEndBy (pDecl) (many1 (whiteSpace >> semi)) -- many (lexeme pDecl)+           ; return $ assignIDsAST (AST $ ds) }+++pDecl = do { whiteSpace+           ; pos <- getPosition +           ; fName <- lexeme varId +           ; ps    <- many1 pAPat -- parens (pPats)+           ; whiteSpace +           ; symbol "=" +           ; e     <- pExp+           ; return $ Decl (Name fName) FTUndet ps e }+++-- pPats = sepBy pPat comma ++{-+ pPat  ::= pAPat : pPat +        |  pCPat + pCPat ::= C pAPat ... pAPat +        |  pAPat + pAPat ::= C | x | BList | (pPat)+ BList ::= [ pPat, ..., pPat ]+-}++pcons x y = PCon Nothing TUndet (Name "Cons") [x,y]+pnil      = PCon Nothing TUndet (Name "Nil")  []++-- list pattern +pPat = do { whiteSpace +          ; pos <- getPosition +          ; try ( do { p1 <- pAPat +                     ; symbol ":" +                     ; p2 <- pPat +                     ; return $ pcons p1 p2 } )+            <|> +            pCPat }++-- constructor pattern+pCPat = do { whiteSpace+           ; pos <- getPosition +           ; do { c <- lexeme conId+                ; ps <- many pAPat +                ; return $ PCon Nothing TUndet (Name c) ps }+             <|> +             pAPat }++-- pattern need not to be enclosed with parens+pAPat = do { whiteSpace +           ; pos <- getPosition +           ; do { c <- lexeme conId +                ; ps <- many pAPat +                ; return $ PCon Nothing TUndet (Name c) [] }+             <|>+             do { c <- lexeme number +                ; return $ PCon Nothing TUndet (Name $ show c) [] }+             <|>+             do { c <- lexeme varId +                ; return $ PVar Nothing TUndet (Name c) }+             <|>+             do { pBListPat }+             <|>+             do { parens pPat } }++-- [p1, ..., pn]                    +pBListPat = do { ps <- brackets (sepBy pPat comma)+               ; return $ foldr pcons pnil ps}++-- pPat = do { whiteSpace  +--           ; pos <- getPosition +--           ; try pList +--             <|> +--             do { c <- lexeme conId                +--                ; ps <- many pAPat -- option [] $ parens pPats +--                ; return $ PCon Nothing TUndet (Name c) ps }+--             <|>             +--             pAPat  }+++-- pAPat = do { whiteSpace+--            ; pos <- getPosition +--            ; do { c <- lexeme conId+--                 ; return $ PCon Nothing TUndet (Name c) [] }+--              <|>+--              do { c <- lexeme number +--                 ; return $ PCon Nothing TUndet (Name $ show c) [] }+--              <|>+--              do { c <- lexeme varId +--                 ; return $ PVar Nothing TUndet (Name c) }+--              <|>+--            --  do { pBList }+--            --  <|>+--              do { parens pPat }+--            }++-- pList = do { whiteSpace +--            ; pos <- getPosition +--            ; try (do { p1 <- pAPat +--                      ; symbol ":"+--                      ; p2 <- pPat +--                      ; return $ PCon Nothing TUndet (Name $ "Cons") [p1,p2] })+--              <|>+--              pAPat }++++-- pTExp = do { whiteSpace+--            ; pos <- getPosition+--            ; do { c  <- lexeme conId+--                 ; es <- option [] $ parens (sepBy (pTExp) comma)+--                 ; return $ ECon Nothing TUndet (Name c) es }+--              <|>+--              do { c <- lexeme $ number+--                 ; return $ ECon Nothing TUndet (Name $ show c) [] }+--              <|>+--              do { c <- lexeme varId +--                 ; do { es <- parens (sepBy (pArg) comma) +--                      ; return $ EFun Nothing TUndet (Name c) es }+--                   <|>+--                   do { return $ EVar Nothing TUndet (Name c) } } +--              <|> +--              do { _ <- string "("+--                 ; c <- pTExp +--                 ; _ <- string ")" +--                 ; return c }}+++{-+ pExp  ::= pAExp : pExp+        |  pAppExp ++ pAppExp ::= C pAExp ... pAExp+          |  f pAExp ... pAExp +          | pAExp ++ pAPat ::= C | n | x | pBListExp | (pExp)+ pBListExp ::= [ pExp, ..., pExp ]+-}+++econs x y = ECon Nothing TUndet (Name $ "Cons") [x,y]+enil      = ECon Nothing TUndet (Name $ "Nil")  [] ++-- Cons +pExp = do { whiteSpace+          ; pos <- getPosition +          ; try (do { e1 <- pAExp +                    ; symbol ":" +                    ; e2 <- pExp +                    ; return $ econs e1 e2 })+            <|>+            pAppExp }++-- Application+pAppExp = do { whiteSpace+             ; pos <- getPosition +             ; do { c  <- lexeme conId+                  ; es <- many pAExp -- option [] $ parens (sepBy (pExp) comma)+                  ; return $ ECon Nothing TUndet (Name c) es }+               <|>+               do { c <- lexeme varId +                  ; do { es <- many1 pAExp --  parens (sepBy (pExp) comma) +                       ; return $ EFun Nothing TUndet (Name c) es }+                    <|>+                    do { return $ EVar Nothing TUndet (Name c) } }                +               <|>+               pAExp }+                    +-- Atomic+pAExp = do { whiteSpace+           ; pos <- getPosition +           ; do { c <- lexeme conId+                ; return $ ECon Nothing TUndet (Name c) [] }+             <|>+             do { c <- lexeme number +                ; return $ ECon Nothing TUndet (Name $show c) [] }+             <|>+             do { c <- lexeme varId+                ; return $ EVar Nothing TUndet (Name c) }+             <|>+             do { pBListExp }+             <|>+             do { parens pExp }+           }++-- [e1, ..., en]                    +pBListExp = do { es <- brackets (sepBy pExp comma)+               ; return $ foldr econs enil es}+++-- pExp = do { whiteSpace+--           ; pos <- getPosition+--           ; do { c  <- lexeme conId+--                ; es <- many pAExp -- option [] $ parens (sepBy (pExp) comma)+--                ; return $ ECon Nothing TUndet (Name c) es }+--             <|>+--             do { c <- lexeme $ number+--                ; return $ ECon Nothing TUndet (Name $ show c) [] }+--             <|>+--             do { c <- lexeme varId +--                ; do { es <- many1 pAExp --  parens (sepBy (pExp) comma) +--                     ; return $ EFun Nothing TUndet (Name c) es }+--                  <|>+--                  do { return $ EVar Nothing TUndet (Name c) } } +--             <|> +--             do { parens pExp }+--           }++++-- pArg = do { pos <- getPosition+--           ; c <- lexeme varId+--           ; return $ EVar Nothing TUndet (Name c)} ++
+ README view
@@ -0,0 +1,140 @@+ `b18n-combined`: Combining Syntactic and Semantic Bidirectionalization+======================================================================++What's This?+------------++This program, `b18n-combined`, is a prototype implementation of+the paper "Combining Syntactic and Semantic Bidirectionalization" +written by Janis Voigtl&auml;nder, Zhenjiang Hu, Kazutaka Matsuda,+and Meng Wang, which is accepted at ICFP'10.++The program takes input program describing a view function that constructs a view from a source, +and generates a put-back function that reflects updates on the view to the source. +Thanks to combination of syntactic and semantic bidirectionalization, +the program can generates effective put-back functions in the sense that+the generated put-back functions can put back more updates than +those obtained by either of syntactic/semantic bidirectionalization.++Online Version+--------------++A [CGI version] of the program is provided for your convenience.++[CGI version]: http://www.kb.ecei.tohoku.ac.jp/~kztk/b18n-combined/+++Example+-------+ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.shell}+$ cat example/init.txt +init []          = []+init [a]         = []+init (a:b:x)     = a:initWork b x+initWork a []    = []+initWork a (b:x) = a:initWork b x+$ ./dist/build/b18n-combined/b18n-combined example/sieve.txt -syn -hs+import Control.Monad+import BUtil+data Cmpl t0 t1+    = Csieve_Cmpl_1+    | Csieve_Cmpl_2 t0+    | Csieve_Cmpl_3 t1 (Cmpl t0 t1)+sieve ([]) = []+sieve (a : []) = []+sieve (a : (b : x)) = b : sieve (x)+sieve_B s v = head (sieve_T_I v (sieve_Cmpl s))+sieve_Cmpl ([]) = Csieve_Cmpl_1+sieve_Cmpl (a : []) = Csieve_Cmpl_2 a+sieve_Cmpl (a : (b : x)) = Csieve_Cmpl_3 a (sieve_Cmpl (x))+sieve_T_I x1 x2 = mplus (sieve_T_I_1 x1 x2) (mplus (sieve_T_I_2 x1 x2) (mplus (sieve_T_I_3 x1 x2) mzero))+sieve_T_I_1 [] (Csieve_Cmpl_1) = do return ([])+sieve_T_I_1 _ _ = mzero+sieve_T_I_2 [] (Csieve_Cmpl_2 a) = do return (a : [])+sieve_T_I_2 _ _ = mzero+sieve_T_I_3 (b : tv1) (Csieve_Cmpl_3 a+                                     tc1) = do (x) <- sieve_T_I tv1 tc1+                                               return (a : (b : x))+sieve_T_I_3 _ _ = mzero+$ ./b18n-combined example/sieve.txt -sem+import Data.Bff+import BUtil+sieve_B s v+    = bff Main.sieve s v+sieve ([]) = []+sieve (a : []) = []+sieve (a : (b : x)) = b : sieve (x)+$ ./b18n-combined example/sieve.txt -comb +import Control.Monad+import BUtil+sieve_Bb bias s v+    = gen_put_bias bias Main.sieve(\x y -> castError $ (sieve_22_B $! x) $! y) s v+sieve_Bbd = withDefaultBias sieve_Bb+sieve_Bd = withDefault sieve_B+sieve_B s v = sieve_Bb rear s v+data Cmpl+    = Csieve_22_Cmpl_1+    | Csieve_22_Cmpl_2+sieve ([]) = []+sieve (a : []) = []+sieve (a : (b : x)) = b : sieve (x)+sieve_22_B s v = head (sieve_22_T_I v (sieve_22_Cmpl s))+sieve_22_Cmpl (Z) = Csieve_22_Cmpl_1+sieve_22_Cmpl (S (Z)) = Csieve_22_Cmpl_2+sieve_22_Cmpl (S (S x)) = sieve_22_Cmpl (x)+sieve_22_T_I x1 x2 = mplus (sieve_22_T_I_1 x1 x2) (mplus (sieve_22_T_I_2 x1 x2) (mplus (sieve_22_T_I_3 x1 x2) mzero))+sieve_22_T_I_1 (Z) (Csieve_22_Cmpl_1) = do return (Z)+sieve_22_T_I_1 _ _ = mzero+sieve_22_T_I_2 (Z) (Csieve_22_Cmpl_2) = do return (S Z)+sieve_22_T_I_2 _ _ = mzero+sieve_22_T_I_3 (S tv1) tc1 = do (x) <- sieve_22_T_I tv1 tc1+                                return (S (S x))+sieve_22_T_I_3 _ _ = mzero+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++How to Build Using cabal-install+--------------------------------++If you have [cabal-install] (part of the Haskell Platform) available on your system, you can install b18n-combined using the command+	cabal install bidirectionalization-combined++[cabal-install]: http://haskell.org/cabal/download.html++How to Build Manually+---------------------+++  0. Install [GHC] and make sures that following Haskell packages +     are installed.+     * mtl, template-haskell, containers, pretty, parsec (for web interface: directory, xhtml, cgi, utf8-string, bytestring, unix, hint >= 0.3.2)+  1. Get the source tarball from +     [./bidirectionalization-combined-0.1.tar.gz](./bidirectionalization-combined-0.1.tar.gz) or from [hackage].+  2. Unfold the source tarball+     * `tar zxvf bidirectionalization-combined-0.1.tar.gz` +  3. Build the executables by +     1. `runhaskell Setup.hs configure`+     2. `runhaskell Setup.hs build`+    +Note that the source code is also available via darcs.++     darcs get http://www.kb.ecei.tohoku.ac.jp/~kztk/darcs/sem_syn/++[GHC]: http://www.haskell.org/ghc/+[hackage]: http://hackage.haskell.org/package/bidirectionalization-combined+++Limitation+----------++Current implementation can handle lists only.++<div class="footer">++----------------------------------------------------+<address>Kazutaka Matsuda: <kztk@kb.ecei.tohoku.ac.jp>.</address>++<p>The first version of this page was published in Jul. 29th, 2010.</p>++</div>+
+ SemSyn.hs view
@@ -0,0 +1,793 @@+{-# OPTIONS -XFlexibleInstances #-}++module SemSyn where++import Text.PrettyPrint+import Control.Monad.State+import Control.Monad.Error+import Data.List+import Data.Maybe (fromJust, isNothing, isJust)+import Debug.Trace ++import Data.Function (on)++import Data.Map (Map)+import qualified Data.Map as Map++import Data.Set (Set)+import qualified Data.Set as Set++import Data.Graph ++import Util +import AST++import Parser+import Type+import Shapify+import CodeGen +++data Config +    = Config +      { +        inputFile   :: Maybe String, -- ^ Path to input file+        execMode    :: ExecMode,  +        b18nMode    :: B18nMode, +        outputMode  :: OutputMode,   -- ^ Obsolete   +        isHaskellify :: Bool, +        isShowType  :: Bool+      }+    deriving Show ++data ExecMode +    = Normal | Shapify | ShapifyPlus | Help | Debug +    deriving (Eq, Read, Show)++data OutputMode = PseudoCode | HaskellCode | ForwardCode | OM_NotSpecified +    deriving (Eq, Read, Show)++data B18nMode = SyntacticB18n | SemanticB18n | CombinedB18n | NoB18n +    deriving (Eq, Read, Show)++defaultConfig = Config { +                  inputFile    = Nothing, +                  execMode     = Normal, +                  b18nMode     = CombinedB18n, +                  outputMode   = OM_NotSpecified, +                  isHaskellify = False, +                  isShowType   = True  }++-- | Since some combination of the config options is useless, +--   this function adjust some configuration to valid one.+adjustConfig :: Config -> Config +-- adjustConfig (conf@(Config {b18nMode = CombinedB18n})) =+--     conf { isHaskellify = True, execMode = ShapifyPlus }+-- adjustConfig (conf@(Config {b18nMode = SemanticB18n})) =+--     conf { isHaskellify = True, execMode = Normal, outputMode = ForwardCode }+-- adjustConfig (conf@(Config {b18nMode = SyntacticB18n})) =+--     conf { execMode = Normal, outputMode = PseudoCode }+adjustConfig (conf@(Config {outputMode = ForwardCode})) = +    conf { b18nMode = NoB18n }+adjustConfig (conf@(Config {outputMode = HaskellCode})) | execMode conf /= Help = +    conf { execMode = ShapifyPlus, isHaskellify = True, b18nMode = CombinedB18n  }+adjustConfig (conf@(Config {outputMode = PseudoCode})) =+    conf { isHaskellify = False, b18nMode = SyntacticB18n }+adjustConfig conf = conf ++++outputCode :: Config -> Bool -> AST -> AST -> Doc+outputCode conf_ isShapify orig ast = +    let (p1,p2,p3) = constructBwdFunction ast+    in case b18nMode conf of +         NoB18n -> +             if isHaskellify conf then +                 ppr (generateCodeDet ast) +             else+                 ppr (typeFilter ast)+         SyntacticB18n ->+             if isHaskellify conf then +                 vcat [ text "import Control.Monad" +                      , text "import BUtil"+                      , ppr (constructTypeDecl p2)+                      , ppr $ generateCodeBwd (orig, p1, p2, p3) ]+             else +                 vcat [ ppr (constructTypeDecl p2)+                      , space+                      , ppr orig+                      , space+                      , ppr (typeFilter p1) +                      , space +                      , ppr (typeFilter p2)+                      , space +                      , ppr (typeFilterT p3) ]+         SemanticB18n -> vcat $ +             [ text "import Data.Bff" ] +++             [ text "import BUtil" ] ++ +             (map genBwdDefBff $ +                   let Right (AST decls) = typeInference orig +                   in map (\(Decl f t _ _:_) -> (f,t)) $ groupBy isSameFunc decls) +++             [ ppr $ generateCodeDet orig ]             +         CombinedB18n -> vcat $ +             [ text "import Control.Monad"+             , text "import BUtil"+             ] ++ (+             if isShapify+             then map genBwdDef $+                     let Right (AST decls) = typeInference orig+                     in map (\(Decl f t _ _:_) -> (f,t)) $ groupBy isSameFunc decls+             else []                                     +             ) +++             [ ppr (constructTypeDecl p2)+             , ppr $ generateCodeBwd (orig,p1,p2,p3)+             ]+    where+      conf       = adjustConfig conf_+      typeFilter  = if isShowType conf then id else eraseType+      typeFilterT = if isShowType conf then id else eraseTypeT+      genBwdDefBff (Name fName,(TFun is ts t)) =+          case (ts,t) of +            ([TCon (Name "List") [TVar i]],TCon (Name "List") [TVar j]) | i == j  ->+                ppr (Name fName) <> text "_B s v" $$+                    nest 4 (text "= bff Main." <> ppr (Name fName) <+> text "s v") +            _ ->+                empty +--           ppr (Name fName) <> text "_B_Eq" $$+--               nest 4 (text "= bff_Eq Main." <> ppr (Name fName)) $$+--           ppr (Name fName) <> text "_B_Ord" $$+--               nest 4 (text "= bff_Ord Main." <> ppr (Name fName))  +      genBwdDef (Name fName,(TFun is ts t)) =+          case (ts,t) of +            ([TCon (Name "List") [TVar i]],TCon (Name "List") [TVar j]) | i == j  ->+                ppr (Name fName) <> text "_Bb bias s v" $$+                  nest 4 (text "= gen_put_bias bias Main." <> ppr (Name fName) +                               <> text "(\\x y -> castError $ (" +                               <> ppr (NBwd $ IName fName is)+                               <> text " $! x) $! y) s v" ) $$+                ppr (Name fName) <> text "_Bbd = withDefaultBias "+                    <> ppr (Name fName) <> text "_Bb" $$+                ppr (Name fName) <> text "_Bd = withDefault "+                    <> ppr (Name fName) <> text "_B" $$+                ppr (Name fName) <> text "_B s v = " +                  <> ppr (Name fName) <> text "_Bb rear s v" +            _ ->+                empty+++isNormalMode conf =+    ( b18nMode conf == SemanticB18n ) +    || ( (b18nMode conf == SyntacticB18n || b18nMode conf == NoB18n)+         && (execMode conf == Normal) )++isShapifyMode conf = +    (b18nMode conf == SyntacticB18n || b18nMode conf == NoB18n)+    && (execMode conf == Shapify)++isShapifyPlusMode conf =+    (b18nMode conf == CombinedB18n) +    || ( (b18nMode conf == SyntacticB18n || b18nMode conf == NoB18n)+         && (execMode conf == ShapifyPlus) )++renderCode :: Config -> AST -> Doc+renderCode conf cprog+    | isNormalMode conf =      outputCode conf False (cprog) $+                                    either error id $ typeInference cprog+    | isShapifyMode conf =     outputCode conf False (cprog) $+                                    shapify $ either error id $ typeInference cprog+    | isShapifyPlusMode conf = outputCode conf True  (cprog) $+                                    introNat $ shapify $ either error id $ typeInference cprog+    | otherwise =              outputCode conf True  (cprog) $+                                    introNat $ shapify $ either error id $ typeInference cprog+++checkBidirectionalizability :: AST -> Maybe String +checkBidirectionalizability ast = if isEmpty msgs then Nothing else Just (show msgs)+    where+      msgs = +        either (text.showTypeError) (const empty) (typeInference ast) $$+        maybe empty (text.showTreelessError)      (checkTreeless $ eraseType ast) $$+        maybe empty (text.showAffineError)        (checkAffine   $ eraseType ast)+      showTypeError err+          = show $ text "Error: program does not typecheck" $$+                         nest 4 (text err)+      showTreelessError (e,d)+          = show $ text "Error: program is not treeless due to expression" $$+                         nest 4 (ppr e) $$+                         text "in declaration" $$ +                         nest 4 (ppr d)+      showAffineError (vs,d)+          = show $ text "Error: program is not affine due to variables" $$+                         nest 4 (ppr vs) $$+                         text "in declaration" $$ +                         nest 4 (ppr d)+      +                                                         +                                                        ++-- msum []     = mzero+-- msum (m:ms) = mplus m (msum ms)++-- Nothing    : treeless+-- Just (e,d) : not treeless because of e in d +checkTreeless :: AST -> Maybe (Exp, Decl)+checkTreeless (AST decls) = msum $ map checkTreelessD decls+    where+      checkTreelessD (d@(Decl _ _ _ e))  = checkTreelessE d e +      checkTreelessE d (EVar _ _ _)      = Nothing +      checkTreelessE d (ECon _ _ _ es)   = msum $ map (checkTreelessE d) es+      checkTreelessE d (e@(EFun _ _ _ es)) | all isVariable es = Nothing +                                           | otherwise         = Just (e,d)       +      isVariable (EVar _ _ _) = True +      isVariable e            = False++-- Nothing     : affine+-- Just (vs,d) : not affine because of vs in d +checkAffine :: AST -> Maybe ([Name],Decl)+checkAffine (AST decls) = msum $ map checkAffineD decls+    where+      checkAffineD (d@(Decl _ _ _ e)) = checkAffineE d e +      checkAffineE d e | (sort (varsE e) == snub (varsE e)) = Nothing+                       | otherwise                          = Just (sort (varsE e) \\ snub (varsE e),d)+      varsE (EVar _ _ v) = [v]+      varsE (ECon _ _ _ es) = concatMap varsE es+      varsE (EFun _ _ _ es) = concatMap varsE es+++           +type Automaton s = Map s [Deriv s]+data Deriv s    = DCon Name [s]+                | DEps s +                | DAny++pprAM :: (Ppr a, Ppr t) => Map t [Deriv a] -> Doc+pprAM am = +    vcat $ map pprDs $ Map.toList am+    where+      pprDs (i,ds) = +          ppr i $$+          nest 4 (vcat $ map (\d -> text " -> " <> pprD d) ds)+      pprD (DAny)      = text "_" +      pprD (DEps s)    = ppr s+      pprD (DCon c ss) = ppr c <> parens (hcat $ punctuate comma (map ppr ss))++data AState = ASType Int+            | ASExp  Int+            | ASFun  Name+     deriving (Eq,Ord)++instance Ppr AState where+    ppr (ASType i) = text $ "T" ++ show i +    ppr (ASExp  x) = text $ "E" ++ show x+    ppr (ASFun  n) = text $ "F" ++ show n++instance Show AState where+    show = show . ppr ++initTAMap :: Type -> State Int (AState, Map AState [Deriv AState])+initTAMap s = constructTypeMap s+    where+      uniq = do { i <- get; put (i+1); return i }+      listType t =+          do { (st,m) <- constructTypeMap t+             ; i <- uniq+             ; let m1 = Map.insert (ASType i) [DCon (Name "Nil")[], +                                               DCon (Name "Cons") [ASType i, st]] m+             ; return (ASType i, m1) }+      natType = +          do { let m1 = Map.insert (ASType 0) [DCon (Name "Z") [], +                                               DCon (Name "S") [ASType 0]] (Map.empty)+             ; return (ASType 0, m1) }+      anyType =+          do { let m1 = Map.insert (ASType 1) [DAny] (Map.empty)+             ; return (ASType 1, m1) }+      constructTypeMap (TCon (Name "List") [t]) =+          listType t+      constructTypeMap (TCon (Name "Nat") []) =+          natType +      constructTypeMap (TVar i) = +          anyType+      constructTypeMap _ =+          anyType -- Not Supported++testOverlap :: AST -> Doc +testOverlap (AST decl) = +    let fDs = groupBy isSameFunc decl+    in evalState (do { docs <- mapM f fDs+                     ; return $ vcat docs }) initCAConf +    where+      am = constructAutomaton (AST decl) initTAMap +      f (ds@(Decl g t ps e:es)) = +          do { b <- checkInjectivity am (AST decl) g+             ; let di  = text "Injectivity: " <> text (show $ b)+             ; ba <- checkAmbiguity am (ASFun g)+             ; let da  = text "Ambiguity: " <> text (show $ ba)+             ; dol <- pol ds +             ; return $ text (show g) $$ nest 4 (da $$ di $$ dol) }+      pol ds = let is  = [ ASExp $ fromJust $ idofE e | (Decl f t ps e) <- ds ] +                   ijs = [ (i,j) | vs <- [zip is [0..]], (i,x) <- vs, (j,y) <- vs ]+               in +                 do { bs <- mapM (uncurry $ checkOverlapS am (Set.empty)) ijs +                    ; let vs = map (map snd) $ groupBy ((==) `on` (fst.fst)) $ zip ijs bs +                    ; return $ vcat ( map g vs )}+          where g bs = hcat ( map (\h -> if h then text "O" else text "-") bs)+          +isNonErasing :: Decl -> Bool+isNonErasing (Decl _ _ ps e) =+    null $ (snub $ concatMap varsP ps) \\ varsE e+++checkInjectivity :: Automaton AState -> AST -> Name -> State (CAConf AState) Bool+checkInjectivity am (AST decl) f =+    checkInj (Set.empty) f +    where+      checkInj env f =+          do { inj  <- getInjSet+             ; ninj <- getNonInjSet+             ; if Set.member f inj || Set.member f env then +                   return True+               else if Set.member f ninj then +                   return False+               else+                   do { b1 <- checkAmbiguity am (ASFun f)+                      ; when b1 (addNonInj f)+                      ; let dsF = filter (\(Decl g _ _ _) -> g == f) decl+                      ; let b2  = all isNonErasing dsF+                      ; when (not b2) (addNonInj f )+                      ; let fs = concatMap calledFunctions dsF+                      ; b3  <- mapM (checkInj (Set.insert f env)) fs+                      ; when (not $ and b3) (addNonInj f)+                      ; if (not b1) && b2 && and b3 then+                            when (Set.null env) (addInj f) >> return True+                        else+                            return False } }++testTupling :: AST -> TAST+testTupling ast = +    evalState (do { cAst <- optimizedComplementation am ast+                  ; tAst <- doTupling am ast cAst+                  ; return tAst }) initCAConf+    where+      am = constructAutomaton ast initTAMap +++data TypeDecl = TypeDecl Name [Int] [ConDef]+data ConDef   = ConDef Name [Type] -- NB: First Order++instance Ppr TypeDecl where+    ppr (TypeDecl c is cdefs) = +        text "data" <+> ppr c <+>+             hsep (map (\i -> text "t" <> ppr i) is) $$ nest 4 (ppr cdefs)+    pprList decls =+        vcat $ map ppr decls++instance Ppr ConDef where+    ppr (ConDef n ts) = ppr n <+> hsep (map pprT ts)+        where+          pprT (TVar i) = ppr (TVar i)+          pprT t        = parens (ppr t)+    pprList []        = empty +    pprList (c:cs)    = text "=" <+> ppr c $$+                        f cs+        where f []     = empty +              f [c]    = text "|" <+> ppr c +              f (c:cs) = text "|" <+> ppr c $$ f cs  ++-- Extract Type Definition from the complement definition+-- FIXME: More Smart Definition+constructTypeDecl :: AST -> [ TypeDecl ]+constructTypeDecl (AST cdecls) = [ TypeDecl (cmplName) vs condef ]+    where+      cmplName = Name "Cmpl"+      vs = snub $ concat $ evalState (mapM extractVarsT cdecls) (0,[])+      extractVarsT (Decl _ _ _ e) =+          case e of +            (ECon _ _ c es) -> +                do { trav <- traversedList+                   ; if c `elem` trav then +                         return []+                     else+                         do { addTraversed c +                            ; let ws = [ w | (EVar _ _ w) <- es ]+                            ; is <- mapM (\_ -> uniq) ws +                            ; return $ is }}+            _ -> +                return []+      uniq = do { (i,t) <- get; put (i+1,t); return i }+      traversedList  = do { (i,t) <- get; return t }+      addTraversed t = do { (i,tt) <- get; put (i,t:tt) }+      condef = concat $ evalState (mapM mkConDef cdecls) (0,[])+      mkConDef (Decl _ _ _ e) =+          case e of +            (ECon _ _ c es) -> +                do { trav <- traversedList+                   ; if c `elem` trav then +                         return []+                     else +                         do { addTraversed c +                            ; let ws = [ w | (EVar _ _ w) <- es ]+                            ; let fs = [ TCon cmplName [ TVar i | i <- vs ] | (EFun _ _ _ _) <- es ]+                            ; is <- mapM (\_ -> uniq) ws +                            ; return $ [ ConDef c (map TVar is ++ fs) ] } }+            _ ->+                return [] +                  +++++constructBwdFunction :: AST -> (AST, AST, TAST) +constructBwdFunction ast =+    evalState ( do { cmpl <- optimizedComplementation am ast+                   ; tpl  <- doTupling am ast cmpl +                   ; let itpl = localInversion tpl +                   ; let fs = functions ast+                   ; bwds <- mapM constructBWD fs +                   ; return $ (AST bwds, cmpl, itpl)+                   }) initCAConf+    where+      am = constructAutomaton ast initTAMap +      functions (AST decls) = map (\(Decl f _ _ _:_) -> f) $ groupBy isSameFunc decls +      pS = PVar Nothing TUndet (Name "s")+      pV = PVar Nothing TUndet (Name "v")+      eS = EVar Nothing TUndet (Name "s")+      eV = EVar Nothing TUndet (Name "v")+      constructBWD f = do { b <- checkInjectivity am ast f +                          ; if b then +                                return $ Decl (NBwd f) FTUndet [pS,pV] +                                           (EFun Nothing TUndet (NInv f) [eV])+                            else+                                return $ Decl (NBwd f) FTUndet [pS,pV]+                                           (EFun Nothing TUndet (NInv (NTuple f)) +                                                     [eV, EFun Nothing TUndet (NCmpl f) [eS]]) } ++localInversion :: TAST -> TAST+localInversion (TAST tdecls) = TAST $ map localInversionD tdecls++localInversionD :: TDecl -> TDecl +localInversionD (TDecl f ps es vdecls) =+    TDecl (NInv f) (map e2p es) (map p2e ps) (map linvVD vdecls)+    where+      e2p (EVar i t v)    = PVar i t v +      e2p (ECon i t c es) = PCon i t c (map e2p es)+      p2e (PVar i t v)    = EVar i t v +      p2e (PCon i t c ps) = ECon i t c (map p2e ps)+      linvVD (VDecl vs f us) = VDecl us (NInv f) vs +      +-- doTupling :: AST -> AST -> TAST +doTupling :: Automaton AState -> AST -> AST -> State (CAConf AState) TAST+doTupling am (AST decls) (AST cdecls) =+    do { tdecls <- mapM tupleD $ zip decls cdecls +       ; return $ TAST tdecls }+    where+      fCalls (EFun _ _ f es) = [(f,es)] +      fCalls (ECon _ _ _ es) = concatMap fCalls es+      fCalls _               = []+      convE mp (EFun i t f es) = case lookup (f,es) mp of+                                   Just v  -> EVar i t v +                                   Nothing -> EFun i t f es -- never happens+      convE mp (EVar i t v )   = EVar i t v +      convE mp (ECon i t c es) = ECon i t c (map (convE mp) es)+      tupleD (Decl f _ ps e, Decl _ _ _ ce) =+          do { b <- checkInjectivity am (AST decls) f+             ; if b then +                   return $ tupleDInj f ps e +               else +                   return $ tupleDNInj f ps e ce }+      tupleDInj f ps e = TDecl f ps [convE vnMap e] wdecls -- keep function-name if injective +          where+            funCalls = fCalls e +            vnMap    = zip funCalls [ NTupleV i | i <- [1..] ]+            wdecls = map (\((f,es),v) -> VDecl [v] f [u | (EVar _ _ u) <- es ]) vnMap +      tupleDNInj f ps e ce = TDecl (NTuple f) ps [convE vnMap e, convE cnMap ce] wdecls +          where+            funCalls  = fCalls e+            ninjCalls = [ (f,es) | (NCmpl f, es) <- fCalls ce ]+            injCalls  = funCalls \\ ninjCalls +            vnMap    = zip funCalls [ NTupleV  i | i <- [1..] ]+            cnMap    = zip (map (\(f,es) -> (NCmpl f,es)) funCalls) [ NTupleVC i | i <- [1..] ]+            wdecls   = map convW vnMap +                where +                  convW ((f,es),v@(NTupleV i)) +                      | (f,es) `elem` injCalls = VDecl [v] f [u | (EVar _ _ u) <- es ]+                      | otherwise              = VDecl [v,NTupleVC i] (NTuple f) [u | (EVar _ _ u) <- es ]+                                       +            +                                      +                          +++++                      +calledFunctions (Decl _ _ _ e) = snub $ calledFunctionsE e +calledFunctionsE (ECon _ _ _ es) = concatMap calledFunctionsE es+calledFunctionsE (EFun _ _ f es) = f:concatMap calledFunctionsE es +calledFunctionsE _               = []+                            ++testComplementation (AST decls) = +    evalState (optimizedComplementation am (AST decls)) initCAConf+    where+      am = constructAutomaton (AST decls) initTAMap +      ++optimizedComplementation am (AST decls) +    = do { cmpl   <- complementation am (AST decls)+         ; cmpl'  <- optimizeByRemove am cmpl+         ; cmpl'' <- optimizeByRename am cmpl' +         ; return $ cmpl'' }++optimizeByRename am (AST cdecls) =+    do { let cfdeclss = groupBy isSameFunc cdecls+       ; cfdeclss' <- mapM optRename cfdeclss +       ; return $ AST $ concat cfdeclss' }+    where+      optRename cfdecls = +         do { let ids = [ (i,[ (v,t) | (EVar _ t v) <- es  ],length es)  +                               | (Decl _ _ _ (ECon _ _ (NCConE i) es)) <- cfdecls ]+            ; idss <- grouping [] ids +            ; return $ map (doRename idss) cfdecls }+--      grouping :: [[(Int,[(Name,Type)])]] -> [(Int,[(Name,Type)])] -> State (CAConf AState) [[(Int,[(Name,Type)])]]+      grouping gs []      = return gs +      grouping gs (i:ids) =+         do { gs' <- checkGroup i gs +            ; grouping gs' ids }+--      checkGroup :: (Int,[(Name,Type)]) -> [[(Int,[(Name,Type)])]] -> State (CAConf AState) [[(Int,[(Name,Type)])]]+      checkGroup i [] = return $ [ [i] ]+      checkGroup i (g:gs) =+          do { b <- compatible i g  +             ; if b then +                   return $ (i:g):gs+               else+                   do { gs' <- checkGroup i gs +                      ; return $ g:gs' } }+      compatible i [] = return $ True+      compatible (i,vs,l) ((i',vs',l'):ls) =+          do { b <- checkOverlapS am Set.empty (ASExp i) (ASExp i')+             ; let b2 = (sort $ map snd vs) == (sort $ map snd vs') +             ; if (not b) && b2 && l == l' then +                   compatible (i,vs,l) ls +               else+                   return False }+      doRename idss (Decl f t ps (ECon ei et (NCConE i) es)) = +          Decl f t ps (ECon ei et (NCConU f j) es') +          where+            j = fix (\f n iss -> +                         case iss of +                           is:iss -> +                               if i `elem` (map (\(a,_,_) -> a) is) then +                                   n +                               else +                                   f (n+1) iss) 1 idss +            es' = sortBy (compare `on` typeofE) [ e | (e@(EVar _ _ _)) <- es ]+                  ++ [ e | (e@(EFun _ _ _ _)) <- es ]+      doRename idss d = d +            +          +          +                 ++optimizeByRemove am (AST cdecls) =+    do { let cfdeclss = groupBy isSameFunc cdecls +       ; cfdeclss' <- mapM optRem cfdeclss +       ; return $ AST $ concat cfdeclss' }+    where+      fromInj (Decl _ _ _ (ECon _ _ (NCConF _) _)) = True+      fromInj _                                    = False+      optRem cfdecls +          | fromInj (head cfdecls) = return cfdecls+          | otherwise = +              mapM (\(Decl f t ps e) -> do { e' <- tryRemove e; return $ Decl f t ps e'}) cfdecls                 +          where ids = [ i | (Decl _ _ _ (ECon _ _ (NCConE i) _)) <- cfdecls ]+                tryRemove (ex@(ECon ei et (NCConE i) [EFun ei' et' f es])) = +                    do { b <- checkNonOverlapAll i ids +                       ; if b then +                             return $ EFun ei' et' f es+                         else+                             return $ ex }+                tryRemove ex = return ex +                checkNonOverlapAll i [] = return $ True+                checkNonOverlapAll i (j:jds) | i == j    = checkNonOverlapAll i jds +                                             | otherwise = do { b <- checkOverlapS am (Set.empty) (ASExp i) (ASExp j)+                                                              ; if b then +                                                                    return False+                                                                else+                                                                    checkNonOverlapAll i jds }++complementation am (ast@(AST decls)) =+    do { cdecls <- mapM (complementationD am ast) decls+       ; return $ AST cdecls }++complementationD am ast (Decl f ftype ps e) =                 +    do { b <- checkInjectivity am ast f+       ; if b then +             return $ (Decl (NCmpl f) FTUndet ps (ECon Nothing TUndet cNameC []))+         else +             do { let fs = fCalls e +                ; fs' <- filterNonInj fs+                ; let e' = cExp unusedVars fs' +                ; return $ (Decl (NCmpl f) FTUndet ps e') }+       }+    where+      unusedVars = snub $ (snub $ concatMap varsWithTP ps) \\ (snub $ varsWithTE e)+      varsWithTP (PVar _ t v)    = [EVar Nothing t v]+      varsWithTP (PCon _ _ _ ps) = concatMap varsWithTP ps+      varsWithTE (EVar _ t v)    = [EVar Nothing t v]+      varsWithTE (ECon _ _ _ es) = concatMap varsWithTE es +      varsWithTE (EFun _ _ _ es) = concatMap varsWithTE es +      fCalls (ECon _ _ _ es) = concatMap fCalls es +      fCalls (EFun _ _ f es) = (f,es):concatMap fCalls es+      fCalls _               = []+      filterNonInj []          = return []+      filterNonInj ((f,es):fs) = do { b <- checkInjectivity am ast f +                                    ; if b then +                                          filterNonInj fs +                                      else+                                          do { fs' <- filterNonInj fs+                                             ; return $ (f,es):fs' } }+      cNameC = NCConF f +      cName  = NCConE (fromJust $ idofE e)+      cExp vs fs = ECon Nothing TUndet cName $ +                       vs ++ (map (\(f,es) -> EFun Nothing TUndet (NCmpl f) es) fs)++++constructAutomaton :: AST -> (Type -> State Int (AState,Automaton AState)) -> Automaton AState+constructAutomaton (AST decl) initTAMap =+    removeEps $ evalState (unionM $ map constructAMD decl) 2 +    where+      unionM []     = return $ Map.empty+      unionM (m:ms) = do { r1 <- unionM ms +                         ; r2 <- m+                         ; return $ Map.unionWith (++) r1 r2 }+      constructAMD (Decl f t ps e) = +          do { (st,m) <- constructAME e+             ; return $ Map.insertWith (++) (ASFun f) [DEps st] m }+      constructAME (ECon i t c es) =+          do { ims <- mapM constructAME es+             ; let (is,ms) = unzip ims+             ; let m       = Map.unions ms+             ; let s       = ASExp $ fromJust i +             ; return (s, Map.insertWith (++) s [DCon c is] m)}+      constructAME (EFun i t f es) = -- Assume Treeless+          let s = ASExp $ fromJust i  +          in return (s, Map.insertWith (++) s [DEps $ ASFun f] (Map.empty))+      constructAME (EVar i t x) =+          do { (st,m) <- initTAMap t +             ; let s = ASExp $ fromJust i +             ; return (s, Map.insertWith (++) s [DEps st] m) }+     +allStates :: Ord s => Automaton s -> [s]+allStates am = +    snub $ foldr (++) [] $ map (\(i,d) -> i:concatMap allStatesDerive d) $ Map.toList am +++allStatesDerive (DCon _ is) = is+allStatesDerive (DAny)      = []+allStatesDerive (DEps i)    = [i]++removeEps :: Automaton AState -> Automaton AState +removeEps am = +    foldr (Map.unionWith (++)) Map.empty $+         map f $ Map.toList am+    where+      f (i,ds) = Map.fromList [ (j,filter nonEpsD ds) | j <- reachableA i ]+      isEps (_,DEps _) = True+      isEps _          = False+      nonEpsD (DEps _) = False+      nonEpsD _        = True+      erules       = filter isEps $ concatMap (\(i,ds) -> [(i,d)|d<-ds]) $ Map.toList am+      aStates      = allStates am+      (graph,v2n,k2v) = graphFromEdges $ map (\(i,is) -> (i,i,is)) $+                            Map.toList $ Map.fromListWith (++) $+                              (map (\(i,DEps j) -> (j,[i])) erules+                               ++ map (\i->(i,[i])) aStates)+      reachableA k = map (\(n,_,_) -> n) $ map v2n $ reachable graph (fromJust $ k2v k) +                           +              +type AmbSet   s = Set s+type UnAmbSet s = Set s+type OLSet    s = Set (s,s)+type UnOLSet  s = Set (s,s)+type InjSet     = Set Name+type NonInjSet  = Set Name+type CAConf   s = (AmbSet s, UnAmbSet s, OLSet s, UnOLSet s, InjSet, NonInjSet)++initCAConf = (Set.empty,Set.empty,Set.empty,Set.empty,Set.empty,Set.empty)++ambset    (s,_,_,_,_,_) = s+unambset  (_,s,_,_,_,_) = s +olset     (_,_,s,_,_,_) = s +unolset   (_,_,_,s,_,_) = s+injset    (_,_,_,_,s,_) = s  +noninjset (_,_,_,_,_,s) = s  ++getAmbSet :: Ord s => State (CAConf s) (AmbSet s)+getAmbSet   = get >>= (return . ambset)++getUnAmbSet :: Ord s => State (CAConf s) (UnAmbSet s)+getUnAmbSet = get >>= (return . unambset)++getOLSet :: Ord s => State (CAConf s) (OLSet s)+getOLSet    = get >>= (return . olset)++getUnOLSet :: Ord s => State (CAConf s) (UnOLSet s)+getUnOLSet  = get >>= (return . unolset)++getInjSet :: State (CAConf s) InjSet+getInjSet   = get >>= (return . injset)++getNonInjSet :: State (CAConf s) NonInjSet+getNonInjSet = get >>= (return . noninjset)++addAmb    x = do { (a,ua,o,uo,inj,ninj) <- get; put (Set.insert x a,ua,o,uo,inj,ninj) }+addUnAmb  x = do { (a,ua,o,uo,inj,ninj) <- get; put (a,Set.insert x ua,o,uo,inj,ninj) }+addOL     x = do { (a,ua,o,uo,inj,ninj) <- get; put (a,ua,Set.insert x o,uo,inj,ninj) }+addUnOL   x = do { (a,ua,o,uo,inj,ninj) <- get; put (a,ua,o,Set.insert x uo,inj,ninj) }+addInj    x = do { (a,ua,o,uo,inj,ninj) <- get; put (a,ua,o,uo,Set.insert x inj,ninj) }+addNonInj x = do { (a,ua,o,uo,inj,ninj) <- get; put (a,ua,o,uo,inj,Set.insert x ninj) }++checkAmbiguity :: Ord s => Automaton s -> s -> State (CAConf s) Bool+checkAmbiguity am s = +    do { amb    <- getAmbSet +       ; unamb  <- getUnAmbSet+       ; if (Set.member s amb) then +             return True+         else if (Set.member s unamb) then +             return False+         else+             do { b <- checkAmb am unamb s +                ; when (not b) (addUnAmb s)+                ; return b } }+    where+      distinctPairs ds = let vs = zip ds [0..]+                         in [ (d1,d2) | (d1,i) <- vs, (d2,j) <- vs, i < j ]+      checkOL (d1,d2) = checkOverlap am (Set.empty) d1 d2 +      checkAmb am env s =+          let derives = fromJust $ Map.lookup s am +              dPairs  = distinctPairs derives+          in do { rs <- mapM checkOL dPairs +                ; if or rs then +                      addAmb s >> return True+                  else +                      do { let ss = [ s | d <- derives, s <- allStatesDerive d, not (Set.member s env) ]+                         ; rs <- mapM (checkAmb am (Set.insert s env)) ss+                         ; return $ or rs }}+    ++checkOverlap am env (DEps s1)    (DEps s2) = checkOverlapS am env s1 s2+checkOverlap am env (DCon c1 s1) (DCon c2 s2)+    | c1 == c2 =+        do { rs <- mapM (uncurry (checkOverlapS am env)) $ zip s1 s2+           ; return $ and rs }+    | otherwise = return False++checkOverlap am env DAny _ = return True+checkOverlap am env _ DAny = return True+checkOverlap am env _ _    = return False++checkOverlapS :: Ord s => Automaton s -> Set (s,s) -> s -> s -> State (CAConf s) Bool+checkOverlapS am env s1 s2 +    | Set.member (s1,s2) env || Set.member (s2,s1) env +      = return False +    | otherwise +      = do { ol  <- getOLSet +           ; uol <- getUnOLSet+           ; if Set.member (s1,s2) ol || Set.member (s2,s1) ol then +                 return True+             else if Set.member (s1,s2) uol || Set.member (s2,s1) uol then +                 return False+             else+                 let derives1 = fromJust $ Map.lookup s1 am +                     derives2 = fromJust $ Map.lookup s2 am +                     comb     = [ (d1,d2) | d1 <- derives1, d2 <- derives2 ]+                 in do { rs <- mapM (uncurry $ checkOverlap am (Set.insert (s1,s2) env)) comb+                       ; if all not rs then +                             do { when (Set.null env) (addUnOL (s1,s2))+                                ; return False }+                         else+                             do { addOL (s1,s2)+                                ; return True } }}+                                       +
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Shapify.hs view
@@ -0,0 +1,173 @@+module Shapify where++import Util +import AST++import Data.Map (Map)+import qualified Data.Map as Map++import Data.Function (fix)+import Data.Maybe+import Data.List ((\\), intersect)++-- replaces  "Nil :: Unit"            -> "Z"+--           "Cons(_,y) :: List Unit" ->  S(y)+introNat :: AST -> AST +introNat (AST decls) =+    AST $ map introNatD decls +    where+      natT = TCon (Name "Nat") []+      zP i   = PCon i natT (Name "Z") []+      sP i x = PCon i natT (Name "S") [x]+      zE i   = ECon i natT (Name "Z") []+      sE i x = ECon i natT (Name "S") [x]+      introNatD (Decl f (TFun is ts t) ps e) =+          let ts' = map replT ts +              t'  = replT t+              ps' = map replP ps+              e'  = replE e+          in Decl f (TFun is ts' t') ps' e'+      replT (TCon (Name "List") [TCon (Name "Unit") []]) +          = TCon (Name "Nat") []+      replT (TVar i)    = TVar i+      replT (TCon c ts) = TCon c (map replT ts)++      replP (PVar i (TCon (Name "List") [TCon (Name "Unit") []]) x)+          = PVar i (TCon (Name "Nat") []) x+      replP (PVar i t x) +          = PVar i (replT t) x +      replP (PCon i (TCon (Name "List") [TCon (Name "Unit") []]) +                      (Name "Nil") [])+          = zP i+      replP (PCon i (TCon (Name "List") [TCon (Name "Unit") []])+                      (Name "Cons") [x,y])+          = sP i (replP y)+      replP (PCon i t c ps)+          = PCon i (replT t) c (map replP ps)+ +      replE (EVar i (TCon (Name "List") [TCon (Name "Unit") []]) x)+          = EVar i (TCon (Name "Nat") []) x+      replE (EVar i t x) +          = EVar i (replT t) x +      replE (ECon i (TCon (Name "List") [TCon (Name "Unit") []]) +                      (Name "Nil") [])+          = zE i +      replE (ECon i (TCon (Name "List") [TCon (Name "Unit") []])+                      (Name "Cons") [x,y])+          = sE i (replE y)+      replE (ECon i t c es) = ECon i (replT t) c (map replE es)+      replE (EFun i t f es) = EFun i (replT t) f (map replE es)+      ++-- removes parameters/arguments of which type is Unit+-- FIXME: This function only checks "Unit" but no singleton types.+specializeUnit :: AST -> AST+specializeUnit (AST decls) =+    assignIDsAST $ AST $ map spUnitD decls +    where+      spUnitD (Decl f (TFun is ts t) ps e) =+          let isUnits = map isUnit ts +              ts'     = map fst $ filter (\(_,b) -> not b) $ zip ts isUnits +              ps'     = map fst $ filter (\(_,b) -> not b) $ zip ps isUnits +          in Decl f (TFun is ts' t) ps' (spUnitE e)+      spUnitE (EVar i t x)    = EVar i t x+      spUnitE (ECon i t c es) = ECon i t c (map spUnitE es)+      spUnitE (EFun i t f es) = +          let isUnits = map isUnit (map typeofE es) +              es'     = map fst $ filter (\(_,b) -> not b) $ +                          zip (map spUnitE es) isUnits +          in EFun i t f es' +      isUnit (TCon (Name "Unit") []) = True+      isUnit _                       = False+              ++-- replaces all "e::t" -> "Unit::Unit"+--          and "p::t" -> "Unit::Unit" +-- in functions with type +--              "forall ... t ... . ..."+shapify :: AST -> AST+shapify (AST decls) = --AST $ map shapifyD decls +    specializeUnit $ +     AST $ fix (\f proced pend rdecls -> +                 let rest = pend \\ proced +                 in if null rest then +                        rdecls +                    else+                        let decls' = shapifySig rest+                            pend'  = collectPending decls'+                        in f (rest++proced) pend' (decls'++rdecls))+            [] initPend []+    where+--       initPend = Map.toList $ Map.fromList $ map +--                    (\(Decl f (TFun is ts t) _ _) -> +--                         (f,TFun [] (map (replT is) ts) (replT is t))) decls+      initPend = Map.toList $ Map.fromList $ map+                  (\(Decl f (TFun is _ _) _ _) -> (f,is)) decls++      unitT = TCon (Name "Unit") []+      unitP i = PCon i unitT (Name "Unit") []+      unitE i = ECon i unitT (Name "Unit") []+              +      signituresMap +          = Map.fromList $ map +            (\(Decl f (TFun is ts t) _ _) -> (f,TFun is ts t)) decls++      collectPending decls =+          snub $ concatMap (\(Decl _ _ _ e) -> funCallsWithT e) decls+      funCallsWithT (EVar _ _ _)    = []+      funCallsWithT (ECon _ _ _ es) = concatMap funCallsWithT es+      funCallsWithT (EFun _ _ (IName f is) es) +          = (Name f,is):concatMap funCallsWithT es +      funCallsWithT (EFun _ _ _ es) = concatMap funCallsWithT es +--       funCallsWithT (EFun t f es) = (f,TFun [] (map typeofE es) t):+--                                        concatMap funCallsWithT es+      shapifySig [] = []+      shapifySig ((f,is'):rs)+          = concatMap (\(d@(Decl g (TFun _ _ _) _ _))  ->+                           if f == g then +                               [shapifyD is' d]+                           else+                               []+                           ) decls ++shapifySig rs +      unifyU []                                   = []+      unifyU ((TCon (Name "Unit") [], TVar i):rs)    = i:unifyU rs+      unifyU ((TVar i, TCon (Name "Unit") []):rs)    = i:unifyU rs+      unifyU ((TCon c ts, TCon c' ts'):rs) | c == c' = unifyU (zip ts ts') ++ unifyU rs+      unifyU (_:rs)                                  = unifyU rs +      shapifyD is' (Decl (Name s) (TFun is ts t) ps e)+          = let ftype = (TFun (is\\is') (map (replT is') ts) (replT is' t))+            in Decl (IName s is') ftype+                   (map (replP is') ps) (replE is' e)+      replT is (TVar i) | i `elem` is = unitT+                        | otherwise   = TVar i +      replT is (TCon c ts) = TCon c (map (replT is) ts)++      replP is p = +          case typeofP p of +            TVar i | i `elem` is -> unitP (idofP p) +            _ -> +                case p of +                  PVar i t x    -> PVar i (replT is t) x+                  PCon i t c ps -> PCon i (replT is t) c (map (replP is) ps)++      replE is e = +          case typeofE e of +            TVar i | i `elem` is -> unitE (idofE e)+            _ -> +                case e of +                  EVar i t x    -> EVar i (replT is t) x+                  ECon i t c es -> ECon i (replT is t) c (map (replE is) es)+                  EFun i t (IName f _) es ->+                      funCallE i is t f es                       +                  EFun i t (Name f) es ->+                      funCallE i is t f es+          where funCallE i is t f es = +                    let es' = map (replE is) es +                        TFun is' ts' t' +                            = fromJust $ Map.lookup (Name f) signituresMap +                        ts  = map typeofE es' +                        is'' = intersect +                                 is' +                                 (snub $ unifyU $ zip (t:ts) (t':ts'))+                    in  +                      EFun i (replT is t) (IName f is'') es'
+ Type.hs view
@@ -0,0 +1,283 @@+module Type (eraseType, eraseTypeT, typeInference) where++import AST ++import Data.Graph +import Control.Monad.State+import Control.Monad.Error+import Util+import Data.Maybe+import Data.List (nub,nubBy,union)++import Data.Map (Map)+import qualified Data.Map as Map++-- type erasure+eraseType (AST decls) =+    AST $ map (\(Decl f ftype ps e) ->+             Decl f FTUndet (map eraseTypeP ps) (eraseTypeE e)) decls ++eraseTypeP (PVar id t varname)   +    = PVar id TUndet varname+eraseTypeP (PCon id t conname ps)+    = PCon id TUndet conname (map eraseTypeP ps)++eraseTypeE (EVar id t varname) +    = EVar id TUndet varname +eraseTypeE (ECon id t conname es)+    = ECon id TUndet conname (map eraseTypeE es)+eraseTypeE (EFun id t funname es)+    = EFun id TUndet funname (map eraseTypeE es)++eraseTypeT (TAST decls) = +    TAST $ map (\(TDecl f ps es bs) -> +                    TDecl f (map eraseTypeP ps) (map eraseTypeE es)bs) decls++-- type inference++initTMap :: [ (Name, FType) ]+initTMap =+    [ (Name "Z",   TFun [] [] (TCon (Name "Nat") [])),+      (Name "S",   TFun [] [TCon (Name "Nat") []] (TCon (Name "Nat") [])),+      (Name "Nil",  TFun [0] [] (TCon (Name "List") [TVar 0])),+      (Name "Cons", TFun [0] [TVar 0, TCon (Name "List") [TVar 0]] +                (TCon (Name "List") [TVar 0])) ]+++typeInference (AST decls) = +    do { (decls',_,_) <- +             foldr (\decls m -> +                        do (rdecls, tMap,  icount)  <- m+                           (decls', tMap', icount') <- inferenceStep decls tMap icount+                           return $ (decls'++rdecls, tMap', icount')+                   ) (return ([],initTMap,initIcount)) declss+       ; return $ AST decls' } +    where+      initIcount = max 1 ((foldr max 0 $ map maxTVarCount decls)+1) -- FIXME +      declss = +          let scc = stronglyConnComp callGraph +          in reverse $ map (\x -> case x of +                           AcyclicSCC f  -> +                               filter (\(Decl g _ _ _) -> f == g) decls+                           CyclicSCC  fs -> +                               filter (\(Decl g _ _ _) -> g `elem` fs) decls) scc+--      callGraph = map (\f -> (f,f,snub $ f:funCallsE e)) $+--                     grupBy $ map (\(Decl f _ _ _) -> f) decls+      callGraph = +          let fMap  = Map.fromListWith union $ +                       map (\(Decl f _ _ e) -> (f,f:funCallsE e)) decls +              fMap' = Map.map (snub) fMap +          in map (\(f,fs) -> (f,f,fs)) $ Map.toList fMap'+      funCallsE (EVar _ _ v)    = []+      funCallsE (EFun _ _ f es) = f:concatMap funCallsE es +      funCallsE (ECon _ _ _ es) = concatMap funCallsE es +++maxTVarCount (Decl f t ps e) =+    (maxTVarFT t) +    `max` (foldr max 0 $ map maxTVarP ps) +    `max` (maxTVarE e)+    where+      maxTVarFT FTUndet        = 0 +      maxTVarFT (TFun is ts t) = foldr max 0 is+      maxTVarP  (PVar _ t _)    = fromT t+      maxTVarP  (PCon _ t _ ps) = fromT t `max` +                                  (foldr max 0 $ map maxTVarP ps)+      maxTVarE  (EVar _ t _)    = fromT t +      maxTVarE  (EFun _ t _ es) = fromT t `max`+                                  (foldr max 0 $ map maxTVarE es)+      maxTVarE  (ECon _ t _ es) = fromT t `max`+                                  (foldr max 0 $ map maxTVarE es)+      fromT (TUndet) = 0+      fromT (TVar i) = i +      fromT (TCon _ ts) = +          foldr max 0 $ map fromT ts ++inferenceStep decls tmap icount = +      do { (decls0,  (tmpMap, icount0)) <- runStateT (makeInitConstr tmap decls) ([],icount)+         ; (decls' , (constr, icount')) <- runStateT (mapM (assignTypeVars tmpMap tmap) decls0) ([],icount0)+         ; (tmpMap', etypeMap') <- solveConstr tmpMap constr+         ; let decls'' = map (repl tmpMap' etypeMap') decls'+         ; return (decls'', tmpMap' ++ tmap, icount') }+        where +          repl tM cM (Decl f ftype ps e) =+              Decl f (fromJust $ lookup f tM) (map replP ps) (replE e)+              where+                replP (PVar id (TVar i) v)    +                    = PVar id (fromJust $ lookup i cM) v+                replP (PCon id (TVar i) c ps)+                    = PCon id (fromJust $ lookup i cM) c (map replP ps)+                replE (EVar id (TVar i) v)+                    = EVar id (fromJust $ lookup i cM) v+                replE (ECon id (TVar i) c es)+                    = ECon id (fromJust $ lookup i cM) c (map replE es)+                replE (EFun id (TVar i) c es)+                    = EFun id (fromJust $ lookup i cM) c (map replE es)+          extractConstr ds = map (\(Decl f t _ _) -> (f,t)) $+                                nubBy isSameFunc ds++++solveConstr tmpMap constr +    = substStep constr (tmpMap, rearrange constr)+    where +      introForAll (k,TFun _ ts t) =+          let vs = snub $ varsT t ++ concatMap varsT ts +          in (k,TFun vs ts t)+      rearrange constr = +          let vs = nub $ concatMap (\(t1,t2) -> varsT t1 ++ varsT t2) constr +          in map (\x -> (x,TVar x)) vs                +      varsT (TVar i)    = [i]+      varsT (TCon _ ts) = concatMap varsT ts +      varsT (TUndet)    = []+      substStep [] (tM,cM) = return (map introForAll tM,cM)+      substStep ((t,t'):cs) (tM,cM) =+          do { subs <- unify t t'+             ; substStep+                  (performSubstC subs cs)+                  (performSubstTM subs tM, performSubstCM subs cM) }+      performSubstC subs cs+          = map (\(t1,t2) -> (performSubstT subs t1, performSubstT subs t2)) cs+      performSubstTM subs tM +          = map (\(k,v) -> (k, performSubstFT subs v)) tM+      performSubstCM subs cM+          = map (\(k,v) -> (k, performSubstT subs v)) cM+      performSubstFT subs (TFun is ts t) +          = TFun [] (map (performSubstT subs) ts) (performSubstT subs t)+      performSubstT subs (TUndet) = TUndet +      performSubstT subs (TVar i) = +          case lookup (TVar i) subs of +            Just t' -> t'+            _       -> TVar i+      performSubstT subs (TCon c ts) =+          TCon c (map (performSubstT subs) ts)+      unify :: Type -> Type -> Either String [ (Type, Type) ]+      unify (TVar i) t | not (i `elem` varsT t) = return [ (TVar i, t) ]+      unify t (TVar i) | not (i `elem` varsT t) = return [ (TVar i, t) ]+      unify (TVar i) (TVar j) | i == j = return []+      unify (TCon c ts) (TCon c' ts') | c == c' +          = do { ss <- mapM (uncurry unify) $ zip ts ts'+               ; return $ concat ss }+      unify t t' = throwError $ "Can't unify types: " ++ show ( ppr (t,t'))+                 +    +               ++makeInitConstr tmap decls =+    do { mapM_ (\(Decl f t ps e) ->+                      do { tmpMap <- getTmpMap +                         ; case t of+                             FTUndet -> +                                 case lookup f tmpMap of +                                   Just t' -> +                                       return ()+                                   _ -> +                                       do { i  <- newTypeVar +                                          ; is <- mapM (\_->newTypeVar) ps +                                          ; let t' = TFun [] (map TVar is) (TVar i) +                                          ; putTmpMap ((f,t'):tmpMap)+                                          ; return ()  }+                             _ -> +                                 putTmpMap ((f,t):tmpMap)}) $ +         (nubBy isSameFunc decls)+       ; tmpMap <- getTmpMap+       ; let decls' = map (\(Decl f t ps e) -> +                             Decl f (fromJust $ lookup f tmpMap) ps e) decls+       ; return decls' }+    where getTmpMap    = do { (tmpMap,i) <- get; return tmpMap }+          putTmpMap tm = do { (_,i) <- get; put (tm,i) }+          newTypeVar   = do { (tm,i) <- get; put (tm,i+1); return i}++    +               ++assignTypeVars tmpMap typeMap (Decl fname ftype ps e) =+    do ps' <- mapM assignTypeVarsP ps+       e'  <- assignTypeVarsE      e+       unifyFT ftype (TFun [] (map typeofP ps') (typeofE e'))+       let vtp = concatMap vtMapP ps'+       let vte = vtMapE e'+       mapM_ (\(x,t) -> case (lookup x vte) of +                          { Just t' -> unifyT t t'; _ -> return ()}) vtp +       mapM_ (\(x,t) -> case (lookup x vte) of +                          { Just t' -> unifyT t t' }) vte +       return $ Decl fname ftype ps' e'+    where+      vtMapP (PVar _ t x)    = [(x,t)]+      vtMapP (PCon _ _ c ps) = concatMap vtMapP ps +      vtMapE (EVar _ t x)    = [(x,t)]+      vtMapE (ECon _ _ c es) = concatMap vtMapE es+      vtMapE (EFun _ _ c es) = concatMap vtMapE es+--      newTypeVar :: State ( [(Type,Type)], Int ) Int+      newTypeVar = do { (constr, icount) <- get+                      ; put (constr, icount+1)+                      ; return icount }+      addConstr s t = do { (constr, icount) <- get+                           ; put ((s,t):constr, icount) }+      assignTypeVarsP (PVar id t v) = +          do { i <- newTypeVar+             ; unifyT t (TVar i) +             ; return $ PVar id (TVar i) v } +      assignTypeVarsP (PCon id t c ps) = +          do { i <- newTypeVar+             ; case lookup c typeMap of+                 Just t' -> +                     do { ps' <- mapM assignTypeVarsP ps +                        ; unifyFT t' (TFun [] (map typeofP ps') (TVar i))+                        ; unifyT  t  (TVar i)+                        ; return $ PCon id (TVar i) c ps' }+                 Nothing -> fail $ "No entry " ++ show c ++ " in type map"+             }+      assignTypeVarsE (EVar id t v) = +          do { i <- newTypeVar +             ; unifyT t (TVar i)+             ; return $ EVar id (TVar i) v }+      assignTypeVarsE (ECon id t c es) =+          do { i <- newTypeVar+             ; case lookup c typeMap of+                 Just t' -> +                     do { es' <- mapM assignTypeVarsE es +                        ; unifyFT t' (TFun [] (map typeofE es') (TVar i))+                        ; unifyT  t  (TVar i)+                        ; return $ ECon id (TVar i) c es' }+                 Nothing -> fail $ "No entry " ++ show c ++ " in type map"+             }+      assignTypeVarsE (EFun id t f es) =+          do { i <- newTypeVar+             ; case lookup f (typeMap ++ tmpMap)  of+                 Just t' -> +                     do { es' <- mapM assignTypeVarsE es +                        ; unifyFT t' (TFun [] (map typeofE es') (TVar i))+                        ; unifyT  t  (TVar i)+                        ; return $ EFun id (TVar i) f es' }+                 _ ->+                     fail $ (show f ++ " is not in " ++ show (typeMap ++ tmpMap))+             }+--      unifyT :: Type -> Type -> State ([(Type,Type)],Int) ()+      unifyT (TUndet) _ = return ()+      unifyT _ (TUndet) = return ()+      unifyT (TVar i) (TVar j) | i == j = return ()+      unifyT t t'       = addConstr t t'+      unifyFT (FTUndet) _ = return ()+      unifyFT _ (FTUndet) = return ()+      unifyFT t t' = +          do { s  <- escapeForAll t +             ; s' <- escapeForAll t'+             ; case (s,s') of +                 (TFun _ ts t, TFun _ ts' t') ->+                     mapM_ (uncurry unifyT) $ zip (t:ts) (t':ts') }+      escapeForAll (TFun is ts t) =+          do { is' <- mapM (\_ -> newTypeVar) is +             ; let ts' = map (replaceTVar (zip is is')) ts+             ; let t'   = replaceTVar (zip is is') t +             ; return $ TFun [] ts' t'}+      replaceTVar table TUndet = TUndet+      replaceTVar table (TVar i) =+          case lookup i table of+            Just j -> TVar j +            _      -> TVar i+      replaceTVar table (TCon t ts) =+          TCon t (map (replaceTVar table) ts)++                     +                          
+ Util.hs view
@@ -0,0 +1,44 @@+module Util where ++import Text.PrettyPrint+import Data.List (group, sort)++class Ppr a where+    ppr :: a -> Doc +    pprList :: [a] -> Doc +    pprList as = brackets (sep $ punctuate comma (map ppr as))+++instance (Ppr Int) where +    ppr i = int i ++instance (Ppr Integer) where+    ppr i = integer i +++instance (Ppr a, Ppr b) => Ppr (a,b) where+    ppr (a,b) = parens (sep $ punctuate comma [ppr a, ppr b])++instance (Ppr a, Ppr b, Ppr c) => Ppr (a,b,c) where +    ppr (a,b,c) = parens (sep $ punctuate comma [ppr a, ppr b, ppr c])++instance Ppr a => Ppr [a] where+    ppr as    = pprList as -- brackets (sep $ punctuate comma (map ppr as))++instance Ppr Char where+    ppr c     = char c+    pprList s = text s++instance (Ppr a, Ppr b) => Ppr (Either a b) where+    ppr (Left a)  = text "Left"  <+> ppr a +    ppr (Right b) = text "Right" <+> ppr b++instance (Ppr a) => Ppr (Maybe a) where+    ppr (Nothing) = text "Nothing"+    ppr (Just a)  = text "Just" <+> ppr a +++{-# SPECIALIZE snub :: [Int] -> [Int] #-}+{-# SPECIALIZE snub :: [String] -> [String] #-}+snub :: Ord a => [a] -> [a]+snub = map head . group .  sort  
+ b18n-combined-cgi.hs view
@@ -0,0 +1,567 @@+{-# LANGUAGE RecordWildCards #-}+import Network.CGI+import Text.XHtml+import Data.Maybe+import Data.List+import Data.ByteString.Lazy.UTF8 (fromString)+import qualified Data.ByteString.Lazy as BS+import Control.Monad+import Control.Applicative ((<$>))+import Text.PrettyPrint.HughesPJ (render)+import System.IO+import System.IO.Error hiding ( catch )+import System.Directory+import Prelude hiding ( catch )+import Control.Exception+import System.Posix.Files ( isDirectory, getSymbolicLinkStatus )+import System.Posix.Env+++import Parser+import SemSyn+import AST++import MyInterpret+import BundledCode+import JQuery++{-------------------------+ - Types (Logic/Presentation interface+ -------------------------}++data PageInfo = PageInfo+    { config :: Config+    , scrollX :: Maybe String+    , scrollY :: Maybe String+    , viewFunction :: String+    , astError :: Maybe String+    , generatedModuleMB :: Maybe String+    , showCode :: Bool+    , playCodeMB :: Maybe String+    , playErrorM :: Maybe String+    } ++data Run = Get | Check | Load | BiDi | EvalPut | EvalGet++{-------------------------+ - Default and example data+ -------------------------}++examples :: [(String, String)]+examples =+	[ ("init", unlines+		[ "init []      = []"+		, "init [a]     = []"+		, "init (a:b:x) = a:initWork b x"+		, ""+		, "initWork a []    = []"+		, "initWork a (b:x) = a:initWork b x"+		])+	, ("tail", unlines+		[ "tail []     = []"+		, "tail (x:xs) = xs"+		])+	, ("sieve", unlines+		[ "sieve []      = []"+		, "sieve [a]     = []"+		, "sieve (a:b:x) = b:sieve x"+		])+	, ("halve", unlines+		[ "halve []    = []"+		, "halve (a:x) = a:halveWork x x"+		, ""+		, "halveWork xs    []      = []"+		, "halveWork xs    [x]     = []"+		, "halveWork (a:x) (b:c:y) = a:halveWork x y"+		])+	, ("rev", unlines+		[ "reverse []     = []"+		, "reverse (x:xs) = rev xs [x]"+		, ""+		, "rev []    y = y"+		, "rev (a:x) y = rev x (a:y)"+		])+	]++defaultPlayCode :: Config -> String -> Maybe String+defaultPlayCode (Config{ b18nMode = SyntacticB18n}) get =+        Just $ unlines+            [ "get s = Main." ++ get ++ " s"+            , "put s v = " ++ get ++ "_B s v"+            , ""+            , "source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"+            ]+defaultPlayCode (Config{ b18nMode = SemanticB18n}) get =+        Just $ unlines+            [ "get s = Main." ++ get ++ " s"+            , "put s v = " ++ get ++ "_B s v"+            , ""+            , "source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"+            ]+defaultPlayCode (Config{ b18nMode = CombinedB18n}) get =+        Just $ unlines+            [ "get s = Main." ++ get ++ " s"+            , "put s v = fromMaybe (error \"Could not handle shape change.\") $ " +++                 get ++ "_Bbd bias default_value s v"+            , "bias = rear         -- or another option, e.g., front, middle, borders"+            , "default_value = 42  -- or another value of the element type of source"+            , ""+            , "source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"+            ]++defaultCode :: String+defaultCode = fromJust (lookup "init" examples)++{-------------------------+ - Program logic+ -------------------------}++-- This function will not work in all casses, but in most.+delDefinition :: String -> String -> String+delDefinition name code = unlines squashed+  where filtered = filter (not . defines name) (lines code)+	squash [] = []+	squash ("":_) = [""]+	squash ("\r":_) = [""]+	squash ls = ls+	squashed = concat $ map squash $ group $ filtered++addDefinition :: String -> String -> String -> String+addDefinition name def code = unlines (squashed ++ pad ++ new_line)+  where	squashed = lines (delDefinition name code)+	pad | last squashed == "" || last squashed == "\r" = []+            | otherwise                                    = [""]+	new_line = [name ++ " = " ++ def]+	+defines :: String -> String -> Bool+defines "" (' ':_) = True+defines "" ('=':_) = True+defines "" "" = False+defines "" _   = False+defines _  ""  = False+defines (i:is) (x:xs) | i == x    = defines is xs+                      | otherwise = False++formMain :: CGI CGIResult+formMain = do+        setHeader "Content-type" "text/html; charset=UTF-8"++        conf <- do+            b18nMode' <- maybe CombinedB18n read <$> getInput "b18nMode"+            return $ adjustConfig $ defaultConfig+                { isHaskellify = True+                , b18nMode = b18nMode'+                }+	+	todo <- msum <$> sequence (+            map (\what -> fmap (const what) <$> getInput (submitId what))+            [ BiDi, Get, Check, Load, EvalPut, EvalGet])+        +	code <- filter (/= '\r') <$> fromMaybe defaultCode <$> getInput "code"++        code <- case todo of+            Just Load -> do loadWhat <- getInput "loadCode"+                            return $ fromMaybe code $ loadWhat >>= flip lookup examples +            _ -> return code+        +        let eAST = parseString code+++        let astError = either (Just . show) checkBidirectionalizability eAST++        let (genCodeM,getM) = case (todo,eAST) of+                (Just Load, _) -> (Nothing, Nothing)+                (Just _, Right ast) ->+                    (  Just $ render $ renderCode conf ast+                    ,  firstDeclaredName ast+                    )+                _ -> (Nothing, Nothing)++        showCode <- maybe False read <$> getInput "showCode"++        pcM <- getInput "playCode" +        (playCode, playErrorM) <-+            case (todo,getM,genCodeM,pcM) of+            -- The user successfully generated code to play with, insert default playCode.+            -- Do not use the user input, as he probably switched to a new example.+            (Just BiDi, Just get, Just _, _) ->+                return (defaultPlayCode conf get, Nothing)+            -- The user played with the code+            (Just EvalGet, Just get, Just genCode, Just pc) -> do+                view <- liftIO $ evaluateWith genCode pc ("get source")+                case view of +                    Left err -> return $ (Just pc, Just err)+                    Right dat -> return $ (\r -> (Just r, Nothing))+                                        $ addDefinition "view" dat +                                        $ delDefinition "result"+                                        $ pc+            (Just EvalGet, Just get, Just genCode, Nothing) -> do+                return (defaultPlayCode conf get, Nothing)+            (Just EvalPut, Just get, Just genCode, Just pc) -> do+                view <- liftIO $ evaluateWith genCode pc ("put source view")+                case view of +                    Left err -> return $ (Just pc, Just err)+                    Right dat -> return $ (\r -> (Just r, Nothing))+                                        $ addDefinition "result" dat +                                        $ pc+            (Just EvalPut, Just get, Just _, Nothing) -> do+                return (defaultPlayCode conf get, Nothing)+            _ -> return (Nothing, Nothing)++        scrollX <- getInput "scrollx"+        scrollY <- getInput "scrolly"++        outputFPS $ fromString $ showHtml $ page $+            PageInfo conf+                     scrollX+                     scrollY+                     code+                     astError+                     genCodeM+                     showCode+                     playCode+                     playErrorM++evaluateWith :: String -> String -> String -> IO (Either String String)+evaluateWith genCode playCode expr =+    withinTmpDir $ do+        BS.writeFile "BUtil.hs" bUtilCode+        writeFile "Main.hs" $ "module Main where\n" ++ genCode+        liftIO $ catchInterpreterErrors $ simpleInterpret mods imports playCode expr+  where mods = +            [ "BUtil"+            , "Main"+            --, "Data.Maybe"+            ]+        imports = mods +++            [ "Data.Maybe"+            , "Prelude"+            ]++{-------------------------+ - CGI Interface+ -------------------------}++main :: IO ()+main = runCGI (handleErrors cgiMain)++cgiMain :: CGI CGIResult+cgiMain = do+    qs <- queryString+    if qs == "jquery"+     then jQueryMain+     else formMain++jQueryMain :: CGI CGIResult+jQueryMain = do+        setHeader "Content-type" "text/javascript"+        setHeader "Expires" "Fri, 01 Jan 2100 00:00:00 +0100"+        setHeader "Cache-control" "max-age=36000000" -- 1000 h+        outputFPS $ jQueryCode+    ++{-------------------------+ - HTML generation+ -------------------------}++submitId :: Run -> String+submitId Get = "get source"+submitId Check = "check"+submitId Load = "load"+submitId BiDi = "submitBiDi"+submitId EvalPut = "evalPut"+submitId EvalGet = "evalGet"++submitLabel :: Run -> String+submitLabel Check =   "Re-Parse definition"+submitLabel Load  =   "Load example"+submitLabel EvalGet = "view = get source"+submitLabel EvalPut = "result = put source view"+submitLabel BiDi =    "bidirectionalize"++b18nModeName :: B18nMode -> String+b18nModeName SemanticB18n = "Semantic bidir. (POPL’09)"+b18nModeName SyntacticB18n = "Syntactic bidir. (ICFP’07)"+b18nModeName CombinedB18n = "Combined bidir. (ICFP’10)"++mkSubmit :: Bool -> Run -> Html+mkSubmit active what = submit (submitId what) (submitLabel what)+     	               ! if active then [] else [disabled]++page :: PageInfo -> Html+page (PageInfo {..}) =+       header << (+	thetitle << "(Combining) Syntactic and Semantic Bidirectionalization" ++++	style ! [ thetype "text/css" ] << cdata cssStyle ++++	script ! [ thetype "text/javascript", src "?jquery" ] << noHtml ++++        script ! [ thetype "text/javascript" ] << cdata jsCode +       ) ++++       body ! [ strAttr "onload" "restoreScroll()" ] << (+	thediv ! [theclass "top"] << (+		thespan ! [theclass "title"] << "(Combining) Syntactic and Semantic Bidirectionalization" ++++		thespan ! [theclass "subtitle"] << "Prototype implementation"+	) ++++	maindiv << (+        	p << "This tool allows you to experiment with the bidirectionalization methods described in the following papers: " ++++                ulist << (+                    li << (+                      "“" ++++		      hotlink "http://doi.acm.org/10.1145/1291151.1291162"+                        << "Bidirectionalization transformation based on automatic derivation of view complement functions" ++++		      "” (ICFP’07) by " ++++		      hotlink "http://www.kb.ecei.tohoku.ac.jp/~kztk/"+                        << "Kazutaka Matsuda" +++ ", " ++++                      "Zhenjiang Hu, " ++++                      "Keisuke Nakano, " ++++                      "Makoto Hamana, and " ++++                      "Masato Takeichi."+                    ) ++++                    li << (+                      "“" ++++		      hotlink "http://doi.acm.org/10.1145/1480881.1480904"+                        << "Bidirectionalization for free! (Pearl)" ++++		      "” (POPL’09) by " ++++		      hotlink "http://www.iai.uni-bonn.de/~jv/"+                        << "Janis Voigtländer"+                    ) ++++                    li << (+                      "“" ++++		      hotlink "http://www.iai.uni-bonn.de/~jv/icfp10.pdf"+                        << "Combining Syntactic and Semantic Bidirectionalization" ++++		      "” (ICFP’10) by " ++++                      "Janis Voigtländer" +++ ", " ++++                      "Zhenjiang Hu, " ++++                      "Kazutaka Matsuda" +++ ", and " ++++                      "Meng Wang"+                    )+		) ++++		p << (+		  "(For a stand-alone version on command line, which is also able to " ++++                  "show intermediate steps in the transformations, see " ++++		  hotlink "http://www.kb.ecei.tohoku.ac.jp/~kztk/b18n-combined/desc.html" << "here" +++ ". " ++++		  "For the technique from POPL’09 alone, a "++++		  hotlink "http://www-ps.iai.uni-bonn.de/cgi-bin/bff.cgi"+                    << "separate web interface" ++++                  " offering more features is also available.)"+		)+	) ++++        form ! [method "post",+                action "#",+                strAttr "onsubmit" "saveScroll()"+            ] << (+                hidden "scrollx" (fromMaybe "0" scrollX) ++++                hidden "scrolly" (fromMaybe "0" scrollY) ++++                hidden "showCode" (show showCode) ++++		maindiv << (+			 p << (+				"Please enter the view function. The first function "++++                                "defined will be assumed to be your view function. You "++++                                "can use the first-order functional language from the "++++                                "ICFP’07 paper, in Haskell syntax. The view function must "++++                                "have type " +++ tt << "[a] -> [a]" +++ ". You can also load "++++                                "some predefined examples."+			) +++++			p << (+				concatHtml (map (\(name,thisCode) -> +					radio "loadCode" name+					! (if thisCode == viewFunction then [checked] else [])+					+++ name +++ " "+				) examples) ++++				mkSubmit True Load ++++				br ++++				textarea ! [name "code", cols "120", rows "7"] << viewFunction+			) +			+		) ++++                ( case astError of +                  Just err -> +                     maindiv << p << (+                        "There was an error with the view function:" +++ br ++++                        pre << err +++ br ++++                        mkSubmit True Check ++++                        p << (+                            "The "++++                            hotlink "http://www-ps.iai.uni-bonn.de/cgi-bin/bff.cgi"+                             << "purely semantic bidirectionalization technique" ++++                            " (POPL’09) may still be able to handle your view function. "++++                            "For the combined technique (ICFP’10) it may be possible " ++++                            "to recover applicability by using some program transformation "++++                            "techniques as discussed in Section 7 of the paper."+                        )+                     )+		  Nothing -> +                    maindiv ! [ identifier "output" ]<< (+			p << ( "You can try all three bidirectionalization methods." ) ++++			p << (  concatHtml (map (\mode -> +			          radio "b18nMode" (show mode) +					! (guard (mode == b18nMode config) >> return checked)+					+++ b18nModeName mode +++ " "+                                ) [SyntacticB18n, SemanticB18n, CombinedB18n]) +++ " " ++++			       mkSubmit True BiDi+			) ++++                        ( htmlMB generatedModuleMB $ \ generatedModule -> +                            p << ("Result Code" ++++                                thespan ! [ identifier "hideShow"+                                          , thestyle "display:none"] << (+                                    " (" +++ hotlink "javascript:" << "Hide/Show" +++ ")"+                                ) +++ ":" +++ br ++++                                pre ! [identifier "genCode" ] << generatedModule++                            )++                        )+                    ) ++++                    ( htmlMB playCodeMB $ \playCode -> maindiv << ( +                        p << (  "You can now play with the code. You can modify the " ++++                                tt << "source" +++ " and calculate the " ++++                                tt << "view" +++ ", or modify the " ++++                                tt << "view" +++ " and calculate an updated "++++                                tt << "source" +++ "." +++ br ++++                                textarea ! [name "playCode", cols "120", rows "12" ] << playCode+                        ) ++++                        p << ( "Evaluate " ++++                               mkSubmit True EvalGet +++ " " ++++                               mkSubmit True EvalPut+                        )+                    )) ++++                    ( htmlMB playErrorM $ \playError -> maindiv << ( +                        p << (+                            strong << "An error occurred while evaluating your code:" +++ br ++++                            pre << playError+                            )+                    ))+		) +	) ++++        maindiv << (+	    p << (+		"The source code of this application and the underlying library can be found " ++++		hotlink "http://hackage.haskell.org/package/bidirectionalization-combined" << "on hackage" ++++		". " ++++                "The code for the web interface is based on " ++++                hotlink "http://www-ps.iai.uni-bonn.de/cgi-bin/bff.cgi" << +                    "the demo interface from “Bidirectionalization for free!”"+            ) ++++	    p << ("© 2010 Kazutaka Matsuda, Joachim Breitner <" ++++                hotlink "mailto:mail@joachim-breitner.de" << "mail@joachim-breitner.de" ++++	      ">")+	    )	+	)+       +cdata :: String -> Html+cdata s = primHtml $+    -- "<!--//--><![CDATA[//><!--\n" +++    s+    -- ++"\n//--><!]]>"++maindiv :: Html -> Html+maindiv = thediv ! [theclass "main"]++{-------------------------+ - Static Web code+ -------------------------}++cssStyle :: String+cssStyle = unlines +        [ "body { padding:0px; margin: 0px; }"+        , "div.top { margin:0px; padding:10px; margin-bottom:20px;"+        , "              background-color:#efefef;"+        , "              border-bottom:1px solid black; }"+        , "span.title { font-size:xx-large; font-weight:bold; }"+        , "span.subtitle { padding-left:30px; font-size:large; }"+        , "div.main { border:1px dotted black;"+        , "                   padding:10px; margin:10px; }"+        , "div.submain { padding:10px; margin:11px; }"+        , "p.subtitle { font-size:large; font-weight:bold; }"+        , "input.type { font-family:monospace; }"+        , "input[type=\"submit\"] { font-family:monospace; background-color:#efefef; }"+        , "span.mono { font-family:monospace; }"+        , "pre { margin:10px; margin-left:20px; padding:10px;"+        , "          border:1px solid black; }"+        , "textarea { margin:10px; margin-left:20px; padding:10px;  }"+        , "p { text-align:justify; }"+	]++jsCode :: String+jsCode = unlines +    [ "function saveScroll () {"+    , "    $('#scrolly').val($('html').scrollTop());"+    , "}"+    , "function restoreScroll () {"+    , "    $('html').scrollTop($('#scrolly').val());"+    , "}"+    , "$(document).ready(function () {"+    , "   $('#hideShow').show();"+    , "   if ($('#showCode').val() == 'False')"+    , "     { $('#genCode').hide(); };"+    , "   $('#hideShow a').click(function () {"+    , "      $('#showCode').val("+    , "         $('#genCode').is(':visible') ? 'False' : 'True'"+    , "      );"+    , "      $('#genCode').toggle('slow');"+    , "   })"+    , "})"+    ]++{-------------------------+ - Utility functions+ -------------------------}++htmlMB :: Maybe t -> (t -> Html) -> Html+htmlMB Nothing  _ = noHtml+htmlMB (Just x) f = f x++firstDeclaredName :: AST -> Maybe String+firstDeclaredName (AST []) = Nothing+firstDeclaredName (AST (Decl n _ _ _:_)) = Just (show n)++{-+ - Temp-Dir functions taken from XMonad/Lock.hs and simplified.+ - It also changes TMP so that hint’s temporary files are stored within this directory+ -}+withinTmpDir :: IO a -> IO a+withinTmpDir job = do+  absolute_name <- (++ "/sem_syn.cgi") <$> getTemporaryDirectory+  formerdir <- getCurrentDirectory+  formerTMP <- getEnv "TMPDIR"+  bracket (do dir <- create_directory absolute_name 0+              setEnv "TMPDIR" dir True  +              return dir+          )+          (\dir -> do setCurrentDirectory formerdir+                      maybe (unsetEnv "TMPDIR") (\p -> setEnv "TMPDIR" p True) formerTMP+                      rmRecursive dir)+          (const job)+    where newname name 0 = name+          newname name n = name ++ "-" ++ show n+          create_directory :: FilePath -> Int -> IO FilePath+          create_directory name n+              = do createDirectory $ newname name n+                   setCurrentDirectory $ newname name n+                   getCurrentDirectory+                `catch` (\e -> if isAlreadyExistsError e+                               then create_directory name (n+1)+                               else throwIO e)++rmRecursive :: FilePath -> IO ()+rmRecursive d =+    do isd <- isDirectory <$> getSymbolicLinkStatus d+       if not isd+          then removeFile d+          else when isd $ do conts <- actual_dir_contents+                             withCurrentDirectory d $+                               mapM_ rmRecursive conts+                             removeDirectory d+    where actual_dir_contents = -- doesn't include . or ..+              do c <- getDirectoryContents d+                 return $ filter (/=".") $ filter (/="..") c++withCurrentDirectory :: FilePath -> IO r -> IO r+withCurrentDirectory name m =+    bracket+        (do cwd <- getCurrentDirectory+            when (name /= "") (setCurrentDirectory name)+            return cwd)+        (\oldwd -> setCurrentDirectory oldwd)+        (const m)+
+ bidirectionalization-combined.cabal view
@@ -0,0 +1,38 @@+Name:                bidirectionalization-combined+Version:             0.1+Synopsis:            Prototype Implementation of Combining Syntatic and Semantic Bidirectionalization (ICFP'10)+Description:         This is a prototype implementation of the idea presented +                     in Combining Syntatic and Semantic Bidirectionalization +                     by Janis Voigtlaender, Zhenjiang Hu, Kazutaka Matsuda +                     and Meng Wang.+		     .+		     This package builds two executables to experiment with the system,+		     a command line program "b18-combined" and a CGI based web interface+		     "b18n-combined-cgi". The latter is also available on+		     http://www.kb.ecei.tohoku.ac.jp/~kztk/b18n-combined/+License:             PublicDomain+Author:              Kazutaka Matsuda, Joachim Breitner+Maintainer:          kztk@kb.ecei.tohoku.ac.jp+Homepage:	     http://www.kb.ecei.tohoku.ac.jp/~kztk/b18n-combined/desc.html+Category:            Language+Build-type:          Simple+Cabal-version:       >=1.6+Extra-source-files:  example/*.txt BundledCode.hsb JQuery.hsb jquery.min.js README+Data-files:          BUtil.hs++source-repository head+  type:     darcs+  location: http://www.kb.ecei.tohoku.ac.jp/~kztk/darcs/sem_syn/++Executable b18n-combined+  Main-is: Main.hs            +  Build-depends: base >=4 && <5, mtl, template-haskell, containers, pretty, parsec+  Other-modules: Util, AST, Parser, Type, Shapify, CodeGen, SemSyn++Executable b18n-combined-cgi+  Main-is: b18n-combined-cgi.hs+  Build-depends: base >=4 && <5, mtl, template-haskell, containers, pretty, directory,+                 parsec, xhtml, cgi, utf8-string, bytestring,+                 unix, hint >= 0.3.2+  Other-modules: Util, AST, Parser, Type, Shapify, CodeGen, SemSyn,+                 MyInterpret, BundledCode, JQuery
+ example/init.txt view
@@ -0,0 +1,5 @@+init []          = []+init [a]         = []+init (a:b:x)     = a:initWork b x+initWork a []    = []+initWork a (b:x) = a:initWork b x
+ example/initHalf.txt view
@@ -0,0 +1,17 @@+--  This program requires further preprocessing +--  to get effective "put" function.+--+--  However, "shap"ication makes the preprocess easier.+--+--  After the shapificatoin, +--  we can easily observe that the first parameter +--  of initHalfWork is useless.	  ++initHalf []     = []+initHalf (a:x)  = a:initHalfWork x x++initHalfWork xs []  = []+initHalfWork xs [x] = []+initHalfWork (a:x) (b:c:y)+    = a:initHalfWork x y+
+ example/rev.txt view
@@ -0,0 +1,3 @@+reverse xs = rev xs []+rev [] y    = y +rev (a:x) y = rev x (a:y) 
+ example/sieve.txt view
@@ -0,0 +1,3 @@+sieve []      = []+sieve [a]     = []+sieve (a:b:x) = b:sieve (x)
+ jquery.min.js view
@@ -0,0 +1,154 @@+/*!+ * jQuery JavaScript Library v1.4.2+ * http://jquery.com/+ *+ * Copyright 2010, John Resig+ * Dual licensed under the MIT or GPL Version 2 licenses.+ * http://jquery.org/license+ *+ * Includes Sizzle.js+ * http://sizzlejs.com/+ * Copyright 2010, The Dojo Foundation+ * Released under the MIT, BSD, and GPL Licenses.+ *+ * Date: Sat Feb 13 22:33:48 2010 -0500+ */+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "++a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);