From 99824ee2a6e1e4d06640139127ec164790d30e4f Mon Sep 17 00:00:00 2001 From: kenji Date: Sun, 20 Jul 2025 21:34:56 -0400 Subject: [PATCH] fix mouse reports and improve timeout handling --- html/index.html | 7 +- html/indicators.shtml | 15 - my_fsdata.c | 684 ++++++++++++++++++++---------------------- parse_keys.c | 8 +- server.c | 20 +- server.h | 1 - websocket.c | 21 +- websocket.h | 1 + 8 files changed, 357 insertions(+), 400 deletions(-) delete mode 100644 html/indicators.shtml diff --git a/html/index.html b/html/index.html index e3967a1..c83e767 100644 --- a/html/index.html +++ b/html/index.html @@ -250,8 +250,6 @@ window.onload = (event) => { window.addEventListener("keyup", onKeyUp, true); socket = new WebSocket("ws://" + window.location.hostname + ":8080/"); - //socket.onopen = function (event) { document.getElementById("websocket").innerHTML="connected"; }; - //socket.onclose = function (event) { document.getElementById("websocket").innerHTML="closed"; }; socket.onmessage = function (event) { updateLEDs(event.data); }; } @@ -332,6 +330,11 @@ function sendKeys(curKeys, is_mouse) { } else { socket.send("K: " + curKeys); } + } else if (socket.readyState == WebSocket.CLOSED) { + socket = new WebSocket("ws://" + window.location.hostname + ":8080/"); + setTimeout( function () { sendKeys(curKeys, is_mouse); }, 10); + } else { + setTimeout( function () { sendKeys(curKeys, is_mouse); }, 10); } } diff --git a/html/indicators.shtml b/html/indicators.shtml deleted file mode 100644 index 1e9705b..0000000 --- a/html/indicators.shtml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - -Keyboard Indicators - - - -
NumLock
-
CapsLock
-
ScrollLock
- - - diff --git a/my_fsdata.c b/my_fsdata.c index 10955ca..998b236 100644 --- a/my_fsdata.c +++ b/my_fsdata.c @@ -13,46 +13,6 @@ static const unsigned char data_fsdata_c[] = { 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, }; -static const unsigned char data_indicators_shtml[] = { - /* /indicators.shtml */ - 0x2f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, - 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3a, 0x20, 0x6c, 0x77, 0x49, 0x50, 0x2f, - 0x70, 0x72, 0x65, 0x2d, 0x30, 0x2e, 0x36, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, - 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, - 0x64, 0x61, 0x6d, 0x2f, 0x6c, 0x77, 0x69, 0x70, 0x2f, 0x29, - 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, - 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, - 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, 0x3c, - 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, - 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0x3c, 0x68, 0x74, 0x6d, - 0x6c, 0x3e, 0xa, 0xa, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, - 0xa, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x4b, 0x65, - 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x49, 0x6e, 0x64, - 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x3c, 0x2f, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x65, - 0x61, 0x64, 0x3e, 0xa, 0xa, 0x3c, 0x62, 0x6f, 0x64, 0x79, - 0x3e, 0xa, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, - 0x22, 0x6e, 0x75, 0x6d, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6e, 0x75, - 0x6d, 0x2d, 0x2d, 0x3e, 0x22, 0x3e, 0x4e, 0x75, 0x6d, 0x4c, - 0x6f, 0x63, 0x6b, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, - 0x61, 0x70, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x63, 0x61, 0x70, - 0x73, 0x2d, 0x2d, 0x3e, 0x22, 0x3e, 0x43, 0x61, 0x70, 0x73, - 0x4c, 0x6f, 0x63, 0x6b, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0xa, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, - 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x22, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x21, 0x2d, 0x2d, 0x23, - 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x2d, 0x2d, 0x3e, 0x22, - 0x3e, 0x53, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x4c, 0x6f, 0x63, - 0x6b, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x3c, 0x2f, - 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0xa, 0x3c, 0x2f, 0x68, - 0x74, 0x6d, 0x6c, 0x3e, 0xa, }; - static const unsigned char data_wifi_shtml[] = { /* /wifi.shtml */ 0x2f, 0x77, 0x69, 0x66, 0x69, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, @@ -1015,27 +975,7 @@ static const unsigned char data_index_html[] = { 0x77, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x2f, 0x22, - 0x29, 0x3b, 0xa, 0x9, 0x2f, 0x2f, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x2e, 0x6f, 0x6e, 0x6f, 0x70, 0x65, 0x6e, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, - 0x20, 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, 0x77, 0x65, 0x62, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x2e, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x22, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3b, - 0x20, 0x7d, 0x3b, 0xa, 0x9, 0x2f, 0x2f, 0x73, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, - 0x20, 0x7b, 0x20, 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, 0x77, 0x65, - 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x2e, - 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, - 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x22, 0x3b, 0x20, - 0x7d, 0x3b, 0xa, 0x9, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x29, 0x3b, 0xa, 0x9, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6f, 0x6e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, @@ -1221,325 +1161,351 @@ static const unsigned char data_index_html[] = { 0x74, 0x2e, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x22, 0x4b, 0x3a, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x63, 0x75, 0x72, 0x4b, 0x65, 0x79, 0x73, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x7d, 0xa, 0x9, - 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x28, 0x64, 0x69, 0x76, 0x5f, 0x69, - 0x64, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, 0x73, - 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x6c, 0x65, 0x74, 0x20, + 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, + 0x3d, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x2e, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x29, 0x20, + 0x7b, 0xa, 0x9, 0x9, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x57, 0x65, 0x62, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x22, 0x77, 0x73, + 0x3a, 0x2f, 0x2f, 0x22, 0x20, 0x2b, 0x20, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x2b, 0x20, 0x22, 0x3a, 0x38, 0x30, 0x38, 0x30, + 0x2f, 0x22, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x73, 0x65, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, + 0x20, 0x7b, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, + 0x73, 0x28, 0x63, 0x75, 0x72, 0x4b, 0x65, 0x79, 0x73, 0x2c, + 0x20, 0x69, 0x73, 0x5f, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x29, + 0x3b, 0x20, 0x7d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0x3b, 0xa, + 0x9, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, + 0x9, 0x9, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x20, 0x73, 0x65, + 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x28, 0x63, 0x75, 0x72, + 0x4b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x2c, 0x20, + 0x31, 0x30, 0x29, 0x3b, 0xa, 0x9, 0x7d, 0xa, 0x7d, 0xa, + 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x28, 0x64, 0x69, 0x76, 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x6b, + 0x65, 0x79, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x7b, + 0xa, 0x9, 0x6c, 0x65, 0x74, 0x20, 0x6b, 0x65, 0x79, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x20, 0x3d, 0x20, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, + 0x79, 0x49, 0x64, 0x28, 0x64, 0x69, 0x76, 0x5f, 0x69, 0x64, + 0x29, 0x3b, 0xa, 0x9, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x20, 0x6f, 0x66, 0x20, + 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x20, + 0x7b, 0xa, 0x9, 0x9, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, + 0x77, 0x52, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, + 0x22, 0x64, 0x69, 0x76, 0x22, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, + 0x76, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, + 0x69, 0x6c, 0x64, 0x28, 0x6e, 0x65, 0x77, 0x52, 0x6f, 0x77, + 0x29, 0x3b, 0xa, 0x9, 0x9, 0x66, 0x6f, 0x72, 0x20, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x72, 0x6f, 0x77, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, + 0x9, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x64, 0x69, - 0x76, 0x5f, 0x69, 0x64, 0x29, 0x3b, 0xa, 0x9, 0x66, 0x6f, - 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x6f, 0x77, - 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x6c, 0x65, - 0x74, 0x20, 0x6e, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x20, 0x3d, - 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x28, 0x22, 0x64, 0x69, 0x76, 0x22, 0x29, - 0x3b, 0xa, 0x9, 0x9, 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x6e, 0x65, - 0x77, 0x52, 0x6f, 0x77, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x66, - 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6b, 0x65, - 0x79, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x6f, 0x77, 0x29, 0x20, - 0x7b, 0xa, 0x9, 0x9, 0x9, 0x6c, 0x65, 0x74, 0x20, 0x6e, - 0x65, 0x77, 0x44, 0x69, 0x76, 0x20, 0x3d, 0x20, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x28, 0x22, 0x64, 0x69, 0x76, 0x22, 0x29, 0x3b, 0xa, 0x9, - 0x9, 0x9, 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x2e, - 0x69, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, - 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x64, 0x20, - 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x3b, 0xa, + 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x64, 0x69, + 0x76, 0x22, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x69, 0x66, + 0x20, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x29, 0x20, + 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, + 0x69, 0x76, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x6b, 0x65, + 0x79, 0x2e, 0x69, 0x64, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, + 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x6b, + 0x65, 0x79, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, - 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, - 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, - 0x77, 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6b, 0x65, - 0x79, 0x22, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x69, 0x66, - 0x20, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x72, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, - 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, - 0x68, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x2c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, - 0x9, 0x9, 0x9, 0x9, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, - 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x3b, 0x20, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, - 0x2e, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, - 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, - 0x68, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, - 0x9, 0x9, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x28, 0x29, 0x3b, 0x20, 0x72, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, - 0x2e, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, - 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, - 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, - 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, - 0x2e, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, - 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, - 0x65, 0x75, 0x70, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, - 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x72, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, - 0x2e, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, - 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x9, + 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0xa, + 0x9, 0x9, 0x9, 0x9, 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, + 0x79, 0x2e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x29, 0x20, + 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, + 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x28, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x4b, + 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x2c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x29, + 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, + 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x6e, 0x64, + 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, + 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, + 0x3b, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4b, + 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x2c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x29, + 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, + 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, 0x77, + 0x6e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, + 0x9, 0x9, 0x9, 0x9, 0x70, 0x72, 0x65, 0x73, 0x73, 0x4b, + 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x2c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x29, + 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, + 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x75, 0x70, 0x22, + 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, + 0x9, 0x9, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4b, + 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x2c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x29, + 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x7d, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, + 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, + 0x9, 0x9, 0x9, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, + 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x28, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, 0x2e, + 0x69, 0x64, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x74, - 0x6f, 0x75, 0x63, 0x68, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, - 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, - 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x3b, - 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x28, + 0x6f, 0x75, 0x63, 0x68, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, + 0x9, 0x9, 0x9, 0x9, 0x9, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x3b, 0x20, 0x72, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x6e, - 0x64, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, - 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, - 0x29, 0x3b, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, + 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x9, + 0x9, 0x9, 0x9, 0x9, 0x9, 0x70, 0x72, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x75, 0x70, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, + 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, + 0x79, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, + 0xa, 0x9, 0x9, 0x9, 0x9, 0x7d, 0xa, 0x9, 0x9, 0x9, + 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x9, + 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x20, 0x62, 0x6c, 0x61, + 0x6e, 0x6b, 0x22, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x7d, 0xa, + 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, + 0x64, 0x28, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x29, 0x3b, + 0xa, 0x9, 0x9, 0x9, 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, + 0x79, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0x20, 0x7b, + 0xa, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, + 0x76, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, 0x3d, 0x20, + 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x22, 0x20, 0x2b, + 0x20, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x2a, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, + 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, 0x70, 0x78, 0x3b, 0x22, + 0x3b, 0xa, 0x9, 0x9, 0x9, 0x7d, 0xa, 0x9, 0x9, 0x9, + 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, + 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x22, 0x20, 0x2b, 0x20, 0x28, + 0x6b, 0x65, 0x79, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x2a, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, 0x70, 0x78, 0x3b, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3b, 0x22, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x7d, + 0xa, 0x9, 0x9, 0x7d, 0xa, 0x9, 0x7d, 0xa, 0x7d, 0xa, + 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x69, + 0x64, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x6c, 0x65, 0x74, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x44, 0x69, 0x76, 0x20, 0x3d, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x79, 0x49, 0x64, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x5f, 0x69, 0x64, 0x29, 0x3b, 0xa, 0x9, 0x66, 0x6f, 0x72, + 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, + 0x9, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x77, 0x44, 0x69, + 0x76, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x64, 0x69, + 0x76, 0x22, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x6e, 0x65, 0x77, + 0x44, 0x69, 0x76, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x69, 0x64, 0x3b, 0xa, 0x9, + 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x3b, 0xa, 0x9, 0x9, 0x6e, 0x65, 0x77, + 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x3b, + 0x20, 0x73, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x28, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x6b, 0x65, 0x79, 0x73, + 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x6e, + 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, + 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x3b, + 0x20, 0x73, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x28, + 0x5b, 0x5d, 0x29, 0x3b, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, + 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, + 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, - 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x28, 0x6b, 0x65, - 0x79, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, - 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, - 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, - 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x75, 0x70, 0x22, 0x2c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x28, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, - 0x9, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4b, 0x65, - 0x79, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x69, 0x64, 0x29, 0x3b, - 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x7d, - 0xa, 0x9, 0x9, 0x9, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, - 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, - 0x20, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3b, 0xa, 0x9, - 0x9, 0x9, 0x7d, 0xa, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, - 0x52, 0x6f, 0x77, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x6e, 0x65, 0x77, 0x44, - 0x69, 0x76, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x69, 0x66, - 0x20, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x6e, - 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x73, 0x74, 0x79, 0x6c, - 0x65, 0x20, 0x3d, 0x20, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, - 0x3a, 0x22, 0x20, 0x2b, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x2e, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x2a, 0x6e, 0x65, 0x77, 0x44, - 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, - 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, - 0x70, 0x78, 0x3b, 0x22, 0x3b, 0xa, 0x9, 0x9, 0x9, 0x7d, - 0xa, 0x9, 0x9, 0x9, 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, - 0x79, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x20, - 0x7b, 0xa, 0x9, 0x9, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, - 0x69, 0x76, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, 0x3d, - 0x20, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x22, - 0x20, 0x2b, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x2e, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x2a, 0x6e, 0x65, 0x77, 0x44, 0x69, - 0x76, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, - 0x70, 0x78, 0x3b, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, - 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x22, 0x3b, 0xa, - 0x9, 0x9, 0x9, 0x7d, 0xa, 0x9, 0x9, 0x7d, 0xa, 0x9, - 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x28, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x5f, 0x69, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x9, - 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x44, - 0x69, 0x76, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x69, 0x64, 0x29, 0x3b, 0xa, - 0x9, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, - 0x20, 0x7b, 0xa, 0x9, 0x9, 0x6c, 0x65, 0x74, 0x20, 0x6e, - 0x65, 0x77, 0x44, 0x69, 0x76, 0x20, 0x3d, 0x20, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x28, 0x22, 0x64, 0x69, 0x76, 0x22, 0x29, 0x3b, 0xa, 0x9, - 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x64, - 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x69, - 0x64, 0x3b, 0xa, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, - 0x76, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3b, 0xa, 0x9, - 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, - 0x68, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x2c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, - 0x9, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x28, 0x29, 0x3b, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x4b, - 0x65, 0x79, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, - 0xa, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, - 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x74, 0x6f, - 0x75, 0x63, 0x68, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, - 0x9, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x28, 0x29, 0x3b, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x4b, - 0x65, 0x79, 0x73, 0x28, 0x5b, 0x5d, 0x29, 0x3b, 0x3b, 0x20, - 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, - 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, - 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, 0x77, 0x6e, - 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, - 0x73, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x28, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x29, - 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x6e, 0x65, - 0x77, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x75, 0x70, - 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, - 0x73, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x28, 0x5b, - 0x5d, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x44, 0x69, 0x76, 0x2e, 0x61, - 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, - 0x28, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x29, 0x3b, 0xa, - 0x9, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x69, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x6c, - 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, - 0x6f, 0x72, 0x44, 0x69, 0x76, 0x20, 0x3d, 0x20, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, - 0x64, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x69, 0x64, 0x29, 0x3b, 0xa, 0x9, 0x66, 0x6f, - 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, - 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x20, - 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, - 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, - 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x64, 0x69, 0x76, - 0x22, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, - 0x69, 0x76, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x69, 0x6e, - 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x64, + 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x73, 0x65, 0x6e, 0x64, + 0x4b, 0x65, 0x79, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, - 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, - 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x3b, 0xa, 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, - 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x22, 0x6f, 0x66, 0x66, 0x22, 0x3b, 0xa, - 0x9, 0x9, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, - 0x72, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x75, 0x70, 0x22, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, + 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x73, 0x65, 0x6e, 0x64, + 0x4b, 0x65, 0x79, 0x73, 0x28, 0x5b, 0x5d, 0x29, 0x3b, 0x20, + 0x7d, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x29, 0x3b, 0xa, 0x9, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4c, 0x45, 0x44, - 0x73, 0x28, 0x63, 0x75, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x6c, 0x65, 0x74, 0x20, - 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x64, 0x73, 0x20, 0x3d, 0x20, - 0x63, 0x75, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, - 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, 0x2c, 0x22, 0x29, - 0x3b, 0xa, 0x9, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, - 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, - 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, - 0x20, 0x7b, 0xa, 0x9, 0x9, 0x6c, 0x65, 0x74, 0x20, 0x69, - 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, - 0x69, 0x76, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x69, - 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x69, - 0x64, 0x29, 0x3b, 0xa, 0x9, 0x9, 0x69, 0x66, 0x20, 0x28, - 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x64, 0x73, 0x2e, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x64, - 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, - 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x69, 0x6e, 0x64, - 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x76, - 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x22, 0x6f, 0x6e, 0x22, 0x3b, 0xa, 0x9, - 0x9, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x28, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, + 0x29, 0x20, 0x7b, 0xa, 0x9, 0x6c, 0x65, 0x74, 0x20, 0x69, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x69, + 0x76, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, + 0x29, 0x3b, 0xa, 0x9, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x6c, 0x65, 0x74, 0x20, + 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x20, 0x3d, 0x20, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x22, 0x64, 0x69, 0x76, 0x22, 0x29, 0x3b, 0xa, + 0x9, 0x9, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x69, + 0x64, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x3b, 0xa, 0x9, 0x9, + 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, + 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3b, 0xa, 0x9, 0x9, + 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, + 0x6f, 0x66, 0x66, 0x22, 0x3b, 0xa, 0x9, 0x9, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x69, 0x76, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x28, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x76, 0x29, + 0x3b, 0xa, 0x9, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4c, 0x45, 0x44, 0x73, 0x28, 0x63, 0x75, + 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, 0x7b, + 0xa, 0x9, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, + 0x65, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x73, 0x70, 0x6c, 0x69, + 0x74, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x3b, 0xa, 0x9, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x9, + 0x9, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x76, 0x20, 0x3d, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x79, 0x49, 0x64, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0xa, + 0x9, 0x9, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x6e, 0x5f, 0x6c, + 0x65, 0x64, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x73, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, - 0x6f, 0x66, 0x66, 0x22, 0x3b, 0xa, 0x9, 0x9, 0x7d, 0xa, - 0x9, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x3c, 0x2f, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x3e, 0xa, 0xa, 0x3c, 0x2f, 0x68, - 0x65, 0x61, 0x64, 0x3e, 0xa, 0xa, 0x3c, 0x62, 0x6f, 0x64, - 0x79, 0x3e, 0xa, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0xa, 0x9, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6b, 0x65, 0x79, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x3e, - 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, - 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, - 0x72, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x4d, 0x6f, - 0x75, 0x73, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x73, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, - 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, - 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x22, 0x3e, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0xa, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, - 0xa, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x3e, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x3c, 0x64, 0x69, 0x76, - 0x3e, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x22, - 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, - 0x66, 0x3d, 0x22, 0x77, 0x69, 0x66, 0x69, 0x2e, 0x73, 0x68, - 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x20, 0x57, 0x69, 0x2d, 0x46, 0x69, - 0x3c, 0x2f, 0x61, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, - 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x61, 0x20, 0x68, 0x72, - 0x65, 0x66, 0x3d, 0x22, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, - 0x2e, 0x63, 0x67, 0x69, 0x22, 0x3e, 0x52, 0x65, 0x62, 0x6f, - 0x6f, 0x74, 0x3c, 0x2f, 0x61, 0x3e, 0xa, 0x9, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0xa, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0xa, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, - 0xa, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, -}; + 0x6f, 0x6e, 0x22, 0x3b, 0xa, 0x9, 0x9, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x9, 0x9, 0x9, 0x69, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, + 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6f, 0x66, 0x66, 0x22, + 0x3b, 0xa, 0x9, 0x9, 0x7d, 0xa, 0x9, 0x7d, 0xa, 0x7d, + 0xa, 0xa, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0xa, 0xa, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0xa, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x22, 0x3e, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, + 0x9, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3e, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, + 0x64, 0x69, 0x76, 0x3e, 0x4d, 0x6f, 0x75, 0x73, 0x65, 0x20, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x3a, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0xa, 0xa, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x22, 0x3e, 0xa, 0x9, 0x9, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x77, + 0x69, 0x66, 0x69, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, + 0x3e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x20, 0x57, 0x69, 0x2d, 0x46, 0x69, 0x3c, 0x2f, 0x61, 0x3e, + 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x22, 0x3e, 0xa, 0x9, + 0x9, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x67, 0x69, + 0x22, 0x3e, 0x52, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x3c, 0x2f, + 0x61, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0xa, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0xa, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, }; static const unsigned char data_success_html[] = { /* /success.html */ @@ -1602,9 +1568,7 @@ static const unsigned char data_success_html[] = { const struct fsdata_file file_fsdata_c[] = {{NULL, data_fsdata_c, data_fsdata_c + 10, sizeof(data_fsdata_c) - 10, FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT}}; -const struct fsdata_file file_indicators_shtml[] = {{file_fsdata_c, data_indicators_shtml, data_indicators_shtml + 18, sizeof(data_indicators_shtml) - 18, FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT}}; - -const struct fsdata_file file_wifi_shtml[] = {{file_indicators_shtml, data_wifi_shtml, data_wifi_shtml + 12, sizeof(data_wifi_shtml) - 12, FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT}}; +const struct fsdata_file file_wifi_shtml[] = {{file_fsdata_c, data_wifi_shtml, data_wifi_shtml + 12, sizeof(data_wifi_shtml) - 12, FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT}}; const struct fsdata_file file_index_html[] = {{file_wifi_shtml, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12, FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT}}; @@ -1612,4 +1576,4 @@ const struct fsdata_file file_success_html[] = {{file_index_html, data_success_h #define FS_ROOT file_success_html -#define FS_NUMFILES 5 +#define FS_NUMFILES 4 diff --git a/parse_keys.c b/parse_keys.c index c7b0369..f5c78ff 100644 --- a/parse_keys.c +++ b/parse_keys.c @@ -50,8 +50,8 @@ void parse_key_list(char * keys) { } void parse_mouse_list (char * keys) { - static unsigned char mouse_report[3]; - memset(mouse_report, 0x00, 3); + static unsigned char mouse_report[5]; + memset(mouse_report, 0x00, 5); // Javascript sends the list as comma delimited, so split into individual // keys by splitting at commas @@ -75,11 +75,11 @@ void parse_mouse_list (char * keys) { // print resulting HID boot mouse report to CDC for debugging printf("Mouse report: "); - for(int i=0; i<3; i++){ + for(int i=0; i<5; i++){ printf("%02X ",mouse_report[i]); } printf("\n"); - tud_hid_report(REPORT_ID_MOUSE, mouse_report, 3); + tud_hid_report(REPORT_ID_MOUSE, mouse_report, 5); } // take a single Javascript key code and convert it to USB HID scancode diff --git a/server.c b/server.c index d43d598..12f4327 100644 --- a/server.c +++ b/server.c @@ -66,7 +66,6 @@ const char * ip_parts[] = { #define NPARTS ( sizeof( ip_parts )/ sizeof(ip_parts[0]) ) static const tCGI cgi_handlers[] = { - { "/sendkeys.cgi", sendkeys_cgi }, { "/reboot.cgi", reboot_cgi }, }; @@ -133,7 +132,7 @@ void run_http_server() { // start the HTTP web server for keyboard input and config page httpd_init(); - http_set_cgi_handlers(cgi_handlers, 2); + http_set_cgi_handlers(cgi_handlers, 1); for (size_t i = 0; i < LWIP_ARRAYSIZE(ssi_tags); i++) { LWIP_ASSERT("tag too long for LWIP_HTTPD_MAX_TAG_NAME_LEN", strlen(ssi_tags[i]) <= LWIP_HTTPD_MAX_TAG_NAME_LEN); @@ -189,21 +188,6 @@ void run_http_server() { } } -// lwIP cgi handler for GET requests to sendkeys.cgi -const char * sendkeys_cgi (int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) { - for (int i=0; i < iNumParams; i++) { - // search GET parameters for keys and forward for processing to USB - if (strcmp(pcParam[i], "keys") == 0 ) { - parse_key_list(pcValue[i]); - } - } - - lastActive= get_absolute_time(); - - // send return page - return "/success.html"; -} - // lwIP cgi handler for reboots initiated from the web const char * reboot_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) { // turn on reboot flag to prevent watchdog from updating @@ -469,6 +453,8 @@ const void ws_receive_handler(uint8_t *data, uint16_t len) { } else if (strncmp(data, "M: ", 3) == 0) { parse_mouse_list(&data[3]); } + + lastActive= get_absolute_time(); } // save keyboard's LED indicator status to memory diff --git a/server.h b/server.h index 45ed5c8..feec51d 100644 --- a/server.h +++ b/server.h @@ -23,7 +23,6 @@ typedef struct { } net_config; void run_http_server(); -const char * sendkeys_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const char * reboot_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); uint16_t __time_critical_func(ssi_handler)(int iIndex, char *pcInsert, int iInsertLen); void set_indicator(uint8_t const* buffer); diff --git a/websocket.c b/websocket.c index b8671cc..1980a7e 100644 --- a/websocket.c +++ b/websocket.c @@ -120,6 +120,7 @@ static err_t ws_accept(void *arg, struct altcp_pcb *pcb, err_t err) { // register callbacks for tcp events altcp_recv(pcb, ws_recv); + altcp_sent(pcb, ws_sent); altcp_poll(pcb, ws_poll, WS_POLL_INTERVAL); altcp_err(pcb, ws_err); @@ -166,6 +167,24 @@ static err_t ws_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err return ERR_OK; } +// called when data has been sent over the websocket +static err_t ws_sent(void *arg, struct altcp_pcb *pcb, uint16_t len) { + struct ws_state *wss = (struct ws_state *)arg; + + LWIP_DEBUGF(WS_DEBUG | LWIP_DBG_TRACE, ("ws_sent %p\n", (void*) pcb)); + + LWIP_UNUSED_ARG(len); + + if (wss == NULL) { + return ERR_OK; + } + + wss->retries = 0; + + return ERR_OK; +} + +// called when there is a websocket error static void ws_err (void *arg, err_t err) { struct ws_state *wss = (struct ws_state *) arg; LWIP_UNUSED_ARG(err); @@ -192,6 +211,7 @@ static err_t ws_close_or_abort_conn(struct altcp_pcb *pcb, struct ws_state *wss, // clear callbacks altcp_arg(pcb, NULL); altcp_recv(pcb, NULL); + altcp_sent(pcb, NULL); altcp_poll(pcb, NULL, 0); altcp_err(pcb, NULL); @@ -353,7 +373,6 @@ static err_t ws_send(struct ws_state *wss, uint8_t *data, uint16_t len) { err = altcp_write(wss->pcb, buf, len+2, TCP_WRITE_FLAG_COPY); if (err == ERR_OK) { altcp_output(wss->pcb); - wss->retries = 0; } return err; diff --git a/websocket.h b/websocket.h index 807e770..17cca0d 100644 --- a/websocket.h +++ b/websocket.h @@ -27,6 +27,7 @@ void ws_server_init(void); static void ws_server_init_pcb( struct altcp_pcb *pcb, uint16_t port); static err_t ws_accept(void *arg, struct altcp_pcb *pcb, err_t err); static err_t ws_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err); +static err_t ws_sent(void *arg, struct altcp_pcb *pcb, uint16_t len); static void ws_err (void *arg, err_t err); static err_t ws_close_conn(struct altcp_pcb *pcb, struct ws_state *wss); static err_t ws_close_or_abort_conn(struct altcp_pcb *pcb, struct ws_state *wss, uint8_t abort_conn);