/* Automatically generated file (don't edit) */
/* Copyright Manuel Serrano, see Hop's LICENSE file */
/* 
Fri Nov  5 15:27:04 CET 2010
 */
var undefined;
function hop_name() {
   return "Hop";
}
function hop_version() {
   return "2.2.0";
}
function hop_backend() {
   return "native";
}
function hop_url() {
   return "http://hop.inria.fr/";
}
var hop_enable_location_event = true;
function hop_service_base() {
   return "/hop";
}
function hop_get_flash_version() {
   if( navigator.mimeTypes
       && navigator.mimeTypes[ "application/x-shockwave-flash" ] ) {
      var p = navigator.mimeTypes[ "application/x-shockwave-flash" ].enabledPlugin;
      if( p && p.description ) {
	 var d = p.description;
	 if( (typeof d == "string") && (d.indexOf( "Shockwave Flash " ) == 0) ) {
	    return parseFloat( d.substring( 16, d.indexOf( " ", 16 ) ) );
	 }
      }
   } else {
      try {
	 axo = new ActiveXObject( "ShockwaveFlash.ShockwaveFlash.7" );
	 var m = axo.GetVariable( "$version" ).match( /.+ ([0-9]+),/ );
	 if( m != null ) {
	    return m[ 1 ];
	 }
      } catch (e) {
      }
   }
   return 0;
}
function hop_Config() {
  this.cpu_speed = 100;
  if( navigator.platform.indexOf( "armv6" ) >= 0 ) this.cpu_speed = 40;
  if( navigator.platform.indexOf( "armv5" ) >= 0 ) this.cpu_speed = 30;
  if( navigator.platform.indexOf( "WinCE" ) >= 0 ) this.cpu_speed = 30;
  this.gpu_speed = 100;
  if( navigator.platform.indexOf( "armv6" ) >= 0 ) this.gpu_speed = 30;
  this.js_speed = 50;
  this.is_tablet = ( navigator.userAgent.indexOf( "Tablet" ) >= 0 );
  var audio = document.createElement( "audio" );
  this.html5_video = "play" in document.createElement( "video" );
  if( !"HTMLAudioElement" in window ) {
     this.html5_audio = false;
  } else {
    this.html5_audio = 
       ("play" in audio) && (audio.constructor === window[ "HTMLAudioElement" ]);
  }
  this.flash_version = hop_get_flash_version();
  this.flash_external_interface = false;
  this.flash_audio = false;
  this.flash_markup = "embed";
  this.geolocation = (navigator.geolocation ? true : false);
  this.mouse_left_button = 0;
  this.inline_image = false;
  this.filtered_errors = [];
  this.css = 2.1;
  this.xhr_multipart = false; 
  this.clone_innerHTML = false; 
  this.eval_innerHTML = true;
  this.websocket = false;
  if( navigator.userAgent.indexOf( "MSIE" ) >= 0 ) {
     this.js_speed = 20;
     this.navigator_family = "msie";
     this.mouse_left_button = 1;
     this.flash_external_interface = true;
     this.flash_audio = false;
     this.flash_markup = "object";
     this.inline_image = false;
     this.clone_innerHTML = true;
     if( navigator.userAgent.indexOf( "MSIE 6.0" ) >= 0 ) {
	hop_enable_location_event = false;
     }
  } else if( navigator.userAgent.indexOf( "Opera" ) >= 0 ) {
     this.js_speed = 70;
     this.navigator_family = "opera";
     this.mouse_left_button = 0;
     this.flash_external_interface = false;
     this.flash_audio = false;
     this.flash_markup = "embed";
     this.inline_image = true;
     this.clone_innerHTML = true;
  } else if( navigator.userAgent.indexOf( "Chrome" ) >= 0 ) {
     this.js_speed = 100;
     this.navigator_family = "chrome";
     this.mouse_left_button = 0;
     this.flash_external_interface = true;
     this.flash_audio = false;
     this.flash_markup = "embed";
     this.inline_image = true;
     this.css = 3;
     this.clone_innerHTML = true;
     if( ! "Window" in window || window.Window === undefined ) {
       window.Window = window.constructor;
     }
  } else if( navigator.userAgent.indexOf( "Safari" ) >= 0 ) {
     this.js_speed = 80;
     this.navigator_family = "safari";
     this.mouse_left_button = 0;
     this.flash_external_interface = true;
     this.flash_audio = false;
     this.flash_markup = "embed";
     this.inline_image = true;
     this.clone_innerHTML = true;
  } else if( navigator.userAgent.indexOf( "WebKit" ) >= 0 ) {
     this.navigator_family = "webkit";
     this.js_speed = 80;
     this.mouse_left_button = 0;
     this.flash_external_interface = true;
     this.flash_audio = false;
     this.flash_markup = "embed";
     this.inline_image = true;
     this.clone_innerHTML = true;
  } else if( navigator.userAgent.indexOf( "KHTML" ) >= 0 ) {
     this.navigator_family = "khtml";
     this.mouse_left_button = 1;
     this.flash_external_interface = true;
     this.flash_audio = false;
     this.flash_markup = "embed";
     this.inline_image = true;
     this.clone_innerHTML = true;
  } else if( navigator.userAgent.indexOf( "Mozilla" ) >= 0 ) {
     if( navigator.userAgent.match( /3.[56][^ ]*$/ ) ) {
        this.js_speed = 75;	    
        this.css = 3;
     } else if( navigator.userAgent.match( /3.0[^ ]*$/ ) ) {
        this.js_speed = 60;	    
     } else {
        this.js_speed = 50;
     }
     this.navigator_family = "mozilla";
     this.mouse_left_button = 0;
     this.flash_external_interface = true;
     this.flash_audio = true;
     this.flash_markup = "embed";
     this.inline_image = true;
     this.filtered_errors = ["javascript:top.location+\"__flashplugin_unique__\"", "tipElement.ownerDocument is null"];
  } else {
     alert( "Unknown navigator (" + navigator.userAgent +
	    "), using default settings..." );
  }
  this.screen_width = screen.width;
  this.screen_height = screen.height;
  this.screen_available_width = screen.availWidth;
  this.screen_available_height = screen.availHeight;
  this.screen_color_depth = screen.colorDepth;
  this.version = hop_version();
  this.backend = hop_backend();
}
var hop_config = new hop_Config();
function hop_config_get( key ) {
   if( arguments.length == 0 ) {
      var l = null;
      for( var p in hop_config ) {
	 var c = new sc_Pair( sc_jsstring2symbol( p ), hop_config[ p ]);
	 l = new sc_Pair( c, l );
      }
      return l;
   } else if( !sc_isSymbol( key ) && !sc_isKeyword( key ) ) {
      return false;
   } else if( sc_isSymbol( key ) ) {
      return hop_config[ sc_symbol2jsstring( key ) ];
   } else {
      return hop_config[ sc_keyword2jsstring( key ) ];
   }
}
function hop_flash_minversion_set( v ) {
   if( v > hop_config.flash_version ) hop_config.flash_version = v;
}
function hop_flash_audio_set( v ) {
   hop_config.flash_audio = v;
}
var hop_innerHTML_need_evalp = true;
var tmp = document.createElement( "div" );
try {
   tmp.innerHTML = "<script type='text/javascript'>hop_config.eval_innerHTML = false;<\u002fscript>";
   tmp = tmp.cloneNode( true );
   if( ("body" in document) && (document.body != null) ) {
      document.body.appendChild( tmp );
      document.body.removeChild( tmp );
   } else {
      if( ("documentElement" in document) &&  
          (document.documentElement != null) ) {
	 document.documentElement.appendChild( tmp );
	 document.documentElement.removeChild( tmp );
      } else {
	 var body = document.getElementsByTagName( "body" )[ 0 ];
	 body.appendChild( tmp );
	 body.removeChild( tmp );
      }
   }
} catch( e ) {
     ;
}
var hop_json_parse;
if( "JSON" in window ) {
   hop_json_parse = JSON.parse;
} else {
   hop_json_parse = function( o ) { return hop_unjson( eval( o ) ); };
}
function hop_properties_to_string( obj ) {
   var res = "";
   var i = 0;
   for( var p in obj ) {
      if( i === 10 ) {
	 res += p + "\n";
	 i = 0;
      } else {
	 i++;
	 res += p + " ";
      }
   }
   return res;
}
function hop_properties_values_to_string( obj ) {
   var res = "";
   var i = 0;
   for( var p in obj ) {
      if( i === 10 ) {
	 res += p + "=" + obj[ p ] + "\n";
	 i = 0;
      } else {
	 i++;
	 res += p + "=" + obj[ p ] + " ";
      }
   }
   return res;
}
var hop_is_html_element;
if( !("HTMLElement" in window) ) {
   hop_is_html_element = function hop_is_html_element( obj ) {
      return (obj != null)
              && (((obj instanceof Object) || (typeof obj == "object"))
	      && (typeof obj.innerHTML == "string"));
   } 
} else {
   var ifr = document.createElement( "iframe" );
   if( ifr instanceof HTMLElement ) {
      hop_is_html_element = function hop_is_html_element( obj ) {
	 return (obj != null) && (obj instanceof HTMLElement);
      }
   } else {
      var ifproto = ifr.__proto__;
      hop_is_html_element = function hop_is_html_element( obj ) {
	 return (obj instanceof HTMLElement) || (obj.__proto__ == ifproto);
      }
   }
}
var hop_is_dom_form_element;
try {
   if( undefined instanceof HTMLFormElement ) {
      hop_is_dom_form_element = function hop_is_dom_form_element( obj ) {
	 return false;
      };
   } else {
      hop_is_dom_form_element = function hop_is_dom_form_element( obj ) {
	 return obj instanceof HTMLFormElement;
      };
   }
} catch( e ) {
   hop_is_dom_form_element = function hop_is_dom_form_element( obj ) {
      return hop_is_html_element( obj ) && (obj.tagName === "form");
   };
}
if( !("HTMLCollection" in window) ) {
   window.HTMLCollection = function() { return false; };
}
if( !("HTMLInputElement" in window) ) {
   window.HTMLInputElement = function() { return false; };
}
if( !("HTMLTextAreaElement" in window) ) {
   window.HTMLTextAreaElement = function() { return false; };
}
if( !("HTMLSelectElement" in window) ) {
   window.HTMLSelectElement = function() { return false; };
}
var hop_make_xml_http_request;
if( "XMLHttpRequest" in window ) {
   var req = new XMLHttpRequest();
   hop_make_xml_http_request = function hop_make_xml_http_request() {
      return new XMLHttpRequest();
   }
   if( "multipart" in req ) {
      hop_config.xhr_multipart = true;
   }
} else {
   if( "ActiveXObject" in window ) {
      hop_make_xml_http_request = function hop_make_xml_http_request() {
	 function hop_make_activexobject( ax ) {
	    var o = new Object();
	    var a = new ActiveXObject( ax );
	    o.activex = a;
	    o.open = function( msg, svc, sync ) {
	       a.onreadystatechange = function() {
		  o.status = a.status;
		  o.readyState = a.readyState;
		  o.responseText = a.responseText;
		  o.onreadystatechange();
	       }
	       if( sync ) {
		  var r = a.open( msg, svc, sync );
		  o.status = a.status;
		  o.readyState = a.readyState;
		  o.responseText = a.responseText;
		  return r;
	       } else 
		  return a.open( msg, svc, sync );
	    }
	    o.send = function( v ) {
	       return a.send( v );
	    }
	    o.setRequestHeader = function( v ) {
	       return a.setRequestHeader( v );
	    };
	    return o;
	 }
	 try {
	    return hop_make_activexobject( "Msxml2.XMLHTTP" );
	 } catch( e ) {
	    try {
	       return hop_make_activexobject( "Microsoft.XMLHTTP" );
	    } catch( e ) {
	       alert( "*** ERROR: Don't know how to create XMLHttpRequest" );
	    }
	 }
      }
   } else {
      if( "XMLHttpRequest" in window ) {
	 hop_make_xml_http_request = function hop_make_xml_http_request() {
	    return new XMLHttpRequest();
	 }
      } else {
	 hop_make_xml_http_request = function hop_make_xml_http_request() {
	    alert( "*** ERROR: Don't know how to create XMLHttpRequest" );
	 }
      }
   }
}
if( "WebSocket" in window ) {
   hop_config.websocket = true;
}
var hop_header_autoconf = hop_make_xml_http_request();
var hop_header_content_type;
var hop_header_hop_serialize;
if( typeof hop_header_autoconf.getResponseHeader == "function" ) {
   hop_header_content_type = function hop_header_content_type( http ) {
      var h = http.getResponseHeader( "Content-Type" );
      if( h ) {
	 var i = h.indexOf( ";" );
	 if( i >= 0 ) {
	    return h.substring( 0, i );
	 } else {
	    return h;
	 }
      } else {
	 return "application/text";
      }
   }
   hop_header_hop_serialize = function hop_header_hop_serialize( http ) {
      var h = http.getResponseHeader( "Hop-Serialize" );
      if( h ) {
	 return h;
      } else {
	 return "javascript";
      }
   }
} else {
   hop_header_content_type = function hop_header_content_type( http ) {
      var hds = http.getAllResponseHeaders();
      var i = hds.indexOf( "Content-Type" );
      if( i < 0 ) i = hds.indexOf( "content-type" );
      if( i < 0 ) i = hds.indexOf( "Content-type" );
      if( i < 0 ) return "application/text";
      var j = hds.indexOf( "\n", i + 1 );
      var s = (j >= 0) ? hds.substring( i, j ) : hds.substring( i, s.length );
      var m = s.match( "[ \t:]+([^ \n;]*)" );
      if( m )
	 return m[ 1 ];
      else
	 return "application/text";
   }
   hop_header_hop_serialize = function hop_header_hop_serialize( http ) {
      var hds = http.getAllResponseHeaders();
      var i = hds.indexOf( "Hop-Serialize" );
      if( i < 0 ) return "javascript";
      var j = hds.indexOf( "\n", i + 1 );
      return (j >= 0) ? hds.substring( i + 15, j - 1 )
                      : hds.substring( i + 15, s.length );
   }
}
function node_style_set_native( el, prop, value ) {
   var obj = el;
   if( (el instanceof String) || (typeof el === "string") )
      obj = document.getElementById( el );
   for( var i = 1; i < arguments.length; i += 2 ) {
      var p = arguments[ i ];
      var v = arguments[ i + 1 ];
      if( sc_isKeyword( p ) )
	 p = sc_keyword2jsstring( p );
      if( !(v instanceof String) && (typeof v !== "string") ) {
	 if( !v && (v != 0) ) {
	    sc_error( "node-style-set!", "Illegal \"" + p + "\" value: " + v, el );
	 } else {
	    v = v.toString();
	 }
      }
      if( !obj || !obj.style ) {
	 sc_error( "node-style-set!",
		   "Illegal object while setting \"" + p + ": " + v + "\"",
		   el );
      }
      try {
	 if( p in obj.style ) {
	    obj.style[ p ] =  v;
	 } else {
	    obj.style.setProperty( p, v, "" );
	 }
      } catch( e ) {
	 sc_error( "node-style-set!", "Can't set property \"" + p + "\"", el );
      }
   }
}
function node_style_set_array( el, prop, value ) {
   var obj = el;
   if( (el instanceof String) || (typeof el === "string") )
      obj = document.getElementById( el );
   for( var i = 1; i < arguments.length; i += 2 ) {
      var p = arguments[ i ];
      var v = arguments[ i + 1 ];
      if( sc_isKeyword( p ) )
	 p = sc_keyword2jsstring( p );
      if( !(v instanceof String) && (typeof v !== "string") ) {
	 if( !v && (v != 0) ) {
	    sc_error( "node-style-set!", "Illegal \"" + p + "\" value: "+ v, el );
	 } else {
	    v = v.toString();
	 }
      }
      obj.style[ p ] = v;
   }
}
var node_style_set = function( el, prop, value ) {
   var obj = el;
   if( (el instanceof String) || (typeof el === "string") )
      obj = document.getElementById( el );
   try {
      if( "setProperty" in obj.style ) {
         node_style_set = node_style_set_native;
      	 return node_style_set_native.apply( null, arguments );
      } else {
	 node_style_set = node_style_set_array;
	 return node_style_set_array.apply( null, arguments );
      }
   } catch( e ) {
      sc_error( "node-style-set!", "Can't set property \"" + prop + "\"", el );
  }
}
var hop_active_location_timeout =
   ((hop_config.cpu_speed < 66) ? 100 : 250);
var hop_has_setInterval = true;
try {
   var i = setInterval( function() { ; }, 1000 );
   clearInterval( i );
} catch( e ) {
   var hop_has_setInterval = false;
}
var hop_add_native_event_listener = undefined;
var hop_remove_native_event_listener = undefined;
var hop_stop_propagation = undefined;
var hop_has_event20 = false;
try {
   hop_has_event20 = document.implementation.hasFeature( "Events" , "2.0" );
} catch( e ) {
   ;
}
if( hop_has_event20 ) {
   hop_add_native_event_listener = function( obj, event, proc, capture ) {
      if( "addEventListener" in obj ) {
         var f = hop_callback( proc );
         var i = "on" + event + "hdl";
         if( !(i in obj ) ) obj[ i ] = [];
         obj[ i ][ proc ] = f;
	 return obj.addEventListener( event, f, capture );
      } else {
	 throw new Error( "add-event-listener!: cannot add `" 
			  + event + "' listener for object: "
			  + obj );
      }
   }
   hop_remove_native_event_listener = function( obj, event, proc, capture ) {
      if( "removeEventListener" in obj ) {
	var i = "on" + event + "hdl";
        var h = obj[ i ];
        if( h !== undefined ) {
	   var p = obj[ i ][ proc ];
	   if( p !== undefined ) {
	      h[ p ] = undefined;
	      return obj.removeEventListener( event, p, capture );
	   }
	}
      } else {
	 throw new Error( "remove-event-listener!: cannot remove `"
			  + event + "' listener for object: "
			  + obj );
      }
   }
   hop_stop_propagation = function( event, def ) {
      if( !def ) event.preventDefault();
      event.stopPropagation();
      event.isStopped = true;
   }
} else {
   var hop_event_counter = 0;
   hop_add_native_event_listener = function( obj, event, proc, capture ) {
      var f = hop_callback( proc );
      var procid = "on" + event + hop_event_counter++;
      obj[ procid ] = f;
      var p = function( e ) { return obj[ procid ]( window.event ); };
      var i = "on" + event + "hdl";
      if( obj[ i ] === undefined ) obj[ i ] = [];
      obj[ i ][ proc ] = { proc: p, id: procid };
      return obj.attachEvent( "on" + event, p );
   }
   hop_remove_native_event_listener = function( obj, event, proc, capture ) {
      var i = "on" + event + "hdl";
      if( i in obj ) {
	 var p = obj[ i ][ proc ];
	 delete obj[ p.id ];
	 delete obj[ i ][ proc ] ;
	 if( p.proc !== undefined ) {
	    return obj.detachEvent( "on" + event, p.proc );
	 }
      }
      return false;
   }
   hop_stop_propagation = function( event, def ) {
      if( !def ) event.cancelBubble = true;
      event.returnValue = false;
      event.isStopped = true;
   }
}
function hop_deinline_image( el, src ) {
   if( !el.deinlined ) {
      el.deinlined = true;
      el.src = src;
   }
}
var hop_event_mouse_x = undefined;
var hop_event_mouse_y = undefined;
var hop_event_mouse_button = undefined;
var hop_event_key_code = undefined;
function hop_event_value( evt ) { return evt.value; }
function hop_event_response_text( evt ) { return evt.responseText; }
if( hop_has_event20  ) {
   hop_event_mouse_x = function hop_event_mouse_x( event ) {
      return event.pageX;
   }
   hop_event_mouse_y = function hop_event_mouse_y( event ) {
      return event.pageY;
   }
   hop_event_key_code = function hop_event_key_code( event ) {
      return event.which;
   }
} else {
   hop_event_mouse_x = function hop_event_mouse_x( event ) {
      if( (document.body != null) &&
	  (document.documentElement.scrollLeft != null) ) {
	 return event.clientX + document.documentElement.scrollLeft;
      } else {
	 return event.clientX + document.body.scrollLeft;
      }
   }
   hop_event_mouse_y = function hop_event_mouse_y( event ) {
      if( (document.body != null) &&
	  (document.documentElement.scrollTop != null) ) {
	 return event.clientY + document.documentElement.scrollTop;
      } else {
	 return event.clientY + document.body.scrollTop;
      }
   }
   hop_event_key_code = function hop_event_key_code( event ) {
      return event.keyCode;
   }
}
switch( hop_config.mouse_left_button ) {
   case 0:
      hop_event_mouse_button = function hop_event_mouse_button( e ) {
	 return e.button + 1;
      };
      break;
   case 1:
      hop_event_mouse_button = function hop_event_mouse_button( e ) {
	 return e.button;
      }
      break;
   default:
      hop_event_mouse_button = function hop_event_mouse_button( e ) {
	 return e.button + (1 - hop_config.mouse_left_button);
      }
}
var hop_main_window_width = undefined;
var hop_main_window_height = undefined;
var hop_main_window_orientation = undefined;
if( isNaN( window.innerWidth ) ) {
   hop_main_window_width = function hop_main_window_width() {
      return document.documentElement.clientWidth;
   }
   hop_main_window_height = function hop_main_window_height() {
      return document.documentElement.clientHeight;
   }
} else {
   hop_main_window_width = function hop_main_window_width() {
      return window.innerWidth;
   }
   hop_main_window_height = function hop_main_window_height() {
      return window.innerHeight;
   }
}
var hop_orientation = false;
hop_main_window_orientation = function hop_main_window_orientation() {
  if( !hop_orientation ) {
     hop_orientation = sc_jsstring2symbol( "landscape" );
  }
  return hop_orientation;
}
var hop_current_window_width = hop_main_window_width;
var hop_current_window_height = hop_main_window_height;
function hop_screen_dimensions( unit ) {
   if( !unit ) unit = "cm";
   var d = document.createElement( "div" );
   var h = document.getElementsByTagName( "body" )[ 0 ];
   node_style_set( d, "visibility", "hidden" );
   node_style_set( d, "border", "0" );
   d.innerHTML = ".";
   h.appendChild( d );
   node_style_set( d, "width", "1" + unit );
   node_style_set( d, "height", "1" + unit );
   var res =
      new sc_Pair( Math.round( hop_config.screen_width / d.offsetWidth ),
		   Math.round( hop_config.screen_height / d.offsetHeight ) );
   h.removeChild( d );
   return res;
}
function hop_iframe_scroll_height( e ) {
   if( "contentDocument" in e ) {
      return e.contentDocument.body.scrollHeight;
   } else {
      if( "document" in e ) {
	 return e.document.body.scrollHeight;
      } else {
	 return iframe.height;
      }
   }
}
function hop_iframe_scroll_width( e ) {
   if( "contentDocument" in e ) {
      return e.contentDocument.body.scrollWidth;
   } else {
      if( "document" in e ) {
	 return e.document.body.scrollWidth;
      } else {
	 return iframe.width;
      }
   }
}
var hop_get_selection;
if( window.getSelection ) {
   hop_get_selection = function hop_get_selection() {
      return window.getSelection().toString();
   }
} else {
   if( document.getSelection ) {
      hop_get_selection = function hop_get_selection() {
	 return document.getSelection().toString();
      }
   } else {
      hop_get_selection = function hop_get_selection() {
	 if( document.selection ) {
	    return document.selection.createRange().text;
	 } else {
	    return "";
	 }
      }
   }
}
function sc_print_debug() {
    sc_print.apply(null, arguments);
}
var sc_JS_GLOBALS = this;
var __sc_LINE=-1;
var __sc_FILE="";
function sc_alert() {
   var len = arguments.length;
   var s = "";
   var i;
   for( i = 0; i < len; i++ ) {
       s += sc_toDisplayString(arguments[ i ]);
   }
   return alert( s );
}
function sc_typeof( x ) {
   return typeof x;
}
var __sc_errorHook = false;
function sc_errorHookSet( h ) {
   __sc_errorHook = h;
}
function sc_errorHook() {
   return __sc_errorHook;
}
function sc_error() {
   var e = new Error("sc_error");
   if (arguments.length >= 1) {
      e.name = arguments[0];
      if (arguments.length >= 2) {
	 e.message = arguments[1];
	 if (arguments.length >= 3) {
	    e.scObject = arguments[2];
	 }
      }
   }
   throw __sc_errorHook ? __sc_errorHook( e, arguments ) : e;
}
function sc_arity_check(fun, nbArgs) {
   function err( args, msg, obj ) {
      var where= ("callee" in args && "caller" in args.callee ?
		  ("name" in args.callee.caller ?
		   args.callee.caller.name : args.callee.caller)
		  : "arity-check");
      sc_error(where, msg, obj);
      return undefined;
   }
   if (typeof fun !== "function") {
      return err(arguments, "not a function", fun);
   }
   var fun_arity = fun.sc_arity;
   if (fun_arity === undefined || fun_arity === false) return fun;
   if (fun_arity >= 0 && nbArgs == fun_arity) return fun;
   if (fun_arity < 0 && nbArgs >= -1-fun_arity) return fun;
   var errorMsg = "Wrong number of arguments: " + fun_arity + " expected, " +
      nbArgs + " provided";
   return err( arguments, errorMsg, fun);
}
function sc_raise(obj) {
    throw obj;
}
function sc_withHandlerLambda(handler, body) {
    try {
	return body();
    } catch(e) {
	if (!e._internalException)
	    return handler(e);
	else
	    throw e;
    }
}
var sc_properties = new Object();
function sc_putpropBang(sym, key, val) {
    var ht = sc_properties[sym];
    if (!ht) {
	ht = new Object();
	sc_properties[sym] = ht;
    }
    ht[key] = val;
}
function sc_getprop(sym, key) {
    var ht = sc_properties[sym];
    if (ht) {
	if (key in ht)
	    return ht[key];
	else
	    return false;
    } else
	return false;
}
function sc_rempropBang(sym, key) {
    var ht = sc_properties[sym];
    if (ht)
	delete ht[key];
}
function sc_any2String(o) {
    return sc_jsstring2string(sc_toDisplayString(o));
}    
function sc_isEqv(o1, o2) {
    return (o1 === o2);
}
function sc_isEq(o1, o2) {
    return (o1 === o2);
}
function sc_isNumber(n) {
    return (typeof n === "number");
}
function sc_isComplex(n) {
    return sc_isNumber(n);
}
function sc_isReal(n) {
    return sc_isNumber(n);
}
function sc_isRational(n) {
    return sc_isReal(n);
}
function sc_isInteger(n) {
    return (parseInt(n) === n);
}
function sc_isExact(n) {
    return false;
}
function sc_isInexact(n) {
    return true;
}
function sc_equal(x) {
    for (var i = 1; i < arguments.length; i++)
	if (x !== arguments[i])
	    return false;
    return true;
}
function sc_less(x) {
    for (var i = 1; i < arguments.length; i++) {
	if (x >= arguments[i])
	    return false;
	x = arguments[i];
    }
    return true;
}
function sc_greater(x, y) {
    for (var i = 1; i < arguments.length; i++) {
	if (x <= arguments[i])
	    return false;
	x = arguments[i];
    }
    return true;
}
function sc_lessEqual(x, y) {
    for (var i = 1; i < arguments.length; i++) {
	if (x > arguments[i])
	    return false;
	x = arguments[i];
    }
    return true;
}
function sc_greaterEqual(x, y) {
    for (var i = 1; i < arguments.length; i++) {
	if (x < arguments[i])
	    return false;
	x = arguments[i];
    }
    return true;
}
function sc_isZero(x) {
    return (x === 0);
}
function sc_isPositive(x) {
    return (x > 0);
}
function sc_isNegative(x) {
    return (x < 0);
}
function sc_isOdd(x) {
    return (x % 2 === 1);
}
function sc_isEven(x) {
    return (x % 2 === 0);
}
var sc_max = Math.max;
var sc_min = Math.min;
function sc_plus() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++)
	sum += arguments[i];
    return sum;
}
function sc_multi() {
    var product = 1;
    for (var i = 0; i < arguments.length; i++)
	product *= arguments[i];
    return product;
}
function sc_minus(x) {
    if (arguments.length === 1)
	return -x;
    else {
	var res = x;
	for (var i = 1; i < arguments.length; i++)
	    res -= arguments[i];
	return res;
    }
}
function sc_div(x) {
    if (arguments.length === 1)
	return 1/x;
    else {
	var res = x;
	for (var i = 1; i < arguments.length; i++)
	    res /= arguments[i];
	return res;
    }
}
var sc_abs = Math.abs;
function sc_quotient(x, y) {
    return parseInt(x / y);
}
function sc_remainder(x, y) {
    return x % y;
}
function sc_modulo(x, y) {
    var remainder = x % y;
    if ((remainder * y) < 0)
	return remainder + y;
    else
	return remainder;
}
function sc_euclid_gcd(a, b) {
    var temp;
    if (a === 0) return b;
    if (b === 0) return a;
    if (a < 0) {a = -a;};
    if (b < 0) {b = -b;};
    if (b > a) {temp = a; a = b; b = temp;};
    while (true) {
	a %= b;
	if(a === 0) {return b;};
	b %= a;
	if(b === 0) {return a;};
    };
    return b;
}
function sc_gcd() {
    var gcd = 0;
    for (var i = 0; i < arguments.length; i++)
	gcd = sc_euclid_gcd(gcd, arguments[i]);
    return gcd;
}
function sc_lcm() {
    var lcm = 1;
    for (var i = 0; i < arguments.length; i++) {
	var f = Math.round(arguments[i] / sc_euclid_gcd(arguments[i], lcm));
	lcm *= Math.abs(f);
    }
    return lcm;
}
var sc_floor = Math.floor;
var sc_ceiling = Math.ceil;
var sc_truncate = parseInt;
var sc_round = Math.round;
var sc_exp = Math.exp;
var sc_log = Math.log;
var sc_sin = Math.sin;
var sc_cos = Math.cos;
var sc_tan = Math.tan;
var sc_asin = Math.asin;
var sc_acos = Math.acos;
var sc_atan = Math.atan;
var sc_sqrt = Math.sqrt;
var sc_expt = Math.pow;
function sc_exact2inexact(x) {
    return x;
}
function sc_inexact2exact(x) {
    return x << 0;
}
function sc_number2jsstring(x, radix) {
    if (radix)
	return x.toString(radix);
    else
	return x.toString();
}
function sc_jsstring2number(s, radix) {
    if (s === "") return false;
    if (radix) {
	var t = parseInt(s, radix);
	if (!t && t !== 0) return false;
	var allowedChars = "01234567890abcdefghijklmnopqrstuvwxyz".substring(0, radix+1);
	if ((new RegExp("^["+allowedChars+"]*$", "i")).test(s))
	    return t;
	else return false;
    } else {
	var t = +s; 
	if (!t && t !== 0) return false;
	var c = s.charAt(0);
	// if +c is 0, but the char is not "0", then we have a whitespace.
	if (+c === 0 && c !== "0") return false;
	return t;
    }
}
function sc_not(b) {
    return b === false;
}
function sc_isBoolean(b) {
    return (b === true) || (b === false);
}
function sc_Pair(car, cdr) {
    this.car = car;
    this.cdr = cdr;
}
sc_Pair.prototype.toString = function() {
    return sc_toDisplayString(this);
};
sc_Pair.prototype.sc_toWriteOrDisplayString = function(writeOrDisplay) {
    var current = this;
    var res = "(";
    while(true) {
	res += writeOrDisplay(current.car);
	if (sc_isPair(current.cdr)) {
	    res += " ";
	    current = current.cdr;
	} else if (current.cdr !== null) {
	    res += " . " + writeOrDisplay(current.cdr);
	    break;
	} else 
	    break;
    }
    res += ")";
    return res;
};
sc_Pair.prototype.sc_toDisplayString = function() {
    return this.sc_toWriteOrDisplayString(sc_toDisplayString);
};
sc_Pair.prototype.sc_toWriteString = function() {
    return this.sc_toWriteOrDisplayString(sc_toWriteString);
};
function sc_isPair(p) {
    return (p instanceof sc_Pair);
}
function sc_isPairEqual(p1, p2, comp) {
    return (comp(p1.car, p2.car) && comp(p1.cdr, p2.cdr));
}
function sc_cons(car, cdr) {
    return new sc_Pair(car, cdr);
}
function sc_consStar() {
    var res = arguments[arguments.length - 1];
    for (var i = arguments.length-2; i >= 0; i--)
	res = new sc_Pair(arguments[i], res);
    return res;
}
function sc_car(p) {
    return p.car;
}
function sc_cdr(p) {
    return p.cdr;
}
function sc_setCarBang(p, val) {
    p.car = val;
}
function sc_setCdrBang(p, val) {
    p.cdr = val;
}
function sc_caar(p) { return p.car.car; }
function sc_cadr(p) { return p.cdr.car; }
function sc_cdar(p) { return p.car.cdr; }
function sc_cddr(p) { return p.cdr.cdr; }
function sc_caaar(p) { return p.car.car.car; }
function sc_cadar(p) { return p.car.cdr.car; }
function sc_caadr(p) { return p.cdr.car.car; }
function sc_caddr(p) { return p.cdr.cdr.car; }
function sc_cdaar(p) { return p.car.car.cdr; }
function sc_cdadr(p) { return p.cdr.car.cdr; }
function sc_cddar(p) { return p.car.cdr.cdr; }
function sc_cdddr(p) { return p.cdr.cdr.cdr; }
function sc_caaaar(p) { return p.car.car.car.car; }
function sc_caadar(p) { return p.car.cdr.car.car; }
function sc_caaadr(p) { return p.cdr.car.car.car; }
function sc_caaddr(p) { return p.cdr.cdr.car.car; }
function sc_cdaaar(p) { return p.car.car.car.cdr; }
function sc_cdadar(p) { return p.car.cdr.car.cdr; }
function sc_cdaadr(p) { return p.cdr.car.car.cdr; }
function sc_cdaddr(p) { return p.cdr.cdr.car.cdr; }
function sc_cadaar(p) { return p.car.car.cdr.car; }
function sc_caddar(p) { return p.car.cdr.cdr.car; }
function sc_cadadr(p) { return p.cdr.car.cdr.car; }
function sc_cadddr(p) { return p.cdr.cdr.cdr.car; }
function sc_cddaar(p) { return p.car.car.cdr.cdr; }
function sc_cdddar(p) { return p.car.cdr.cdr.cdr; }
function sc_cddadr(p) { return p.cdr.car.cdr.cdr; }
function sc_cddddr(p) { return p.cdr.cdr.cdr.cdr; }
function sc_lastPair(l) {
    if (!sc_isPair(l)) sc_error("sc_lastPair: pair expected");
    var res = l;
    var cdr = l.cdr;
    while (sc_isPair(cdr)) {
	res = cdr;
	cdr = res.cdr;
    }
    return res;
}
function sc_isNull(o) {
    return (o === null);
}
function sc_isList(o) {
   var rabbit = o;
   var turtle = o;
   while (true) {
       if (rabbit === null ||
	   (rabbit instanceof sc_Pair && rabbit.cdr === null))
	   return true;  
       else {
	   if ((rabbit instanceof sc_Pair) &&
	       (rabbit.cdr instanceof sc_Pair)) {
	       rabbit = rabbit.cdr.cdr;
	       turtle = turtle.cdr;
	       if (rabbit === turtle) return false; 
	   } else
	       return false; 
       }
   }
}
function sc_list() {
    var res = null;
    var a = arguments;
    for (var i = a.length-1; i >= 0; i--)
	res = new sc_Pair(a[i], res);
    return res;
}
function sc_iota(num, init) {
   var res = null;
   if (!init) init = 0;
   for (var i = num - 1; i >= 0; i--)
      res = new sc_Pair(i + init, res);
   return res;
}
function sc_makeList(nbEls, fill) {
    var res = null;
    for (var i = 0; i < nbEls; i++)
	res = new sc_Pair(fill, res);
    return res;
}
function sc_length(l) {
    var res = 0;
    while (l !== null) {
	res++;
	l = l.cdr;
    }
    return res;
}
function sc_remq(o, l) {
    var dummy = { cdr : null };
    var tail = dummy;
    while (l !== null) {
	if (l.car !== o) {
	    tail.cdr = sc_cons(l.car, null);
	    tail = tail.cdr;
	}
	l = l.cdr;
    }
    return dummy.cdr;
}
function sc_remqBang(o, l) {
    var dummy = { cdr : null };
    var tail = dummy;
    var needsAssig = true;
    while (l !== null) {
	if (l.car === o) {
	    needsAssig = true;
	} else {
	    if (needsAssig) {
		tail.cdr = l;
		needsAssig = false;
	    }
	    tail = l;
	}
	l = l.cdr;
    }
    tail.cdr = null;
    return dummy.cdr;
}
function sc_delete(o, l) {
    var dummy = { cdr : null };
    var tail = dummy;
    while (l !== null) {
	if (!sc_isEqual(l.car, o)) {
	    tail.cdr = sc_cons(l.car, null);
	    tail = tail.cdr;
	}
	l = l.cdr;
    }
    return dummy.cdr;
}
function sc_deleteBang(o, l) {
    var dummy = { cdr : null };
    var tail = dummy;
    var needsAssig = true;
    while (l !== null) {
	if (sc_isEqual(l.car, o)) {
	    needsAssig = true;
	} else {
	    if (needsAssig) {
		tail.cdr = l;
		needsAssig = false;
	    }
	    tail = l;
	}
	l = l.cdr;
    }
    tail.cdr = null;
    return dummy.cdr;
}
function sc_reverseAppendBang(l1, l2) {
    var res = l2;
    while (l1 !== null) {
	var tmp = res;
	res = l1;
	l1 = l1.cdr;
	res.cdr = tmp;
    }
    return res;
}
function sc_dualAppend(l1, l2) {
    if (l1 === null) return l2;
    if (l2 === null) return l1;
    var rev = sc_reverse(l1);
    return sc_reverseAppendBang(rev, l2);
}
function sc_append() {
    if (arguments.length === 0)
	return null;
    var res = arguments[arguments.length - 1];
    for (var i = arguments.length - 2; i >= 0; i--)
	res = sc_dualAppend(arguments[i], res);
    return res;
}
function sc_dualAppendBang(l1, l2) {
    if (l1 === null) return l2;
    if (l2 === null) return l1;
    var tmp = l1;
    while (tmp.cdr !== null) tmp=tmp.cdr;
    tmp.cdr = l2;
    return l1;
}
function sc_appendBang() {
    var res = null;
    for (var i = 0; i < arguments.length; i++)
	res = sc_dualAppendBang(res, arguments[i]);
    return res;
}
function sc_reverse(l1) {
    var res = null;
    while (l1 !== null) {
	res = sc_cons(l1.car, res);
	l1 = l1.cdr;
    }
    return res;
}
function sc_reverseBang(l) {
    return sc_reverseAppendBang(l, null);
}
function sc_listTail(l, k) {
    var res = l;
    for (var i = 0; i < k; i++) {
	res = res.cdr;
    }
    return res;
}
function sc_listRef(l, k) {
    return sc_listTail(l, k).car;
}
function sc_memq(o, l) {
    while (l !== null) {
	if (l.car === o)
	    return l;
	l = l.cdr;
    }
    return false;
}
function sc_memv(o, l) {
    while (l !== null) {
	if (l.car === o)
	    return l;
	l = l.cdr;
    }
    return false;
}
function sc_member(o, l) {
    while (l !== null) {
	if (sc_isEqual(l.car,o))
	    return l;
	l = l.cdr;
    }
    return false;
}
function sc_assq(o, al) {
    while (al !== null) {
	if (al.car.car === o)
	    return al.car;
	al = al.cdr;
    }
    return false;
}
function sc_assv(o, al) {
    while (al !== null) {
	if (al.car.car === o)
	    return al.car;
	al = al.cdr;
    }
    return false;
}
function sc_assoc(o, al) {
    while (al !== null) {
	if (sc_isEqual(al.car.car, o))
	    return al.car;
	al = al.cdr;
    }
    return false;
}
function sc_isCharStringEqual(cs1, cs2) { return cs1.val === cs2.val; }
function sc_isCharStringLess(cs1, cs2) { return cs1.val < cs2.val; }
function sc_isCharStringGreater(cs1, cs2) { return cs1.val > cs2.val; }
function sc_isCharStringLessEqual(cs1, cs2) { return cs1.val <= cs2.val; }
function sc_isCharStringGreaterEqual(cs1, cs2) { return cs1.val >= cs2.val; }
function sc_isCharStringCIEqual(cs1, cs2)
    { return cs1.val.toLowerCase() === cs2.val.toLowerCase(); }
function sc_isCharStringCILess(cs1, cs2)
    { return cs1.val.toLowerCase() < cs2.val.toLowerCase(); }
function sc_isCharStringCIGreater(cs1, cs2)
    { return cs1.val.toLowerCase() > cs2.val.toLowerCase(); }
function sc_isCharStringCILessEqual(cs1, cs2)
    { return cs1.val.toLowerCase() <= cs2.val.toLowerCase(); }
function sc_isCharStringCIGreaterEqual(cs1, cs2)
    { return cs1.val.toLowerCase() >= cs2.val.toLowerCase(); }
function sc_Char(c) {
    var cached = sc_Char.lazy[c];
    if (cached)
	return cached;
    this.val = c;
    sc_Char.lazy[c] = this;
    return undefined;
}
sc_Char.lazy = new Object();
sc_Char.char2readable = {
    "\000": "#\\null",
    "\007": "#\\bell",
    "\010": "#\\backspace",
    "\011": "#\\tab",
    "\012": "#\\newline",
    "\014": "#\\page",
    "\015": "#\\return",
    "\033": "#\\escape",
    "\040": "#\\space",
    "\177": "#\\delete",
    "\001": "#\\soh",
    "\002": "#\\stx",
    "\003": "#\\etx",
    "\004": "#\\eot",
    "\005": "#\\enq",
    "\006": "#\\ack",
    "\013": "#\\vt",
    "\016": "#\\so",
    "\017": "#\\si",
    "\020": "#\\dle",
    "\021": "#\\dc1",
    "\022": "#\\dc2",
    "\023": "#\\dc3",
    "\024": "#\\dc4",
    "\025": "#\\nak",
    "\026": "#\\syn",
    "\027": "#\\etb",
    "\030": "#\\can",
    "\031": "#\\em",
    "\032": "#\\sub",
    "\033": "#\\esc",
    "\034": "#\\fs",
    "\035": "#\\gs",
    "\036": "#\\rs",
    "\037": "#\\us"};
sc_Char.readable2char = {
    "null": "\000",
    "bell": "\007",
    "backspace": "\010",
    "tab": "\011",
    "newline": "\012",
    "page": "\014",
    "return": "\015",
    "escape": "\033",
    "space": "\040",
    "delete": "\000",
    "soh": "\001",
    "stx": "\002",
    "etx": "\003",
    "eot": "\004",
    "enq": "\005",
    "ack": "\006",
    "bel": "\007",
    "bs": "\010",
    "ht": "\011",
    "nl": "\012",
    "vt": "\013",
    "np": "\014",
    "cr": "\015",
    "so": "\016",
    "si": "\017",
    "dle": "\020",
    "dc1": "\021",
    "dc2": "\022",
    "dc3": "\023",
    "dc4": "\024",
    "nak": "\025",
    "syn": "\026",
    "etb": "\027",
    "can": "\030",
    "em": "\031",
    "sub": "\032",
    "esc": "\033",
    "fs": "\034",
    "gs": "\035",
    "rs": "\036",
    "us": "\037",
    "sp": "\040",
    "del": "\177"};
sc_Char.prototype.toString = function() {
    return this.val;
};
sc_Char.prototype.sc_toWriteString = function() {
    var entry = sc_Char.char2readable[this.val];
    if (entry)
	return entry;
    else
	return "#\\" + this.val;
};
function sc_isChar(c) {
    return (c instanceof sc_Char);
}
var sc_isCharEqual = sc_isCharStringEqual;
var sc_isCharLess = sc_isCharStringLess;
var sc_isCharGreater = sc_isCharStringGreater;
var sc_isCharLessEqual = sc_isCharStringLessEqual;
var sc_isCharGreaterEqual = sc_isCharStringGreaterEqual;
var sc_isCharCIEqual = sc_isCharStringCIEqual;
var sc_isCharCILess = sc_isCharStringCILess;
var sc_isCharCIGreater = sc_isCharStringCIGreater;
var sc_isCharCILessEqual = sc_isCharStringCILessEqual;
var sc_isCharCIGreaterEqual = sc_isCharStringCIGreaterEqual;
var SC_NUMBER_CLASS = "0123456789";
var SC_WHITESPACE_CLASS = ' \r\n\t\f';
var SC_LOWER_CLASS = 'abcdefghijklmnopqrstuvwxyz';
var SC_UPPER_CLASS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
function sc_isCharOfClass(c, cl) { return (cl.indexOf(c) != -1); }
function sc_isCharAlphabetic(c)
    { return sc_isCharOfClass(c.val, SC_LOWER_CLASS) ||
	  sc_isCharOfClass(c.val, SC_UPPER_CLASS); }
function sc_isCharNumeric(c)
    { return sc_isCharOfClass(c.val, SC_NUMBER_CLASS); }
function sc_isCharWhitespace(c) {
    var tmp = c.val;
    return tmp === " " || tmp === "\r" || tmp === "\n" || tmp === "\t" || tmp === "\f";
}
function sc_isCharUpperCase(c)
    { return sc_isCharOfClass(c.val, SC_UPPER_CLASS); }
function sc_isCharLowerCase(c)
    { return sc_isCharOfClass(c.val, SC_LOWER_CLASS); }
function sc_char2integer(c)
    { return c.val.charCodeAt(0); }
function sc_integer2char(n)
    { return new sc_Char(String.fromCharCode(n)); }
function sc_charUpcase(c)
    { return new sc_Char(c.val.toUpperCase()); }
function sc_charDowncase(c)
    { return new sc_Char(c.val.toLowerCase()); }
function sc_makeJSStringOfLength(k, c) {
    var fill;
    if (c === undefined)
	fill = " ";
    else
	fill = c;
    var res = "";
    var len = 1;
    while (k >= len) {
	if (k & len)
	    res = res.concat(fill);
	fill = fill.concat(fill);
	len *= 2;
    }
    return res;
}
function sc_makejsString(k, c) {
    var fill;
    if (c)
	fill = c.val;
    else
	fill = " ";
    return sc_makeJSStringOfLength(k, fill);
}
function sc_jsstring2list(s) {
    var res = null;
    for (var i = s.length - 1; i >= 0; i--)
	res = sc_cons(new sc_Char(s.charAt(i)), res);
    return res;
}
function sc_list2jsstring(l) {
    var a = new Array();
    while(l !== null) {
	a.push(l.car.val);
	l = l.cdr;
    }
    return "".concat.apply("", a);
}
var sc_Vector = Array;
sc_Vector.prototype.sc_toWriteOrDisplayString = function(writeOrDisplay) {
    if (this.length === 0) return "#()";
    var res = "#(" + writeOrDisplay(this[0]);
    for (var i = 1; i < this.length; i++)
	res += " " + writeOrDisplay(this[i]);
    res += ")";
    return res;
};
sc_Vector.prototype.sc_toDisplayString = function() {
    return this.sc_toWriteOrDisplayString(sc_toDisplayString);
};
sc_Vector.prototype.sc_toWriteString = function() {
    return this.sc_toWriteOrDisplayString(sc_toWriteString);
};
function sc_isVector(v) {
    return (v instanceof sc_Vector);
}
function sc_isVectorEqual(v1, v2, comp) {
    if (v1.length !== v2.length) return false;
    for (var i = 0; i < v1.length; i++)
	if (!comp(v1[i], v2[i])) return false;
    return true;
}
function sc_makeVector(size, fill) {
    var a = new sc_Vector(size);
    if (fill !== undefined)
	sc_vectorFillBang(a, fill);
    return a;
}
function sc_vector() {
    var a = new sc_Vector();
    for (var i = 0; i < arguments.length; i++)
	a.push(arguments[i]);
    return a;
}
function sc_vectorLength(v) {
    return v.length;
}
function sc_vectorRef(v, pos) {
    return v[pos];
}
function sc_vectorSetBang(v, pos, val) {
    v[pos] = val;
}
function sc_vector2list(a) {
    var res = null;
    for (var i = a.length-1; i >= 0; i--)
	res = sc_cons(a[i], res);
    return res;
}
function sc_list2vector(l) {
    var a = new sc_Vector();
    while(l !== null) {
	a.push(l.car);
	l = l.cdr;
    }
    return a;
}
function sc_vectorFillBang(a, fill) {
    for (var i = 0; i < a.length; i++)
	a[i] = fill;
}
function sc_copyVector(a, len) {
    if (len <= a.length)
	return a.slice(0, len);
    else {
	var tmp = a.concat();
	tmp.length = len;
	return tmp;
    }
}
function sc_vectorCopy(a, start, end) {
    return a.slice(start, end);
}
function sc_vectorCopyBang(target, tstart, source, sstart, send) {
    if (!sstart) sstart = 0;
    if (!send) send = source.length;
    if (tstart <= sstart) {
	for (var i = tstart, j = sstart; j < send; i++, j++) {
	    target[i] = source[j];
	}
    } else {
	var diff = send - sstart;
	for (var i = tstart + diff - 1, j = send - 1;
	     j >= sstart;
	     i--, j--) {
	    target[i] = source[j];
	}
    }
    return target;
}
function sc_isProcedure(o) {
    return (typeof o === "function");
}
function sc_apply(proc) {
    var args = new Array();
    for (var i = 1; i < arguments.length - 1; i++)
	args.push(arguments[i]);
    var l = arguments[arguments.length - 1];
    while (l !== null) {
	args.push(l.car);
	l = l.cdr;
    }
    return proc.apply(null, args);
}
function sc_map(proc, l1) {
    if (l1 === undefined)
	return null;
    var nbApplyArgs = arguments.length - 1;
    var applyArgs = new Array(nbApplyArgs);
    var revres = null;
    while (l1 !== null) {
	for (var i = 0; i < nbApplyArgs; i++) {
	    applyArgs[i] = arguments[i + 1].car;
	    arguments[i + 1] = arguments[i + 1].cdr;
	}
	revres = sc_cons(proc.apply(null, applyArgs), revres);
    }
    return sc_reverseAppendBang(revres, null);
}
function sc_mapBang(proc, l1) {
    if (l1 === undefined)
	return null;
    var l1_orig = l1;
    var nbApplyArgs = arguments.length - 1;
    var applyArgs = new Array(nbApplyArgs);
    while (l1 !== null) {
	var tmp = l1;
	for (var i = 0; i < nbApplyArgs; i++) {
	    applyArgs[i] = arguments[i + 1].car;
	    arguments[i + 1] = arguments[i + 1].cdr;
	}
	tmp.car = proc.apply(null, applyArgs);
    }
    return l1_orig;
}
function sc_forEach(proc, l1) {
    if (l1 === undefined)
	return undefined;
    var nbApplyArgs = arguments.length - 1;
    var applyArgs = new Array(nbApplyArgs);
    while (l1 !== null) {
	for (var i = 0; i < nbApplyArgs; i++) {
	    applyArgs[i] = arguments[i + 1].car;
	    arguments[i + 1] = arguments[i + 1].cdr;
	}
	proc.apply(null, applyArgs);
    }
    return undefined;
}
function sc_filter(proc, l1) {
    var dummy = { cdr : null };
    var tail = dummy;
    while (l1 !== null) {
	if (proc(l1.car) !== false) {
	    tail.cdr = sc_cons(l1.car, null);
	    tail = tail.cdr;
	}
	l1 = l1.cdr;
    }
    return dummy.cdr;
}
function sc_filterBang(proc, l1) {
    var head = sc_cons("dummy", l1);
    var it = head;
    var next = l1;
    while (next !== null) {
        if (proc(next.car) !== false) {
	    it.cdr = next
	    it = next;
	}
	next = next.cdr;
    }
    it.cdr = null;
    return head.cdr;
}
function sc_filterMap1(proc, l1) {
    var revres = null;
    while (l1 !== null) {
        var tmp = proc(l1.car)
        if (tmp !== false) revres = sc_cons(tmp, revres);
        l1 = l1.cdr;
    }
    return sc_reverseAppendBang(revres, null);
}
function sc_filterMap2(proc, l1, l2) {
    var revres = null;
    while (l1 !== null) {
        var tmp = proc(l1.car, l2.car);
        if(tmp !== false) revres = sc_cons(tmp, revres);
	l1 = l1.cdr;
	l2 = l2.cdr
    }
    return sc_reverseAppendBang(revres, null);
}
function sc_filterMap(proc, l1, l2, l3) {
    if (l2 === undefined)
	return sc_filterMap1(proc, l1);
    else if (l3 === undefined)
	return sc_filterMap2(proc, l1, l2);
    var nbApplyArgs = arguments.length - 1;
    var applyArgs = new Array(nbApplyArgs);
    var revres = null;
    while (l1 !== null) {
	for (var i = 0; i < nbApplyArgs; i++) {
	    applyArgs[i] = arguments[i + 1].car;
	    arguments[i + 1] = arguments[i + 1].cdr;
	}
	var tmp = proc.apply(null, applyArgs);
	if(tmp !== false) revres = sc_cons(tmp, revres);
    }
    return sc_reverseAppendBang(revres, null);
}
function sc_any1(proc, l) {
    var revres = null;
    while (l !== null) {
        var tmp = proc(l.car);
        if(tmp !== false) return tmp;
	l = l.cdr;
    }
    return false;
}
function sc_any(proc, l1, l2) {
    if (l1 === undefined)
	return false;
    if (l2 === undefined)
	return sc_any1(proc, l1);
    var nbApplyArgs = arguments.length - 1;
    var applyArgs = new Array(nbApplyArgs);
    while (l1 !== null) {
	for (var i = 0; i < nbApplyArgs; i++) {
	    applyArgs[i] = arguments[i + 1].car;
	    arguments[i + 1] = arguments[i + 1].cdr;
	}
	var tmp =  proc.apply(null, applyArgs);
	if (tmp !== false) return tmp;
    }
    return false;
}
function sc_anyPred(proc, l) {
    return sc_any(proc, l) !== false;
}
function sc_every1(proc, l) {
    var revres = null;
    var tmp = true;
    while (l !== null) {
        tmp = proc(l.car);
        if (tmp === false) return false;
	l = l.cdr;
    }
    return tmp;
}
function sc_every(proc, l1, l2) {
    if (l1 === undefined)
	return true;
    if (l2 === undefined)
	return sc_every1(proc, l1);
    var nbApplyArgs = arguments.length - 1;
    var applyArgs = new Array(nbApplyArgs);
    var tmp = true;
    while (l1 !== null) {
	for (var i = 0; i < nbApplyArgs; i++) {
	    applyArgs[i] = arguments[i + 1].car;
	    arguments[i + 1] = arguments[i + 1].cdr;
	}
	var tmp = proc.apply(null, applyArgs);
	if (tmp === false) return false;
    }
    return tmp;
}
function sc_everyPred(proc, l) {
    var tmp = sc_every(proc, l);
    if (tmp !== false) return true;
    return false;
}
function sc_force(o) {
    return o();
}
function sc_makePromise(proc) {
    var isResultReady = false;
    var result = undefined;
    return function() {
	if (!isResultReady) {
	    var tmp = proc();
	    if (!isResultReady) {
		isResultReady = true;
		result = tmp;
	    }
	}
	return result;
    };
}
function sc_Values(values) {
    this.values = values;
}
function sc_values() {
    if (arguments.length === 1)
	return arguments[0];
    else
	return new sc_Values(arguments);
}
function sc_callWithValues(producer, consumer) {
   if( !sc_isProcedure(producer) )
      sc_error( "callWithValue", "producer not a procedure", producer );
    var produced = producer();
    if (produced instanceof sc_Values)
	return consumer.apply(null, produced.values);
    else
	return consumer(produced);
}
function sc_dynamicWind(before, thunk, after) {
    before();
    try {
	var res = thunk();
	return res;
    } finally {
	after();
    }
}
function sc_Struct(name) {
    this.name = name;
}
sc_Struct.prototype.sc_toDisplayString = function() {
    return "#<struct" + sc_hash(this) + ">";
};
sc_Struct.prototype.sc_toWriteString = sc_Struct.prototype.sc_toDisplayString;
function sc_makeStruct(name) {
    return new sc_Struct(name);
}
function sc_isStruct(o) {
    return (o instanceof sc_Struct);
}
function sc_isStructNamed(name, s) {
    return ((s instanceof sc_Struct) && (s.name === name));
}
function sc_getStructField(s, name, field) {
    return s[field];
}
function sc_setStructFieldBang(s, name, field, val) {
    s[field] = val;
}
function sc_bitNot(x) {
    return ~x;
}
function sc_bitAnd(x, y) {
    return x & y;
}
function sc_bitOr(x, y) {
    return x | y;
}
function sc_bitXor(x, y) {
    return x ^ y;
}
function sc_bitLsh(x, y) {
    return x << y;
}
function sc_bitRsh(x, y) {
    return x >> y;
}
function sc_bitUrsh(x, y) {
    return x >>> y;
}
function sc_jsField(o, field) {
    return o[field];
}
function sc_setJsFieldBang(o, field, val) {
    return o[field] = val;
}
function sc_deleteJsFieldBang(o, field) {
    delete o[field];
}
function sc_jsCall(o, fun) {
    var args = new Array();
    for (var i = 2; i < arguments.length; i++)
	args[i-2] = arguments[i];
    return fun.apply(o, args);
}
function sc_jsMethodCall(o, field) {
    var args = new Array();
    for (var i = 2; i < arguments.length; i++)
	args[i-2] = arguments[i];
    return o[field].apply(o, args);
}
function sc_jsNew(c) {
    var evalStr = "new c(";
    evalStr +=arguments.length > 1? "arguments[1]": "";
    for (var i = 2; i < arguments.length; i++)
	evalStr += ", arguments[" + i + "]";
    evalStr +=")";
    return eval(evalStr);
}    
function sc_pregexp(re) {
    return new RegExp(sc_string2jsstring(re));
}
function sc_pregexpMatch(re, s) {
    var reg = (re instanceof RegExp) ? re : sc_pregexp(re);
    var tmp = reg.exec(sc_string2jsstring(s));
    if (tmp == null) return false;
    var res = null;
    for (var i = tmp.length-1; i >= 0; i--) {
	if (tmp[i] !== null) {
	    res = sc_cons(sc_jsstring2string(tmp[i]), res);
	} else {
	    res = sc_cons(false, res);
	}
    }
    return res;
}
function sc_pregexpReplace(re, s1, s2) {
   var reg;
   var jss1 = sc_string2jsstring(s1);
   var jss2 = sc_string2jsstring(s2);
   if (re instanceof RegExp) {
       if (re.global)
	   reg = re;
       else
	   reg = new RegExp(re.source);
   } else {
       reg = new RegExp(sc_string2jsstring(re));
   }
   return jss1.replace(reg, jss2);
}
function sc_pregexpReplaceAll(re, s1, s2) {
   var reg;
   var jss1 = sc_string2jsstring(s1);
   var jss2 = sc_string2jsstring(s2);
   if (re instanceof RegExp) {
      if (re.global)
	  reg = re;
      else
	  reg = new RegExp(re.source, "g");
   } else {
       reg = new RegExp(sc_string2jsstring(re), "g");
   }
   return jss1.replace(reg, jss2);
}
function sc_pregexpSplit(re, s) {
   var reg = ((re instanceof RegExp) ?
	      re :
	      new RegExp(sc_string2jsstring(re)));
   var jss = sc_string2jsstring(s);
   var tmp = jss.split(reg);
   if (tmp == null) return false;
   return sc_vector2list(tmp);
}
function sc_pregexpCreateCharsetMatcher(set) {
    if (set.length === 0 || set.length === 1) return new RegExp("[" + set + "]");
    var res = "[";
    for (var i = 0; i < set.length; i++) {
	var c = set.charAt(i);
	if (c === "]")
	    res += "\\]";
	else if (c === "^")
	    res += "\\^";
	else if (c === "\\")
	    res += "\\\\";
	else if (c === "-")
	    res += "\\-";
	else res += c;
    }
    return new RegExp(res + "]");
}
function sc_random(n) {
    return Math.floor(Math.random()*n);
}
function sc_currentDate() {
   return new Date();
}
function sc_currentSeconds() {
   return (new Date()).getTime() / 1000;
}
function sc_currentMicroseconds() {
   return (new Date()).getTime();
}
function sc_Hashtable() {
}
sc_Hashtable.prototype.toString = function() {
    return "#{%hashtable}";
};
function sc_HashtableElement(key, val) {
    this.key = key;
    this.val = val;
}
function sc_makeHashtable() {
    return new sc_Hashtable();
}
function sc_isHashtable(o) {
    return o instanceof sc_Hashtable;
}
function sc_hashtablePutBang(ht, key, val) {
    var hash = sc_hash(key);
    ht[hash] = new sc_HashtableElement(key, val);
}
function sc_hashtableGet(ht, key) {
    var hash = sc_hash(key);
    if (hash in ht)
	return ht[hash].val;
    else
	return false;
}
function sc_hashtableForEach(ht, f) {
    for (var v in ht) {
	if (ht[v] instanceof sc_HashtableElement)
	    f(ht[v].key, ht[v].val);
    }
}
function sc_hashtableContains(ht, key) {
    var hash = sc_hash(key);
    if (hash in ht)
	return true;
    else
	return false;
}
var SC_HASH_COUNTER = 0;
function sc_hash(o) {
    if (o === null)
	return "null";
    else if (o === undefined)
	return "undefined";
    else if (o === true)
	return "true";
    else if (o === false)
	return "false";
    else if (typeof o === "number")
	return "num-" + o;
    else if (typeof o === "string")
	return "jsstr-" + o;
    else if (o.sc_getHash)
	return o.sc_getHash();
    else
	return sc_counterHash.call(o);
}
function sc_counterHash() {
    if (!this.sc_hash) {
	this.sc_hash = "hash-" + SC_HASH_COUNTER;
	SC_HASH_COUNTER++;
    }
    return this.sc_hash;
}
function sc_Trampoline() {
}
sc_Trampoline.prototype.restart = function() {
    while (true) {
	this.calls = this.MAX_TAIL_CALLs-1;
	var res = this.f.apply(this, this.args);
	if (res !== this)
	    return res;
    }
}
function sc_bindExitLambda(proc) {
    var escape_obj = new sc_BindExitException();
    var escape = function(res) {
	escape_obj.res = res;
	throw escape_obj;
    };
    try {
	return proc(escape);
    } catch(e) {
	if (e === escape_obj) {
	    return e.res;
	}
	throw e;
    }
}
function sc_BindExitException() {
    this._internalException = true;
}
var SC_SCM2JS_GLOBALS = new Object();
var SC_TAIL_OBJECT = new sc_Trampoline();  
SC_SCM2JS_GLOBALS.TAIL_OBJECT = SC_TAIL_OBJECT;
function sc_EOF() {
}
var SC_EOF_OBJECT = new sc_EOF();
function sc_Port() {
}
function sc_InputPort() {
}
sc_InputPort.prototype = new sc_Port();
sc_InputPort.prototype.peekChar = function() {
    if (!("peeked" in this))
	this.peeked = this.getNextChar();
    return this.peeked;
}
sc_InputPort.prototype.readChar = function() {
    var tmp = this.peekChar();
    delete this.peeked;
    return tmp;
}
sc_InputPort.prototype.isCharReady = function() {
    return true;
}
sc_InputPort.prototype.close = function() {
}
function sc_ErrorInputPort() {
};
sc_ErrorInputPort.prototype = new sc_InputPort();
sc_ErrorInputPort.prototype.getNextChar = function() {
    throw "can't read from error-port.";
};
sc_ErrorInputPort.prototype.isCharReady = function() {
    return false;
};
function sc_StringInputPort(jsStr) {
    this.str = new String(jsStr);
    this.pos = 0;
}
sc_StringInputPort.prototype = new sc_InputPort();
sc_StringInputPort.prototype.getNextChar = function() {
    if (this.pos >= this.str.length)
	return SC_EOF_OBJECT;
    return this.str.charAt(this.pos++);
};
function sc_Token(type, val, pos) {
    this.type = type;
    this.val = val;
    this.pos = pos;
}
sc_Token.EOF = 0;
sc_Token.OPEN_PAR = 1;
sc_Token.CLOSE_PAR = 2;
sc_Token.OPEN_BRACE = 3;
sc_Token.CLOSE_BRACE = 4;
sc_Token.OPEN_BRACKET = 5;
sc_Token.CLOSE_BRACKET = 6;
sc_Token.WHITESPACE = 7;
sc_Token.QUOTE = 8;
sc_Token.ID = 9;
sc_Token.DOT = 10;
sc_Token.STRING = 11;
sc_Token.NUMBER = 12;
sc_Token.ERROR = 13;
sc_Token.VECTOR_BEGIN = 14;
sc_Token.TRUE = 15;
sc_Token.FALSE = 16;
sc_Token.UNSPECIFIED = 17;
sc_Token.REFERENCE = 18;
sc_Token.STORE = 19;
sc_Token.CHAR = 20;
var SC_ID_CLASS = SC_LOWER_CLASS + SC_UPPER_CLASS + "!$%*+-./:<=>?@^_~";
function sc_Tokenizer(port) {
    this.port = port;
}
sc_Tokenizer.prototype.peekToken = function() {
    if (this.peeked)
	return this.peeked;
    var newToken = this.nextToken();
    this.peeked = newToken;
    return newToken;
};
sc_Tokenizer.prototype.readToken = function() {
    var tmp = this.peekToken();
    delete this.peeked;
    return tmp;
};
sc_Tokenizer.prototype.nextToken = function() {
    var port = this.port;
    function isNumberChar(c) {
	return (c >= "0" && c <= "9");
    };
    function isIdOrNumberChar(c) {
	return SC_ID_CLASS.indexOf(c) != -1 || 
	    (c >= "0" && c <= "9");
    }
    function isWhitespace(c) {
	return c === " " || c === "\r" || c === "\n" || c === "\t" || c === "\f";
    };
    function isWhitespaceOrEOF(c) {
	return isWhitespace(c) || c === SC_EOF_OBJECT;
    };
    function readString() {
	res = "";
	while (true) {
	    var c = port.readChar();
	    switch (c) {
	    case '"':
		return new sc_Token(11, res);
	    case "\\":
		var tmp = port.readChar();
		switch (tmp) {
		case '0': res += "\0"; break;
		case 'a': res += "\a"; break;
		case 'b': res += "\b"; break;
		case 'f': res += "\f"; break;
		case 'n': res += "\n"; break;
		case 'r': res += "\r"; break;
		case 't': res += "\t"; break;
		case 'v': res += "\v"; break;
		case '"': res += '"'; break;
		case '\\': res += '\\'; break;
		case 'x':
		    var nb = 0;
		    while (true) {
			var hexC = port.peekChar();
			if (hexC >= '0' && hexC <= '9') {
			    port.readChar();
			    nb = nb * 16 + hexC.charCodeAt(0) - '0'.charCodeAt(0);
			} else if (hexC >= 'a' && hexC <= 'f') {
			    port.readChar();
			    nb = nb * 16 + hexC.charCodeAt(0) - 'a'.charCodeAt(0);
			} else if (hexC >= 'A' && hexC <= 'F') {
			    port.readChar();
			    nb = nb * 16 + hexC.charCodeAt(0) - 'A'.charCodeAt(0);
			} else {
			    res += String.fromCharCode(nb);
			    break;
			}
		    }
		    break;
		default:
		    if (tmp === SC_EOF_OBJECT) {
			return new sc_Token(13, "unclosed string-literal" + res);
		    }
		    res += tmp;
		}
		break;
	    default:
		if (c === SC_EOF_OBJECT) {
		    return new sc_Token(13, "unclosed string-literal" + res);
		}
		res += c;
	    }
	}
    };
    function readIdNumberOrKeyword(firstChar) {
	var res = firstChar;
	while (isIdOrNumberChar(port.peekChar()))
	    res += port.readChar();
	if (isNaN(res)) {
	    if (res.length > 1) {
		colonCode = ':'.charCodeAt(0);
		if (res.charCodeAt(0) == colonCode) {
		    if (res.charCodeAt(1) != colonCode) {
			return new sc_Token(21, res.substring(1, res.length));
		    }
		} else if (res.charCodeAt(res.length - 1) == colonCode &&
			   res.charCodeAt(res.length - 2) != colonCode) {
		    return new sc_Token(21, res.substring(0, res.length - 1));
		}
	    }
	    return new sc_Token(9, res);
	} else {
	    return new sc_Token(12, res - 0);
	}
    };
    function skipWhitespaceAndComments() {
	var done = false;
	while (!done) {
	    done = true;
	    while (isWhitespace(port.peekChar()))
		port.readChar();
	    if (port.peekChar() === ';') {
		port.readChar();
		done = false;
		while (true) {
		    curChar = port.readChar();
		    if (curChar === SC_EOF_OBJECT ||
			curChar === '\n')
			break;
		}
	    }
	}
    };
    function readDot() {
	if (isWhitespace(port.peekChar()))
	    return new sc_Token(10);
	else
	    return readIdNumberOrKeyword(".");
    };
    function readSharp() {
	var c = port.readChar();
	if (isWhitespace(c))
	    return new sc_Token(13, "bad #-pattern0.");
	if (isNumberChar(c)) {
	    var nb = c - 0;
	    while (isNumberChar(port.peekChar()))
		nb = nb*10 + (port.readChar() - 0);
	    switch (port.readChar()) {
	    case '#':
		return new sc_Token(18, nb);
	    case '=':
		return new sc_Token(19, nb);
	    default:
		return new sc_Token(13, "bad #-pattern1." + nb);
	    }
	}
	if (c === "(")
	    return new sc_Token(14);
	if (c === "\\") { 
	    var tmp = ""
	    while (!isWhitespaceOrEOF(port.peekChar()))
		tmp += port.readChar();
	    switch (tmp.length) {
	    case 0: 
		if (sc_isEOFObject(port.peekChar))
		    return new sc_Token(13, "bad #-pattern2.");
		else
		    return new sc_Token(20, port.readChar());
	    case 1:
		return new sc_Token(20, tmp);
	    default:
		var entry = sc_Char.readable2char[tmp.toLowerCase()];
		if (entry)
		    return new sc_Token(20, entry);
		else
		    return new sc_Token(13, "unknown character description: #\\" + tmp);
	    }
	}
	var res;
	var needing;
	switch (c) {
	case 't': res = new sc_Token(15, true); needing = ""; break;
	case 'f': res = new sc_Token(16, false); needing = ""; break;
	case 'u': res = new sc_Token(17, undefined); needing = "nspecified"; break;
	default:
	    return new sc_Token(13, "bad #-pattern3: " + c);
	}
	while(true) {
	    c = port.peekChar();
	    if ((isWhitespaceOrEOF(c) || c === ')') &&
		needing == "")
		return res;
	    else if (isWhitespace(c) || needing == "")
		return new sc_Token(13, "bad #-pattern4 " + c + " " + needing);
	    else if (needing.charAt(0) == c) {
		port.readChar(); 
		needing = needing.slice(1);
	    } else
		return new sc_Token(13, "bad #-pattern5");
	}
    };
    skipWhitespaceAndComments();
    var curChar = port.readChar();
    if (curChar === SC_EOF_OBJECT)
	return new sc_Token(0, curChar);
    switch (curChar)
    {
    case " ":
    case "\n":
    case "\t":
	return readWhitespace();
    case "(":
	return new sc_Token(1);
    case ")":
	return new sc_Token(2);
    case "{":
	return new sc_Token(3);
    case "}":
	return new sc_Token(4);
    case "[":
	return new sc_Token(5);
    case "]":
	return new sc_Token(6);
    case "'":
	return new sc_Token(8);
    case "#":
	return readSharp();
    case ".":
	return readDot();
    case '"':
	return readString();
    default:
	if (isIdOrNumberChar(curChar))
	    return readIdNumberOrKeyword(curChar);
	throw "unexpected character: " + curChar;
    }
};
function sc_Reader(tokenizer) {
    this.tokenizer = tokenizer;
    this.backref = new Array();
}
sc_Reader.prototype.read = function() {
    function readList(listBeginType) {
	function matchesPeer(open, close) {
	    return open === 1 && close === 2
	    	|| open === 3 && close === 4
		|| open === 5 && close === 6;
	};
	var res = null;
	while (true) {
	    var token = tokenizer.peekToken();
	    switch (token.type) {
	    case 2:
	    case 4:
	    case 6:
		if (matchesPeer(listBeginType, token.type)) {
		    tokenizer.readToken(); 
		    return sc_reverseBang(res);
		} else
		    throw "closing par doesn't match: " + listBeginType
			+ " " + listEndType;
	    case 0:
		throw "unexpected end of file";
	    case 10:
		tokenizer.readToken(); 
		var cdr = this.read();
		var par = tokenizer.readToken();
		if (!matchesPeer(listBeginType, par.type))
		    throw "closing par doesn't match: " + listBeginType
			+ " " + par.type;
		else
		    return sc_reverseAppendBang(res, cdr);
	    default:
		res = sc_cons(this.read(), res);
	    }
	}
    };
    function readQuote() {
	return sc_cons("quote", sc_cons(this.read(), null));
    };
    function readVector() {
	var a = new Array();
	while (true) {
	    var token = tokenizer.peekToken();
	    switch (token.type) {
	    case 2:
		tokenizer.readToken();
		return a;
	    default:
		a.push(this.read());
	    }
	}
    };
    function storeRefence(nb) {
	var tmp = this.read();
	this.backref[nb] = tmp;
	return tmp;
    };
    function readReference(nb) {
	if (nb in this.backref)
	    return this.backref[nb];
	else
	    throw "bad reference: " + nb;
    };
    var tokenizer = this.tokenizer;
    var token = tokenizer.readToken();
    if (token.type === 13)
	throw token.val;
    switch (token.type) {
    case 1:
    case 3:
    case 5:
	return readList.call(this, token.type);
    case 8:
	return readQuote.call(this);
    case 11:
	return sc_jsstring2string(token.val);
    case 20:
	return new sc_Char(token.val);
    case 14:
	return readVector.call(this);
    case 18:
	return readReference.call(this, token.val);
    case 19:
	return storeRefence.call(this, token.val);
    case 9:
	return sc_jsstring2symbol(token.val);
    case 21:
	return sc_jsstring2keyword(token.val);
    case 0:
    case 12:
    case 15:
    case 16:
    case 17:
	return token.val;
    default:
	throw "unexpected token " + token.type + " " + token.val;
    }
};
function sc_read(port) {
    if (port === undefined) 
	port = SC_DEFAULT_IN; 
    var reader = new sc_Reader(new sc_Tokenizer(port));
    return reader.read();
}
function sc_readChar(port) {
    if (port === undefined) 
	port = SC_DEFAULT_IN; 
    var t = port.readChar();
    return t === SC_EOF_OBJECT? t: new sc_Char(t);
}
function sc_peekChar(port) {
    if (port === undefined) 
	port = SC_DEFAULT_IN; 
    var t = port.peekChar();
    return t === SC_EOF_OBJECT? t: new sc_Char(t);
}    
function sc_isCharReady(port) {
    if (port === undefined) 
	port = SC_DEFAULT_IN; 
    return port.isCharReady();
}
function sc_closeInputPort(p) {
    return p.close();
}
function sc_isInputPort(o) {
    return (o instanceof sc_InputPort);
}
function sc_isEOFObject(o) {
    return o === SC_EOF_OBJECT;
}
function sc_currentInputPort() {
    return SC_DEFAULT_IN;
}
function sc_callWithInputFile(s, proc) {
    throw "can't open " + s;
}
function sc_callWithOutputFile(s, proc) {
    throw "can't open " + s;
}
function sc_withInputFromFile(s, thunk) {
    throw "can't open " + s;
}
function sc_withOutputToFile(s, thunk) {
    throw "can't open " + s;
}
function sc_openInputFile(s) {
    throw "can't open " + s;
}
function sc_openOutputFile(s) {
    throw "can't open " + s;
}
function sc_basename(p) {
   var i = p.lastIndexOf('/');
   if(i >= 0)
      return p.substring(i + 1, p.length);
   else
      return p;
}
function sc_dirname(p) {
   var i = p.lastIndexOf('/');
   if(i >= 0)
      return p.substring(0, i);
   else
      return '';
}
function sc_withInputFromPort(p, thunk) {
    try {
	var tmp = SC_DEFAULT_IN; 
	SC_DEFAULT_IN = p;
	return thunk();
    } finally {
	SC_DEFAULT_IN = tmp;
    }
}
function sc_withInputFromString(s, thunk) {
    return sc_withInputFromPort(new sc_StringInputPort(sc_string2jsstring(s)), thunk);
}
function sc_withOutputToPort(p, thunk) {
    try {
	var tmp = SC_DEFAULT_OUT; 
	SC_DEFAULT_OUT = p;
	return thunk();
    } finally {
	SC_DEFAULT_OUT = tmp;
    }
}
function sc_withOutputToString(thunk) {
    var p = new sc_StringOutputPort();
    sc_withOutputToPort(p, thunk);
    return p.close();
}
function sc_withOutputToProcedure(proc, thunk) {
    var t = function(s) { proc(sc_jsstring2string(s)); };
    return sc_withOutputToPort(new sc_GenericOutputPort(t), thunk);
}
function sc_openOutputString() {
    return new sc_StringOutputPort();
}
function sc_openInputString(str) {
    return new sc_StringInputPort(sc_string2jsstring(str));
}
function sc_OutputPort() {
}
sc_OutputPort.prototype = new sc_Port();
sc_OutputPort.prototype.appendJSString = function(obj) {
}
sc_OutputPort.prototype.close = function() {
}
function sc_StringOutputPort() {
    this.res = "";
}
sc_StringOutputPort.prototype = new sc_OutputPort();
sc_StringOutputPort.prototype.appendJSString = function(s) {
    this.res += s;
}
sc_StringOutputPort.prototype.close = function() {
    return sc_jsstring2string(this.res);
}
function sc_getOutputString(sp) {
    return sc_jsstring2string(sp.res);
}
function sc_ErrorOutputPort() {
}
sc_ErrorOutputPort.prototype = new sc_OutputPort();
sc_ErrorOutputPort.prototype.appendJSString = function(s) {
    throw "don't write on ErrorPort!";
}
sc_ErrorOutputPort.prototype.close = function() {
}
function sc_GenericOutputPort(appendJSString, close) {
    this.appendJSString = appendJSString;
    if (close)
	this.close = close;
}
sc_GenericOutputPort.prototype = new sc_OutputPort();
function sc_isOutputPort(o) {
    return (o instanceof sc_OutputPort);
}
function sc_closeOutputPort(p) {
    return p.close();
}
function sc_write(o, p) {
    if (p === undefined) 
	p = SC_DEFAULT_OUT;
    p.appendJSString(sc_toWriteString(o));
}
function sc_toWriteString(o) {
    if (o === null)
	return "()";
    else if (o === true)
	return "#t";
    else if (o === false)
	return "#f";
    else if (o === undefined)
	return "#unspecified";
    else if (o === this.window)
        return "window";
    else if (typeof o === 'function')
        return "#<procedure " + (o.name ? o.name : "anonymous") + " " + (o.location != "#f" ? o.location : "") + ":" + sc_hash(o) + ">";
    else if (o.sc_toWriteString)
	return o.sc_toWriteString();
    else
	return o.toString();
}
function sc_escapeWriteString(s) {
    var res = "";
    var j = 0;
    for (i = 0; i < s.length; i++) {
	switch (s.charAt(i)) {
	case "\0": res += s.substring(j, i) + "\\0"; j = i + 1; break;
	case "\b": res += s.substring(j, i) + "\\b"; j = i + 1; break;
	case "\f": res += s.substring(j, i) + "\\f"; j = i + 1; break;
	case "\n": res += s.substring(j, i) + "\\n"; j = i + 1; break;
	case "\r": res += s.substring(j, i) + "\\r"; j = i + 1; break;
	case "\t": res += s.substring(j, i) + "\\t"; j = i + 1; break;
	case '"': res += s.substring(j, i) + '\\"'; j = i + 1; break;
	case "\\": res += s.substring(j, i) + "\\\\"; j = i + 1; break;
	default:
	    var c = s.charAt(i);
	    if ("\a" !== "a" && c == "\a") {
		res += s.substring(j, i) + "\\a"; j = i + 1; continue;
	    }
	    if ("\v" !== "v" && c == "\v") {
		res += s.substring(j, i) + "\\v"; j = i + 1; continue;
	    }
	    if (s.charAt(i) < ' ') {
		res += s.substring(j, i) + "\\x" + s.charCodeAt(i).toString(16);
		j = i + 1;
	    }
	}
    }
    res += s.substring(j, i);
    return res;
}
function sc_display(o, p) {
    if (p === undefined) 
	p = SC_DEFAULT_OUT;
    p.appendJSString(sc_toDisplayString(o));
}
function sc_toDisplayString(o) {
    if (o === null)
	return "()";
    else if (o === true)
	return "#t";
    else if (o === false)
	return "#f";
    else if (o === undefined)
	return "#unspecified";
    else if (o === this.window)
        return "window";
    else if (typeof o === 'function')
        return "#<procedure " + (o.name ? o.name : "anonymous") + " " + (o.location != "#f" ? o.location : "") + ":" + sc_hash(o) + ">";
    else if (o.sc_toDisplayString)
	return o.sc_toDisplayString();
    else
	return o.toString();
}
function sc_newline(p) {
    if (p === undefined) 
	p = SC_DEFAULT_OUT;
    p.appendJSString("\n");
}
function sc_writeChar(c, p) {
    if (p === undefined) 
	p = SC_DEFAULT_OUT;
    p.appendJSString(c.val);
}
function sc_writeCircle(o, p) {
    if (p === undefined) 
	p = SC_DEFAULT_OUT;
    p.appendJSString(sc_toCircleString(o, sc_toWriteString));
}
function sc_displayCircle(o, p) {
    if (p === undefined) 
	p = SC_DEFAULT_OUT;
    p.appendJSString(sc_toCircleString(o, sc_toDisplayString));
}
function sc_toCircleString(o, writeOrDisplay) {
    var symb = sc_gensym("writeCircle");
    var nbPointer = new Object();
    nbPointer.nb = 0;
    sc_prepCircle(o, symb, nbPointer);
    return sc_genToCircleString(o, symb, writeOrDisplay);
}
function sc_prepCircle(o, symb, nbPointer) {
    if (o instanceof sc_Pair ||
	o instanceof sc_Vector) {
	if (o[symb] !== undefined) {
	    o[symb]++;
	    if (!o[symb + "nb"]) o[symb + "nb"] = nbPointer.nb++;
	    return;
	}
	o[symb] = 0;
	if (o instanceof sc_Pair) {
	    sc_prepCircle(o.car, symb, nbPointer);
	    sc_prepCircle(o.cdr, symb, nbPointer);
	} else {
	    for (var i = 0; i < o.length; i++)
		sc_prepCircle(o[i], symb, nbPointer);
	}
    }
}
function sc_genToCircleString(o, symb, writeOrDisplay) {
    if (!(o instanceof sc_Pair ||
	  o instanceof sc_Vector))
	return writeOrDisplay(o);
    return o.sc_toCircleString(symb, writeOrDisplay);
}
sc_Pair.prototype.sc_toCircleString = function(symb, writeOrDisplay, inList) {
    if (this[symb + "use"]) { 
	var nb = this[symb + "nb"];
	if (this[symb]-- === 0) { 
	    delete this[symb];
	    delete this[symb + "nb"];
	    delete this[symb + "use"];
	}
	if (inList)
	    return '. #' + nb + '#';
	else
	    return '#' + nb + '#';
    }
    if (this[symb]-- === 0) { 
	delete this[symb];
	delete this[symb + "nb"];
	delete this[symb + "use"];
    }
    var res = "";
    if (this[symb] !== undefined) { 
	this[symb + "use"] = true;
	if (inList)
	    res += '. #' + this[symb + "nb"] + '=';
	else
	    res += '#' + this[symb + "nb"] + '=';
	inList = false;
    }
    if (!inList)
	res += "(";
    res += sc_genToCircleString(this.car, symb, writeOrDisplay);
    if (sc_isPair(this.cdr)) {
	res += " " + this.cdr.sc_toCircleString(symb, writeOrDisplay, true);
    } else if (this.cdr !== null) {
	res += " . " + sc_genToCircleString(this.cdr, symb, writeOrDisplay);
    }
    if (!inList)
	res += ")";
    return res;
};
sc_Vector.prototype.sc_toCircleString = function(symb, writeOrDisplay) {
    if (this[symb + "use"]) { 
	var nb = this[symb + "nb"];
	if (this[symb]-- === 0) { 
	    delete this[symb];
	    delete this[symb + "nb"];
	    delete this[symb + "use"];
	}
	return '#' + nb + '#';
    }
    if (this[symb]-- === 0) { 
	delete this[symb];
	delete this[symb + "nb"];
	delete this[symb + "use"];
    }
    var res = "";
    if (this[symb] !== undefined) { 
	this[symb + "use"] = true;
	res += '#' + this[symb + "nb"] + '=';
    }
    res += "#(";
    for (var i = 0; i < this.length; i++) {
	res += sc_genToCircleString(this[i], symb, writeOrDisplay);
	if (i < this.length - 1) res += " ";
    }
    res += ")";
    return res;
};
function sc_print(s) {
    if (arguments.length === 1) {
	sc_display(s);
	sc_newline();
    }
    else {
	for (var i = 0; i < arguments.length; i++)
	    sc_display(arguments[i]);
	sc_newline();
    }
}
function sc_format(s) {
   var len = s.length;
   var p = new sc_StringOutputPort();
   var i = 0, j = 1;
   while( i < len ) {
      var i2 = s.indexOf("~", i);
      if (i2 == -1) {
	  p.appendJSString( s.substring( i, len ) );
	  return p.close();
      } else if (i2 == (len - 1)) {
	  p.appendJSString(s.substring(i, len));
	  return p.close();
      } else if (i2 == (len - 2) && s.charAt(i2 + 1) == ":") {
	  p.appendJSString(s.substring(i, len));
	  return p.close();
      } else {
	  if (i2 > i) p.appendJSString(s.substring(i, i2));
	  var alternativeForm = (s.charAt(i2 + 1) == ":");
	  if (alternativeForm) i2++;
	  i = i2 + 2;
	  switch(s.charCodeAt(i2 + 1)) {
	  case 65:
	  case 97:
	      if (alternativeForm)
		  sc_displayCircle(arguments[j], p);
	      else
		  sc_display(arguments[j], p);
	      j++;
	      break;
	  case 83:
	  case 115:
	      if (alternativeForm)
		  sc_writeCircle(arguments[j], p);
	      else
		  sc_write(arguments[j], p);
	      j++;
	      break;
	  case 86:
	  case 118:
	      if (alternativeForm)
		  sc_displayCircle(arguments[j], p);
	      else
		  sc_display(arguments[j], p);
	      p.appendJSString("\n");
	      j++;
	      break;
	  case 67:
	  case 99:
	      p.appendJSString(String.fromCharCode(arguments[j]));
	      j++;
	      break;
	  case 88:
	  case 120:
	      p.appendJSString(arguments[j].toString(16));
	      j++;
	      break;
	  case 79:
	  case 111:
	      p.appendJSString(arguments[j].toString(8));
	      j++;
	      break;
	  case 66:
	  case 98:
	      p.appendJSString(arguments[j].toString(2));
	      j++;
	      break;
	  case 37:
	  case 110:
	      p.appendJSString("\n");
	      break;
	  case 114:
	      p.appendJSString("\r");
	      break;
	  case 126:
	      p.appendJSString("~");
	      break;
	  default:
	      sc_error( "format: illegal ~"
			+ String.fromCharCode(s.charCodeAt(i2 + 1))
			+ " sequence" );
	      return "";
	  }
      }
   }
   return p.close();
}
var SC_DEFAULT_IN = new sc_ErrorInputPort();
var SC_DEFAULT_OUT = new sc_ErrorOutputPort();
var SC_ERROR_OUT = new sc_ErrorOutputPort();
var sc_SYMBOL_PREFIX = "\uEBAC";
var sc_KEYWORD_PREFIX = "\uEBAD";
function sc_jsstring2string(s) {
    return s;
}
function sc_jsstring2symbol(s) {
    return sc_SYMBOL_PREFIX + s;
}
function sc_string2jsstring(s) {
    return s;
}
function sc_symbol2jsstring(s) {
    return s.slice(1);
}
function sc_keyword2jsstring(k) {
    return k.slice(1);
}
function sc_jsstring2keyword(s) {
    return sc_KEYWORD_PREFIX + s;
}
function sc_isKeyword(s) {
    return (typeof s === "string") &&
	(s.charAt(0) === sc_KEYWORD_PREFIX);
}
var sc_gensym = function() {
    var counter = 1000;
    return function(sym) {
	counter++;
	if (!sym) sym = sc_SYMBOL_PREFIX;
	return sym + "s" + counter + "~" + "^sC-GeNsYm ";
    };
}();
function sc_isEqual(o1, o2) {
    return ((o1 === o2) ||
	    (sc_isPair(o1) && sc_isPair(o2)
	     && sc_isPairEqual(o1, o2, sc_isEqual)) ||
	    (sc_isVector(o1) && sc_isVector(o2)
	     && sc_isVectorEqual(o1, o2, sc_isEqual)));
}
function sc_number2symbol(x, radix) {
    return sc_SYMBOL_PREFIX + sc_number2jsstring(x, radix);
}
var sc_number2string = sc_number2jsstring;
function sc_symbol2number(s, radix) {
    return sc_jsstring2number(s.slice(1), radix);
}
var sc_string2number = sc_jsstring2number;
function sc_string2integer(s, radix) {
    if (!radix) return +s;
    return parseInt(s, radix);
}
function sc_string2real(s) {
    return +s;
}
function sc_isSymbol(s) {
    return (typeof s === "string") &&
	(s.charAt(0) === sc_SYMBOL_PREFIX);
}
function sc_symbol2string(s) {
    return s.slice(1);
}
function sc_string2symbol(s) {
    return sc_SYMBOL_PREFIX + s;
}
function sc_symbolAppend() {
    var res = sc_SYMBOL_PREFIX;
    for (var i = 0; i < arguments.length; i++)
	res += arguments[i].slice(1);
    return res;
}
function sc_char2string(c) { return c.val; }
function sc_char2symbol(c) { return sc_SYMBOL_PREFIX + c.val; }
function sc_isString(s) {
    return (typeof s === "string") &&
	(s.charAt(0) !== sc_SYMBOL_PREFIX);
}
var sc_makeString = sc_makejsString;
function sc_string() {
    for (var i = 0; i < arguments.length; i++)
	arguments[i] = arguments[i].val;
    return "".concat.apply("", arguments);
}
function sc_stringLength(s) { return s.length; }
function sc_stringRef(s, k) {
    return new sc_Char(s.charAt(k));
}
function sc_isStringEqual(s1, s2) {
    return s1 === s2;
}
function sc_isStringLess(s1, s2) {
    return s1 < s2;
}
function sc_isStringGreater(s1, s2) {
    return s1 > s2;
}
function sc_isStringLessEqual(s1, s2) {
    return s1 <= s2;
}
function sc_isStringGreaterEqual(s1, s2) {
    return s1 >= s2;
}
function sc_isStringCIEqual(s1, s2) {
    return s1.toLowerCase() === s2.toLowerCase();
}
function sc_isStringCILess(s1, s2) {
    return s1.toLowerCase() < s2.toLowerCase();
}
function sc_isStringCIGreater(s1, s2) {
    return s1.toLowerCase() > s2.toLowerCase();
}
function sc_isStringCILessEqual(s1, s2) {
    return s1.toLowerCase() <= s2.toLowerCase();
}
function sc_isStringCIGreaterEqual(s1, s2) {
    return s1.toLowerCase() >= s2.toLowerCase();
}
function sc_stringContains(s1,s2,start) {
   return s1.indexOf(s2,start ? start : 0) >= 0;
}
function sc_stringCIContains(s1,s2,start) {
   return s1.toLowerCase.indexOf(s2.toLowerCase,start ? start : 0) >= 0;
}
function sc_substring(s, start, end) {
   return s.substring(start, end < 0 ? s.length : end);
}
function sc_isSubstring_at(str1, str2, i, len) {
    if (!len) len = str2.length;
    else if (str2.length < len) return false;
    if (str1.length < len + i) return false;
    return str2.substring(0, len) == str1.substring(i, i+len);
    return s2 == s1.substring(i, i+ s2.length);
}
function sc_isSubstring(s1, s2, len) {
    if (s1.length < len) return false;
    if (s2.length < len) return false;
    return s2.substring(0, len) == s1.substring(0, len);
}
function sc_stringAppend() {
    return "".concat.apply("", arguments);
}
var sc_string2list = sc_jsstring2list;
var sc_list2string = sc_list2jsstring;
function sc_stringCopy(s) {
    return s;
}
function sc_keyword2string(o) {
    return o.slice(1);
}
function sc_string2keyword(o) {
    return sc_KEYWORD_PREFIX + o;
}
String.prototype.sc_toDisplayString = function() {
    if (this.charAt(0) === sc_SYMBOL_PREFIX)
	return this.slice(1);
    else if (this.charAt(0) === sc_KEYWORD_PREFIX)
	return ":" + this.slice(1);
    else
	return this.toString();
};
String.prototype.sc_toWriteString = function() {
    if (this.charAt(0) === sc_SYMBOL_PREFIX)
	return this.slice(1);
    else if (this.charAt(0) === sc_KEYWORD_PREFIX)
	return ":" + this.slice(1);
    else
	return '"' + sc_escapeWriteString(this) + '"';
};
function sc_isStringPrefix(cs1, cs2) {
    return cs2.indexOf(cs1) === 0;
}
function sc_isStringSuffix(cs1, cs2) {
    var tmp = cs2.lastIndexOf(cs1);
    return tmp !== false && tmp >= 0 && tmp === cs2.length - cs1.length;
}
function sc_stringSplit(s, sep) {
    if (sep.length === 1)
	return sc_vector2list(s.split(sep));
    return sc_vector2list(s.split(sc_pregexpCreateCharsetMatcher(sep)));
}
function sc_stringIndex(s, cset, start) {
   var res;
   if (!start) start = 0;
   if (cset instanceof sc_Char) {
      res = s.indexOf(sc_char2string(cset), start);
      return res >= 0 ? res : false;
   }
   if (cset.length == 1) {
      res = s.indexOf(cset, start);
      return res >= 0 ? res : false;
   } else {
      for (var i = start; i < s.length; i++ ) {
	 if (cset.indexOf(s.charAt(i)))
	    return i;
      }
      return false;
   }
}
function sc_stringIndexRight(s, cset, start) {
   var res;
   if (!start) start = s.length - 1;
   if (cset instanceof sc_Char) {
      res = s.lastIndexof(sc_char2string(cset), start);
      return res >= 0 ? res : false;
   }
   if (cset.length == 1) {
      res = s.lastIndexOf(cset, start);
      return res >= 0 ? res : false;
   } else {
      for (var i = start; i >= 0; i-- ) {
	 if (cset.indexOf(s.charAt(i)))
	    return i;
      }
      return false;
   }
}
function sc_string_downcase(s) {
   return s.toLowerCase();
}
function sc_string_upcase(s) {
   return s.toUpperCase();
}
function sc_string_capitalize(s) {
   return s.replace(/\w+/g, function (w) {
	 return w.charAt(0).toUpperCase() + w.substr(1).toLowerCase();
      });
}
var BGl_dssslzd2getzd2keyzd2argzd2zzdssslz00;
var BGl_dssslzd2getzd2keyzd2restzd2argz00zzdssslz00;
var BGl_dssslzd2checkzd2keyzd2argsz12zc0zzdssslz00;
var const_dsssl;
var BgL_sc_const_1z00_dsssl;
var BgL_sc_const_2z00_dsssl;
const_dsssl = "dsssl formal parsing";
BgL_sc_const_1z00_dsssl = "Unexpected #!keys parameters";
BgL_sc_const_2z00_dsssl = "keyword argument misses value";
sc_tmp = BGl_dssslzd2checkzd2keyzd2argsz12zc0zzdssslz00 = function(dsssl_args, key_list) {
      var stmp;
      var stmp_1;
      var tmp1308;
      var tmp1307;
      var tmp1306;
      var args;
      var armed;
      var opts;
      var tmp1304;
      var tmp1303;
      var args_2;
      var g1305;
      if (key_list === null) {
        args_2 = dsssl_args;
        while (!(args_2 === null)) {
          tmp1303 = !(args_2 instanceof sc_Pair);
          if (tmp1303 !== false) {
            stmp_1 = tmp1303;
          } else {
            tmp1304 = args_2.cdr === null;
            if (tmp1304 !== false) {
              stmp_1 = tmp1304;
            } else {
              stmp_1 = !sc_arity_check(sc_isKeyword, 1)(args_2.car);
            }
          }
          if (stmp_1 !== false) {
            return sc_arity_check(sc_error, 3)(const_dsssl, BgL_sc_const_1z00_dsssl, args_2);
          } else {
            args_2 = args_2.cdr.cdr;
          }
        }
        return dsssl_args;
      } else {
        g1305 = null;
        args = dsssl_args;
        armed = false;
        opts = g1305;
        while (!(args === null)) {
          tmp1306 = !(args instanceof sc_Pair);
          if (tmp1306 !== false) {
            stmp = tmp1306;
          } else {
            tmp1307 = args.cdr === null;
            if (tmp1307 !== false) {
              stmp = tmp1307;
            } else {
              tmp1308 = !sc_arity_check(sc_isKeyword, 1)(args.car);
              if (tmp1308 !== false) {
                stmp = tmp1308;
              } else {
                stmp = sc_arity_check(sc_memq, 2)(args.car, key_list) === false;
              }
            }
          }
          if (stmp !== false) {
            if (armed === false) {
              args = args.cdr;
            } else {
              armed = false;
              opts = new sc_Pair(args.car, opts);
              args = args.cdr;
            }
          } else {
            args = args.cdr.cdr;
            armed = true;
          }
        }
        return sc_arity_check(sc_reverseBang, 1)(opts);
      }
    }, sc_tmp.name = "dsssl-check-key-args!", sc_tmp.location = "(at dsssl.scm 144)", sc_tmp.sc_arity = 2, sc_tmp;
sc_tmp = BGl_dssslzd2getzd2keyzd2argzd2zzdssslz00 = function(dsssl_args, keyword, initializer) {
      var args;
      args = dsssl_args;
      while (!(args === null)) {
        if (!sc_arity_check(sc_isKeyword, 1)(args.car)) {
          args = args.cdr;
        } else {
          if (args.car === keyword) {
            if (!(args.cdr instanceof sc_Pair)) {
              return sc_arity_check(sc_error, 3)("\uEBACdsssl-get-key-arg", BgL_sc_const_2z00_dsssl, args.car);
            } else {
              return args.cdr.car;
            }
          } else {
            if (!(args.cdr instanceof sc_Pair)) {
              return sc_arity_check(sc_error, 3)("\uEBACdsssl-get-key-arg", BgL_sc_const_2z00_dsssl, args.car);
            } else {
              args = args.cdr.cdr;
            }
          }
        }
      }
      return initializer;
    }, sc_tmp.name = "dsssl-get-key-arg", sc_tmp.location = "(at dsssl.scm 1375)", sc_tmp.sc_arity = 3, sc_tmp;
sc_tmp = BGl_dssslzd2getzd2keyzd2restzd2argz00zzdssslz00 = function(dsssl_args) {
      var tmp1309;
      var args;
      args = dsssl_args;
      while (!(args === null)) {
        tmp1309 = !sc_arity_check(sc_isKeyword, 1)(args.car);
        if ((tmp1309 !== false? tmp1309: args.cdr === null) !== false) {
          return args;
        } else {
          args = args.cdr.cdr;
        }
      }
      return null;
    }, sc_tmp.name = "dsssl-get-key-rest-arg", sc_tmp.location = "(at dsssl.scm 2124)", sc_tmp.sc_arity = 1, sc_tmp;
var hop_onerror_handler_hop_exception;
var hop_last_exception_hop_exception;
var BgL_sc_objzd2ze3string_1z31_hop_exception;
var in_exception_report_hop_exception;
var const_hop_exception;
var BgL_sc_const_2z00_hop_exception;
var BgL_sc_const_3z00_hop_exception;
var BgL_sc_const_4z00_hop_exception;
var BgL_sc_const_5z00_hop_exception;
var BgL_sc_const_6z00_hop_exception;
var BgL_sc_const_7z00_hop_exception;
var BgL_sc_const_8z00_hop_exception;
var BgL_sc_const_9z00_hop_exception;
var BgL_sc_const_10z00_hop_exception;
var BgL_sc_const_11z00_hop_exception;
var BgL_sc_const_12z00_hop_exception;
var BgL_sc_const_13z00_hop_exception;
var BgL_sc_const_14z00_hop_exception;
var BgL_sc_const_15z00_hop_exception;
var BgL_sc_const_16z00_hop_exception;
var BgL_sc_const_17z00_hop_exception;
var BgL_sc_const_18z00_hop_exception;
var BgL_sc_const_19z00_hop_exception;
var BgL_sc_const_20z00_hop_exception;
var BgL_sc_const_21z00_hop_exception;
var BgL_sc_const_22z00_hop_exception;
var BgL_sc_const_23z00_hop_exception;
var BgL_sc_const_24z00_hop_exception;
var hop_get_stack;
var hop_report_exception;
var hop_mangledp;
var hop_demangle;
var hop_make_exception_stack;
var hop_make_exception_frame;
const_hop_exception = "font-family: arial; font-size: 10pt; overflow: visible";
BgL_sc_const_2z00_hop_exception = "font-family: monospace; color: #777";
BgL_sc_const_3z00_hop_exception = "at ([^ ]+) [(]([^ ]+)(:[0-9]+:[0-9]+)[)]";
BgL_sc_const_4z00_hop_exception = "position: fixed;\n    top: 0; left: 0; right: 0; bottom: 0;\n    opacity: 0.8;\n    background: #141111;\n    z-index: 1000000";
BgL_sc_const_5z00_hop_exception = "font-size: 9pt; padding-left: 1em";
BgL_sc_const_6z00_hop_exception = "data:image\u002fpng;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A\u002fwD\u002foL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kGBA8VBixNgawAAAsWSURBVGje7Zp5cF3Vfcc\u002fd3mbnlZbq2VJlrUvXrRhG8dyhKG2jI1jEuMQwDZ2CyYQoCYdSGmBYJrJZDqdadKmSUM7nZBJZrJM2sKUUuI07bBMp9OEmJIGgsHxgm1ZSA9J795379n6x32WZSy3BmxwJtyZ39zfO+fe3znf3+\u002f3Ped37jzLGMNv8mXzG359COCDvtxTyvcs60LajQF3a7jRQMKBxxV8wcD4hRrg+jx33YvkmC9q2FNSXooTizF27GSbgS7g44B\u002fqafQKgV75i\u002ftYOjrX2Ho0b+ibfijSBjWsN0AF0IuFoC4hr1x16Z713YSy4dwuwZov+kmCkvSSHhAwTwFvFe5WAC2aFjdcPkAJauuhMksZMZJNnXStvYKNNRouE0D71UuBoACDfcVlRbSuWsHFJSAl4VcDpSh9ZqPUbVgPiHcrqD9UozA7xvobtu4jlTvCvA9CMNIPB+3opbF1wzjOnaZgocvNQ40SLi7vKGGxi1bwIqB758GEAYQhNT2L6ehuw0BmxWsvZRS6PMGyps3DOMu7IhSR4gZAELwfaxEIe0fHSRmW66ChzXYlwKAHgFbazuaqFu\u002fEUIZ5X0QRFHwvOh3GILnUdPSQfuyHgRcpmDLBePAu8xFV8Ejrmsnu2\u002fYilNTD9lsNNkgICwtJaysxCgVgcjlsHBZPLiK0pIiBHxRQcUHCWCDhPXNq1cw9yNDkIsmjucRVlXhL12K199P0NFxRlRKyqpYsnIAAws07PqgUsjWsCeVStCyeTOkiqOVJwgwjoNqbCTmusQtC9XSgi4ujtIpDCEnaGnvYk55GQI+raHyPQN4F97fLmHVwtUrKFrUA54\u002f7X1VW4tTWkoiHicZjxMrLET19kbEzuUg8CmIpVjSvxQsq07DH7\u002ffESiTcH9peSntH782WjZzPvg+Jp2G1lbitk0YBGSzWeKA3dmJbmzMc0SA59O+YCF1dTWEcLOGpe8nBx5W0NS2\u002fipSLd2QjVKHMISuLtxUCiEEruuSTCYRQmDbNta6dZBIRKkU5EgI6OnqxLGttII\u002fM2C9HynULODmqvoaFly1FqSGIBd5tqoKq76e2c7ZmUwGq6IC+vpgcjIfBY+FZXNobWkkhCENV130FDLwOQvSXZuuJl5dl\u002fdmAEpBe\u002fs533NOHZgGB6GoaJrQbjagf2EjBckEEr6go5rqokVgpYAdDT2d1A4OQaiiyWez0NAANTUAWLOc7hLJZKRUVMDwMExNTe\u002fQtbgsaWtCQp+GGy9WMZfW8KVEImZ3fewa7MKyqGTwfYjHYcmSWaLlY\u002fIHMNueMdSaNdDaGqWSEFgTU\u002fSWlVFWlEbAQwYWvONi7jy8\u002fykBly9c3sfcxX3gzSgXFi2CkpLIjon8Y5QGEwcTj\u002fQzCu8CuPFGkHJ6h56bzdHXWI+xrBoFd17QFALSEu4qLimkc+PVEC+MKkzfh3Qa09aWt6LRhCidw3JsLMuJxLFxYhZGzxi6pwcWL4aJiQjIRJaegjS15WWEsEND2wUjsYE9Brrahlbijh8leO7JaNdVBtXVhUkk8iuPhWOlcGzYv\u002f9n3Hfv\u002fTz40F5eO\u002fQrbBRYFqcWKGPb6J07IRYH3yfjZXhTZulrbiTu2GUSHjkfDpzPV4lKAXdUNtSyYGkn\u002fk++j\u002fz1YdzaJgqu3YnT3Y2DzhM3Iu+TTz3PjhtuYuTNLJZl8Xd\u002f\u002fXX+5pvfZt3wGoQICW1JgROHvj6mhj7CoUe\u002fxsm4wH4jQ11HL83Vlfz86PFNMegFfnpeXyXOlT4a7jRQ2bzyMqw3XkUdPYx2wT9wAH9+JZMhGJUDLDSC\u002f37xCW79vc8wMn4cmyy2meDY2Bi7dt3KCz\u002f7AaOZgE9ccR3PPPNztDH4n9zKSIGFlhB6OcaPHaGrtoakY8ckfF6B81524n4Bn21Y1M68+gpy\u002f\u002fVvKED74Kwfxrn6WgpcjdBgjMfBIyN8YsuDHD78EpaxMZaFtgAtOXbsAJs23cuj33iMw2Nj3HLLTvY9\u002fQxFl62k+ra7kX6U26PHjlCEpLe+FgkbDHzyXa1CgKNhb8x1Eu2rV6BffwmZmcBoMOk4uevvATeN9gNs4\u002fLCi6+z8Xc2cPD1X1JeXIaFBkTeWgxwOHb4dR584C7K0i7f+c73aagrIsjmKN++m0RrHToAKTWjJ96gvWIuJfEYAvZqqHjHJDawUcC6+d1tlKRdwpdfwFigc8DWbTw3Kblr932ENjz4yJ\u002fS37OEBQ3d\u002fPLVgzy+71lq5zdgTBzbaJLJFHPnVqGw6O9dwRP\u002fso\u002fWtmpq6xeihIdTU0vlZ\u002f4ArSO4mfFxyHksrq5EQaOa5czw\u002fwGwFOxJFaToHFyOfOk\u002fkBNZjAJdUYLefCtXDA5QkjI01czjR0\u002f+I0\u002f964v88B\u002fuZ35NGQM9Dfzq0Mts+9RNKOLs3rWdv\u002fzqV9i0cStPPfsjUgmNpR20EhgtEVOTFK29hkR3G8qPonD82FE655RSnUoSRmeGinfCgd0KVrWvHKDQFuQO\u002fAJjgxIgNu9AVtcjPY\u002fPPXAvr\u002fz6IE8\u002f\u002fc8s65mPlPX4chRj4mhvnK89+mWWLh2gf3ANRw+d5M\u002f\u002f9ssk5AlEGBLIKZS0UBJkEKAL0sy57W5M3AEDE1NZ\u002fKkJltVU4lpWnYw+ApzXRlYt4I\u002fKa6po7ltEbv9zqJzEBCBbWwiu\u002fV2Un0VJiZAKKSVSBgQiIBQelknj+5NokwIm+PQd9\u002fDTZx\u002fn1tvXU5FOYFOOUgotDEqpaRFTkxRcOUz6yjXThD46coK6ZJzmokLCKI1W\u002fp8RyN8f0DCveXkv9uhhwkMHIu+7LlNbbkEkU8hcDiElSiqEEIShQkuJUmAkeH4OISRh6NDSVsd3v\u002fsE33vieY4cHWMyN4mQkkAowjBECIEQApmX4p27cSpLMRKyuZDRzDhLykqIWVZMwZ8YsM\u002f5YctAk4Bt1fW1zF8wD3\u002f\u002fcygdTUpWVRAODCGzWYSUSCmjgaVEa41SBplT5IIcqVSSkZERTpwYYc6cOHfc8xA\u002f\u002fvvn2Xr9Njo7utl23Q1k3vJR6lQEIwk9D6eplVhnB0pETj06Nk6ZBYuKCwlgtYYrz7kTa\u002fhD27LSXatXwPHXECOjGBeMBsYzOK+8iBxYjcCA62JcF2IuxnExjoPjOBhL4NtJalqbyPkCoRS3f7YZ37cxegKt04yO+hSWOCglUUKilUIJAYB89RWCQ4cxdgQgJzQjb71FX3Eh\u002fzOVZVLpvQ48A3hnADAwKGFHy+IOKqtKmfrxPrQF2hAZ83xSX7qHcPUGdLIArQ3StlG2DZYdlRKWBcbC2JGK5WA0jBgFGrS20EZjDExpjdYGpTVKaZQxGKWZ\u002fMk+goNHMG40tgUcn5pibjLFsqJCnspMXGbDDcA3zgCgYE8ylbTbL+8j+MV\u002fIt8cRzuR97Uh0k+O4T72TXS+TRlQp\u002frN6TZtQOOglYqcoMC4IMPp8mRazvptgYmdtmeAQBpeG8\u002fQXlLMftflhJQ3zwago6h8Dinp4R18GePakTEzQ2IRkGiCUdvp5SsazTrFMqPzs4n6tQanIO\u002fVGaLftn7r\u002fFgzmelgkQkEXi6gOubwhpS1Z3HAggMTY5nWyQmP4mVrUUpj9CmJwjut67fps\u002fUpjTGn+\u002fUZ70Vhi57J96nT7Xqmjfx7aE2gNceFxIGR2Uj8F17WG\u002f73p59n7rzqaPAZoqd1ztE+Sz\u002f5fm3e1sZZ9iNbZ9s+FX4Lw0mhGJEKB751FgAD\u002f2TBdWNjmTtHxjKNGhyTX4BmlNZn3M3bcnm2Z871zrnuM\u002fVZav\u002fjLjwGfHU6cz78r8SHAH7LAfwv3UC6JoGBIwEAAAAASUVORK5CYII=";
BgL_sc_const_7z00_hop_exception = "font-weight: bold";
BgL_sc_const_8z00_hop_exception = "color: red; font-weight: bold";
BgL_sc_const_9z00_hop_exception = "border-top: 1px dashed #ccc; margin-top: 2ex";
BgL_sc_const_10z00_hop_exception = "font-weight: bold; margin-bttom: 1ex;";
BgL_sc_const_11z00_hop_exception = "font-size: 9pt; padding-left: 1em;";
BgL_sc_const_12z00_hop_exception = "[(]at ([^ ]+) ([^ ]+)[)]";
BgL_sc_const_13z00_hop_exception = "width: 100%; font-size: 9pt; overflow: visible; padding-left: 1em";
BgL_sc_const_14z00_hop_exception = "position: fixed;\n    top: 60px; left: 150px; right: 150px; bottom: 60px;\n    opacity: 0.97;\n    background: white;\n    z-index: 10000001;\n    text-align: left;\n    border: 3px dashed red; padding: 4px;\n    color: black;\n    overflow: hidden;\n    overflow-y: auto;";
BgL_sc_const_15z00_hop_exception = "margin:0; padding: 0";
BgL_sc_const_16z00_hop_exception = "font-size: 20pt; padding-bottom: 4px";
BgL_sc_const_17z00_hop_exception = "JavaScript stack:";
BgL_sc_const_18z00_hop_exception = "Hop client stack:";
BgL_sc_const_19z00_hop_exception = "width: 100%; font-family: arial; font-size: 10pt; background: #FFFFF7; border-bottom: 1px solid #ccc; overflow: visible";
BgL_sc_const_20z00_hop_exception = "font-family: monospace; font-size: 10pt";
BgL_sc_const_21z00_hop_exception = "height: 64px; vertical-align: top; padding-top: 10px; text-align: center";
BgL_sc_const_22z00_hop_exception = "font-family: arial; font-size: 10pt; padding: 5px";
BgL_sc_const_23z00_hop_exception = "color: #777; font-weight: bold";
BgL_sc_const_24z00_hop_exception = "HopClientSideError";
sc_tmp = hop_mangledp = function(string) {
      var tmp1351;
      var tmp1350;
      var tmp1349;
      var len;
      len = string.length;
      if (len > 7) {
        tmp1349 = sc_arity_check(sc_isSubstring, 3)(string, "BgL_", 4);
        if ((tmp1349 !== false? tmp1349: sc_arity_check(sc_isSubstring, 3)(string, "BGl_", 4)) !== false) {
          if (sc_arity_check(sc_stringRef, 2)(string, len - 3).val === new sc_Char("z").val) {
            tmp1350 = sc_arity_check(sc_isCharAlphabetic, 1)(sc_arity_check(sc_stringRef, 2)(string, len - 2));
            if ((tmp1350 !== false? tmp1350: SC_NUMBER_CLASS.indexOf(sc_arity_check(sc_stringRef, 2)(string, len - 2).val) != -1) !== false) {
              tmp1351 = sc_arity_check(sc_isCharAlphabetic, 1)(sc_arity_check(sc_stringRef, 2)(string, len - 1));
              if (tmp1351 !== false) {
                return tmp1351;
              } else {
                return SC_NUMBER_CLASS.indexOf(sc_arity_check(sc_stringRef, 2)(string, len - 1).val) != -1;
              }
            } else {
              return false;
            }
          } else {
            return false;
          }
        } else {
          return false;
        }
      } else {
        return false;
      }
    }, sc_tmp.name = "bigloo-mangled?", sc_tmp.location = "(at hop-exception.scm 6848)", sc_tmp.sc_arity = 1, sc_tmp;
sc_tmp = hop_demangle = function(string) {
      var get_8bits_integer;
      var subvector;
      var bigloo_demangle_at;
      var clen;
      var len;
      len = string.length;
      clen = len - 3;
      sc_tmp = get_8bits_integer = function(r) {
            var i2;
            var i1;
            var c2;
            var c1;
            c1 = sc_arity_check(sc_stringRef, 2)(string, r + 1);
            c2 = sc_arity_check(sc_stringRef, 2)(string, r + 2);
            if (SC_NUMBER_CLASS.indexOf(c1.val) != -1) {
              i1 = c1.val.charCodeAt(0) - new sc_Char("0").val.charCodeAt(0);
            } else {
              i1 = 10 + (c1.val.charCodeAt(0) - new sc_Char("a").val.charCodeAt(0));
            }
            if (SC_NUMBER_CLASS.indexOf(c2.val) != -1) {
              i2 = c2.val.charCodeAt(0) - new sc_Char("0").val.charCodeAt(0);
            } else {
              i2 = 10 + (c2.val.charCodeAt(0) - new sc_Char("a").val.charCodeAt(0));
            }
            return i1 + (i2 << 4);
          }, sc_tmp.name = "get-8bits-integer", sc_tmp.location = "(at hop-exception.scm 7793)", sc_tmp.sc_arity = 1, sc_tmp;
      sc_tmp = subvector = function(vec, len) {
            var i;
            var l;
            var g1353;
            var g1352;
            g1352 = len - 1;
            g1353 = null;
            i = g1352;
            l = g1353;
            while (!(i === -1)) {
              l = new sc_Pair(vec[i], l);
              --i;
            }
            return sc_arity_check(sc_list2string, 1)(l);
          }, sc_tmp.name = "subvector", sc_tmp.location = "(at hop-exception.scm 7990)", sc_tmp.sc_arity = 2, sc_tmp;
      sc_tmp = bigloo_demangle_at = function(offset) {
            var nc;
            var i;
            var c;
            var r;
            var w;
            var checksum;
            var new_1;
            new_1 = sc_arity_check(sc_makeVector, 1)(clen);
            r = offset;
            w = 0;
            checksum = 0;
            while (!(r === clen)) {
              c = sc_arity_check(sc_stringRef, 2)(string, r);
              if (c.val === new sc_Char("z").val) {
                if (sc_arity_check(sc_stringRef, 2)(string, r + 1).val === new sc_Char("z").val) {
                  return new sc_Values([sc_arity_check(subvector, 2)(new_1, w - 1), r + 2]);
                } else {
                  i = sc_arity_check(get_8bits_integer, 1)(r);
                  nc = new sc_Char(String.fromCharCode(i));
                  new_1[w] = nc;
                  r += 3;
                  ++w;
                  checksum ^= i;
                }
              } else {
                new_1[w] = c;
                ++r;
                ++w;
              }
            }
            if (checksum === sc_arity_check(get_8bits_integer, 1)(r)) {
              return new sc_Values([sc_arity_check(subvector, 2)(new_1, w), r + 3]);
            } else {
              return new sc_Values([string, r + 3]);
            }
          }, sc_tmp.name = "bigloo-demangle-at", sc_tmp.location = "(at hop-exception.scm 8151)", sc_tmp.sc_arity = 1, sc_tmp;
      if (sc_arity_check(hop_mangledp, 1)(string) === false) {
        return string;
      } else {
        if (sc_arity_check(sc_isSubstring, 3)(string, "BgL_", 4) !== false) {
          return sc_arity_check(sc_callWithValues, 2)((sc_tmp = function() {
                      return sc_arity_check(bigloo_demangle_at, 1)(4);
                    }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 0, sc_tmp), (sc_tmp = function(str, offset) {
                      return str;
                    }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 2, sc_tmp));
        } else {
          if (sc_arity_check(sc_isSubstring, 3)(string, "BGl_", 4) !== false) {
            return sc_arity_check(sc_callWithValues, 2)((sc_tmp = function() {
                        return sc_arity_check(bigloo_demangle_at, 1)(4);
                      }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 0, sc_tmp), (sc_tmp = function(id, offset) {
                        return sc_arity_check(sc_callWithValues, 2)((sc_tmp = function() {
                                    return sc_arity_check(bigloo_demangle_at, 1)(offset);
                                  }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 0, sc_tmp), (sc_tmp = function(module, offset) {
                                    return id + "@" + module;
                                  }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 2, sc_tmp));
                      }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 2, sc_tmp));
          } else {
            return string;
          }
        }
      }
    }, sc_tmp.name = "bigloo-demangle", sc_tmp.location = "(at hop-exception.scm 7527)", sc_tmp.sc_arity = 1, sc_tmp;
sc_tmp = hop_get_stack = function(offset) {
      var depth = null;
      for (var sc_tmp = arguments.length - 1; sc_tmp >= 1; --sc_tmp) {
        depth = sc_cons(arguments[sc_tmp], depth);
      }
      var frame;
      var caller;
      var n;
      var stack;
      var g1356;
      var g1355;
      var proc;
      var offset_2;
      var g1354;
      g1354 = arguments.callee;
      proc = g1354;
      offset_2 = offset;
      while (!(offset_2 === 0)) {
        if (proc !== false) {
          proc = proc.caller;
          --offset_2;
        } else {
          return null;
        }
      }
      if (depth instanceof sc_Pair) {
        g1355 = depth.car;
      } else {
        g1355 = 10;
      }
      g1356 = null;
      caller = proc;
      n = g1355;
      stack = g1356;
      while (caller && n > 0) {
        frame = new sc_Pair(caller, sc_arity_check(sc_vector2list, 1)(caller.arguments));
        caller = caller.caller;
        --n;
        stack = new sc_Pair(frame, stack);
      }
      return sc_arity_check(sc_reverseBang, 1)(stack);
    }, sc_tmp.name = "hop-get-stack", sc_tmp.location = "(at hop-exception.scm 9702)", sc_tmp.sc_arity = -2, sc_tmp;
in_exception_report_hop_exception = "\uEBACno";
sc_tmp = hop_make_exception_frame = function() {
      var args = null;
      for (var sc_tmp = arguments.length - 1; sc_tmp >= 0; --sc_tmp) {
        args = sc_cons(arguments[sc_tmp], args);
      }
      var stmp;
      var g1361;
      var g1364;
      var g1362;
      var g1363;
      var mask;
      g1361 = sc_arity_check(dom_create, 4)("div", "\uEBADstyle", BgL_sc_const_4z00_hop_exception, "");
      mask = g1361;
      g1363 = sc_arity_check(dom_create, 4)("div", "\uEBADstyle", "overflow: auto", args);
      stmp = g1363;
      g1362 = sc_arity_check(dom_create, 4)("div", "\uEBADstyle", BgL_sc_const_14z00_hop_exception, stmp);
      g1364 = sc_arity_check(dom_create, 3)("div", mask, g1362);
      sc_arity_check(hop_add_event_listener, 3)(g1364, "click", (sc_tmp = function(event) {
            var g1365;
            in_exception_report_hop_exception = "\uEBACno";
            g1365 = this.parentNode.removeChild(this);
            if (g1365 !== false) {
              false;
            } else {
              sc_arity_check(hop_stop_propagation, 2)(event, false);
            }
            return g1365;
          }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 1, sc_tmp));
      return g1364;
    }, sc_tmp.name = "<EXCEPTION-FRAME>", sc_tmp.location = "(at hop-exception.scm 10941)", sc_tmp.sc_arity = -1, sc_tmp;
sc_tmp = BgL_sc_objzd2ze3string_1z31_hop_exception = function(o, longp) {
      var stmp;
      var g1369;
      var g1371;
      var m;
      var name;
      var g1367;
      if (typeof o === 'function') {
        if (!sc_arity_check(sc_isString, 1)(o.name)) {
          name = sc_arity_check(sc_withOutputToString, 1)((sc_tmp = function() {
                  return sc_arity_check(sc_write, 1)(o);
                }, sc_tmp.name = "", sc_tmp.location = "(at hop-exception.scm 11651)", sc_tmp.sc_arity = 0, sc_tmp));
        } else {
          if (o.name.length > 0) {
            name = o.name;
          } else {
            g1367 = sc_arity_check(dom_create, 2)("i", "anonymous");
            name = g1367;
          }
        }
        if (longp && sc_arity_check(sc_isString, 1)(o.location)) {
          m = sc_arity_check(sc_pregexpMatch, 2)(BgL_sc_const_12z00_hop_exception, o.location);
          if (m !== false) {
            g1371 = sc_arity_check(dom_create, 8)("a", "\uEBADstyle", "color: inherit", "\uEBADhref", m.cdr.car, m.cdr.car, "!", m.cdr.cdr.car);
            stmp = g1371;
            g1369 = sc_arity_check(dom_create, 5)("span", "\uEBADstyle", "color: #777", stmp, ", ");
            return sc_arity_check(sc_list, 4)(g1369, "(", name, " ...)");
          } else {
            return sc_arity_check(sc_list, 3)("(", name, " ...)");
          }
        } else {
          if (longp !== false) {
            return sc_arity_check(sc_list, 3)("(", name, " ...)");
          } else {
            return name;
          }
        }
      } else {
        if (sc_arity_check(sc_isString, 1)(o)) {
          return o;
        } else {
          return sc_arity_check(sc_withOutputToString, 1)((sc_tmp = function() {
                      return sc_arity_check(sc_write, 1)(o);
                    }, sc_tmp.name = "", sc_tmp.location = "(at hop-exception.scm 12224)", sc_tmp.sc_arity = 0, sc_tmp));
        }
      }
    }, sc_tmp.name = "obj->string", sc_tmp.location = "(at hop-exception.scm 11489)", sc_tmp.sc_arity = 2, sc_tmp;
sc_tmp = hop_make_exception_stack = function(stack) {
      var stmp;
      var stmp_3;
      var stmp_4;
      var stmp_5;
      var frame;
      var tail1432;
      var L1428;
      var falseHead1431;
      var g1375;
      var g1373;
      var g1372;
      falseHead1431 = new sc_Pair(null, null);
      tail1432 = falseHead1431;
      L1428 = stack;
      while (!(L1428 === null)) {
        frame = L1428.car;
        stmp_4 = new sc_Pair(sc_arity_check(sc_list, 2)(sc_arity_check(BgL_sc_objzd2ze3string_1z31_hop_exception, 2)(frame.car, true), "\n"), null);
        tail1432.cdr = stmp_4;
        tail1432 = tail1432.cdr;
        L1428 = L1428.cdr;
      }
      stmp_3 = falseHead1431.cdr;
      g1375 = sc_arity_check(dom_create, 4)("pre", "\uEBADstyle", BgL_sc_const_11z00_hop_exception, stmp_3);
      sc_arity_check(hop_add_event_listener, 3)(g1375, "click", (sc_tmp = function(event) {
            var g1376;
            g1376 = sc_arity_check(hop_stop_propagation, 1)(event);
            if (g1376 !== false) {
              false;
            } else {
              sc_arity_check(hop_stop_propagation, 2)(event, false);
            }
            return g1376;
          }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 1, sc_tmp));
      stmp = g1375;
      g1373 = sc_arity_check(dom_create, 4)("div", "\uEBADstyle", BgL_sc_const_10z00_hop_exception, BgL_sc_const_18z00_hop_exception);
      stmp_5 = g1373;
      g1372 = sc_arity_check(dom_create, 5)("div", "\uEBADstyle", BgL_sc_const_22z00_hop_exception, stmp_5, stmp);
      return g1372;
    }, sc_tmp.name = "<EXCEPTION-STACK>", sc_tmp.location = "(at hop-exception.scm 12461)", sc_tmp.sc_arity = 1, sc_tmp;
sc_tmp = hop_report_exception = function(exc) {
      var stmp;
      var stmp_6;
      var stmp_7;
      var stmp_8;
      var stmp_9;
      var stmp_10;
      var stmp_11;
      var stmp_12;
      var stmp_13;
      var stmp_14;
      var stmp_15;
      var stmp_16;
      var stmp_17;
      var stmp_18;
      var stmp_19;
      var stmp_20;
      var stmp_21;
      var stmp_22;
      var stmp_23;
      var stmp_24;
      var stmp_25;
      var stmp_26;
      var stmp_27;
      var stmp_28;
      var stmp_29;
      var stmp_30;
      var stmp_31;
      var stmp_32;
      var stmp_33;
      var stmp_34;
      var stmp_35;
      var stmp_36;
      var stmp_37;
      var stmp_38;
      var stmp_39;
      var stmp_40;
      var stmp_41;
      var stmp_42;
      var stmp_43;
      var stmp_44;
      var stmp_45;
      var g1379;
      var g1380;
      var m;
      var g1377;
      var g1378;
      var href;
      var l;
      var i;
      var f;
      var tail1437;
      var L1433;
      var falseHead1436;
      var g1384;
      var g1383;
      var g1382;
      var l_46;
      var s;
      var s_47;
      var tail1447;
      var L1443;
      var s_48;
      var tail1442;
      var L1438;
      var g1415;
      var g1422;
      var g1381;
      var stack;
      var tmp1423;
      var g1421;
      var g1416;
      var g1418;
      var g1419;
      var g1420;
      var g1417;
      var g1392;
      var g1398;
      var g1403;
      var g1404;
      var g1413;
      var g1414;
      var g1411;
      var g1412;
      var g1408;
      var g1409;
      var g1410;
      var g1405;
      var g1406;
      var g1407;
      var g1400;
      var g1402;
      var g1394;
      var g1396;
      var src;
      var g1390;
      var g1389;
      var g1388;
      var location;
      var url;
      var name;
      var msg;
      var g1387;
      var message;
      var L1443_49;
      var falseHead1446;
      var L1438_50;
      var falseHead1441;
      var e;
      var e_51;
      var e_52;
      var tmp1424;
      if (in_exception_report_hop_exception === "\uEBACyes") {
        return sc_arity_check(sc_raise, 1)(exc);
      } else {
        if (document.body && !(document.body === null)) {
          in_exception_report_hop_exception = "\uEBACyes";
          tmp1424 = exc === false;
          if ((tmp1424 !== false? tmp1424: exc === undefined) !== false) {
            e_52 = new Error();
            e_52.message = "unknown error";
            e = e_52;
          } else {
            if (sc_arity_check(sc_isString, 1)(exc)) {
              e_51 = new Error();
              e_51.message = exc;
              e = e_51;
            } else {
              e = exc;
            }
          }
          if (!("message" in e)) {
            message = "unknwown error";
          } else {
            if (sc_arity_check(sc_isString, 1)(e.message)) {
              falseHead1441 = new sc_Pair(null, null);
              L1438_50 = sc_arity_check(sc_stringSplit, 2)(e.message, "\n ");
              tail1442 = falseHead1441;
              L1438 = L1438_50;
              while (!(L1438 === null)) {
                s_48 = L1438.car;
                stmp_45 = new sc_Pair(sc_arity_check(hop_demangle, 1)(s_48) + " ", null);
                tail1442.cdr = stmp_45;
                tail1442 = tail1442.cdr;
                L1438 = L1438.cdr;
              }
              stmp_44 = falseHead1441.cdr;
              message = sc_arity_check(sc_apply, 2)(sc_stringAppend, stmp_44);
            } else {
              if (sc_arity_check(sc_isSymbol, 1)(e.message)) {
                message = e.message.slice(1);
              } else {
                if (sc_arity_check(sc_isKeyword, 1)(e.message)) {
                  message = e.message.slice(1);
                } else {
                  if (sc_arity_check(sc_isNumber, 1)(e.message)) {
                    message = e.message;
                  } else {
                    if (!(e.message === undefined)) {
                      message = sc_arity_check(BgL_sc_objzd2ze3string_1z31_hop_exception, 2)(e.message, false);
                    } else {
                      if (sc_arity_check(sc_isString, 1)(e.description)) {
                        falseHead1446 = new sc_Pair(null, null);
                        L1443_49 = sc_arity_check(sc_stringSplit, 2)(e.description, "\n ");
                        tail1447 = falseHead1446;
                        L1443 = L1443_49;
                        while (!(L1443 === null)) {
                          s_47 = L1443.car;
                          stmp_43 = new sc_Pair(sc_arity_check(hop_demangle, 1)(s_47) + " ", null);
                          tail1447.cdr = stmp_43;
                          tail1447 = tail1447.cdr;
                          L1443 = L1443.cdr;
                        }
                        stmp_42 = falseHead1446.cdr;
                        message = sc_arity_check(sc_apply, 2)(sc_stringAppend, stmp_42);
                      } else {
                        message = "unknwown error";
                      }
                    }
                  }
                }
              }
            }
          }
          if (e && "scObject" in e) {
            g1387 = sc_arity_check(dom_create, 2)("tt", sc_arity_check(BgL_sc_objzd2ze3string_1z31_hop_exception, 2)(e.scObject, false));
            stmp_41 = g1387;
            msg = sc_arity_check(sc_list, 3)(message, " -- ", stmp_41);
          } else {
            msg = message;
          }
          if (sc_arity_check(sc_isString, 1)(e.name)) {
            name = e.name;
          } else {
            if (e.name === undefined) {
              name = BgL_sc_const_24z00_hop_exception;
            } else {
              name = sc_arity_check(BgL_sc_objzd2ze3string_1z31_hop_exception, 2)(e.name, false);
            }
          }
          if (sc_arity_check(sc_isString, 1)(e.fileName)) {
            url = e.fileName;
          } else {
            url = document.location.href;
          }
          if (sc_arity_check(sc_isString, 1)(e.hopLocation)) {
            location = e.hopLocation;
          } else {
            location = "Client Error";
          }
          if (e.lineNumber && !(e.lineNumber === undefined)) {
            g1388 = sc_arity_check(dom_create, 4)("a", "\uEBADhref", url, url);
            src = sc_arity_check(sc_list, 3)(g1388, ", line ", e.lineNumber);
          } else {
            if (e.line && !(e.line === undefined)) {
              g1389 = sc_arity_check(dom_create, 4)("a", "\uEBADhref", url, url);
              src = sc_arity_check(sc_list, 3)(g1389, ", line ", e.line);
            } else {
              g1390 = sc_arity_check(dom_create, 3)("a", "\uEBADhref", url);
              src = g1390;
            }
          }
          if (sc_arity_check(sc_isString, 1)(e.stack)) {
            stack = e.stack;
            g1381 = sc_arity_check(sc_stringSplit, 2)(stack, "\n");
            BgL_whilezd2break1495zd2: {
              l_46 = g1381;
              s = 2;
              while (!(l_46 === null)) {
                if (s === 0) {
                  falseHead1436 = new sc_Pair(null, null);
                  tail1437 = falseHead1436;
                  L1433 = l_46;
                  while (!(L1433 === null)) {
                    f = L1433.car;
                    i = sc_arity_check(sc_stringIndex, 2)(f, new sc_Char("@"));
                    l = f.length;
                    if (i !== false) {
                      href = f.substring(i + 1, l);
                      g1378 = sc_arity_check(dom_create, 6)("a", "\uEBADstyle", "color: inherit", "\uEBADhref", href, href);
                      stmp_14 = g1378;
                      g1377 = sc_arity_check(dom_create, 5)("span", "\uEBADstyle", "color: #777", stmp_14, ", ");
                      stmp_12 = sc_arity_check(sc_list, 3)(g1377, f.substring(0, i), "\n");
                    } else {
                      m = sc_arity_check(sc_pregexpMatch, 2)(BgL_sc_const_3z00_hop_exception, f);
                      if (m !== false) {
                        g1380 = sc_arity_check(dom_create, 9)("a", "\uEBADstyle", "color: inherit", "\uEBADhref", m.cdr.cdr.car, m.cdr.car, "!", m.cdr.cdr.car, m.cdr.cdr.cdr.car);
                        stmp_13 = g1380;
                        g1379 = sc_arity_check(dom_create, 5)("span", "\uEBADstyle", "color: #777", stmp_13, ", ");
                        stmp_12 = sc_arity_check(sc_list, 4)(g1379, "(", m.cdr.car, " ...)\n");
                      } else {
                        stmp_12 = sc_arity_check(sc_list, 2)(f, "\n");
                      }
                    }
                    stmp_11 = new sc_Pair(stmp_12, null);
                    tail1437.cdr = stmp_11;
                    tail1437 = tail1437.cdr;
                    L1433 = L1433.cdr;
                  }
                  stmp_10 = falseHead1436.cdr;
                  g1384 = sc_arity_check(dom_create, 4)("pre", "\uEBADstyle", BgL_sc_const_5z00_hop_exception, stmp_10);
                  sc_arity_check(hop_add_event_listener, 3)(g1384, "click", (sc_tmp = function(event) {
                        var g1385;
                        g1385 = sc_arity_check(hop_stop_propagation, 1)(event);
                        if (g1385 !== false) {
                          false;
                        } else {
                          sc_arity_check(hop_stop_propagation, 2)(event, false);
                        }
                        return g1385;
                      }, sc_tmp.name = "", sc_tmp.location = "#f", sc_tmp.sc_arity = 1, sc_tmp));
                  stmp_9 = g1384;
                  g1383 = sc_arity_check(dom_create, 4)("div", "\uEBADstyle", BgL_sc_const_7z00_hop_exception, BgL_sc_const_17z00_hop_exception);
                  stmp_15 = g1383;
                  g1382 = sc_arity_check(dom_create, 5)("div", "\uEBADstyle", BgL_sc_const_22z00_hop_exception, stmp_15, stmp_9);
                  {
                    stmp_8 = g1382;
                    break BgL_whilezd2break1495zd2;
                  }
                } else {
                  l_46 = l_46.cdr;
                  --s;
                }
              }
              stmp_8 = "";
            }
            if (e.hopService !== false) {
              tmp1423 = !(e.hopService === undefined);
            } else {
              tmp1423 = false;
            }
            if ((tmp1423 !== false? tmp1423: e.hopStack instanceof sc_Pair) !== false) {
              stmp_16 = BgL_sc_const_9z00_hop_exception;
            } else {
              stmp_16 = "margin-top: 2ex";
            }
            g1422 = sc_arity_check(dom_create, 4)("div", "\uEBADstyle", stmp_16, stmp_8);
            stmp_7 = g1422;
          } else {
            stmp_7 = false;
          }
          if (e.hopStack instanceof sc_Pair) {
            g1421 = sc_arity_check(dom_create, 4)("div", "\uEBADstyle", e.hopService && !(e.hopService === undefined)? BgL_sc_const_9z00_hop_exception: "margin-top: 2ex", sc_arity_check(hop_make_exception_stack, 1)(e.hopStack));
            stmp_18 = g1421;
          } else {
            stmp_18 = false;
          }
          if (e.hopService && !(e.hopService === undefined)) {
            g1420 = sc_arity_check(dom_create, 4)("td", "\uEBADstyle", "font-size: 10pt", sc_arity_check(BgL_sc_objzd2ze3string_1z31_hop_exception, 2)(e.hopService, false));
            stmp_22 = g1420;
            g1419 = sc_arity_check(dom_create, 2)("tr", stmp_22);
            stmp_21 = g1419;
            g1418 = sc_arity_check(dom_create, 4)("table", "\uEBADstyle", BgL_sc_const_13z00_hop_exception, stmp_21);
            stmp_20 = g1418;
            g1417 = sc_arity_check(dom_create, 4)("div", "\uEBADstyle", BgL_sc_const_7z00_hop_exception, "Service:");
            stmp_23 = g1417;
            g1416 = sc_arity_check(dom_create, 5)("div", "\uEBADstyle", BgL_sc_const_22z00_hop_exception, stmp_23, stmp_20);
            stmp_19 = g1416;
          } else {
            stmp_19 = false;
          }
          g1415 = sc_arity_check(dom_create, 6)("div", "\uEBADstyle", const_hop_exception, stmp_19, stmp_18, stmp_7);
          stmp_6 = g1415;
          g1414 = sc_arity_check(dom_create, 4)("td", "\uEBADstyle", BgL_sc_const_2z00_hop_exception, sc_arity_check(hop_properties_to_string, 1)(e));
          stmp_28 = g1414;
          g1413 = sc_arity_check(dom_create, 2)("tr", stmp_28);
          stmp_27 = g1413;
          g1412 = sc_arity_check(dom_create, 4)("td", "\uEBADstyle", BgL_sc_const_20z00_hop_exception, src);
          stmp_30 = g1412;
          g1411 = sc_arity_check(dom_create, 2)("tr", stmp_30);
          stmp_29 = g1411;
          g1410 = sc_arity_check(dom_create, 4)("span", "\uEBADstyle", BgL_sc_const_23z00_hop_exception, name);
          stmp_33 = g1410;
          g1409 = sc_arity_check(dom_create, 6)("td", "\uEBADstyle", "font-size: 11pt", stmp_33, ": ", msg);
          stmp_32 = g1409;
          g1408 = sc_arity_check(dom_create, 2)("tr", stmp_32);
          stmp_31 = g1408;
          g1407 = sc_arity_check(dom_create, 4)("span", "\uEBADstyle", BgL_sc_const_8z00_hop_exception, location);
          stmp_36 = g1407;
          g1406 = sc_arity_check(dom_create, 4)("td", "\uEBADstyle", BgL_sc_const_16z00_hop_exception, stmp_36);
          stmp_35 = g1406;
          g1405 = sc_arity_check(dom_create, 2)("tr", stmp_35);
          stmp_34 = g1405;
          g1404 = sc_arity_check(dom_create, 7)("table", "\uEBADstyle", "width: 100%", stmp_34, stmp_31, stmp_29, stmp_27);
          stmp_26 = g1404;
          g1403 = sc_arity_check(dom_create, 4)("td", "\uEBADstyle", BgL_sc_const_15z00_hop_exception, stmp_26);
          stmp_25 = g1403;
          g1402 = sc_arity_check(dom_create, 5)("img", "\uEBADsrc", BgL_sc_const_6z00_hop_exception, "\uEBADalt", "Error");
          stmp_38 = g1402;
          g1400 = sc_arity_check(dom_create, 4)("td", "\uEBADstyle", BgL_sc_const_21z00_hop_exception, stmp_38);
          stmp_37 = g1400;
          g1398 = sc_arity_check(dom_create, 3)("tr", stmp_37, stmp_25);
          stmp_24 = g1398;
          g1396 = sc_arity_check(dom_create, 3)("col", "\uEBADwidth", "64px");
          stmp_40 = g1396;
          g1394 = sc_arity_check(dom_create, 2)("colgroup", stmp_40);
          stmp_39 = g1394;
          g1392 = sc_arity_check(dom_create, 5)("table", "\uEBADstyle", BgL_sc_const_19z00_hop_exception, stmp_39, stmp_24);
          stmp = sc_arity_check(hop_make_exception_frame, 2)(g1392, stmp_6);
          return sc_arity_check(dom_append_child, 2)(document.body, stmp);
        } else {
          return sc_arity_check(hop_add_event_listener, 3)(window, "load", (sc_tmp = function(e) {
                      return sc_arity_check(hop_report_exception, 1)(exc);
                    }, sc_tmp.name = "", sc_tmp.location = "(at hop-exception.scm 18878)", sc_tmp.sc_arity = 1, sc_tmp));
        }
      }
    }, sc_tmp.name = "hop-report-exception", sc_tmp.location = "(at hop-exception.scm 18133)", sc_tmp.sc_arity = 1, sc_tmp;
hop_last_exception_hop_exception = false;
sc_tmp = hop_onerror_handler_hop_exception = function(msg, url, line) {
      var tmp1427;
      var i;
      var g1426;
      var exc;
      var exc_53;
      var tmp1425;
      g1426 = hop_config.filtered_errors.length - 1;
      BgL_whilezd2break1496zd2: {
        i = g1426;
        while (i >= 0) {
          tmp1427 = url === hop_config.filtered_errors[i];
          if (tmp1427 !== false) {
            {
              tmp1425 = tmp1427;
              break BgL_whilezd2break1496zd2;
            }
          } else {
            --i;
          }
        }
        tmp1425 = false;
      }
      if (tmp1425 !== false) {
        return tmp1425;
      } else {
        if (hop_last_exception_hop_exception && hop_last_exception_hop_exception.message === msg) {
          exc = hop_last_exception_hop_exception;
        } else {
          exc_53 = new Error();
          exc_53.message = msg;
          exc_53.fileName = url;
          exc_53.lineNumber = line;
          exc_53.hopStack = sc_arity_check(hop_get_stack, 1)(2);
          exc = exc_53;
        }
        sc_arity_check(hop_report_exception, 1)(exc);
        return sc_arity_check(hop_debug, 0)() < 2;
      }
    }, sc_tmp.name = "hop-onerror-handler", sc_tmp.location = "(at hop-exception.scm 19899)", sc_tmp.sc_arity = 3, sc_tmp;
if (sc_arity_check(hop_debug, 0)() > 0) {
  sc_arity_check(sc_errorHookSet, 1)((sc_tmp = function(exc, _) {
        hop_last_exception_hop_exception = exc;
        exc.hopStack = sc_arity_check(hop_get_stack, 1)(3);
        return exc;
      }, sc_tmp.name = "", sc_tmp.location = "(at hop-exception.scm 20733)", sc_tmp.sc_arity = 2, sc_tmp));
  window.onerror = hop_onerror_handler_hop_exception;
}
function dom_add_child( node, e ) {
   if( hop_is_html_element( e ) ) {
      node.appendChild( e );
   } else {
      if( (e instanceof String) ||
	  (typeof e == "string") ||
	  (typeof e == "number") ) {
	 node.appendChild( document.createTextNode( e ) );
      } else {
	 if( sc_isPair( e ) ) {
	    dom_add_child( node, e.car );
	    dom_add_child( node, e.cdr );
	 } else {
	    if( e ) {
	       sc_error( "dom_add_child", "illegal child node", e );
	    }
	 }
      }
   }
}
function dom_set_child_node( parent, node ) {
   var childs = parent.childNodes;
   for( var nc = childs.length - 1; nc >= 0; nc-- )
      parent.removeChild( childs[ nc ] );
   dom_add_child( parent, node );
   return node;
}
function dom_node_elementp( node ) {
   return node.nodeType == 1;
}
function dom_node_textp( node ) {
   return node.nodeType == 3;
}
function dom_node_documentp( node ) {
   return node.nodeType == 9;
}
function dom_node_commentp( node ) {
   return node.nodeType == 8;
}
function dom_node_document_fragmentp( node ) {
   return node.nodeType == 11;
}
function dom_node_document_attrp( node ) {
   return node.nodeType == 2;
}
function dom_create( tag, _ ) {
   var el = document.createElement( tag );
   var l = arguments.length;
   var i = 1;
   while( i < l ) {
      var k = arguments[ i ];
      if( sc_isKeyword( k ) ) {
	 if( i < (l - 1) ) {
	    var at = arguments[ i + 1 ];
	    var prop = sc_keyword2jsstring( k );
	    if( prop === "class" ) {
	       el.className = at;
	    } else if( prop === "style" ) {
	       if( hop_config.navigator_family === "msie" ) {
		  el.style.setAttribute( "cssText", at );
	       } else {
		  el.setAttribute( prop, at );
	       }
	    } else {
	       if( (at instanceof String) || (typeof at == "string") ) {
		  if( sc_isSymbol( at ) ) {
		     el.setAttribute( prop, sc_symbol2jsstring( at ) );
		  } else {
		     el.setAttribute( prop, at );
		  }
	       } else {
		  el.setAttribute( prop, at + "" );
		  try {
		     el[ prop ] = at;
		  } catch( _ ) { ; }
	       }
	    }
	    i += 2;
	 } else {
	    var prop = sc_keyword2jsstring( k );
	    el.setAttribute( prop, prop );
	    i++;
	 }
      } else {
	 dom_add_child( el, k );
	 i++;
      }
   }
   return el;
}
function hop_dom_create_msie_radio( name, _ ) {
   arguments[ 0 ] = "<INPUT name='" + name + "'>";
   return dom_create.apply( null, arguments );
}
function dom_add_head_script( pathname, id ) {
   var head = document.getElementsByTagName( "head" )[ 0 ];
   var script = document.createElement( 'script' );
   script.type = 'text/javascript';
   script.src = pathname;
   if( id != undefined ) script.id = id;
   head.appendChild( script );
}
function hop_create_lframe( attrs, body ) {
   var hc = sc_jsstring2keyword( "hssclass" );
   var bd = dom_create( "div", hc, "hop-lfborder", body );
   return dom_create( "div", hc, "hop-lframe", bd );
}
function hop_create_lflabel( attrs, body ) {
   var hc = sc_jsstring2keyword( "hssclass" );
   var ct = dom_create( "span", body );
   return dom_create( "div", hc, "hop-lflabel", ct );
}
function dom_create_delay() {
   return ( "*** Hop Error, `delay' can only be created on server" );
}
function dom_create_inline() {
   return ( "*** Hop Error, `inline' can only be created on server" );
}
function dom_create_notepad() {
   return ( "*** Hop Error, `notepad' can only be created on server" );
}
function dom_create_nphead() {
   return ( "*** Hop Error, `nphead' can only be created on server" );
}
function dom_create_nptab() {
   return ( "*** Hop Error, `nptab' can only be created on server" );
}
function dom_create_nptabhead() {
   return ( "*** Hop Error, `nptabhead' can only be created on server" );
}
function dom_create_pan() {
   return ( "*** Hop Error, `pan' can only be created on server" );
}
function dom_create_paned() {
   return ( "*** Hop Error, `paned' can only be created on server" );
}
function dom_create_slider() {
   return ( "*** Hop Error, `slider' can only be created on server" );
}
function dom_create_sorttable() {
   return ( "*** Hop Error, `sorttable' can only be created on server" );
}
function dom_has_attributes( node ) {
   return node.hasAttributes();
}
function dom_get_attributes( node ) {
   return sc_vector2list( node.getAttributes() );
}
function dom_has_attribute( node, string ) {
   return node.hasAttribute( string );
}
function dom_get_attribute( node, string ) {
   return node.getAttribute( string );
}
function dom_remove_attribute( node, string ) {
   return node.removeAttribute( string );
}
function dom_set_attribute( node, string, value ) {
   return node.setAttribute( string, value );
}
function dom_owner_document( node ) {
   return node.ownerDocument();
}
function dom_has_child_nodes( node ) {
   return node.hasChildNodes();
}
function dom_child_nodes( node ) {
   return sc_vector2list( node.childNodes );
}
function dom_first_child( node ) {
   return node.firstChild;
}
function dom_last_child( node ) {
   return node.lastChild;
}
function dom_next_sibling( node ) {
   return node.nextSibling;
}
function dom_previous_sibling( node ) {
   return node.previousSibling;
}
function dom_node_name( node ) {
   return node.nodeName;
}
function dom_node_type( node ) {
   return node.nodeType;
}
function dom_parent_node( node ) {
   return node.parentNode;
}
function dom_append_child( node, n ) {
   if( (n instanceof String) ||
       (typeof n == "string") ||
       (typeof n == "number") ) {
      return node.appendChild( document.createTextNode( n ) );
   } else {
      return node.appendChild( n );
   }
}
function dom_remove_child( node, n ) {
   return node.removeChild( n );
}
function dom_clone_node( node, b ) {
   return node.cloneNode( b );
}
function dom_insert_before( node, n, r ) {
   return node.insertBefore( n, r );
}
function dom_replace_child( node, n, r ) {
   return node.replaceChild( n, r );
}
function dom_get_element_by_id( doc, id ) {
   if( (doc instanceof String) || (typeof doc === "string") ) {
      var res = document.getElementById( doc );
      if( res == null ) {
	 return false;
      }
      else
	 return res;
   } else {
      var res = doc.getElementById( id );
      if( res == null )
	 return false;
      else
	 return res;
   }
}
function dom_get_elements_by_tag_name( doc, name ) {
   if( (doc instanceof String) || (typeof doc === "string") ) {
      return sc_vector2list( document.getElementsByTagName( doc ) );
   } else {
      return sc_vector2list( doc.getElementsByTagName( name ) );
   }
}
function dom_get_elements_by_name( doc, name ) {
   if( (doc instanceof String) || (typeof doc === "string") ) {
      return sc_vector2list( document.getElementsByName( doc ) );
   } else {
      return sc_vector2list( doc.getElementsByName( name ) );
   }
}
function hop_css_add_style_sheet( document, rules ) {
   try {
      var els = document.getElementsByTagName( "head" );
      if( (els != null) && (els[ 0 ].appendChild != undefined) ) {
	 var st = document.createElement( "style" );
	 st.appendChild( document.createTextNode( rules ) );
	 els[ 0 ].appendChild( st );
      }
   } catch( e ) {
      ;
   }
}
function hop_load_css( url ) {
   try {
      var els = document.getElementsByTagName( "head" );
      if( (els != null) && (els[ 0 ].appendChild != undefined) ) {
	 var st = document.createElement( "link" );
	 if( url.lastIndexOf( ".hss" ) === url.length ) {
	    st.href = url + "?hss";
	 } else {
	    st.href = url;
	 }
	 st.rel = "stylsheet";
	 st.type = "text/css";
	 els[ 0 ].appendChild( st );
      }
   } catch( e ) {
      ;
   }
}
function hop_load_jscript( url ) {
   try {
      var els = document.getElementsByTagName( "head" );
      if( (els != null) && (els[ 0 ].appendChild != undefined) ) {
	 var sc = document.createElement( "script" );
	 sc.src = url;
	 sc.type = "text/javascript";
	 els[ 0 ].appendChild( sc );
      }
   } catch( e ) {
      ;
   }
}
function dom_get_elements_by_class( doc, name ) {
   var res = new Array();
   var n = 0;
   var all, re;
   if( (doc instanceof String) || (typeof doc == "string") ) {
      all = document.getElementsByTagName( "*" );
      re = new RegExp( doc + " |" + doc + "$", "g" );
   } else {
      all = doc.getElementsByTagName( "*" );
      re = new RegExp( name + " |" + name + "$", "g" );
   }
   for( var i = 0; i < all.length; i++ ) {
      if( re.exec( all[ i ].className ) ) {
	 res[ n++ ] = all[ i ];
      }
   }
   return sc_vector2list( res );
}
document.getElementsByClass = function( className ) {
   var all = document.getElementsByTagName( "*" );
   var res = new Array();
   var n = 0;
   var re = new RegExp( name + " |" + name + "$", "g" );
   for( var i = 0; i < all.length; i++ ) {
      if( re.exec( all[ i ].className ) ) {
	 res[ n++ ] = all[ i ];
      }
   }
   return res;
}
function hop_node_eval( node, text ) {
   var res;
   function hop_node_eval_from_text( text ) {
      var res;
      var start_re = /<script[^>]*>/ig;
      var end_re = /<\/script>/i;
      var script;
      while( (script=start_re.exec( text )) != null ) {
	 var start = script.index + script[0].length;
	 var end = text.indexOf( "<\u002fscript>", start );
	 if( end == -1 ) end = text.indexOf( "<\u002fSCRIPT>", start );
	 if( (end > start) ) {
	    res = eval( text.substr( start, end - start ) );
	 }
      }
      return res;
   }
   if( "getElementsByTagName" in node ) {
      var scripts = node.getElementsByTagName( "script" );
      if( scripts && scripts.length > 0 ) {
	 for ( var j = 0; j < scripts.length; j++ ) {
	    if( false && scripts[ j ].childNodes.length > 0 ) {
	       res = eval( scripts[ j ].childNodes[ 0 ].nodeValue );
	    } else {
	       res = eval( scripts[ j ].innerHTML );
	    }
	 }
      } else {
	 return hop_node_eval_from_text( text );
      }
   } else {
      return hop_node_eval_from_text( text );
   }
   return res;
}
function node_style_get( obj, prop ) {
   if( (obj instanceof String) || (typeof obj === "string") )
      obj = document.getElementById( obj );
   else {
      if( sc_isKeyword( prop ) )
	 prop = sc_keyword2jsstring( prop );
   }
   return obj.style[ prop ];
}
function node_computed_style_get( obj, prop ) {
   if( (obj instanceof String) || (typeof obj === "string") )
      obj = document.getElementById( obj );
   else {
      if( sc_isKeyword( prop ) )
	 prop = sc_keyword2jsstring( prop );
   }
   return window.getComputedStyle( obj, null )[ prop ];
}
var hop_start_tag = new RegExp( "^<([a-zA-Z]+)" );
var hop_tags_parent = {
   'tr' : 'tbody',
   'td' : 'tr',
   'th' : 'tr',
   'li' : 'ul'
};
function cloneScriptNode( node ) {
   if( node.nodeType != 1 ) {
      return node;
   }
   if( (node.tagName !== "SCRIPT") && (node.tagName !== "script") ) {
      var childs = node.childNodes;
      for( var i = childs.length - 1; i >= 0; i-- ) {
	 var n = cloneScriptNode( childs[ i ] );
	 if( n != childs[ i ] ) {
	    node.replaceChild( n, childs[ i ] );
	 }
      }
      return node;
   } else {
      var t = document.createTextNode( node.innerHTML );
      var s = document.createElement( "SCRIPT" );
      if( "text" in s ) 
	 s.text = node.innerHTML;
      else
	 s.appendChild( t );
      return s;
   }
}
function hop_create_element( html ) {
   var m = html.match( hop_start_tag );
   var tag;
   if( m ) {
      var t = m[ 1 ];
      tag = ( t in hop_tags_parent ) ? hop_tags_parent[ t ] : "div";
   } else {
      tag = "div";
   }
   var el = document.createElement( tag );
   el.innerHTML = html;
   if( hop_config.clone_innerHTML ) {
      if( html.search( /<script[ >]/i ) >= 0 )
	 return cloneScriptNode( el.childNodes[ 0 ] );
      else
	 return el.removeChild( el.childNodes[ 0 ] );
   } else {
      return el.removeChild( el.childNodes[ 0 ] );
   }
}
function hop_create_encoded_element( html ) {
   return hop_create_element( decodeURIComponent( html ) );
}
function hop_innerHTML_set( nid, html ) {
   var el;
   if( (nid instanceof String) || (typeof nid == "string") ) {
      el = document.getElementById( nid );
      if( el == undefined ) {
	 sc_error( "innerHTML-set!", "Cannot find element", nid );
      }
   } else {
      if( !nid ) {
	 sc_error( "innerHTML-set!", "illegal element", nid );
	 return;
      }
      el = nid;
   }
   if( (html instanceof String) || (typeof html == "string") ) {
      el.innerHTML = html;
      hop_node_eval( el, html );
   } else if( hop_is_html_element( html ) || sc_isPair( html ) ) {
      dom_set_child_node( el, html );
      if( hop_config.eval_innerHTML ) hop_node_eval( el, html );
   } else {
      el.innerHTML = html;
   }
}
function hop_style_attribute_set( obj, val ) {
   var expr;
   if( (val instanceof String) || (typeof val == "string") )
      expr = eval( val );
   for( var p in expr ) {
      node_style_set( obj, p, expr[ p ] );
   }
}
function hop_element_x( obj ) {
   var res = 0;
   while( obj != null ) {
      if( typeof obj.offsetLeft == "number" ) 
	 res += obj.offsetLeft;
      else {
	 break;
      }
      obj = obj.offsetParent;
   }
   return res;
}
function hop_element_y( obj ) {
   var res = 0;
   while( obj != null ) {
      if( typeof obj.offsetTop == "number" ) 
	 res += obj.offsetTop;
      else {
	 break;
      }
      obj = obj.offsetParent;
   }
   return res;
}
function hop_bounding_box( e, m ) {
   var n;
   if( (e instanceof String) || (typeof e == "string") ) {
      n = document.getElementById( e );
   } else {
      n = e;
   }
   if( n == undefined ) sc_error( "bounding-box", "illegal node", e );
   if( !m ) m = 0;
   return [ hop_element_x( n ) - m, hop_element_y( n ) - m,
	    n.offsetWidth + (2*m), n.offsetHeight + (2*m) ];
}
function hop_bounding_box_to_list( bbox ) {
   return sc_vector2list( bbox );
}
function hop_bounding_box_x( bbox, loc ) {
   if( arguments.length == 1 )
      return bbox[ 0 ];
   if( (loc == "w") || (loc == "nw") || (loc == "sw") )
      return bbox[ 0 ];
   if( (loc == "n") || (loc == "s"))
      return bbox[ 0 ] + (bbox[ 2 ]/2);
   if( (loc == "ne") || (loc == "e") || (loc == "se") )
      return bbox[ 0 ] + bbox[ 2 ];
   return 0;
}
function hop_bounding_box_y( bbox, loc ) {
   if( arguments.length == 1 )
      return bbox[ 1 ];
   if( (loc == "nw") || (loc == "n") || (loc == "ne") )
      return bbox[ 1 ];
   if( (loc == "e") || (loc == "w"))
      return bbox[ 1 ] + (bbox[ 3 ]/2);
   if( (loc == "se") || (loc == "s") || (loc == "sw") )
      return bbox[ 1 ] + bbox[ 3 ];
   return 0;
}
var hop_is_ready = false;
hop_add_native_event_listener( window, "load", function() { hop_is_ready = true; } );
function HopEvent( n, v ) {
   this.isStopped = false;
   this.preventDefault = function() { ; };
   this.stopPropagation = this.preventDefault;
   this.name = n;
   this.value = v;
   return this;
}
function hop_event_stoppedp( e ) {
   return e.isStopped == true;
}
function hop_add_event_listener( obj, event, proc, capture ) {
   if( event === "location" )
      return hop_add_active_location_listener( obj, proc );
   if( event === "server" )
      return hop_add_server_listener( obj, proc, capture );
   if( event === "serverready" )
      return hop_add_serverready_listener( obj, proc );
   if( event === "serverclose" )
      return hop_add_serverclose_listener( obj, proc );
   if( event === "timeout" )
      return hop_add_timeout_listener( obj, proc );
   if( ("hop_add_event_listener" in obj) &&
       (obj.hop_add_event_listener != hop_add_event_listener) )
      return obj.hop_add_event_listener( event, proc, capture );
   if( event === "ready" ) {
      if( hop_is_ready ) {
	 return proc( new function() { this.name = 'ready' } );
      } else {
	 return hop_add_native_event_listener( window, "load", proc, capture );
      }
   }
   return hop_add_native_event_listener( obj, event, proc, capture );
}
function hop_remove_event_listener( obj, event, proc, capture ) {
   if( event === "location" )
      return hop_remove_active_location_listener( obj, proc );
   if( event === "server" )
      return hop_remove_server_listener( obj, proc );
   if( event === "serverready" )
      return hop_remove_serverready_listener( obj, proc );
   if( event === "serverclose" )
      return hop_remove_serverclose_listener( obj, proc );
   if( event === "timeout" )
      return hop_remove_timeout_listener( proc );
   if( (obj.hop_remove_event_listener != undefined) &&
      (obj.hop_remove_event_listener != hop_remove_event_listener) )
      return obj.hop_remove_event_listener( event, proc, capture );
   return hop_remove_native_event_listener( obj, event, proc, capture );
} 
function hop_add_active_location_listener( obj, proc ) {
   obj.hop_active_location_proc = proc;
   var i = window.location.href.indexOf( "#" );
   if( i === -1 ) {
      obj.hop_active_location_href = window.location.href;
   } else {
      obj.hop_active_location_href = window.location.href.substring( 0, i-1 );
   }
   if( obj.hop_active_location_interval === undefined ) {
      var check = function() {
	 if( obj.hop_active_location_href !== window.location.href ) {
	    if( obj.hop_active_location_href != window.location.href ) {
	       obj.hop_active_location_href = window.location.href;
	       obj.hop_active_location_proc( window.location );
	    }
	 }
	 return true;
      }
      obj.hop_active_location_interval =
	 setInterval( check, hop_active_location_timeout );
   }
   return false;
}
function hop_remove_active_location_listener( obj, proc ) {
   if( obj.hop_active_location_interval != undefined ) {
      clearInterval( obj.hop_active_location_interval );
      obj.hop_active_location_interval = undefined;
   }
}
function hop_active_location_set( obj, href ) {
   window.location.href = href;
   obj.hop_active_location_href = window.location.href;
}
var hop_servevt_id = "__hop_serevt_proxy";
var hop_server_event_count = 0;
var re = new RegExp( "<[\/]?event[^>]*>", "g" );
function HopServerEvent( n, text, val ) {
   this.isStopped = false;
   this.name = n;
   this.value = val;
   this.id = hop_server_event_count++;
   this.preventDefault = function() { ; };
   this.stopPropagation = this.preventDefault;
   if( typeof text == "string" ) {
      this.responseText = text.replace( re, "" );
   } else {
      this.responseText = "";
   }
}
var hop_servevt_proxy = false;
var hop_servevt_table = {};
var hop_servevt_ctable = {};
var hop_servevt_dlist = null;
var hop_servevt_enveloppe_re =
   new RegExp( "^<([rsxifj]) name='([^']+)'>((?:.|[\n])*)</[rsxifj]>$" );
var hop_servevt_enveloppe_cdata_re =
   new RegExp( "^<!\\[CDATA\\[((?:.|[\n])*)\\]\\]>$" );
function hop_servevt_enveloppe_parse( val, xhr, server_ready ) {
   var m = val.match( hop_servevt_enveloppe_re );
   if( m != null ) {
      var k = m [ 1 ];
      var id = m[ 2 ];
      var text = m[ 3 ];
      if( k === "i" ) {
	 hop_trigger_servevt( id, text, parseInt( text ), false );
      } else if( k == "f" ) {
	 hop_trigger_servevt( id, text, parseFloat( text ), false );
      } else if( k == "s" ) {
	 hop_trigger_servevt( id, text, text, false );
      } else if( k == "x" ) {
	 hop_trigger_servevt( id, text, hop_create_element( text ), false );
      } else if( k == "j" ) {
	 var t = text.match( hop_servevt_enveloppe_cdata_re );
	 if( t ) {
	    hop_trigger_servevt( id, t[ 1 ], t[ 1 ], true );
	 }
      } else if( k == "r" ) {
	 if( !server_ready ) {
	    hop_trigger_serverready_event( new HopServerReadyEvent() );
	 }
	 return true;
      } else {
	 hop_servevt_enveloppe_parse_error( xhr );
      }
   } else {
      hop_servevt_enveloppe_parse_error( xhr );
   }
   return server_ready;
}
function hop_servevt_enveloppe_parse_error( xhr ) {
   exc = new Error( "bad server event enveloppe" );
   exc.hopStack = false;
   exc.name = "HopServevtError";
   exc.scObject = false;
   exc.message = xhr.responseText === "" ? "Empty enveloppe" : xhr.responseText;
   hop_report_exception( exc );
}
function start_servevt_websocket_proxy( key, host, port ) {
   if( !hop_servevt_proxy.websocket ) {
      var url = "ws://" + host + ":" + port +
	 hop_service_base() + "/server-event/websocket?key=" + key;
      var ws = new WebSocket( url );
      var register = function( id ) {
	 var svc = hop_service_base() +
	 "/server-event/register?event=" + id +
	 "&key=" + key  + "&mode=websocket";
	 hop_send_request( svc, false,
			   function() { ; }, false,
			   false, [] );
      }
      var unregister = function( id ) {
	 hop_servevt_proxy.httpreq.abort();
	 var svc = hop_service_base() +
	 "/server-event/unregister?event=" + id +
	 "&key=" + key;
	 hop_send_request( svc, false,
			   function() { ; }, false,
			   false, [] );
      };
      ws.onopen = function() {
	 hop_servevt_proxy.register = register;
	 hop_servevt_proxy.unregister = unregister;
	 for( var p in hop_servevt_table ) {
	    if( hop_servevt_table[ p ].hop_servevt ) {
	       register( p );
	    }
	 }
	 hop_trigger_serverready_event( new HopServerReadyEvent() );
      }
      ws.onclose = function() {
	 hop_servevt_onclose();
      }
      ws.onmessage = function ( e ) {
	 e.responseText = e.data;
	 hop_servevt_enveloppe_parse( e.data, e, true );
      }
      hop_servevt_proxy.websocket = ws;
   }
}
function start_servevt_xhr_multipart_proxy( key ) {
   if( !hop_servevt_proxy.httpreq ) {
      var server_ready = false;
      var register = function( id ) {
	 var svc = hop_service_base() +
	    "/server-event/register?event=" + id +
	    "&key=" + key  + "&mode=xhr-multipart";
	 var success = function( val, xhr ) {
	    server_ready = hop_servevt_enveloppe_parse( val, xhr, server_ready );
	 }
	 var failure = function( xhr ) {
	    if( xhr.exception ) {
	       if( typeof hop_report_exception === "function" ) {
		  hop_report_exception( xhr.exception );
	       }
	    }
	    if( "hop_servevt_onclose" in window ) hop_servevt_onclose();
	 }
	 var req = hop_make_xml_http_request();
	 req.multipart = true;
	 hop_servevt_proxy.httpreq = hop_send_request( svc,
						       false,
						       success,
						       failure,
						       false,
						       [],
						       false,
						       false,
	                                               req );
      }
      var unregister = function( id ) {
	 hop_servevt_proxy.httpreq.abort();
	 var svc = hop_service_base() +
	    "/server-event/unregister?event=" + id +
   	    "&key=" + hop_servevt_proxy.key;
	 hop_servevt_proxy.httpreq = hop_send_request( svc, false,
						       function() { ; }, false,
						       false, [] );
      };
      hop_servevt_proxy.register = register;
      hop_servevt_proxy.unregister = unregister;
      for( var p in hop_servevt_table ) {
	 if( hop_servevt_table[ p ].hop_servevt ) {
	    register( p );
	 }
      }
   }
}
function start_servevt_ajax_proxy( key ) {
   if( !hop_servevt_proxy.httpreq ) {
      var xhr_error_ttl = 6 * 3;
      var server_ready = false;
      var register = function( id ) {
	 var svc = hop_service_base() +
	    "/server-event/register?event=" + id +
	    "&key=" + key  + "&mode=ajax";
	 var success = function( val, xhr ) {
	    if( !server_ready ) {
	       server_ready = true;
	       hop_trigger_serverready_event( new HopServerReadyEvent() );
	    }
	    if( val != null ) {
	       xhr_error_ttl = 6 * 3;
	       register( "" );
	       while( sc_isPair( val ) ) {
		  var v = val.car;
		  var id = v.car;
		  var vals = v.cdr;
		  while( vals != null ) {
		     hop_trigger_servevt( id, vals.car, vals.car, false );
		     vals = vals.cdr;
		  }
		  val = val.cdr;
	       }
	    }
	 }
	 var failure = function( xhr ) {
	    if( !xhr.status &&
		(xhr_error_ttl > 0) &&
		!xhr.getAllResponseHeaders() ) {
	       xhr_error_ttl--;
	       register( id );
	    } else {
	       hop_servevt_onclose();
	    }
	 }
	 hop_servevt_proxy.httpreq = hop_send_request( svc,
						       false,
						       success,
						       failure,
						       false,
						       [] );
      }
      var unregister = function( id ) {
	 hop_servevt_proxy.httpreq.abort();
	 var svc = hop_service_base() +
	    "/server-event/unregister?event=" + id +
   	    "&key=" + hop_servevt_proxy.key;
	 hop_servevt_proxy.httpreq = hop_send_request( svc, false,
						       function() { ; }, false,
						       false, [] );
      };
      hop_servevt_proxy.register = register;
      hop_servevt_proxy.unregister = unregister;
      for( var p in hop_servevt_table ) {
	 if( hop_servevt_table[ p ].hop_servevt ) {
	    register( p );
	 }
      }
   }
}
function start_servevt_flash_proxy( key, host, port ) {
   var object_proxy = function() {
      return "<object id='" + hop_servevt_id + "' class='hop-servevt-proxy'" +
      " style='visibility: visible; position: fixed; top: 0; right: 0'" +
      " type='application/x-shockwave-flash'" +
      " codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,22,0'" +
      " width='1px' height='1px' title='hop-servevt' classId='HopServevt.swf'>" +
      "<param name='movie' value='" + hop_share_directory() + "/flash/HopServevt.swf'/>" +
      "<param name='allowScriptAccess' value='always'/>" +
      "<param name='FlashVars' value='init=hop_servevt_proxy_flash_init" +
      "&host=" + host + "&port=" + port + "&key=" + key +
      "&onevent=hop_trigger_servevt&onclose=hop_servevt_onclose" +
      "&onerror=hop_servevt_onerror'/>" +
      "</object>";
   }
   var embed_proxy = function() {
      var embed = document.createElement( "embed" );
      embed.id = hop_servevt_id;
      embed.className = "hop-servevt-proxy";
      embed.setAttribute( "width", "1px" );
      embed.setAttribute( "height", "1px" );
      embed.setAttribute( "src", hop_share_directory() + "/flash/HopServevt.swf" );
      embed.setAttribute( "type", "application/x-shockwave-flash" );
      embed.setAttribute( "name", "__hop_servevt_proxy" );
      embed.setAttribute( "swliveconnect", "true" );
      embed.setAttribute( "allowScriptAccess", "always" );
      embed.setAttribute( "FlashVars", "init=hop_servevt_proxy_flash_init" +
			  "&host=" + host + "&port=" + port + "&key=" + key +
			  "&onevent=hop_trigger_servevt" +
			  "&onclose=hop_servevt_onclose" +
			  "&onerror=hop_servevt_onerror" );
      return embed;
   }
   var proxy = document.createElement( "div" );
   node_style_set( proxy, "position", "fixed" );
   node_style_set( proxy, "top", "0" );
   node_style_set( proxy, "right", "0" );
   node_style_set( proxy, "background", "transparent" );
   if( hop_config.flash_markup === "embed" ) {
      proxy.appendChild( embed_proxy() );
   } else {
      proxy.innerHTML = object_proxy();
   }
   document.body.appendChild( proxy );
   document.getElementById( hop_servevt_id ).key = key;
   return proxy;
}
function hop_servevt_onerror( msg ) {
   sc_error( "servevt", msg, "internal server event error" );
}
function hop_servevt_proxy_flash_init() {
   hop_flash_minversion_set( 8 );
   var pending_events = 0;
   hop_servevt_proxy = document.getElementById( hop_servevt_id );
   var abort = function( id ) {
      var svc = hop_service_base() +
         "/server-event/unregister?event=" + id
         + "&key=" + hop_servevt_proxy.key;
      hop_servevt_proxy.httpreq = hop_send_request( svc, false,
						    function() {;}, false,
						    false, [] );
   }
   var failure = function( e ) {
      hop_servevt_onclose();
      for( var p in hop_servevt_table ) {
	 if( hop_servevt_table[ p ].hop_servevt ) {
	    abort( p );
	 }
      }
      hop_send_request( hop_service_base() +
			"/server-event/close?key=" + hop_servevt_proxy.key,
			false,
			function() {;}, false,
			false, [] );
   }
   var register = function( id ) {
      var svc = hop_service_base() + "/server-event/register?event=" + id
         + "&key=" + hop_servevt_proxy.key + "&mode=flash";
      var success = function( e ) {
	 if( pending_events > 0 ) {
	    if( pending_events == 1 ) {
	       hop_trigger_serverready_event( new HopServerReadyEvent() );
	    }
	    pending_events--;
	 }
      }
      hop_servevt_proxy.httpreq = hop_send_request( svc,
						    false,
						    success,
						    failure,
						    false,
						    [] );
   }
   hop_servevt_proxy.register = register;
   hop_servevt_proxy.unregister = function( id ) {
      abort( id );
   }
   hop_add_event_listener( window, "unload", failure );
   for( var p in hop_servevt_table ) {
      if( hop_servevt_table[ p ].hop_servevt ) {
	 pending_events++;
      }
   }
   if( pending_events > 0 ) {
      for( var p in hop_servevt_table ) {
	 if( hop_servevt_table[ p ].hop_servevt ) {
	    register( p );
	 }
      }
   } else {
      hop_trigger_serverready_event( new HopServerReadyEvent() );
   }
}
function servevt_websocketp() {
   return hop_config.websocket;
}
function servevt_xhr_multipartp() {
   return hop_config.xhr_multipart;
}
function servevt_flashp( port ) {
   return port &&
      (hop_config.flash_version >= 8) &&
      (hop_config.flash_external_interface) &&
      (hop_config.navigator_family != "msie");
}
function hop_start_servevt_proxy() {
   hop_servevt_proxy = new Object();
   hop_servevt_proxy.websocket = false;
   hop_servevt_proxy.register = function( x ) {};
   hop_send_request( hop_service_base() + "/server-event/info",
		     false,
		     function( v ) {
			var host = v[ 0 ];
			var port = v[ 1 ];
			var key = v[ 2 ];
			if( servevt_websocketp() ) {
			   start_servevt_websocket_proxy( key, host, port );
			} else if( servevt_xhr_multipartp() ) {
			   start_servevt_xhr_multipart_proxy( key );
			} else if( servevt_flashp( port ) ) {
			   try {
			      start_servevt_flash_proxy( key, host, port );
			   } catch( e ) {
			      e.scObject = ("port=" + port);
			      throw( e );
			   }
			} else {
			   start_servevt_ajax_proxy( key );
			}
		     },
		     function( v ) {
			throw new Error( "No event server acknowledge" );
		     },
		     true,
		     [] );
}
function hop_trigger_servevt( id, text, value, json ) {
   try {
      var v = (json ? eval( value ) : value);
      var evt = new HopServerEvent( id, text, v );
      var p2 = hop_servevt_table[ id ];
      if( sc_isPair( hop_servevt_dlist ) &&
	  sc_isPair( hop_servevt_ctable[ id ] ) ) {
	 var p1 = hop_servevt_dlist;
	 while( sc_isPair( p1 ) ) {
	    p1.car( evt );
	    p1 = p1.cdr;
	 }
      }
      evt.isStopped = false;
      while( sc_isPair( p2 ) ) {
	 try {
	    p2.car( evt );
	 } catch( exc ) {
	    exc.scObject = ("event=" + id + ", val=" + p2.car );
	    throw exc;
	 }
	 if( evt.isStopped ) break;
	 p2 = p2.cdr;
      }
   } catch( exc ) {
      exc.scObject = ("event=" + id + ", val=" + value );
      throw exc;
   }
}
var hop_serverclose_list = null;
var hop_serverclose_triggered = false;
function hop_add_serverclose_listener( obj, proc ) {
   if( obj === document ) {
      if( hop_serverclose_triggered ) {
	 var evt = new HopServerEvent( "serverclose", false, false );
	 proc( evt );
      } else {
	 hop_serverclose_list = sc_cons( proc, hop_serverclose_list );
      }
   } else {
      throw new Error( "add-event-listener!: Illegal `serverclose' recipient"
		       + obj );
   }
}
function hop_remove_serverclose_listener( obj, proc ) {
   if( obj === document ) {
      hop_serverclose_list = sc_remqBang( proc, hop_serverclose_list );
      return true;
   } else {
      throw new Error( "remove-event-listener!: Illegal `serverclose' recipient"
		       + obj );
      return false;
   }
}
function hop_servevt_onclose() {
   var evt = new HopServerEvent( "serverclose", false, false );
   var p = hop_serverclose_list;
   while( sc_isPair( p ) ) {
      p.car( evt );
      if( evt.isStopped ) break;
      p = p.cdr;
   }
   hop_serverclose_triggered = true;
}
function hop_add_server_listener( obj, proc, capture ) {
   if( typeof proc != "function" ) {
      throw new Error( "Illegal procedure: " + proc );
   }
   if( obj === document ) {
      hop_servevt_dlist = sc_cons( proc, hop_servevt_dlist );
   } else {
      if( !document.body ) {
	 hop_add_event_listener(
	    window, "ready", 
	    function( e ) {
	       hop_add_server_listener( obj, proc, capture );
	    } );
      } else {
	 var o = hop_servevt_table[ obj ];
	 hop_servevt_table[ obj ] = sc_cons( proc, sc_isPair( o ) ? o : null );
	 hop_servevt_table[ obj ].hop_servevt = true;
	 if( capture ) {
	    var o = hop_servevt_ctable[ obj ];
	    hop_servevt_ctable[ obj ] = sc_cons( proc, sc_isPair( o ) ? o : null );
	 }
	 if( !hop_servevt_proxy ) {
	    hop_start_servevt_proxy();
	 } else {
	    hop_servevt_proxy.register( obj );
	 }
      }
   }
}
function hop_remove_server_listener( obj, proc ) {
   if( obj === document ) {
      hop_servevt_dlist = sc_remqBang( proc, hop_servevt_dlist );
   } else {
      if( sc_isPair( hop_servevt_table[ obj ] ) )
	 hop_servevt_table[ obj ] =
	    sc_remqBang( proc, hop_servevt_table[ obj ] );
      if( sc_isPair( hop_servevt_ctable[ obj ] ) )
	 hop_servevt_ctable[ obj ] =
	    sc_remqBang( proc,hop_servevt_ctable[ obj ] );
      for( id in hop_servevt_table ) {
	 if( sc_isPair( hop_servevt_table[ obj ] ) )
	    return;
      }
      hop_servevt_proxy.unregister( obj );
   }
}
var hop_serverready_list = null;
var hop_serverready_triggered = false;
function HopServerReadyEvent() {
   var o = new Object();
   o.isStopped = false;
   return o;
}
function hop_trigger_serverready_event( evt ) {
   while( sc_isPair( hop_serverready_list ) ) {
      hop_serverready_list.car( evt );
      if( evt.isStopped ) break;
      hop_serverready_list = hop_serverready_list.cdr;
   }
   hop_serverready_triggered = true;
}
function hop_add_serverready_listener( obj, proc ) {
   if( obj === document ) {
      if( hop_serverready_triggered ) {
	 proc();
      } else {
	 hop_serverready_list = sc_cons( proc, hop_serverready_list );
      }
   } else {
      throw new Error( "add-event-listener!: Illegal `serverready' recipient"
		       + obj );
   }
}
function hop_remove_serverready_listener( obj, proc ) {
   if( obj === document ) {
      hop_serverready_list = sc_remqBang( proc, hop_serverready_list );
      return true;
   } else {
      throw new Error( "remove-event-listener!: Illegal `serverready' recipient"
		       + obj );
      return false;
   }
}
var hop_timeout_listeners = null;
function hop_add_timeout_listener( obj, proc ) {
   hop_timeout_listeners = sc_cons( sc_cons( proc, setInterval( proc, obj ) ),
				    hop_timeout_listeners );
}
function hop_remove_timeout_listener( proc ) {
   var p = hop_timeout_listeners;
   if( sc_isPair( p ) ) {
      if( p.car.car === proc ) {
	 clearInterval( p.car.cdr );
	 hop_timeout = p.cdr;
      } else {
	 while( sc_isPair( p.cdr ) ) {
	    if( p.cdr.car === proc ) {
	       clearInterval( p.cdr.cdr );
	       p.cdr = p.cdr.cdr;
	       break;
	    } else {
	       p = p.cdr;
	    }
	 }
      }
   }
}
function hop_bigloo_serialize( item ) {
   var tname = typeof item;
   if( (item instanceof String) || (tname == "string") ) {
      if( sc_isSymbol( item ) ) {
	 return "%27"
	    + hop_serialize_string( '%22', sc_symbol2jsstring( item ) );
      } else if( sc_isKeyword( item ) ) {
	 return "%3a"
	    + hop_serialize_string( '%22', sc_keyword2jsstring( item ) );
      } else {
	 return hop_serialize_string( '%22', item );
      }
   }
   if( tname == "number" )
      return hop_serialize_number( item );
   if( (item instanceof Boolean) || (tname == "boolean") )
      return hop_serialize_boolean( item );
   if( item instanceof Array )
      return hop_serialize_array( item );
   if( item === undefined )
      return ";";
   if( item === null )
      return ".";
   if( item instanceof Date )
      return hop_serialize_date( item );
   if( (item instanceof Object) &&
       ((typeof item.hop_bigloo_serialize) == "function") )
      return item.hop_bigloo_serialize();
   if( (HTMLCollection != undefined) && (item instanceof HTMLCollection) )
      return hop_serialize_array( item );
   if( (HTMLInputElement != undefined) && (item instanceof HTMLInputElement) )
      return hop_bigloo_serialize( item.value );
   if( (HTMLTextAreaElement != undefined) && (item instanceof HTMLTextAreaElement) )
      return hop_bigloo_serialize( item.value );
   if( (HTMLSelectElement != undefined) && (item instanceof HTMLSelectElement) )
      return hop_bigloo_serialize( item.value );
   if( (item.callee != undefined) && (item.length > -1) )
      return hop_serialize_array( item );
   if( hop_is_html_element( item ) )
      return hop_serialize_html( item );
   return hop_bigloo_serialize_alist( item );
}
function hop_bigloo_serialize_object() {
   var o = this;
   var classname = hop_demangle( o.hop_classname );
   var classfields = o.hop_classfields;
   var str = "|" + "%27" + hop_serialize_string( '%22', classname );
   var args = "";
   var len = 1;
   for( var i = 0; i < classfields.length; i++ ) {
      len++;
      args += hop_bigloo_serialize( o[ classfields[ i ] ] );
   }
   str += hop_serialize_word( len );
   str += hop_serialize_boolean( false );
   str += args;
   str += hop_bigloo_serialize( o.hop_classhash );
   return str;
}
function hop_size_of_word( word ) {
   var s = 0;
   while( word > 0 ) {
      s++;
      word >>= 8;
   }
   return s;
}
function hop_serialize_word( word ) {
   var s = hop_size_of_word( word );
   if( s == 0 ) {
      return "%00";
   } else {
      var i1 = (s >> 4);
      var i2 = (s & 0xf);
      var c1 = i1 + ((i1 < 10) ? 48 : 55);
      var c2 = i2 + ((i2 < 10) ? 48 : 55);
      var rw = String.fromCharCode( 37, c1, c2 );
      s--;
      while( s >= 0 ) {
         var c = ((word >> (s << 3)) & 0xff);
         if( (c < 127) && (c >= 46) ) {
	    rw += String.fromCharCode( c );
         } else {
            var i1 = (c >> 4);
            var i2 = (c & 0xf);
            var c1 = i1 + ((i1 < 10) ? 48 : 55);
            var c2 = i2 + ((i2 < 10) ? 48 : 55);
            rw += String.fromCharCode( 37, c1, c2 );
         }
         s--;
      }
      return rw;
   }
}
function ucs2_to_utf8( s ) {
   var len = s.length;
   for( var i = 0; i < len; i++ ) {
      var c = s.charCodeAt( i );
      if( c >= 128 ) {
	 var utf = s.substring( 0, i );
	 for( ; i< len; i++, c = s.charCodeAt( i ) ) {
	    if( c < 128 ) {
	       utf += String.fromCharCode( c );
	    } else {
	       if( (c > 127) && (c < 2048) ) {
		  utf += String.fromCharCode((c >> 6) | 192);
		  utf += String.fromCharCode((c & 63) | 128);
	       } else {
		  utf += String.fromCharCode((c >> 12) | 224);
		  utf += String.fromCharCode(((c >> 6) & 63) | 128);
		  utf += String.fromCharCode((c & 63) | 128);
	       }
	    }
	 }
	 return utf;
      }
   }
   return s;
}
function utf_length( s ) {
   var len = s.length;
   var res = len;
   for( var i = 0; i < len; i++ ) {
      var c = s.charCodeAt( i );
      if( c >= 128 ) {
	 if( (c > 127) && (c < 2048) ) {
	    res++;
	 } else {
	    res += 2;
	 }
      }
   }
   return res;
}
function hop_serialize_string( mark, item ) {
   return mark +
      hop_serialize_word( utf_length( item ) ) +
      encodeURIComponent( item );
}
function hop_serialize_number( item ) {
   var sitem = item + "";
   if( sitem.indexOf( "." ) == -1 ) {
      if( item < 0 ) {
	 if( item >= -536870912 ) {
	    return '-' + hop_serialize_word( -item );
	 } else if( item >= 2147483648 ) {
	    return hop_serialize_string( 'E', item + "" );
	 } else {
	    return hop_serialize_string( 'L', item + "" );
	 }
      } else {
	 if( item <= 536870911 ) {
	    return hop_serialize_word( item );
	 } else if( item <= 2147483647 ) {
	    return hop_serialize_string( 'E', item + "" );
	 } else {
	    return hop_serialize_string( 'L', item + "" );
	 }
      }
   } else {
      return 'f' + hop_serialize_word( sitem.length ) + sitem;
   }
}
function hop_serialize_boolean( item ) {
   return item ? 'T' : 'F';
}
function hop_serialize_array( item ) {
   var l = item.length;
   var ra = '[' + hop_serialize_word( l );
   var i = 0;
   for( i = 0; i < l; i++ ) {
      ra += hop_bigloo_serialize( item[ i ] );
   }
   return ra;
}
function hop_serialize_date( item ) {
   var utc = Date.UTC( item.getUTCFullYear(),
		       item.getUTCMonth(),
		       item.getUTCDate(),
		       item.getUTCHours(),
		       item.getUTCMinutes(),
		       item.getUTCSeconds() ) + "";
   var ms = utc.substring( 0, utc.length - 3 );
   return 'd' + hop_serialize_word( ms.length ) + encodeURIComponent( ms );
}
function hop_serialize_html( item ) {
   if( "outerHTML" in item ) {
      return hop_serialize_string( '%22', item.outHTML );
   } else {
      if( item.nodeType == 1 ) {
	 var str = "<" + item.tagName + " id='" + item.id + "' "
	    + (item.className ? ("class='" + item.className + "'") : "")
	    + ">" + item.innerHTML + "</" + item.tagName + ">";
	 return hop_serialize_string( '%22', str );
      } else {
	 if( item.nodeType == 3 ) {
	    return hop_serialize_string( '%22', item.nodeValue );
	 } else {
	    return hop_bigloo_serialize( "#<" + tname + ">" );
	 }
      }
   }
}
function hop_bigloo_serialize_alist( item ) {
   var alist = null;
   for( p in item ) {
      var k = sc_jsstring2keyword( p );
      alist = sc_cons( sc_cons( k, sc_cons( item[ p ] ) ), alist );
   }
   return hop_bigloo_serialize( alist );
}
function hop_obj_to_string( item ) {
   return decodeURIComponent( hop_bigloo_serialize( item ) );
}
function hop_string_to_obj( s ) {
   var pointer = 0;
   var definitions = [];
   var defining = -1;
   function read_integer( s ) {
      return read_size( s );
   }
   function read_float( s ) {
      var szf = read_size( s );
      var res = s.substring( pointer, pointer + szf );
      pointer += szf;
      return +res;
   }
   function read_char( s ) {
      new sc_Char(String.fromCharCode(n));
   }
   function read_word( s, sz ) {
      var acc = 0;
      for( var iw = 0; iw < sz; iw++ ) {
	 acc = (256 * acc) + s.charCodeAt( pointer++ );
      }
      return acc;
   }
   function read_long_word( s, szlw ) {
      return read_word( szlw );
   }
   function read_size( s ) {
      var szs = s.charCodeAt( pointer++ );
      return read_word( s, szs );
   }
   function read_string( s ) {
      var sz = read_size( s );
      var res = s.substring( pointer, pointer + sz );
      if( defining >= 0 ) {
	 definitions[ defining ] = res;
	 defining = -1;
      }
      pointer += sz;
      return res;
   }
   function read_definition() {
      defining = read_item();
      return read_item();
   }
   function read_reference() {
      return definitions[ read_item() ];
   }
   function read_symbol() {
      return sc_jsstring2symbol( read_item() );
   }
   function read_keyword() {
      return sc_jsstring2keyword( read_item() );
   }
   function read_cnst() {
      switch( read_integer( s ) ) {
	 default: alert( "read_cnst: not implemented: " + s );
      }
   }
   function read_vector( sz ) {
      var res = sc_makeVector( sz );
      if( defining >= 0 ) {
	 definitions[ defining ] = res;
	 defining = -1;
      }
      for( var iv = 0; iv < sz; iv++ ) {
	 res[ iv ] = read_item();
      }
      return res;
   }
   function read_list( sz ) {
      var res = sc_cons( null, null );
      var hd = res;
      if( defining >=0 ) {
	 definitions[ defining ] = res;
	 defining = -1;
      }
      for( var i = 0; i < (sz - 2); i++, hd = hd.cdr ) {
	 hd.car = read_item();
	 hd.cdr = sc_cons( null, null );
      }
      hd.car = read_item();
      hd.cdr = read_item();
      return res;
   }
   function read_extended_list( sz ) {
      var res = sc_cons( null, null );
      var hd = res;
      if( defining >= 0 ) {
	 definitions[ defining ] = res;
	 defining = -1;
      }
      for( var i = 0; i < (sz - 2); i++, hd = hd.cdr ) {
	 hd.car = read_item();
	 read_item();
	 hd.cdr = sc_cons( null, null );
      }
      hd.car = read_item();
      read_item();
      hd.cdr = read_item();
      return res;
   }
   function read_item() {
      switch( s.charCodeAt( pointer++ ) ) {
	 case 0x3d : return read_definition();
	 case 0x23 : return read_reference();
	 case 0x27 : return read_symbol();
	 case 0x3a : return read_keyword();
	 case 0x61 : return read_char( s );
	 case 0x46 : return false;
	 case 0x54 : return true;
	 case 0x3b : return undefined;
	 case 0x2e : return null;
	 case 0x3c : return read_cnst();
	 case 0x22 : return read_string( s )
	 case 0x28 : return read_list( read_size( s ) );
	 case 0x53 : return read_extended_list( read_size( s ) );
	 case 0x5b : return read_vector( read_size( s ) );
	 case 0x66 : return read_float( s );
	 case 0x2d : return -read_integer( s );
	 default: pointer--; return read_integer( s );
      }
   }
   if( s.charAt( pointer ) == 'c' ) {
      pointer++;
      definitions = new Array( read_size( s ) );
   }
   return read_item();
}
var unjson = {
   "pair": function( o ) {
      return sc_cons( hop_unjson( o.car ), hop_unjson( o.cdr ) );
   }
}
function hop_unjson( o ) {
   var tname = typeof o;
   if( ((o instanceof String) || (tname == "string")) ||
       ((typeof o) == "number") ||
       (o instanceof Boolean) || (tname == "boolean") ||
       (o === null) ) {
      return o;
   }
   if( o instanceof Array ) {
      for( var i = 0; i < o.length; i++ ) {
	 o[ i ] = hop_unjson( o [ i ] );
      }
      return o;
   }
   if( "__uuid" in o )
      return unjson[ o.__uuid ]( o );
   else
      return o;
}
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function base64_encode( input ) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;
   do {
      chr1 = input.charCodeAt( i++ );
      chr2 = input.charCodeAt( i++ );
      chr3 = input.charCodeAt( i++ );
      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;
      if( isNaN( chr2 ) ) {
         enc3 = enc4 = 64;
      } else if( isNaN( chr3 ) ) {
         enc4 = 64;
      }
      output = output + keyStr.charAt( enc1 ) + keyStr.charAt( enc2 ) + 
         keyStr.charAt( enc3 ) + keyStr.charAt( enc4 );
   } while( i < input.length );
   return output;
}
function utf8_decode( input ) {
   var string = "";
   var i = 0;
   var c = c1 = c2 = 0;
   while ( i < input.length ) {
      c = input.charCodeAt(i);
      if( c < 128 ) {
	 string += String.fromCharCode( c );
	 i++;
      }
      else if( (c > 191) && (c < 224) ) {
	 c2 = input.charCodeAt( i + 1 );
	 string += String.fromCharCode( ((c & 31) << 6) | (c2 & 63) );
	 i += 2;
      }
      else {
	 c2 = input.charCodeAt( i + 1 );
	 c3 = input.charCodeAt( i + 2 );
	 string += String.fromCharCode( ((c & 15) << 12) |
					((c2 & 63) << 6) |
					(c3 & 63) );
	 i += 3;
      }
   }
   return string;
}
function base64_decode( input ) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;
   input = input.replace( /[^A-Za-z0-9\+\/\=]/g, "" );
   do {
      enc1 = keyStr.indexOf( input.charAt( i++ ) );
      enc2 = keyStr.indexOf( input.charAt( i++ ) );
      enc3 = keyStr.indexOf( input.charAt( i++ ) );
      enc4 = keyStr.indexOf( input.charAt( i++ ) );
      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;
      output = output + String.fromCharCode( chr1 );
      if( enc3 != 64 ) {
         output = output + String.fromCharCode( chr2 );
      }
      if( enc4 != 64 ) {
         output = output + String.fromCharCode( chr3 );
      }
   } while( i < input.length );
   return utf8_decode( output );
}
var hop_anim_latency = 400;
var hop_busy_vis_16_16 = false;
var hop_busy_vis_32_32 = false;
var hop_busy_anim_16_16 = "data:image/gif;base64,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";
var hop_busy_anim_32_32_simple = "data:image/gif;base64,R0lGODlhIAAgALMMAOxiJlM8GvrYydTOxu1sNPGJXPjErX5tU15IKJ+Sf/Snhb62qf///wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBQAMACwAAAAAIAAgAAAETJDJSau9OOvNu/9gKI6YQQBoqq4AYXAnK6sEN9+pjd/6Lve+FTCY2xBZw2OSuAw2fc9dFDflGY+q6kz728SwtY0J/CKZz+i0es3ORAAAIfkECQUADAAsAAAAACAAIAAABEWQyUmrvTjrzbv/YCiOmgKcaIoqoeqm7fvGskrX6I0DOt7XP1lwBtrBisbT0LW0IZPN4yepfBqjOZDJyCJ5v+CweEzmRAAAIfkECQUADAAsAAAAACAAIAAABEKQyUmrvTjrzbv/YCiOXQGcKFCQU+qykpvCjIzS9onnu93LvxcsBwjOhjykTwlkCllE4815hCZZJtmKxu16v+AwKwIAIfkECQUADAAsAAAAACAAIAAABDyQyUmrvTjrzbv/YCiOIGCSmQmgmMpe7lvF8kTXzF3rMv/6LCBKSCKOjCJkSFk64STMT9QzfVqv2KzWEwEAIfkEBQUADAAsAAAAACAAIAAABDyQyUmrvTjrzbv/YCiOISCQmolm6nq1bgXH00wzNp3Hu9uvP1SQNBwVRcfS6VZbMnFOZhI0fVqv2Kw2EwEAIfkEBQUADAAsDgAGAAMAFAAABAkwyEmrvTjrGgEAIfkEBQUADAAsCwAGAAkAFAAABBLwhEmDrDjrzbv/YCiOZHhhRwQAIfkEBQUADAAsCAAGAA8AFAAABBYwhUkrlTbrzbv/YCiOZGmeaKpeYBIBACH5BAkFAAwALAYABgAUABQAAAQdcKFAq70BSczv7GAojmRpnmiqrmzrvnD7ndpMahEAIfkECQUADAAsAAAAACAAIAAABEWQyUmrvTjrzbv/YCiOWhKcaIomoeqm7fvGskrX6I0HOt7XP1lwBtrBisbT0LW0IZPN4yepfBqjOZDJyCJ5v+CweEzmRAAAIfkECQUADAAsAAAAACAAIAAABEKQyUmrvTjrzbv/YCiO3RGcaHCQU+qykpvCjIzS9onnu93LvxcsFwjOhjykTwlkCllE4815hCZZJtmKxu16v+AwKwIAIfkECQUADAAsAAAAACAAIAAABDyQyUmrvTjrzbv/YCiOYGCSmRmgmMpe7lvF8kTXzF3rMv/6LCBKSCKOjCJkSFk64STMT9QzfVqv2KzWEwEAIfkEBQUADAAsAAAAACAAIAAABDyQyUmrvTjrzbv/YCiOYTCQmolm6nq1bgXH00wzNp3Hu9uvP1SQNBwVRcfS6VZbMnFOZhI0fVqv2Kw2EwEAIfkEBQUADAAsDgAGAAMAFAAABAkQyEmrvTjrGgEAIfkEBQUADAAsCwAGAAkAFAAABBKwgEmBrDjrzbv/YCiOZHhhRQQAIfkEBQUADAAsCAAGAA8AFAAABBZQgUkrlTbrzbv/YCiOZGmeaKpeoBIBACH5BAUFAAwALAYABgAUABQAAAQd0BBAq72ASMzv7GAojmRpnmiqrmzrvnD7ndpMahEAOw==";
var hop_busy_anim_32_32 = "data:image/gif;base64,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";
function hop_apply_form_url( service, args ) {
   var nargs = null;
   var els = args[ 0 ].elements;
   for( i = els.length - 1 ; i >=0 ; i-- ) {
      if( els[ i ].type == "checkbox" ) {
	 nargs = sc_cons( els[ i ].checked ? els[ i ].value : false, nargs );
	 nargs = sc_cons( sc_jsstring2keyword( els[ i ].name ), nargs );
      } else {
	 if( els[ i ].type == "radio" ) {
	    if( els[ i ].checked ) {
	       nargs = sc_cons( els[ i ].value, nargs );
	       nargs = sc_cons( sc_jsstring2keyword( els[ i ].name ), nargs );
	    }
	 } else {
	    if( els[ i ].name !== "" ) {
	       nargs = sc_cons( els[ i ].value, nargs );
	       nargs = sc_cons( sc_jsstring2keyword( els[ i ].name ), nargs );
	    }
	 }
      }
   }
   return hop_apply_url( service, nargs );
}
function hop_apply_url( service, args ) {
   if( sc_isPair( args ) ) {
      return service
	 + "?hop-encoding=hop"
	 + "&vals=" + hop_bigloo_serialize( args );
   } else {
      if( (args.length == 1) && hop_is_dom_form_element( args[ 0 ] ) ) {
	 return hop_apply_form_url( service, args );
      } else {
	 return service
	    + "?hop-encoding=hop"
	    + "&vals=" + hop_bigloo_serialize( sc_vector2list( args ) );
      }
   }
}
function hop_default_failure( xhr ) {
   if( !document ) return;
   var div = document.createElement( "div" );
   var hstack = xhr.hopStack ? hop_make_exception_stack( xhr.hopStack ) : false;
   var jsstack = xhr.jsStack ? hop_make_exception_stack( xhr.jsStack ) : false;
   if( "exception" in xhr ) {
      hop_report_exception( xhr.exception );
   } else {
      if( xhr.responseError ) {
	 div.appendChild( xhr.responseError );
      } else {
	 var t = xhr.responseText;
	 if( t ) {
	    if( t.match( /<!DOCTYPE[^>]*>/) ) {
	       t = t.replace( /<!DOCTYPE[^>]*>/g, "" );
	       t = t.replace( /<head[^>]*>/g, "<div style='display: none;'>" );
	       t = t.replace( /<\/head>/g, "</div>" );
	       t = t.replace( /<(meta|link)[^>]*>/g, "<span style='display: none'></span>" );
	       t = t.replace( /<html[^>]*>/g, "<div style='width: 100%; height: 100%; overflow: auto'>" );
	       t = t.replace( /<\/html>/g, "</div>" );
	       t = t.replace( /<body[^>]*>/g, "<div style='width: 100%; height: 100%; overflow: auto'>" );
	       t = t.replace( /<\/body>/g, "</div>" );
	       t = t.replace( /&quot;/g, "\"" );
	       div.innerHTML = t;
	    } else {
	       div.innerHTML = "foo: " + t;
	    }
	 } else {
	    div.innerHTML = "Status: " + xhr.status + " -- " + xhr.statusText;
	 }
      }
      document.body.appendChild(
	 hop_make_exception_frame( div, hstack, jsstack ) );
   }
}
function hop_anim_16_16( title ) {
   if( !hop_busy_vis_16_16 ) {
      var vis = document.createElement( "div" );
      node_style_set( vis, "position", "fixed" );
      node_style_set( vis, "top", "5px" );
      node_style_set( vis, "right", "5px" );
      node_style_set( vis, "z-index", "100" );
      node_style_set( vis, "background", "#eeeeee" );
      node_style_set( vis, "border-color", "black" );
      node_style_set( vis, "border-style", "outset" );
      node_style_set( vis, "border-width", "1px" );
      node_style_set( vis, "padding-top", "3px" );
      node_style_set( vis, "width", "20px" );
      node_style_set( vis, "height", "20px" );
      node_style_set( vis, "-moz-border-radius", "0.2em" );
      node_style_set( vis, "-moz-opacity", "0.7" );
      vis.align = "center";
      vis.count = false;
      var img = document.createElement( "img" );
      img.className = "hop-busy-anim";
      if( !hop_config.inline_image ) {
	 img.src = hop_share_directory() + "/icons/busy-anim-16.gif";
      } else {
	 img.src = hop_busy_anim_16_16;
      }
      vis.appendChild( img );
      hop_busy_vis_16_16 = vis;
   }
   return hop_busy_vis_16_16;
}
function hop_anim_32_32( title ) {
   if( !hop_busy_vis_32_32 ) {
      var vis = document.createElement( "div" );
      node_style_set( vis, "position", "fixed" );
      node_style_set( vis, "top", "5px" );
      node_style_set( vis, "right", "5px" );
      vis.align = "center";
      vis.count = false;
      var img = document.createElement( "img" );
      img.className = "hop-busy-anim";
      if( !hop_config.inline_image ) {
	 img.src = hop_share_directory() + "/icons/busy-anim-32.gif";
      } else {
	 img.src = hop_busy_anim_32_32;
      }
      vis.appendChild( img );
      hop_busy_vis_32_32 = vis;
   }
   return hop_busy_vis_32_32;
}
var hop_default_anim = hop_anim_32_32;
function hop_default_anim_set( anim ) {
   var old = hop_default_anim;
   hop_default_anim = anim;
   return old;
}
function hop_default_anim_get() {
   return hop_default_anim;
}
var hop_anim_vis = false;
var hop_anim_fun = false;
function hop_stop_anim( xhr ) {
   if( xhr.hop_anim ) {
      if( xhr.hop_anim_interval ) {
	 clearInterval( xhr.hop_anim_interval );
	 xhr.hop_anim_interval = false;
      }
      xhr.hop_anim.count--;
      if( xhr.hop_anim.count == 1 )
	 node_style_set( xhr.hop_anim, "display", "none" );
   }
}
function hop_start_anim( service, user_anim ) {
   var anim = user_anim( service );
   if( !anim.count ) {
      document.body.appendChild( anim );
      anim.count = 2;
   } else {
      anim.count++;
      anim.title = service;
      node_style_set( anim, "display", "block" );
   }
   return anim;
}
function hop_default_success( h, xhr ) {
   return h;
}
function hop_send_request( svc, sync, success, failure, anim, henv, auth, t, x ) {
   var xhr = x ? x : hop_make_xml_http_request();
   var hop_header_ctype = hop_header_content_type;
   var hop_header_serialize = hop_header_hop_serialize;
   var succ = (typeof success === "function") ? success : hop_default_success;
   var fail = (typeof failure === "function") ? failure : hop_default_failure;
   var hstack = hop_debug() > 0 ? hop_get_stack( 1 ) : false;
   function onreadystatechange() {
      if( xhr.readyState == 4 ) {
	 try {
	    var status = xhr.status;
	    xhr.hopStack = hstack;
	    switch( status ) {
	       case 200:
		  try {
		     var ctype = hop_header_ctype( xhr );
		     var expr;
		     if( ctype === "application/x-javascript" ) {
			var serialize = hop_header_serialize( xhr );
			try {
			   if( serialize === "javascript" ) {
			      expr = eval( xhr.responseText );
			   } else if( serialize === "hop" ) {
			      expr = hop_string_to_obj( decodeURIComponent( xhr.responseText ) );
			   } else if( serialize === "json" ) {
			      expr = hop_unjson( hop_json_parse( xhr.responseText ) );
			   } else {
			      sc_error( svc,
					"Unknown serialization format",
					serialize );
			   }
			} catch( exc ) {
			   xhr.exception = exc;
			   xhr.exception.hopStack = hstack;
			   xhr.exception.hopService = svc;
			   xhr.exception.message = xhr.responseText;
			   fail( xhr );
			   expr = false;
			}
			return succ( expr, xhr );
		     } else if( (ctype === "text/html") ||
				(ctype === "application/xhtml+xml") ) {
			var el = hop_create_element( xhr.responseText );
			return succ( el, xhr );
		     } else {
			return succ( xhr.responseText, xhr );
		     }
		  } catch( exc ) {
		     xhr.exception = exc;
		     xhr.exception.hopStack = hstack;
		     xhr.exception.hopService = svc;
		     fail( xhr );
		     return false;
		  }
	       case 204:
		  return false;
	       case 257:
		  return hop_js_eval( xhr );
	       case 258:
		  if( xhr.responseText != null )
		     return eval( xhr.responseText );
		  else
		     return false;
	       case 259:
		  hop_set_cookie( xhr );
		  return false;
	       case 407:
		  fail( xhr );
		  return false;
	       default:
		  if( (typeof status == "number") &&
		      (status > 200) && (status < 300) ) {
		     return succ( xhr.responseText, xhr );
		  } else {
		     fail( xhr );
		     return false;
		  }
	    }
	 } catch( exc ) {
	    xhr.exception = exc;
	    xhr.exception.hopStack = hstack;
	    xhr.exception.hopService = svc;
	    fail( xhr );
	    return false;
	 } finally {
	    if( typeof hop_stop_anim === "function" ) { 
	       hop_stop_anim( xhr );
	    }
	 }
      }
      return false;
   }
   if( !sync ) {
      xhr.onreadystatechange = onreadystatechange;
   }
   xhr.open( "PUT", svc, (sync != true) );
   if( t ) {
      if( "setTimeouts" in xhr ) {
	 xhr.setTimeouts = t;
      } else {
	 xhr.timeout = t;
	 xhr.ontimeout = failure;
      }
   }
   if( hop_config.navigator_family != "safari" &&
       hop_config.navigator_family != "chrome" &&
       hop_config.navigator_family != "webkit" )
      xhr.setRequestHeader( 'Connection', 'close' );
   xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1' );
   if( henv.length > 0 ) {
      xhr.setRequestHeader( 'Hop-Env', hop_serialize_request_env() );
   }
   if( auth ) {
      xhr.setRequestHeader( 'Authorization', auth );
   }
   if( xhr.multipart === true ) {
      xhr.setRequestHeader( 'Xhr-Multipart', "true" );
   }
   try {
      xhr.send( null );
      if( anim ) {
	 var a = (anim instanceof Function) ? anim : hop_default_anim_get();
	 if( hop_has_setInterval ) {
	    xhr.hop_anim = true;
	    xhr.hop_anim_interval =
	       setInterval( function() {
		     clearInterval( xhr.hop_anim_interval );
		     if( xhr.hop_anim == true )
			xhr.hop_anim = hop_start_anim( svc, a );
		  }, hop_anim_latency );
	 } else {
	    xhr.hop_anim_interval = false;
	    xhr.hop_anim = hop_start_anim( svc, a );
	 }
      } else {
	 xhr.hop_anim = false;
      }
      if( sync ) {
	 if( xhr.readyState == 4 ) {
	    onreadystatechange();
	 } else {
	    sc_error( svc,
		      "with-hop synchronous call failed",
		      "readyState: " + xhr.readyState );
	 }
      }
   } catch( e ) {
      if( typeof hop_stop_anim === "function" ) { 
	 hop_stop_anim( xhr );
      }
      e.hopObject = svc;
      throw e;
   }
   return xhr;
}
function with_hop( svc, success, failure, sync, anim, timeout ) {
   return hop_send_request( svc, sync,
			    success, failure,
			    true, hop_serialize_request_env(), false, timeout );
}
var hop_request_env = [];
var hop_request_env_string = "";
var hop_request_env_invalid = false;
function hop_serialize_request_env() {
   if( hop_request_env_invalid ) {
      var tmp = null;
      for( var p in hop_request_env ) {
	 if( (typeof hop_request_env[ p ] != "function") &&
	     (hop_request_env[ p ] != undefined) ) {
	    tmp = sc_cons( sc_cons( p, hop_request_env[ p ] ), tmp );
	 }
      }
      hop_request_env_string = hop_bigloo_serialize( tmp );
   }
   return hop_request_env_string;
}
function hop_request_reset() {
   hop_request_env_string = "";
   hop_request_env_set = false;
   return null;
}
function hop_request_set( key, val ) {
   hop_request_env_invalid = true;
   hop_request_env[ key ] = val;
   return val;
}
function hop_request_get( key ) {
   return hop_request[ key ];
}
function hop_callback( proc ) {
   if( hop_debug() > 0 ) {
      if( !(typeof proc === "function" ) ) {
	 var hstack = hop_get_stack( 1 );
	 e = new Error( "handler not a procedure: " + proc );
	 e.hopStack = hstack;
	 hop_report_exception( e );
	 return function( e ) {
	    throw( e );
	 }
      } else {
	 var hstack =
	    ((typeof hop_get_stack) === "function") ?
	    hop_get_stack( 2 ) : null;
	 return function( e ) {
	    try {
	       return proc.apply( this, arguments );
	    } catch( exc ) {
	       if( sc_isPair( exc.hopStack ) ) {
		  exc.hopStack = sc_append( exc.hopStack, hstack );
	       }
	       else {
		  try {
		     exc.hopStack = hstack;
		  } catch( _ ) {
		  }
	       }
	       hop_report_exception( exc );
	    }
	 }
      }
   } else {
      return proc;
   }
}   
function hop_trace() {
   if( hop_debug() > 0 ) {
      var svc = hop_apply_url( hop_service_base() + "/trace", arguments );
      hop_send_request( svc, true, function() {}, function() {}, false, [] );
   }
}
function hop_tprint( file, pos, rest ) {
   var svc = hop_apply_url( hop_service_base() + "/trace/tprint",
			    [ file, pos, rest ] );
   hop_send_request( svc, true, function() {}, function() {}, false, [] );
}
function hop_for( proc, obj ) {
   for( var p in obj ) {
      proc( p, obj[ p ] );
   }
}
function hop_in( field, obj ) {
   return field in obj;
}
function hop_instanceof( obj, klass ) {
   return obj instanceof klass;
}
function hop_properties_to_list( obj ) {
   var res = null;
   for( var p in obj ) {
      res = sc_cons( sc_cons( p, obj[ p ] ), res );
   }
   return sc_reverseBang( res );
}
function hop_replace_inner( el ) {
   if( el != undefined ) {
      return function( html ) {
	 if( html ) {
	    hop_innerHTML_set( el, html );
	 }
      }
   } else {
      sc_error( "hop_replace_inner", "Can't find element", el );
   }
}
function hop_replace_inner_id( id ) {
   return hop_replace_inner( document.getElementById( id ) );
}
function hop_set_cookie( http ) {
   try {
      var cookie = http.getResponseHeader( "set-cookie" );
      if( cookie )
	 document.cookie = cookie;
   } catch( e ) {
      ;
   }
}
function hop_cookie_remove( name, path, domain ) {
   if( hop_cookie_get_value( name ) ) {
      hop_cookie_set_value( name, "", path, domain );
   }
}
function hop_cookie_get_value( name ) {
   var cookies = document.cookie;
   var i = cookies.indexOf( name + "=" );
   if( i !== -1 ) {
      var start = i + name.length + 1;
      var end = cookies.indexOf( ";", start );
      if( end == -1 ) end = cookies.length;
      return unescape( cookies.substring( start, end ) );
   } else {
      return null;
   }
}
function hop_cookie_set_value( name, val, path, domain, expires ) {
   var cookie = name + "=" + val;
   if( (path instanceof String) || (typeof path == "string") ) {
      cookie += "; path=" + path;
   } else {
      cookie += "; path=/";
   }
   if( (expires instanceof String) || (typeof expires == "string") ) {
      cookie += "; expires=" + expires;
   } else {
      if( expires instanceof Date ) {
	 cookie += "; expires=" + expires.toGMTString();
      }
   }
   if( (domain instanceof String) || (typeof domain == "string") ) {
      cookie += "; domain=" + domain;
   }
   document.cookie = cookie;
}
var hop_load_frequency = 100;
var hop_load_frequency = 100;
function hop_load( src, timeout ) {
   var script = document.createElement( "script" );
   script.src = src;
   var loaded = false;
   var holder = document.getElementsByTagName( "head" );
   if( !timeout || (timeout == undefined) ) timeout = -1;
   if( holder != null ) {
      if( timeout != 0 ) script.onload = function( e ) { loaded = true; }
      holder[ 0 ].appendChild( script );
      if( timeout != 0 ) {
	 var it;
	 var p = function() {
	    if( loaded == true ) {
	       clearInterval( it );
	    } else {
	       if( timeout > 0 ) {
		  timeout -= hop_load_frequency;
		  if( timeout <= 0 ) {
		     clearInterval( it );
		     sc_error( "hop_load", "Cannot load file", src );
		  }
	       }
	    }
	 };
	 it = setInterval( p, hop_load_frequency );
      }
   } else {
      sc_error( "hop_load", "Can't find HEAD element", src );
   }
}
var hop_window_onload_add = function( proc ) {
   return hop_add_event_listener( window, "load", proc );
}
function hop_update( node ) {
   if( node.hop_update != undefined ) {
      node.hop_update();
   }
   for( var i = 0; i < node.childNodes.length; i++ ) {
      hop_update( node.childNodes[ i ] );
   }
}
function hop_typeof( obj ) {
   if( obj instanceof Object ) {
      if( obj instanceof Date ) {
	 return "date";
      } else {
	 if( obj instanceof RegExp ) {
	    return "regexp";
	 } else {
	    if( typeof obj.hop_typeof == "function" ) 
	       return obj.hop_typeof();
	    else
	       return "object";
	 }
      }
   } else {
      var tname = typeof obj;
      if( tname == "string" ) {
	 if( sc_isSymbol( obj ) )
	    return "symbol";
	 if( sc_isKeyword( obj ) )
	    return "keyword";
	 return tname;
      }
      return tname;
   }
}
function after( timeout, proc ) {
   var tm = sc_isNumber( timeout ) ? timeout : 1;
   var wproc = hop_callback( proc );
   var i = setInterval( function() { clearInterval( i ); wproc() }, tm );
   return true;
}
function timeout( tm, proc ) {
   var wproc = hop_callback( proc );
   if( wproc() ) {
      var i = setInterval(
	 function() { if( !wproc() ) clearInterval( i )}, tm );
   }
}
function url_decode( s ) {
   try {
      return decodeURI( s );
   } catch( e ) {
      return s;
   }
}
function url_encode( s ) {
   return encodeURI( s );
}
function string_hex_extern( str ) {
  var res = "";
  var l = str.length;
  for( var i = 0; i < l; i++ ) {
    res += "0123456789abcdef".charAt( (str.charCodeAt( i ) >> 4) & 15 )
         + "0123456789abcdef".charAt( (str.charCodeAt( i ) & 15) );
  }
  return res;
}
function string_hex_intern( s ) {
   var res = "";
   var l = s.length;
   var z = '0'.charCodeAt( 0 );
   var n = '9'.charCodeAt( 0 );
   var a = 'a'.charCodeAt( 0 );
   var f = 'f'.charCodeAt( 0 );
   var A = 'A'.charCodeAt( 0 );
   function hex_to_num( c ) {
      if( (c >= z) && ( c<= n) ) {
	 return c - z;
      }
      if( (c >= a) && ( c<= f) ) {
	 return (c - a) + 10;;
      }
      return (c - A) + 10;
   }
   for( var i = 0; i < l; i += 2 ) {
      var d1 = hex_to_num( s.charCodeAt( i ) );
      var d2 = hex_to_num( s.charCodeAt( i + 1 ) );
      res += String.fromCharCode( (d1 << 4) + d2 );
   }
   return res;
}
function make_date() {
   var l = arguments.length, i = 0;
   var year = 1970;
   var month = 1;
   var day = 1;
   var hours = 1;
   var minutes = 1;
   var seconds = 1;
   while( i < l ) {
      var k = arguments[ i++ ];
      if( sc_isKeyword( k ) ) {
	 var prop = sc_keyword2jsstring( k );
	 if( prop === "year" ) year = arguments[ i++ ]; 
	 else if( prop === "month" ) month = (arguments[ i++ ] - 1); 
	 else if( prop === "day" ) day = arguments[ i++ ]; 
	 else if( prop === "hours" ) hours = arguments[ i++ ]; 
	 else if( prop === "minutes" ) minutes = arguments[ i++ ]; 
	 else if( prop === "seconds" ) seconds = arguments[ i++ ]; 
	 else i++;
      }
   }
   return new Date( year, month, day, hours, minutes, seconds );
}
function date_copy() {
   var l = arguments.length, i = 1;
   var date = arguments[ 0 ];
   var year = date.getFullYear();
   var month = date.getMonth();
   var day = date.getDate();
   var hours = date.getHours();
   var minutes = date.getMinutes();
   var seconds = date.getSeconds();
   while( i < l ) {
      var k = arguments[ i++ ];
      if( sc_isKeyword( k ) ) {
	 var prop = sc_keyword2jsstring( k );
	 if( prop === "year" ) year = arguments[ i++ ]; 
	 else if( prop === "month" ) month = (arguments[ i++ ] - 1);  
	 else if( prop === "day" ) day = arguments[ i++ ]; 
	 else if( prop === "hours" ) hours = arguments[ i++ ]; 
	 else if( prop === "minutes" ) minutes = arguments[ i++ ]; 
	 else if( prop === "seconds" ) seconds = arguments[ i++ ]; 
	 else i++;
      }
   }
   return new Date( year, month, day, hours, minutes, seconds );
}
function date_seconds( d ) {
   return d.getTime() / 1000;
}
function seconds_date( d ) {
   return new Date( d * 1000 );
}
function date_to_rfc2822( d ) {
   return d.toTimeString();
}
function date_from_rfc2822( s ) {
   return new Date( s );
}
function day_seconds() {
   return 86400;
}
function date_year( d ) {
   return d.getFullYear();
}
function date_month( d ) {
   return d.getMonth() + 1;
}
function date_day( d ) {
   return d.getDate();
}
function date_yday( d ) {
   var d0 = new Date( d.getFullYear(), 0, 1,
		      d.getHours(), d.getMinutes(),
		      d.getSeconds(), d.getMilliseconds() );
   return Math.round(((d.getTime() - d0.getTime()) / 1000) / day_seconds()) + 1;
}
function date_wday( d ) {
   return d.getDay() + 1;
}
function date_hour( d ) {
   return d.getHours();
}
function date_minute( d ) {
   return d.getMinutes();
}   
function date_second( d ) {
   return d.getSeconds();
}   
var hop_day_names =
   [ "Sunday", "Monday",  "Tuesday", "Wednesday", "Thursday", "Friday",  "Saturday" ];
function day_name( day ) {
   if( day < 1 ) 
      sc_error( "date-name", "Illegal day number", day );
   else if( day > 7 )
      return sc_jsstring2string( hop_day_names[ day % 7 ] );
   else
      return sc_jsstring2string( hop_day_names[ day - 1 ] );
}
function day_aname( day ) {
   if( day < 1 ) 
      sc_error( "date-name", "Illegal day number", day );
   else if( day > 7 )
      return sc_jsstring2string( hop_day_names[ day % 7 ].substring( 0, 2 ) );
   else
      return sc_jsstring2string( hop_day_names[ day - 1 ].substring( 0, 2 ) );
}
var hop_month_names =
   [ "January", "February", "March", "April", "May", "June",
     "July", "August", "September", "October", "November", "December" ];
function month_name( month ) {
   if( month < 1 ) 
      sc_error( "date-name", "Illegal month number", month );
   else if( month > 12 )
      return sc_jsstring2string( hop_month_names[ month % 12 ] );
   else
      return sc_jsstring2string( hop_month_names[ month - 1 ] );
}
function month_aname( month ) {
   if( month < 1 ) 
      sc_error( "date-name", "Illegal month number", month );
   else if( month > 12 )
      return sc_jsstring2string( hop_month_names[ month % 12 ].substring( 0, 2 ) );
   else
      return sc_jsstring2string( hop_month_names[ month - 1 ].substring( 0, 2 ) );
}
function hop_alist2jsobject( alist ) {
   var o = {};
   while( sc_isPair( alist ) ) {
      if( !sc_isPair( alist.car ) || !sc_isPair( alist.car.cdr ) )
	 sc_error( "alist->object", "Illegal entry", alist.car );
      if( !sc_isKeyword( alist.car.car ) )
	 sc_error( "alist->object", "Illegal key", alist.car.car );
      o[ sc_keyword2jsstring( alist.car.car ) ] = alist.car.cdr.car;
      alist = alist.cdr;
   }
   return o;
}
function hop_jsobject2alist( obj ) {
   var l = null;
   for( p in obj ) {
      var c = sc_cons( sc_jsstring2keyword( p ), sc_cons( o[ p ], null ) );
      l = sc_cons( c, l );
   }
   return l;
}
function hop_plist2jsobject( plist ) {
   var o = {};
   while( sc_isPair( plist ) ) {
      if( !sc_isKeyword( plist.car ) )
	 sc_error( "plist->object", "Illegal key", plist.car.car );
      if( !sc_isPair( plist.cdr ) ) 
	 sc_error( "plist->object", "Illegal entry", plist );
      o[ sc_keyword2jsstring( plist.car ) ] = plist.cdr.car;
      plist = plist.cdr.cdr;
   }
   return o;
}
function hop_jsobject2plist( obj ) {
   var l = null;
   for( p in obj ) {
      l = sc_cons( sc_jsstring2keyword( p ), sc_cons( o[ p ], l ) );
   }
   return l;
}
var hop_id_count = 0;
function hop_xml_make_id( obj ) {
   return (obj instanceof String ? obj : "id") + hop_id_count++;
}
var hop_current_state_history = undefined;
var hop_state_history_handler = {};
var hop_location_event_initp = false;
function hop_state_history_register_handler( key, reset, proc ) {
   hop_state_history_handler[ key ] = { reset: reset, proc: proc };
}
function _hop_state_entry( op, val ) {
   this.op = op;
   this.val = val;
   this.close = false;
}
function hop_state_history_to_location( state ) {
   var loc = undefined;
   for( p in state ) {
      if( state[ p ] instanceof _hop_state_entry ) {
	 if( loc == undefined ) {
	    loc = "#" + p + "=" + state[ p ].op + ":" + state[ p ].val;
	 } else {
	    loc += "," + p + "=" + state[ p ].op + ":" + state[ p ].val;
	 }
      }
   }
   return loc;
}
var hop_hash_history_regexp = /#?([^=]+)=([^:]+):([^,]+)+/;
function hop_location_to_state_history( hash ) {
   var state = {};
   var split = hash.split( "," );
   for( var i = 0; i < split.length; i++ ) {
      var el = split[ i ].match( hop_hash_history_regexp );
      if( el ) {
	 var id = el[ 1 ];
	 var op = el[ 2 ];
	 var val = el [ 3 ];
	 state[ id ] = new _hop_state_entry( op, val );
      }
   }
   return state;
}
function hop_state_history_push( id, op, val ) {
   if( hop_current_state_history == undefined ) {
      hop_current_state_history = {};
      hop_current_state_history[ id ] = new _hop_state_entry( op, val );
   } else {
      var olde = hop_current_state_history[ id ];
      if( olde == undefined ) {
	 hop_current_state_history[ id ] = new _hop_state_entry( op, val );
      } else {
	 if( (olde.op != op) || (olde.val != val) ) {
	    olde.op = op;
	    olde.val = val;
	 }
      }
   }
}
function hop_state_history_flush() {
   var loc = hop_state_history_to_location( hop_current_state_history );
   var old = window.location.href;
   var i = old.indexOf( "#" );
   if( i == -1 ) {
      hop_active_location_set( document, old + loc );
   } else {
      hop_active_location_set( document, old.substring( 0, i ) + loc );
   }
}
var hop_state_history_transaction = 0;
function hop_state_history_add( id, op, val ) {
   hop_state_history_push( id, op, val );
   if( hop_state_history_transaction == 0 ) {
      hop_state_history_flush();
   }
}
function hop_with_history( proc ) {
   var res;
   hop_state_history_transaction++;
   try {
      res = proc();
   } finally {
      hop_state_history_transaction--;
   }
   hop_state_history_flush();
   return res;
}
function hop_state_history_reset() {
   if( hop_current_state_history != undefined ) {
      for( p in hop_current_state_history ) {
	 if( hop_current_state_history[ p ] instanceof _hop_state_entry ) {
	    var op = hop_current_state_history[ p ].op;
	    var handler =  hop_state_history_handler[ op ];
	    if( handler != undefined ) {
	       handler.proc( p, handler.reset );
	    }
	 }
      }
      hop_current_state_history = undefined;
   }
}
function hop_state_history_update( olds, news ) {
   var res = 0;
   if( olds == undefined ) {
      for( p in news ) {
	 var state = news[ p ];
	 if( state instanceof _hop_state_entry ) {
	    var op = state.op;
	    var handler = hop_state_history_handler[ op ];
	    if( (handler != undefined) && !state.close ) {
	       if( handler.proc( p, state.val ) ) {
		  state.close = true;
	       } else {
		  res++;
	       }
	    }
	 }
      }
   } else {
      for( p in olds ) {
	 if( (olds[ p ] instanceof _hop_state_entry) &&
	     !(news[ p ] instanceof _hop_state_entry) ) {
	    var op = olds[ p ].op;
	    var handler = hop_state_history_handler[ op ];
	    if( handler != undefined ) {
	       handler.proc( p, handler.reset );
	    }
	 }
      }
      for( p in news ) {
	 var state = news[ p ];
	 if( state instanceof _hop_state_entry ) {
	    if( !(olds[ p ] instanceof _hop_state_entry) ||
		(state.op != olds[ p ].op) ||
		(state.val != olds[ p ].val) ) {
	       var op = state.op;
	       var handler = hop_state_history_handler[ op ];
	       if( (handler != undefined) && !state.close ) {
		  if( handler.proc( p, state.val ) ) {
		     state.close = true;
		  } else {
		     res++;
		  }
	       }
	    }
	 }
      }
   }
   return res;
}
var hop_hash_history_check_regexp = new RegExp( "^#(?:[^=]+=[^:]+:[^,]+,?)+$" );
function hop_hash_historyp( hash ) {
   return hop_hash_history_check_regexp.exec( hash );
}
var hop_eval_history_interval = false;
function hop_retry_eval_history_state( count, old_state, new_state ) {
   var fun = function() {
      var c = hop_state_history_update( old_state, new_state );
      if( (c == 0) || (c == count) || hop_eval_history_interval.invalid ) {
	 clearInterval( hop_eval_history_interval );
      }
   }
   hop_eval_history_interval = setInterval( fun, 200 );
   hop_eval_history_interval.invalid = false;
}
function hop_eval_history_state( location ) {
   var hash = location.hash;
   if( hop_eval_history_interval )
      hop_eval_history_interval.invalid = true;
   if( hash.length == 0 ) {
      hop_state_history_reset();
   } else {
      if( hop_hash_historyp( hash ) ) {
	 var new_state = hop_location_to_state_history( hash );
	 var old_state = hop_current_state_history;
	 var count = hop_state_history_update( old_state, new_state );
	 if( count == 0 ) {
	    hop_current_state_history = new_state;
	 } else {
	    hop_retry_eval_history_state( count, old_state, new_state );
	 }
      }
   }
}
function hop_current_history() {
   var hash = location.hash;
   if( hash.length == 0 ) {
      return false;
   }
   if( hop_hash_historyp( hash ) ) {
      return hop_location_to_state_history( hash );
   }
   return false;
}
function hop_replay_history( hist ) {
   hop_current_state_history = undefined;
   var loc = function( v ) { this.hash = v; }
   hop_eval_history_state( new loc( hop_state_history_to_location( hist ) ) );
}
function _hop_history( key ) {
   this.key = key;
}
function hop_make_history( key, handler, reset ) {
   hop_state_history_register_handler( key, reset, handler );
   return new _hop_history( key );
}
function hop_history_add( history, id, val ) {
   if( !history instanceof _hop_history ) {
      alert( "*** ERROR: Illegal history object -- " + history );
      return false;
   } else {
      return hop_state_history_add( id, history.key, val );
   }
}
if( hop_enable_location_event ) {
   if( !hop_location_event_initp ) {
      hop_location_event_initp = true;
      hop_add_event_listener(
	 window, "ready",
	 function( e ) {
	    hop_add_event_listener( document, "location", hop_eval_history_state );
	 } );
   }
}
function hop_bigloo_serialize_pair( l ) {
   var res = "";
   var len = 0;
   while (sc_isPair( l ) ) {
      res += hop_bigloo_serialize( l.car );
      l = l.cdr;
      len++;
   }
   if( l == null ) {
      return hop_serialize_word( len + 1 ) + res + ".";
   } else {
      return hop_serialize_word( len + 1 ) + res + hop_bigloo_serialize( l );
   }
}
sc_Pair.prototype.hop_bigloo_serialize = function() {
   return '(' + hop_bigloo_serialize_pair( this );
};
sc_Pair.prototype.hop_typeof = function() {
   return "pair";
};
sc_Vector.prototype.hop_typeof = function() {
   return "vector";
};
sc_Struct.prototype.hop_typeof = function() {
   return "struct";
};
sc_OutputPort.prototype.hop_typeof = function() {
   return "output-port";
};
sc_StringOutputPort.prototype.hop_typeof = function() {
   return "output-port";
};
sc_GenericOutputPort.prototype.hop_typeof = function() {
   return "output-port";
};
sc_InputPort.prototype.hop_typeof = function() {
   return "input-port";
};
Boolean.prototype.hop_typeof = function() {
   return "bbool";
};
String.prototype.hop_typeof = function() {
    return hop_typeof(this.toString());
};
sc_Char.prototype.hop_typeof = function() {
   return "bchar";
};

