<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- saved from url=(0014)about:internet -->
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>FlexApp</title>
 <style type="text/css">
<!--
body {
	margin-left: 0px;
	margin-top: 0px;
	margin-right: 0px;
	margin-bottom: 0px;
	background-color: #808080;
}
#fileLayer {
	position:absolute;
	width:319px;
	height:30px;
	z-index:1;
	left: 486px;
	top: 603px;
	visibility: hidden;
}
-->
</style></head>

<body scroll="no" top="0" left="0" >
<script language='javascript' charset='utf-8'>
function getQueryVariable(variable)
{
  var atquery = window.location.search.substring(1);
  var atstr = atquery.split("&");
  for (var i=0;i<atstr.length;i++)
  {
    var atvar = atstr[i].split("=");
    if (atvar[0] == variable)
	{
      return atvar[1];
    }
 }
 }

document.write('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="app" width="100%" height="100% codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">');
document.write('<param name="movie" value="runtimeloading.swf" />');
document.write('<param name="quality" value="high" />');
document.write('<param name="bgcolor" value="#869ca7" />');
document.write('<param name="allowScriptAccess" value="sameDomain" />');
document.write('<param name="flashvars" value="automationswfurl='+getQueryVariable("automationswfurl")+'" />');
document.write('</object>');
</script>


</body>
</html>
