Merge remote-tracking branch 'origin/master'

This commit is contained in:
Oliver Schmidt 2011-04-12 14:14:45 +02:00
commit 78f7a74689
12 changed files with 281 additions and 273 deletions

View file

@ -12,7 +12,7 @@
#include "dev/leds.h" #include "dev/leds.h"
#if !UIP_CONF_IPV6_RPL #if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET)
#include "static-routing.h" #include "static-routing.h"
#endif #endif
@ -491,10 +491,10 @@ PROCESS_THREAD(coap_server, ev, data)
PRINTF("COAP SERVER\n"); PRINTF("COAP SERVER\n");
/* if static routes are used rather than RPL */ /* if static routes are used rather than RPL */
#if !UIP_CONF_IPV6_RPL #if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET)
set_global_address(); set_global_address();
configure_routing(); configure_routing();
#endif /*!UIP_CONF_IPV6_RPL*/ #endif
current_tid = random_rand(); current_tid = random_rand();

View file

@ -19,6 +19,7 @@ delete_buffer(void)
{ {
if (data_buffer) { if (data_buffer) {
free(data_buffer); free(data_buffer);
data_buffer = NULL;
buffer_index = 0; buffer_index = 0;
buffer_size = 0; buffer_size = 0;
} }

View file

@ -7,6 +7,8 @@
#include "static-routing.h" #include "static-routing.h"
#if !defined (CONTIKI_TARGET_MINIMAL_NET) /* Any other targets will be added here (&& ! defined (OTHER))*/
#define DEBUG 0 #define DEBUG 0
#if DEBUG #if DEBUG
#include <stdio.h> #include <stdio.h>
@ -66,3 +68,4 @@ void configure_routing(void)
} }
} }
#endif /*!UIP_CONF_IPV6_RPL*/ #endif /*!UIP_CONF_IPV6_RPL*/
#endif /*CONTIKI_TARGET_MINIMAL_NET*/

View file

@ -8,6 +8,7 @@
#ifndef STATICROUTING_H_ #ifndef STATICROUTING_H_
#define STATICROUTING_H_ #define STATICROUTING_H_
#if !defined (CONTIKI_TARGET_MINIMAL_NET)
#define NODE_IP(nodeid,type,ipaddr) NODE_##nodeid##_##type(ipaddr) #define NODE_IP(nodeid,type,ipaddr) NODE_##nodeid##_##type(ipaddr)
/*desktop machine*/ /*desktop machine*/
@ -56,4 +57,5 @@ do{\
void set_global_address(void); void set_global_address(void);
void configure_routing(void); void configure_routing(void);
#endif /*CONTIKI_TARGET_MINIMAL_NET*/
#endif /* STATICROUTING_H_ */ #endif /* STATICROUTING_H_ */

View file

@ -50,10 +50,9 @@ extern const char* header_delimiter;
/*HTTP method types*/ /*HTTP method types*/
typedef enum { typedef enum {
HTTP_METHOD_GET = (1 << 0), HTTP_METHOD_GET = (1 << 0),
HTTP_METHOD_HEAD = (1 << 1), HTTP_METHOD_POST = (1 << 1),
HTTP_METHOD_POST = (1 << 2), HTTP_METHOD_PUT = (1 << 2),
HTTP_METHOD_PUT = (1 << 3), HTTP_METHOD_DELETE = (1 << 3)
HTTP_METHOD_DELETE = (1 << 4)
} http_method_t; } http_method_t;
//DY : FIXME right now same enum names with COAP with different values. Will this work fine? //DY : FIXME right now same enum names with COAP with different values. Will this work fine?

View file

@ -7,7 +7,7 @@
#include "buffer.h" #include "buffer.h"
#include "rest-util.h" #include "rest-util.h"
#if !UIP_CONF_IPV6_RPL #if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET)
#include "static-routing.h" #include "static-routing.h"
#endif #endif
@ -235,8 +235,6 @@ is_method_handled(connection_state_t* conn_state, const char* method)
/*other method types can be added here if needed*/ /*other method types can be added here if needed*/
if(strncmp(method, http_get_string, 3) == 0) { if(strncmp(method, http_get_string, 3) == 0) {
conn_state->request.request_type = HTTP_METHOD_GET; conn_state->request.request_type = HTTP_METHOD_GET;
} else if(strncmp(method, http_head_string, 4) == 0) {
conn_state->request.request_type = HTTP_METHOD_HEAD;
} else if (strncmp(method, http_post_string, 4) == 0) { } else if (strncmp(method, http_post_string, 4) == 0) {
conn_state->request.request_type = HTTP_METHOD_POST; conn_state->request.request_type = HTTP_METHOD_POST;
} else if (strncmp(method, http_put_string, 3) == 0) { } else if (strncmp(method, http_put_string, 3) == 0) {
@ -595,7 +593,7 @@ PROCESS_THREAD(http_server, ev, data)
PROCESS_BEGIN(); PROCESS_BEGIN();
/* if static routes are used rather than RPL */ /* if static routes are used rather than RPL */
#if !UIP_CONF_IPV6_RPL #if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET)
set_global_address(); set_global_address();
configure_routing(); configure_routing();
#endif /*!UIP_CONF_IPV6_RPL*/ #endif /*!UIP_CONF_IPV6_RPL*/

View file

@ -5,10 +5,12 @@
#include "contiki-net.h" #include "contiki-net.h"
#include "rest.h" #include "rest.h"
#if defined (CONTIKI_TARGET_SKY) /* Any other targets will be added here (&& defined (OTHER))*/
#include "dev/light-sensor.h" #include "dev/light-sensor.h"
#include "dev/battery-sensor.h" #include "dev/battery-sensor.h"
#include "dev/sht11-sensor.h" #include "dev/sht11-sensor.h"
#include "dev/leds.h" #include "dev/leds.h"
#endif /*defined (CONTIKI_TARGET_SKY)*/
#define DEBUG 1 #define DEBUG 1
#if DEBUG #if DEBUG
@ -36,9 +38,24 @@ helloworld_handler(REQUEST* request, RESPONSE* response)
sprintf(temp,"Hello World!\n"); sprintf(temp,"Hello World!\n");
rest_set_header_content_type(response, TEXT_PLAIN); rest_set_header_content_type(response, TEXT_PLAIN);
rest_set_response_payload(response, temp, strlen(temp)); rest_set_response_payload(response, (uint8_t*)temp, strlen(temp));
} }
RESOURCE(discover, METHOD_GET, ".well-known/core");
void
discover_handler(REQUEST* request, RESPONSE* response)
{
char temp[100];
int index = 0;
index += sprintf(temp + index, "%s,", "</helloworld>;n=\"HelloWorld\"");
index += sprintf(temp + index, "%s,", "</led>;n=\"LedControl\"");
index += sprintf(temp + index, "%s", "</light>;n=\"Light\"");
rest_set_response_payload(response, (uint8_t*)temp, strlen(temp));
rest_set_header_content_type(response, APPLICATION_LINK_FORMAT);
}
#if defined (CONTIKI_TARGET_SKY)
/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ /*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/
RESOURCE(led, METHOD_POST | METHOD_PUT , "led"); RESOURCE(led, METHOD_POST | METHOD_PUT , "led");
@ -120,20 +137,8 @@ toggle_handler(REQUEST* request, RESPONSE* response)
{ {
leds_toggle(LEDS_RED); leds_toggle(LEDS_RED);
} }
#endif /*defined (CONTIKI_TARGET_SKY)*/
RESOURCE(discover, METHOD_GET, ".well-known/core");
void
discover_handler(REQUEST* request, RESPONSE* response)
{
char temp[100];
int index = 0;
index += sprintf(temp + index, "%s,", "</helloworld>;n=\"HelloWorld\"");
index += sprintf(temp + index, "%s,", "</led>;n=\"LedControl\"");
index += sprintf(temp + index, "%s", "</light>;n=\"Light\"");
rest_set_response_payload(response, temp, strlen(temp));
rest_set_header_content_type(response, APPLICATION_LINK_FORMAT);
}
PROCESS(rest_server_example, "Rest Server Example"); PROCESS(rest_server_example, "Rest Server Example");
AUTOSTART_PROCESSES(&rest_server_example); AUTOSTART_PROCESSES(&rest_server_example);
@ -148,14 +153,16 @@ PROCESS_THREAD(rest_server_example, ev, data)
PRINTF("HTTP Server\n"); PRINTF("HTTP Server\n");
#endif #endif
SENSORS_ACTIVATE(light_sensor);
rest_init(); rest_init();
rest_activate_resource(&resource_helloworld); #if defined (CONTIKI_TARGET_SKY)
SENSORS_ACTIVATE(light_sensor);
rest_activate_resource(&resource_led); rest_activate_resource(&resource_led);
rest_activate_resource(&resource_light); rest_activate_resource(&resource_light);
rest_activate_resource(&resource_toggle); rest_activate_resource(&resource_toggle);
#endif /*defined (CONTIKI_TARGET_SKY)*/
rest_activate_resource(&resource_helloworld);
rest_activate_resource(&resource_discover); rest_activate_resource(&resource_discover);
PROCESS_END(); PROCESS_END();

View file

@ -1,9 +1,9 @@
CONTIKI_PROJECT = sky-webserver CONTIKI_PROJECT = sky-webserver
all: sky-webserver sky-telnet-server telnet-tweet all: sky-webserver sky-telnet-server telnet-tweet
PLATFORM_BUILD=1 # This is needed to avoid the shell to include the httpd-cfs version of the websrerver PLATFORM_BUILD=1 # This is needed to avoid the shell to include the httpd-cfs version of the webserver
APPS = webserver twitter telnetd APPS = webserver twitter telnetd
CFLAGS = -DWITH_UIP=1 -I. #-DWITH_NULLMAC=1 CFLAGS = -DWITH_UIP=1 -I.
DEFINES=MAC_DRIVER=cxmac_driver,MAC_CHANNEL_CHECK_RATE=8 DEFINES=NETSTACK_CONF_RDC=cxmac_driver,NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE=8
# The webserver application normally contains a built-in file system and support # The webserver application normally contains a built-in file system and support
# for server-side includes. # for server-side includes.

View file

@ -54,6 +54,7 @@
#include "lib/petsciiconv.h" #include "lib/petsciiconv.h"
static struct httpd_cgi_call *calls = NULL; static struct httpd_cgi_call *calls = NULL;
static struct collect_neighbor_list neighbor_list;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static static
@ -168,7 +169,7 @@ static unsigned short
make_neighbor(void *arg) make_neighbor(void *arg)
{ {
struct httpd_state *s = (struct httpd_state *)arg; struct httpd_state *s = (struct httpd_state *)arg;
struct collect_neighbor *n = collect_neighbor_get(s->u.count); struct collect_neighbor *n = collect_neighbor_list_get(&neighbor_list, s->u.count);
if(n == NULL) { if(n == NULL) {
return 0; return 0;
@ -188,12 +189,12 @@ PT_THREAD(neighborscall(struct httpd_state *s, char *ptr))
announcement_listen(1); announcement_listen(1);
/* printf("neighbor_num %d\n", neighbor_num());*/ /* printf("neighbor_num %d\n", collect_neighbor_list_num(&neighbor_list)); */
for(s->u.count = 0; s->u.count < collect_neighbor_num(); s->u.count++) { for(s->u.count = 0; s->u.count < collect_neighbor_list_num(&neighbor_list); s->u.count++) {
/* printf("count %d\n", s->u.count);*/ /* printf("count %d\n", s->u.count); */
if(collect_neighbor_get(s->u.count) != NULL) { if(collect_neighbor_list_get(&neighbor_list, s->u.count) != NULL) {
/* printf("!= NULL\n");*/ /* printf("!= NULL\n"); */
PSOCK_GENERATOR_SEND(&s->sout, make_neighbor, s); PSOCK_GENERATOR_SEND(&s->sout, make_neighbor, s);
} }
} }
@ -208,14 +209,14 @@ received_announcement(struct announcement *a, const rimeaddr_t *from,
{ {
struct collect_neighbor *n; struct collect_neighbor *n;
/* printf("adv_received %d.%d\n", from->u8[0], from->u8[1]);*/ /* printf("adv_received %d.%d\n", from->u8[0], from->u8[1]); */
n = collect_neighbor_find(from); n = collect_neighbor_list_find(&neighbor_list, from);
if(n == NULL) { if(n == NULL) {
collect_neighbor_add(from, value, 1); collect_neighbor_list_add(&neighbor_list, from, value);
} else { } else {
collect_neighbor_update(n, value); collect_neighbor_update_rtmetric(n, value);
} }
} }
@ -241,8 +242,11 @@ httpd_cgi_init(void)
announcement_register(&announcement, 31, announcement_register(&announcement, 31,
received_announcement); received_announcement);
announcement_set_value(&announcement, 0);
announcement_listen(2); announcement_listen(2);
collect_neighbor_list_new(&neighbor_list);
collect_neighbor_init();
/* neighbor_discovery_open(&conn, 31, /* neighbor_discovery_open(&conn, 31,
CLOCK_SECOND * 4, CLOCK_SECOND * 4,
CLOCK_SECOND * 20, CLOCK_SECOND * 20,

View file

@ -1,11 +1,11 @@
%!: /header.html %!: /header.html
<script type="text/javascript"> <script type="text/javascript">
var start;i=new Image(50,60)i.src="spin.gif"function load(){var img=document.getElementById("spin");img.innerHTML='&nbsp;';loadData()}function loadData(){var r;try{r=new XMLHttpRequest()}catch(e){try{r=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{r=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){alert("Your browser does not support AJAX!");return false}}}r.onreadystatechange=function(){if(r.readyState==1){var img=document.getElementById("spin");img.innerHTML='<img src="spin.gif">'}if(r.readyState==4){var img=document.getElementById("spin");img.innerHTML='took '+((new Date()).getTime()-start.getTime())/1000+' seconds';eval(r.responseText)}}start=new Date();r.open("GET","/sensordata.shtml",true);r.send(null)}function e(el){d=document;if(d.getElementById){return d.getElementById(el)}else if(d.all){return d.all[el]}}function s(el,n,max,text){e(el).innerHTML='<table width=504 border=0 cellpadding=1 cellspacing=0>'+'<tr><td width=200>'+text+'</td>'+'<td width='+(300*n/max)+' bgcolor="gray">&nbsp;</td>'+'<td width='+(300-300*n/max)+' bgcolor="lightgray">&nbsp;</td>'+'</table>'}function dc(n,d){return n.toFixed(d)}function t(m){n=dc(-39.6+0.01*m,1);s('temp',n,40,'Temperature '+n+' &deg;C')}function h(m){n=dc(-4+0.0405*m-2.8e-6*(m*m),2);s('hum',n,100,'Humidity '+n+'%')}function l1(m){n=dc(.7629394375*m,0);s('l1',n,200,'Light 1 '+n)}function l2(m){n=dc(.4693603*m,0);s('l2',n,200,'Light 2 '+n)}function rs(m){n=m+45;s('rs',n,100,'RSSI '+n)}function p(c,l,t,r){tm=c+l;cp=c*1.8/tm;lp=l*0.0545/tm;lt=t*17.7/tm;lr=r*20/tm;n=cp+lp+lt+lr;s('p',n,30,'Power consumption '+dc(n,2)+' mW');s('pc',cp,30,'CPU power '+dc(cp,2)+' mW');s('pl',lp,30,'LPM power '+dc(lp,2)+' mW');s('pr',lr,30,'Radio RX power '+dc(lr,2)+' mW');s('pt',lt,30,'Radio TX power '+dc(lt,2)+' mW')}function i(n){e('i').innerHTML=n} var start,d=document;i=new Image(50,60);i.src="spin.gif";function load(){var img=d.getElementById("spin");img.innerHTML='&nbsp;';loadData()}function loadData(){var r;try{r=new XMLHttpRequest()}catch(e){try{r=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{r=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){alert("Your browser does not support AJAX!");return false}}}r.onreadystatechange=function(){if(r.readyState==1){var img=d.getElementById("spin");img.innerHTML='<img src="spin.gif">'}if(r.readyState==4){var img=d.getElementById("spin");img.innerHTML='took '+((new Date()).getTime()-start.getTime())/1000+' seconds';eval(r.responseText)}};start=new Date();r.open("GET","/sensordata.shtml",true);r.send(null)}function e(el){if(d.getElementById){return d.getElementById(el)}if(d.all){return d.all[el]}}function s(el,n,max,text){e(el).innerHTML='<table width=504 border=0 cellpadding=1 cellspacing=0><tr><td width=200>'+text+'</td><td width='+(300*n/max)+' bgcolor="gray">&nbsp;</td><td width='+(300-300*n/max)+' bgcolor="lightgray">&nbsp;</td></table>'}function dc(n,d){return n.toFixed(d)}function t(m){n=dc(-39.6+0.01*m,1);s('temp',n,40,'Temperature '+n+' &deg;C')}function h(m){n=dc(-4+0.0405*m-2.8e-6*(m*m),2);s('hum',n,100,'Humidity '+n+'%')}function l1(m){n=dc(.7629394375*m,0);s('l1',n,200,'Light 1 '+n)}function l2(m){n=dc(.4693603*m,0);s('l2',n,200,'Light 2 '+n)}function rs(m){n=m+45;s('rs',n,100,'RSSI '+n)}function p(c,l,t,r){tm=c+l;cp=c*1.8/tm;lp=l*0.0545/tm;lt=t*17.7/tm;lr=r*20/tm;n=cp+lp+lt+lr;s('p',n,30,'Power consumption '+dc(n,2)+' mW');s('pc',cp,30,'CPU power '+dc(cp,2)+' mW');s('pl',lp,30,'LPM power '+dc(lp,2)+' mW');s('pr',lr,30,'Radio RX power '+dc(lr,2)+' mW');s('pt',lt,30,'Radio TX power '+dc(lt,2)+' mW')}function i(n){e('i').innerHTML=n}
</script> </script>
<h1>Node <h1>Node
%! nodeid %! nodeid
</h1> </h1>
<a onclick="loadSensordata();" href="#">Reload</a> <a onclick="loadData();" href="#">Reload</a>
<span id="spin"> </span> <span id="spin"> </span>
<h2>Environment</h2> <h2>Environment</h2>
<div id="temp"></div> <div id="temp"></div>
@ -22,5 +22,3 @@ var start;i=new Image(50,60)i.src="spin.gif"function load(){var img=document.get
<br><br> <br><br>
<div id="i">0</div> <div id="i">0</div>
%!: /footer.html %!: /footer.html

View file

@ -1,4 +1,4 @@
/*********Generated by contiki/tools/makefsdata on 2010-02-03*********/ /*********Generated by contiki/tools/makefsdata on 2011-04-11*********/
const char data_sensordata_shtml[30] = { const char data_sensordata_shtml[30] = {
@ -7,7 +7,7 @@ const char data_sensordata_shtml[30] = {
0x25, 0x21, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x25, 0x21, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73,
0x0a, 0x00}; 0x0a, 0x00};
const char data_sensors_shtml[2264] = { const char data_sensors_shtml[2221] = {
/* /sensors.shtml */ /* /sensors.shtml */
0x2f, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x00, 0x2f, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x00,
0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65,
@ -15,226 +15,222 @@ const char data_sensors_shtml[2264] = {
0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61,
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x3e, 0x0a, 0x76, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x3e, 0x0a, 0x76,
0x61, 0x72, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0x69, 0x61, 0x72, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x64,
0x3d, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3b,
0x28, 0x35, 0x30, 0x2c, 0x36, 0x30, 0x29, 0x69, 0x2e, 0x73, 0x69, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6d, 0x61, 0x67,
0x72, 0x63, 0x3d, 0x22, 0x73, 0x70, 0x69, 0x6e, 0x2e, 0x67, 0x65, 0x28, 0x35, 0x30, 0x2c, 0x36, 0x30, 0x29, 0x3b, 0x69,
0x69, 0x66, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x2e, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x73, 0x70, 0x69, 0x6e,
0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x29, 0x7b, 0x76, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x3b, 0x66, 0x75, 0x6e, 0x63,
0x61, 0x72, 0x20, 0x69, 0x6d, 0x67, 0x3d, 0x64, 0x6f, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x28,
0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45,
0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64,
0x28, 0x22, 0x73, 0x70, 0x69, 0x6e, 0x22, 0x29, 0x3b, 0x69,
0x6d, 0x67, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54,
0x4d, 0x4c, 0x3d, 0x27, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
0x27, 0x3b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61,
0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61,
0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3b, 0x74,
0x72, 0x79, 0x7b, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x58,
0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x28, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63,
0x68, 0x28, 0x65, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x72,
0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76,
0x65, 0x58, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x22,
0x4d, 0x73, 0x78, 0x6d, 0x6c, 0x32, 0x2e, 0x58, 0x4d, 0x4c,
0x48, 0x54, 0x54, 0x50, 0x22, 0x29, 0x7d, 0x63, 0x61, 0x74,
0x63, 0x68, 0x28, 0x65, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b,
0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x63, 0x74, 0x69,
0x76, 0x65, 0x58, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28,
0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,
0x2e, 0x58, 0x4d, 0x4c, 0x48, 0x54, 0x54, 0x50, 0x22, 0x29,
0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x29, 0x7b,
0x61, 0x6c, 0x65, 0x72, 0x74, 0x28, 0x22, 0x59, 0x6f, 0x75,
0x72, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x20,
0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73,
0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x41, 0x4a, 0x41,
0x58, 0x21, 0x22, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72,
0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x7d, 0x7d,
0x72, 0x2e, 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73,
0x74, 0x61, 0x74, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65,
0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28,
0x29, 0x7b, 0x69, 0x66, 0x28, 0x72, 0x2e, 0x72, 0x65, 0x61,
0x64, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3d, 0x3d, 0x31,
0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6d, 0x67, 0x3d, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6d, 0x67, 0x3d,
0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x64, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65,
0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x73, 0x70,
0x79, 0x49, 0x64, 0x28, 0x22, 0x73, 0x70, 0x69, 0x6e, 0x22, 0x69, 0x6e, 0x22, 0x29, 0x3b, 0x69, 0x6d, 0x67, 0x2e, 0x69,
0x29, 0x3b, 0x69, 0x6d, 0x67, 0x2e, 0x69, 0x6e, 0x6e, 0x65,
0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x69, 0x6d,
0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x73, 0x70, 0x69,
0x6e, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x3e, 0x27, 0x7d, 0x69,
0x66, 0x28, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53,
0x74, 0x61, 0x74, 0x65, 0x3d, 0x3d, 0x34, 0x29, 0x7b, 0x76,
0x61, 0x72, 0x20, 0x69, 0x6d, 0x67, 0x3d, 0x64, 0x6f, 0x63,
0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45,
0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64,
0x28, 0x22, 0x73, 0x70, 0x69, 0x6e, 0x22, 0x29, 0x3b, 0x69,
0x6d, 0x67, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54,
0x4d, 0x4c, 0x3d, 0x27, 0x74, 0x6f, 0x6f, 0x6b, 0x20, 0x27,
0x2b, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74,
0x65, 0x28, 0x29, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69,
0x6d, 0x65, 0x28, 0x29, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74,
0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29,
0x29, 0x2f, 0x31, 0x30, 0x30, 0x30, 0x2b, 0x27, 0x20, 0x73,
0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x27, 0x3b, 0x65, 0x76,
0x61, 0x6c, 0x28, 0x72, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x29, 0x7d, 0x7d,
0x73, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x6e, 0x65, 0x77, 0x20,
0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x3b, 0x72, 0x2e, 0x6f,
0x70, 0x65, 0x6e, 0x28, 0x22, 0x47, 0x45, 0x54, 0x22, 0x2c,
0x22, 0x2f, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x64, 0x61,
0x74, 0x61, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x2c,
0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x72, 0x2e, 0x73, 0x65,
0x6e, 0x64, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x7d, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28,
0x65, 0x6c, 0x29, 0x7b, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75,
0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x2e,
0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
0x42, 0x79, 0x49, 0x64, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75,
0x72, 0x6e, 0x20, 0x64, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c,
0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28,
0x65, 0x6c, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69,
0x66, 0x28, 0x64, 0x2e, 0x61, 0x6c, 0x6c, 0x29, 0x7b, 0x72,
0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x2e, 0x61, 0x6c,
0x6c, 0x5b, 0x65, 0x6c, 0x5d, 0x7d, 0x7d, 0x66, 0x75, 0x6e,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x28, 0x65, 0x6c,
0x2c, 0x6e, 0x2c, 0x6d, 0x61, 0x78, 0x2c, 0x74, 0x65, 0x78,
0x74, 0x29, 0x7b, 0x65, 0x28, 0x65, 0x6c, 0x29, 0x2e, 0x69,
0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27,
0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x27, 0x3b, 0x6c, 0x6f,
0x74, 0x68, 0x3d, 0x35, 0x30, 0x34, 0x20, 0x62, 0x6f, 0x72, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x7d, 0x66,
0x64, 0x65, 0x72, 0x3d, 0x30, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f,
0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x20, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x7b, 0x76,
0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x72, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x72,
0x67, 0x3d, 0x30, 0x3e, 0x27, 0x2b, 0x27, 0x3c, 0x74, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x58, 0x4d, 0x4c, 0x48, 0x74,
0x3e, 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28,
0x3d, 0x32, 0x30, 0x30, 0x3e, 0x27, 0x2b, 0x74, 0x65, 0x78, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x29,
0x74, 0x2b, 0x27, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x27, 0x2b, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x72, 0x3d, 0x6e, 0x65, 0x77,
0x27, 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x58, 0x4f, 0x62,
0x3d, 0x27, 0x2b, 0x28, 0x33, 0x30, 0x30, 0x2a, 0x6e, 0x2f, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x22, 0x4d, 0x73, 0x78, 0x6d,
0x6d, 0x61, 0x78, 0x29, 0x2b, 0x27, 0x20, 0x62, 0x67, 0x63, 0x6c, 0x32, 0x2e, 0x58, 0x4d, 0x4c, 0x48, 0x54, 0x54, 0x50,
0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x67, 0x72, 0x61, 0x79, 0x22, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65,
0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x72, 0x3d, 0x6e, 0x65,
0x74, 0x64, 0x3e, 0x27, 0x2b, 0x27, 0x3c, 0x74, 0x64, 0x20, 0x77, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x58, 0x4f,
0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x27, 0x2b, 0x28, 0x33, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x22, 0x4d, 0x69, 0x63,
0x30, 0x30, 0x2d, 0x33, 0x30, 0x30, 0x2a, 0x6e, 0x2f, 0x6d, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x58, 0x4d, 0x4c,
0x61, 0x78, 0x29, 0x2b, 0x27, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x48, 0x54, 0x54, 0x50, 0x22, 0x29, 0x7d, 0x63, 0x61, 0x74,
0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x63, 0x68, 0x28, 0x65, 0x29, 0x7b, 0x61, 0x6c, 0x65, 0x72,
0x67, 0x72, 0x61, 0x79, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x74, 0x28, 0x22, 0x59, 0x6f, 0x75, 0x72, 0x20, 0x62, 0x72,
0x70, 0x3b, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x27, 0x2b, 0x27, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x20, 0x64, 0x6f, 0x65, 0x73,
0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x27, 0x7d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f,
0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, 0x74, 0x20, 0x41, 0x4a, 0x41, 0x58, 0x21, 0x22, 0x29,
0x63, 0x28, 0x6e, 0x2c, 0x64, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61,
0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x73, 0x65, 0x7d, 0x7d, 0x7d, 0x72, 0x2e, 0x6f, 0x6e,
0x78, 0x65, 0x64, 0x28, 0x64, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6d, 0x29, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e,
0x7b, 0x6e, 0x3d, 0x64, 0x63, 0x28, 0x2d, 0x33, 0x39, 0x2e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x69, 0x66,
0x36, 0x2b, 0x30, 0x2e, 0x30, 0x31, 0x2a, 0x6d, 0x2c, 0x31, 0x28, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x74,
0x29, 0x3b, 0x73, 0x28, 0x27, 0x74, 0x65, 0x6d, 0x70, 0x27, 0x61, 0x74, 0x65, 0x3d, 0x3d, 0x31, 0x29, 0x7b, 0x76, 0x61,
0x2c, 0x6e, 0x2c, 0x34, 0x30, 0x2c, 0x27, 0x54, 0x65, 0x6d, 0x72, 0x20, 0x69, 0x6d, 0x67, 0x3d, 0x64, 0x2e, 0x67, 0x65,
0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x27, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79,
0x2b, 0x6e, 0x2b, 0x27, 0x20, 0x26, 0x64, 0x65, 0x67, 0x3b, 0x49, 0x64, 0x28, 0x22, 0x73, 0x70, 0x69, 0x6e, 0x22, 0x29,
0x43, 0x27, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x3b, 0x69, 0x6d, 0x67, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72,
0x6f, 0x6e, 0x20, 0x68, 0x28, 0x6d, 0x29, 0x7b, 0x6e, 0x3d, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x69, 0x6d, 0x67,
0x64, 0x63, 0x28, 0x2d, 0x34, 0x2b, 0x30, 0x2e, 0x30, 0x34, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x73, 0x70, 0x69, 0x6e,
0x30, 0x35, 0x2a, 0x6d, 0x2d, 0x32, 0x2e, 0x38, 0x65, 0x2d, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x3e, 0x27, 0x7d, 0x69, 0x66,
0x36, 0x2a, 0x28, 0x6d, 0x2a, 0x6d, 0x29, 0x2c, 0x32, 0x29, 0x28, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x74,
0x3b, 0x73, 0x28, 0x27, 0x68, 0x75, 0x6d, 0x27, 0x2c, 0x6e, 0x61, 0x74, 0x65, 0x3d, 0x3d, 0x34, 0x29, 0x7b, 0x76, 0x61,
0x2c, 0x31, 0x30, 0x30, 0x2c, 0x27, 0x48, 0x75, 0x6d, 0x69, 0x72, 0x20, 0x69, 0x6d, 0x67, 0x3d, 0x64, 0x2e, 0x67, 0x65,
0x64, 0x69, 0x74, 0x79, 0x20, 0x27, 0x2b, 0x6e, 0x2b, 0x27, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79,
0x25, 0x27, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x49, 0x64, 0x28, 0x22, 0x73, 0x70, 0x69, 0x6e, 0x22, 0x29,
0x6f, 0x6e, 0x20, 0x6c, 0x31, 0x28, 0x6d, 0x29, 0x7b, 0x6e, 0x3b, 0x69, 0x6d, 0x67, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72,
0x3d, 0x64, 0x63, 0x28, 0x2e, 0x37, 0x36, 0x32, 0x39, 0x33, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x74, 0x6f, 0x6f, 0x6b,
0x39, 0x34, 0x33, 0x37, 0x35, 0x2a, 0x6d, 0x2c, 0x30, 0x29, 0x20, 0x27, 0x2b, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x44,
0x3b, 0x73, 0x28, 0x27, 0x6c, 0x31, 0x27, 0x2c, 0x6e, 0x2c, 0x61, 0x74, 0x65, 0x28, 0x29, 0x29, 0x2e, 0x67, 0x65, 0x74,
0x32, 0x30, 0x30, 0x2c, 0x27, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x2d, 0x73, 0x74, 0x61,
0x20, 0x31, 0x20, 0x27, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x72, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65,
0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x32, 0x28, 0x28, 0x29, 0x29, 0x2f, 0x31, 0x30, 0x30, 0x30, 0x2b, 0x27,
0x6d, 0x29, 0x7b, 0x6e, 0x3d, 0x64, 0x63, 0x28, 0x2e, 0x34, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x27, 0x3b,
0x36, 0x39, 0x33, 0x36, 0x30, 0x33, 0x2a, 0x6d, 0x2c, 0x30, 0x65, 0x76, 0x61, 0x6c, 0x28, 0x72, 0x2e, 0x72, 0x65, 0x73,
0x29, 0x3b, 0x73, 0x28, 0x27, 0x6c, 0x32, 0x27, 0x2c, 0x6e, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x29,
0x2c, 0x32, 0x30, 0x30, 0x2c, 0x27, 0x4c, 0x69, 0x67, 0x68, 0x7d, 0x7d, 0x3b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x6e,
0x74, 0x20, 0x32, 0x20, 0x27, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x3b,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x73, 0x72, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x22, 0x47, 0x45,
0x28, 0x6d, 0x29, 0x7b, 0x6e, 0x3d, 0x6d, 0x2b, 0x34, 0x35, 0x54, 0x22, 0x2c, 0x22, 0x2f, 0x73, 0x65, 0x6e, 0x73, 0x6f,
0x3b, 0x73, 0x28, 0x27, 0x72, 0x73, 0x27, 0x2c, 0x6e, 0x2c, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x68, 0x74, 0x6d,
0x31, 0x30, 0x30, 0x2c, 0x27, 0x52, 0x53, 0x53, 0x49, 0x20, 0x6c, 0x22, 0x2c, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x72,
0x27, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x2e, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x6e, 0x75, 0x6c, 0x6c,
0x69, 0x6f, 0x6e, 0x20, 0x70, 0x28, 0x63, 0x2c, 0x6c, 0x2c,
0x74, 0x2c, 0x72, 0x29, 0x7b, 0x74, 0x6d, 0x3d, 0x63, 0x2b,
0x6c, 0x3b, 0x63, 0x70, 0x3d, 0x63, 0x2a, 0x31, 0x2e, 0x38,
0x2f, 0x74, 0x6d, 0x3b, 0x6c, 0x70, 0x3d, 0x6c, 0x2a, 0x30,
0x2e, 0x30, 0x35, 0x34, 0x35, 0x2f, 0x74, 0x6d, 0x3b, 0x6c,
0x74, 0x3d, 0x74, 0x2a, 0x31, 0x37, 0x2e, 0x37, 0x2f, 0x74,
0x6d, 0x3b, 0x6c, 0x72, 0x3d, 0x72, 0x2a, 0x32, 0x30, 0x2f,
0x74, 0x6d, 0x3b, 0x6e, 0x3d, 0x63, 0x70, 0x2b, 0x6c, 0x70,
0x2b, 0x6c, 0x74, 0x2b, 0x6c, 0x72, 0x3b, 0x73, 0x28, 0x27,
0x70, 0x27, 0x2c, 0x6e, 0x2c, 0x33, 0x30, 0x2c, 0x27, 0x50,
0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75,
0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x27, 0x2b, 0x64,
0x63, 0x28, 0x6e, 0x2c, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x6d,
0x57, 0x27, 0x29, 0x3b, 0x73, 0x28, 0x27, 0x70, 0x63, 0x27,
0x2c, 0x63, 0x70, 0x2c, 0x33, 0x30, 0x2c, 0x27, 0x43, 0x50,
0x55, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x27, 0x2b,
0x64, 0x63, 0x28, 0x63, 0x70, 0x2c, 0x32, 0x29, 0x2b, 0x27,
0x20, 0x6d, 0x57, 0x27, 0x29, 0x3b, 0x73, 0x28, 0x27, 0x70,
0x6c, 0x27, 0x2c, 0x6c, 0x70, 0x2c, 0x33, 0x30, 0x2c, 0x27,
0x4c, 0x50, 0x4d, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20,
0x27, 0x2b, 0x64, 0x63, 0x28, 0x6c, 0x70, 0x2c, 0x32, 0x29,
0x2b, 0x27, 0x20, 0x6d, 0x57, 0x27, 0x29, 0x3b, 0x73, 0x28,
0x27, 0x70, 0x72, 0x27, 0x2c, 0x6c, 0x72, 0x2c, 0x33, 0x30,
0x2c, 0x27, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x20, 0x52, 0x58,
0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x27, 0x2b, 0x64,
0x63, 0x28, 0x6c, 0x72, 0x2c, 0x32, 0x29, 0x2b, 0x27, 0x20,
0x6d, 0x57, 0x27, 0x29, 0x3b, 0x73, 0x28, 0x27, 0x70, 0x74,
0x27, 0x2c, 0x6c, 0x74, 0x2c, 0x33, 0x30, 0x2c, 0x27, 0x52,
0x61, 0x64, 0x69, 0x6f, 0x20, 0x54, 0x58, 0x20, 0x70, 0x6f,
0x77, 0x65, 0x72, 0x20, 0x27, 0x2b, 0x64, 0x63, 0x28, 0x6c,
0x74, 0x2c, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x6d, 0x57, 0x27,
0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x20, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x65, 0x28, 0x27, 0x69, 0x20, 0x65, 0x28, 0x65, 0x6c, 0x29, 0x7b, 0x69, 0x66, 0x28,
0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x64, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65,
0x4d, 0x4c, 0x3d, 0x6e, 0x7d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x29, 0x7b, 0x72, 0x65,
0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x68, 0x31, 0x3e, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x2e, 0x67, 0x65, 0x74,
0x4e, 0x6f, 0x64, 0x65, 0x0a, 0x25, 0x21, 0x20, 0x6e, 0x6f, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49,
0x64, 0x65, 0x69, 0x64, 0x0a, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x64, 0x28, 0x65, 0x6c, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x64,
0x0a, 0x3c, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x2e, 0x61, 0x6c, 0x6c, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75,
0x6b, 0x3d, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6e, 0x72, 0x6e, 0x20, 0x64, 0x2e, 0x61, 0x6c, 0x6c, 0x5b, 0x65,
0x73, 0x6f, 0x72, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x6c, 0x5d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x22, 0x6f, 0x6e, 0x20, 0x73, 0x28, 0x65, 0x6c, 0x2c, 0x6e, 0x2c,
0x3e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x3c, 0x2f, 0x61, 0x6d, 0x61, 0x78, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x29, 0x7b,
0x3e, 0x0a, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x28, 0x65, 0x6c, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65,
0x3d, 0x22, 0x73, 0x70, 0x69, 0x6e, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x74, 0x61,
0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x3c, 0x68, 0x32, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d,
0x3e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x35, 0x30, 0x34, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
0x6e, 0x74, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x3c, 0x64, 0x3d, 0x30, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64,
0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x20, 0x63, 0x65, 0x6c,
0x70, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x30,
0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x77,
0x75, 0x6d, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x30, 0x30, 0x3e, 0x27,
0x0a, 0x3c, 0x68, 0x32, 0x3e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x2b, 0x74, 0x65, 0x78, 0x74, 0x2b, 0x27, 0x3c, 0x2f, 0x74,
0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64, 0x74,
0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x31, 0x22, 0x3e, 0x3c, 0x68, 0x3d, 0x27, 0x2b, 0x28, 0x33, 0x30, 0x30, 0x2a, 0x6e,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x2f, 0x6d, 0x61, 0x78, 0x29, 0x2b, 0x27, 0x20, 0x62, 0x67,
0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x32, 0x22, 0x3e, 0x3c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x67, 0x72, 0x61,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x68, 0x32, 0x3e, 0x79, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c,
0x50, 0x6f, 0x77, 0x65, 0x72, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69,
0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x68, 0x3d, 0x27, 0x2b, 0x28, 0x33, 0x30, 0x30,
0x70, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x2d, 0x33, 0x30, 0x30, 0x2a, 0x6e, 0x2f, 0x6d, 0x61, 0x78,
0x29, 0x2b, 0x27, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x3d, 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x67, 0x72,
0x61, 0x79, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62,
0x6c, 0x65, 0x3e, 0x27, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x20, 0x64, 0x63, 0x28, 0x6e, 0x2c, 0x64,
0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e,
0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x64,
0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x20, 0x74, 0x28, 0x6d, 0x29, 0x7b, 0x6e, 0x3d, 0x64, 0x63,
0x28, 0x2d, 0x33, 0x39, 0x2e, 0x36, 0x2b, 0x30, 0x2e, 0x30,
0x31, 0x2a, 0x6d, 0x2c, 0x31, 0x29, 0x3b, 0x73, 0x28, 0x27,
0x74, 0x65, 0x6d, 0x70, 0x27, 0x2c, 0x6e, 0x2c, 0x34, 0x30,
0x2c, 0x27, 0x54, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74,
0x75, 0x72, 0x65, 0x20, 0x27, 0x2b, 0x6e, 0x2b, 0x27, 0x20,
0x26, 0x64, 0x65, 0x67, 0x3b, 0x43, 0x27, 0x29, 0x7d, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28,
0x6d, 0x29, 0x7b, 0x6e, 0x3d, 0x64, 0x63, 0x28, 0x2d, 0x34,
0x2b, 0x30, 0x2e, 0x30, 0x34, 0x30, 0x35, 0x2a, 0x6d, 0x2d,
0x32, 0x2e, 0x38, 0x65, 0x2d, 0x36, 0x2a, 0x28, 0x6d, 0x2a,
0x6d, 0x29, 0x2c, 0x32, 0x29, 0x3b, 0x73, 0x28, 0x27, 0x68,
0x75, 0x6d, 0x27, 0x2c, 0x6e, 0x2c, 0x31, 0x30, 0x30, 0x2c,
0x27, 0x48, 0x75, 0x6d, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20,
0x27, 0x2b, 0x6e, 0x2b, 0x27, 0x25, 0x27, 0x29, 0x7d, 0x66,
0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x31,
0x28, 0x6d, 0x29, 0x7b, 0x6e, 0x3d, 0x64, 0x63, 0x28, 0x2e,
0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x33, 0x37, 0x35,
0x2a, 0x6d, 0x2c, 0x30, 0x29, 0x3b, 0x73, 0x28, 0x27, 0x6c,
0x31, 0x27, 0x2c, 0x6e, 0x2c, 0x32, 0x30, 0x30, 0x2c, 0x27,
0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x31, 0x20, 0x27, 0x2b,
0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x20, 0x6c, 0x32, 0x28, 0x6d, 0x29, 0x7b, 0x6e, 0x3d,
0x64, 0x63, 0x28, 0x2e, 0x34, 0x36, 0x39, 0x33, 0x36, 0x30,
0x33, 0x2a, 0x6d, 0x2c, 0x30, 0x29, 0x3b, 0x73, 0x28, 0x27,
0x6c, 0x32, 0x27, 0x2c, 0x6e, 0x2c, 0x32, 0x30, 0x30, 0x2c,
0x27, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x20, 0x27,
0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x20, 0x72, 0x73, 0x28, 0x6d, 0x29, 0x7b, 0x6e,
0x3d, 0x6d, 0x2b, 0x34, 0x35, 0x3b, 0x73, 0x28, 0x27, 0x72,
0x73, 0x27, 0x2c, 0x6e, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x27,
0x52, 0x53, 0x53, 0x49, 0x20, 0x27, 0x2b, 0x6e, 0x29, 0x7d,
0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70,
0x28, 0x63, 0x2c, 0x6c, 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x7b,
0x74, 0x6d, 0x3d, 0x63, 0x2b, 0x6c, 0x3b, 0x63, 0x70, 0x3d,
0x63, 0x2a, 0x31, 0x2e, 0x38, 0x2f, 0x74, 0x6d, 0x3b, 0x6c,
0x70, 0x3d, 0x6c, 0x2a, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x35,
0x2f, 0x74, 0x6d, 0x3b, 0x6c, 0x74, 0x3d, 0x74, 0x2a, 0x31,
0x37, 0x2e, 0x37, 0x2f, 0x74, 0x6d, 0x3b, 0x6c, 0x72, 0x3d,
0x72, 0x2a, 0x32, 0x30, 0x2f, 0x74, 0x6d, 0x3b, 0x6e, 0x3d,
0x63, 0x70, 0x2b, 0x6c, 0x70, 0x2b, 0x6c, 0x74, 0x2b, 0x6c,
0x72, 0x3b, 0x73, 0x28, 0x27, 0x70, 0x27, 0x2c, 0x6e, 0x2c,
0x33, 0x30, 0x2c, 0x27, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x20,
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f,
0x6e, 0x20, 0x27, 0x2b, 0x64, 0x63, 0x28, 0x6e, 0x2c, 0x32,
0x29, 0x2b, 0x27, 0x20, 0x6d, 0x57, 0x27, 0x29, 0x3b, 0x73,
0x28, 0x27, 0x70, 0x63, 0x27, 0x2c, 0x63, 0x70, 0x2c, 0x33,
0x30, 0x2c, 0x27, 0x43, 0x50, 0x55, 0x20, 0x70, 0x6f, 0x77,
0x65, 0x72, 0x20, 0x27, 0x2b, 0x64, 0x63, 0x28, 0x63, 0x70,
0x2c, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x6d, 0x57, 0x27, 0x29,
0x3b, 0x73, 0x28, 0x27, 0x70, 0x6c, 0x27, 0x2c, 0x6c, 0x70,
0x2c, 0x33, 0x30, 0x2c, 0x27, 0x4c, 0x50, 0x4d, 0x20, 0x70,
0x6f, 0x77, 0x65, 0x72, 0x20, 0x27, 0x2b, 0x64, 0x63, 0x28,
0x6c, 0x70, 0x2c, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x6d, 0x57,
0x27, 0x29, 0x3b, 0x73, 0x28, 0x27, 0x70, 0x72, 0x27, 0x2c,
0x6c, 0x72, 0x2c, 0x33, 0x30, 0x2c, 0x27, 0x52, 0x61, 0x64,
0x69, 0x6f, 0x20, 0x52, 0x58, 0x20, 0x70, 0x6f, 0x77, 0x65,
0x72, 0x20, 0x27, 0x2b, 0x64, 0x63, 0x28, 0x6c, 0x72, 0x2c,
0x32, 0x29, 0x2b, 0x27, 0x20, 0x6d, 0x57, 0x27, 0x29, 0x3b,
0x73, 0x28, 0x27, 0x70, 0x74, 0x27, 0x2c, 0x6c, 0x74, 0x2c,
0x33, 0x30, 0x2c, 0x27, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x20,
0x54, 0x58, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x27,
0x2b, 0x64, 0x63, 0x28, 0x6c, 0x74, 0x2c, 0x32, 0x29, 0x2b,
0x27, 0x20, 0x6d, 0x57, 0x27, 0x29, 0x7d, 0x66, 0x75, 0x6e,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x6e, 0x29,
0x7b, 0x65, 0x28, 0x27, 0x69, 0x27, 0x29, 0x2e, 0x69, 0x6e,
0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x6e, 0x7d,
0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e,
0x0a, 0x3c, 0x68, 0x31, 0x3e, 0x4e, 0x6f, 0x64, 0x65, 0x0a,
0x25, 0x21, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x69, 0x64, 0x0a,
0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0a, 0x3c, 0x61, 0x20, 0x6f,
0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x6c, 0x6f,
0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x22,
0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x22, 0x3e,
0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x3c, 0x2f, 0x61, 0x3e,
0x0a, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d,
0x22, 0x73, 0x70, 0x69, 0x6e, 0x22, 0x3e, 0x20, 0x3c, 0x2f,
0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x3c, 0x68, 0x32, 0x3e,
0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
0x74, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70,
0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c,
0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x75,
0x6d, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a,
0x3c, 0x68, 0x32, 0x3e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x3c,
0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x69, 0x64, 0x3d, 0x22, 0x6c, 0x31, 0x22, 0x3e, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x69, 0x64, 0x3d, 0x22, 0x6c, 0x32, 0x22, 0x3e, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x68, 0x32, 0x3e, 0x50,
0x6f, 0x77, 0x65, 0x72, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a,
0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70,
0x63, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c,
0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x63,
0x6c, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c,
0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x6c,
0x72, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c,
0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x72,
0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c,
0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x74,
0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x22, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c,
0x3e, 0x30, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x25, 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x3c, 0x64,
0x21, 0x3a, 0x20, 0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x22, 0x3e,
0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x0a, 0x0a, 0x0a, 0x00}; 0x30, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x25, 0x21,
0x3a, 0x20, 0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e,
0x68, 0x74, 0x6d, 0x6c, 0x0a, 0x00};
const char data_footer_html[39] = { const char data_footer_html[39] = {
/* /footer.html */ /* /footer.html */
@ -455,4 +451,4 @@ const struct httpd_fsdata_file file_index_html[] ={{ file_header_html, d
#define HTTPD_FS_ROOT file_index_html #define HTTPD_FS_ROOT file_index_html
#define HTTPD_FS_NUMFILES 8 #define HTTPD_FS_NUMFILES 8
#define HTTPD_FS_SIZE 4050 #define HTTPD_FS_SIZE 4007

View file

@ -1,11 +1,11 @@
/* This is the uncompressed version of the script in httpd-fs/sensordata.shtml */ /* This is the uncompressed version of the script in httpd-fs/sensordata.shtml */
var start; var start, d = document;
i = new Image(50,60) i = new Image(50,60);
i.src = "spin.gif" i.src = "spin.gif";
function load() { function load() {
var img = document.getElementById("spin"); var img = d.getElementById("spin");
img.innerHTML = '&nbsp;'; img.innerHTML = '&nbsp;';
loadData(); loadData();
} }
@ -25,27 +25,27 @@ function loadData() {
} }
r.onreadystatechange = function() { r.onreadystatechange = function() {
if(r.readyState == 1) { if(r.readyState == 1) {
var img = document.getElementById("spin"); var img = d.getElementById("spin");
img.innerHTML = '<img src="spin.gif">'; img.innerHTML = '<img src="spin.gif">';
} }
if(r.readyState == 4) { if(r.readyState == 4) {
var img = document.getElementById("spin"); var img = d.getElementById("spin");
img.innerHTML = 'took ' + img.innerHTML = 'took ' +
((new Date()).getTime() - start.getTime()) / 1000 + ((new Date()).getTime() - start.getTime()) / 1000 +
' seconds'; ' seconds';
eval(r.responseText); eval(r.responseText);
} }
} };
start = new Date(); start = new Date();
r.open("GET", "/sensordata.shtml", true); r.open("GET", "/sensordata.shtml", true);
r.send(null); r.send(null);
} }
function e(el) { function e(el) {
d = document;
if(d.getElementById) { if(d.getElementById) {
return d.getElementById(el); return d.getElementById(el);
} else if (d.all) { }
if (d.all) {
return d.all[el]; return d.all[el];
} }
} }