From 3cc804d4a3690f5086ad671e817536995a1785ac Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 22 Apr 2020 22:38:28 +1200 Subject: [PATCH] Per-key LED effects trial. Better LED write --- README.md | 2 +- src/aura.rs | 256 +++++++++++++++++++++++++++ src/core.rs | 46 +++-- src/laptops/gx502gw.rs | 203 +++++++++++++++++++++ src/laptops/mod.rs | 45 +++++ wireshark_data/per_key_raw_bytes | 204 +++++++++++---------- wireshark_data/per_key_raw_bytes.ods | Bin 0 -> 21643 bytes 7 files changed, 641 insertions(+), 115 deletions(-) create mode 100644 src/laptops/gx502gw.rs create mode 100644 src/laptops/mod.rs create mode 100644 wireshark_data/per_key_raw_bytes.ods diff --git a/README.md b/README.md index c570434c..03ada60f 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Currently if no options are supplied for the CLI mode selection then a default i ## Implemented - [X] Setting/modifying built-in LED modes -- [ ] Per-key LED setting +- [X] Per-key LED setting (PARTIALLY COMPLETE) - [ ] Fancy LED modes (custom programs) - [X] Daemon mode - [X] Saving settings for reload diff --git a/src/aura.rs b/src/aura.rs index fe9981d9..370d2301 100644 --- a/src/aura.rs +++ b/src/aura.rs @@ -319,3 +319,259 @@ impl From for u8 { } } } + +#[derive(Clone)] +pub struct KeyColourArray([[u8; 64]; 10]); +impl KeyColourArray { + pub fn new() -> Self { + let mut set = [[0u8; 64]; 10]; + for (count, row) in set.iter_mut().enumerate() { + row[0] = 0x5d; // Report ID + row[1] = 0xbc; // Mode = custom??, 0xb3 is builtin + row[2] = 0x00; + row[3] = 0x01; // ?? + row[4] = 0x01; // ??, 4,5,6 are normally RGB for builtin mode colours + row[5] = 0x01; // ?? + row[6] = (count as u8) << 4; // Key group + row[7] = 0x10; // 0b00010000 addressing? flips for group a0 + if count == 9 { + row[7] = 0x08; // 0b00001000 + } + row[8] = 0x00; + } + KeyColourArray(set) + } + + pub fn set(&mut self, key: Key, r: u8, g: u8, b: u8) { + let (rr, gg, bb) = self.key(key); + *rr = r; + *gg = g; + *bb = b; + } + + pub fn key(&mut self, key: Key) -> (&mut u8, &mut u8, &mut u8) { + // Tuples are indexes in to array + let (row, col) = match key { + Key::VolUp => (0, 15), + Key::VolDown => (0, 18), + Key::MicMute => (0, 21), + Key::ROG => (0, 24), + // + Key::Esc => (1, 24), + Key::F1 => (1, 30), + Key::F2 => (1, 33), + Key::F3 => (1, 36), + Key::F4 => (1, 39), + Key::F5 => (1, 45), + Key::F6 => (1, 48), + Key::F7 => (1, 51), + Key::F8 => (1, 54), + // + Key::F9 => (2, 12), + Key::F10 => (2, 15), + Key::F11 => (2, 18), + Key::F12 => (2, 21), + Key::Del => (2, 24), + Key::Tilde => (2, 39), + Key::N1 => (2, 42), + Key::N2 => (2, 45), + Key::N3 => (2, 48), + Key::N4 => (2, 51), + Key::N5 => (2, 54), + // + Key::N6 => (3, 9), + Key::N7 => (3, 12), + Key::N8 => (3, 15), + Key::N9 => (3, 18), + Key::N0 => (3, 21), + Key::Hyphen => (3, 24), + Key::Equals => (3, 27), + Key::BkSpc1 => (3, 30), + Key::BkSpc2 => (3, 33), + Key::BkSpc3 => (3, 36), + Key::Home => (3, 39), + Key::Tab => (3, 54), + // + Key::Q => (4, 9), + Key::W => (4, 12), + Key::E => (4, 15), + Key::R => (4, 18), + Key::T => (4, 21), + Key::Y => (4, 24), + Key::U => (4, 27), + Key::I => (4, 30), + Key::O => (4, 33), + Key::P => (4, 36), + Key::LBracket => (4, 39), + Key::RBracket => (4, 42), + Key::BackSlash => (4, 45), + Key::PgUp => (4, 54), + // + Key::Caps => (5, 21), + Key::A => (5, 24), + Key::S => (5, 27), + Key::D => (5, 30), + Key::F => (5, 33), + Key::G => (5, 36), + Key::H => (5, 39), + Key::J => (5, 42), + Key::K => (5, 45), + Key::L => (5, 48), + Key::SemiColon => (5, 51), + Key::Quote => (5, 54), + // + Key::Ret1 => (6, 12), + Key::Ret2 => (6, 15), + Key::Ret3 => (6, 18), + Key::PgDn => (6, 21), + Key::LShift => (6, 36), + Key::Z => (6, 42), + Key::X => (6, 45), + Key::C => (6, 48), + Key::V => (6, 51), + Key::B => (6, 54), + // + Key::N => (7, 9), + Key::M => (7, 12), + Key::Comma => (7, 15), + Key::Period => (7, 18), + Key::FwdSlash => (7, 21), + Key::Rshift1 => (7, 27), + Key::Rshift2 => (7, 30), + Key::Rshift3 => (7, 33), + Key::End => (7, 36), + Key::LCtrl => (7, 51), + Key::LFn => (7, 54), + // + Key::Meta => (8, 9), + Key::LAlt => (8, 12), + Key::Space1 => (8, 15), + Key::Space2 => (8, 18), + Key::Space3 => (8, 21), + Key::Space4 => (8, 24), + Key::RAlt => (8, 30), + Key::PrtSc => (8, 33), + Key::RCtrl => (8, 36), + Key::Up => (8, 42), + Key::RFn => (8, 51), + // + Key::Left => (9, 54), + + Key::Down => (10, 9), + Key::Right => (10, 12), + //_ => (0, 24), + }; + // LOLOLOLOLOLOLOL! Look it's safe okay + unsafe { + ( + &mut *(&mut self.0[row][col] as *mut u8), + &mut *(&mut self.0[row][col + 1] as *mut u8), + &mut *(&mut self.0[row][col + 2] as *mut u8), + ) + } + } + + pub fn get(&self) -> &[[u8; 64]; 10] { + &self.0 + } +} + +pub enum Key { + VolUp, + VolDown, + MicMute, + ROG, + Esc, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + Del, + Tilde, + N1, + N2, + N3, + N4, + N5, + N6, + N7, + N8, + N9, + N0, + Hyphen, + Equals, + BkSpc1, + BkSpc2, + BkSpc3, + Home, + Tab, + Q, + W, + E, + R, + T, + Y, + U, + I, + O, + P, + LBracket, + RBracket, + BackSlash, + PgUp, + Caps, + A, + S, + D, + F, + G, + H, + J, + K, + L, + SemiColon, + Quote, + Ret1, + Ret2, + Ret3, + PgDn, + LShift, + Z, + X, + C, + V, + B, + N, + M, + Comma, + Period, + FwdSlash, + Rshift1, + Rshift2, + Rshift3, + End, + LCtrl, + LFn, + Meta, + LAlt, + Space1, + Space2, + Space3, + Space4, + RAlt, + PrtSc, + RCtrl, + Up, + Down, + Left, + Right, + RFn, +} diff --git a/src/core.rs b/src/core.rs index e01ca3ff..f0108014 100644 --- a/src/core.rs +++ b/src/core.rs @@ -1,7 +1,7 @@ // Return show-stopping errors, otherwise map error to a log level use crate::{ - aura::{aura_brightness_bytes, BuiltInModeByte}, + aura::{aura_brightness_bytes, BuiltInModeByte, KeyColourArray}, config::Config, error::AuraError, laptops::*, @@ -52,15 +52,12 @@ impl RogCore { let dev_config = dev_handle.device().config_descriptor(0).unwrap(); // Interface with outputs - let mut led_interface_num = 0; - let mut keys_interface_num = 0; + let mut interface = 0; for iface in dev_config.interfaces() { for desc in iface.descriptors() { for endpoint in desc.endpoint_descriptors() { if endpoint.address() == laptop.key_endpoint() { - keys_interface_num = desc.interface_number(); - } else if endpoint.address() == laptop.led_endpoint() { - led_interface_num = desc.interface_number(); + interface = desc.interface_number(); break; } } @@ -69,13 +66,13 @@ impl RogCore { dev_handle.set_auto_detach_kernel_driver(true).unwrap(); dev_handle - .claim_interface(keys_interface_num) + .claim_interface(interface) .map_err(|err| AuraError::UsbError(err))?; Ok(RogCore { handle: dev_handle, initialised: false, - led_endpoint: led_interface_num, + led_endpoint: laptop.led_endpoint(), keys_endpoint: laptop.key_endpoint(), config: Config::default().read(), virt_keys: VirtKeys::new(), @@ -101,16 +98,12 @@ impl RogCore { fn aura_write(&mut self, message: &[u8]) -> Result<(), AuraError> { self.handle - .write_control(0x21, 0x09, 0x035D, 0, message, Duration::new(0, 5)) - .map_err(|err| AuraError::UsbError(err))?; + .write_interrupt(self.led_endpoint, message, Duration::from_micros(1)) + .unwrap(); Ok(()) } fn aura_write_messages(&mut self, messages: &[&[u8]]) -> Result<(), AuraError> { - self.handle - .claim_interface(self.led_endpoint) - .map_err(|err| AuraError::UsbError(err))?; - if !self.initialised { self.aura_write(&LED_INIT1)?; self.aura_write(LED_INIT2.as_bytes())?; @@ -126,10 +119,29 @@ impl RogCore { } // Changes won't persist unless apply is set self.aura_write(&LED_APPLY)?; + Ok(()) + } - self.handle - .release_interface(self.led_endpoint) - .map_err(|err| AuraError::UsbError(err))?; + /// Initialise and clear the keyboard for custom effects + pub fn aura_effect_init(&mut self) -> Result<(), AuraError> { + let mut init = [0u8; 64]; + init[0] = 0x5d; // Report ID + init[1] = 0xbc; // Mode = custom??, 0xb3 is builtin + self.aura_write(&init)?; + self.initialised = true; + + Ok(()) + } + + /// Write an effect block + /// + /// `aura_effect_init` must be called any effect routine, and called only once. + pub fn aura_write_effect(&mut self, effect: &[KeyColourArray]) -> Result<(), AuraError> { + for key_colours in effect { + for row in key_colours.get() { + self.aura_write(row)?; + } + } Ok(()) } diff --git a/src/laptops/gx502gw.rs b/src/laptops/gx502gw.rs new file mode 100644 index 00000000..3d393aac --- /dev/null +++ b/src/laptops/gx502gw.rs @@ -0,0 +1,203 @@ +use crate::aura::{BuiltInModeByte, Key, KeyColourArray}; +use crate::core::{Backlight, RogCore}; +use crate::error::AuraError; +use crate::virt_device::ConsumerKeys; +//use keycode::{KeyMap, KeyMappingId, KeyState, KeyboardState}; +use super::Laptop; +use log::info; + +pub(super) struct LaptopGX502GW { + usb_vendor: u16, + usb_product: u16, + board_name: &'static str, + prod_family: &'static str, + report_filter_bytes: [u8; 2], + min_led_bright: u8, + max_led_bright: u8, + led_endpoint: u8, + key_endpoint: u8, + supported_modes: [BuiltInModeByte; 12], + backlight: Backlight, + per_key_led: Vec, +} + +impl LaptopGX502GW { + pub(super) fn new() -> Self { + // Setting up a sample effect to run when ROG pressed + let mut per_key_led = Vec::new(); + let mut key_colours = KeyColourArray::new(); + key_colours.set(Key::ROG, 255, 0, 0); + key_colours.set(Key::L, 255, 0, 0); + key_colours.set(Key::I, 255, 0, 0); + key_colours.set(Key::N, 255, 0, 0); + key_colours.set(Key::U, 255, 0, 0); + key_colours.set(Key::X, 255, 0, 0); + per_key_led.push(key_colours.clone()); + + for _ in 0..3 { + for _ in 0..50 { + *key_colours.key(Key::ROG).0 -= 5; + *key_colours.key(Key::L).0 -= 5; + *key_colours.key(Key::I).0 -= 5; + *key_colours.key(Key::N).0 -= 5; + *key_colours.key(Key::U).0 -= 5; + *key_colours.key(Key::X).0 -= 5; + per_key_led.push(key_colours.clone()); + } + for _ in 0..50 { + *key_colours.key(Key::ROG).0 += 5; + *key_colours.key(Key::L).0 += 5; + *key_colours.key(Key::I).0 += 5; + *key_colours.key(Key::N).0 += 5; + *key_colours.key(Key::U).0 += 5; + *key_colours.key(Key::X).0 += 5; + per_key_led.push(key_colours.clone()); + } + } + + // Find backlight + LaptopGX502GW { + usb_vendor: 0x0B05, + usb_product: 0x1866, + // from `cat /sys/class/dmi/id/board_name` + board_name: "GX502GW", + // from `cat /sys/class/dmi/id/product_family` + prod_family: "Zephyrus S", + report_filter_bytes: [0x5a, 0x02], + min_led_bright: 0x00, + max_led_bright: 0x03, + //from `lsusb -vd 0b05:1866` + led_endpoint: 0x04, + //from `lsusb -vd 0b05:1866` + key_endpoint: 0x83, + supported_modes: [ + BuiltInModeByte::Stable, + BuiltInModeByte::Breathe, + BuiltInModeByte::Cycle, + BuiltInModeByte::Rainbow, + BuiltInModeByte::Rain, + BuiltInModeByte::Random, + BuiltInModeByte::Highlight, + BuiltInModeByte::Laser, + BuiltInModeByte::Ripple, + BuiltInModeByte::Pulse, + BuiltInModeByte::ThinZoomy, + BuiltInModeByte::WideZoomy, + ], + backlight: Backlight::new("intel_backlight").unwrap(), + per_key_led, + } + } +} + +impl LaptopGX502GW { + fn do_keypress_actions(&self, rogcore: &mut RogCore) -> Result<(), AuraError> { + if let Some(key_buf) = rogcore.poll_keyboard(&self.report_filter_bytes) { + match GX502GWKeys::from(key_buf[1]) { + GX502GWKeys::LedBrightUp => { + rogcore.aura_bright_inc(&self.supported_modes, self.max_led_bright)?; + } + GX502GWKeys::LedBrightDown => { + rogcore.aura_bright_dec(&self.supported_modes, self.min_led_bright)?; + } + GX502GWKeys::AuraNext => rogcore.aura_mode_next(&self.supported_modes)?, + GX502GWKeys::AuraPrevious => rogcore.aura_mode_prev(&self.supported_modes)?, + GX502GWKeys::ScreenBrightUp => self.backlight.step_up(), + GX502GWKeys::ScreenBrightDown => self.backlight.step_down(), + GX502GWKeys::Sleep => rogcore.suspend_with_systemd(), + GX502GWKeys::AirplaneMode => rogcore.toggle_airplane_mode(), + GX502GWKeys::MicToggle => {} + GX502GWKeys::Fan => {} + GX502GWKeys::ScreenToggle => { + rogcore.virt_keys().press(ConsumerKeys::BacklightTog.into()); + } + GX502GWKeys::TouchPadToggle => { + let mut key = [0u8; 32]; + key[0] = 0x01; + key[3] = 0x070; + rogcore.virt_keys().press(key); + } + GX502GWKeys::Rog => { + rogcore.aura_effect_init()?; + rogcore.aura_write_effect(&self.per_key_led)?; + // let mut key = [0u8; 32]; + // key[0] = 0x01; + // key[3] = 0x68; // XF86Tools? F13 + // rogcore.virt_keys().press(key); + } + GX502GWKeys::None => { + if key_buf[0] != 0x5A { + info!("Unmapped key, attempt passthrough: {:X?}", &key_buf[1]); + rogcore.virt_keys().press(key_buf); + } + } + } + } + Ok(()) + } +} + +impl Laptop for LaptopGX502GW { + fn run(&self, rogcore: &mut RogCore) -> Result<(), AuraError> { + self.do_keypress_actions(rogcore) + } + fn led_endpoint(&self) -> u8 { + self.led_endpoint + } + fn key_endpoint(&self) -> u8 { + self.key_endpoint + } + fn usb_vendor(&self) -> u16 { + self.usb_vendor + } + fn usb_product(&self) -> u16 { + self.usb_product + } + fn supported_modes(&self) -> &[BuiltInModeByte] { + &self.supported_modes + } + fn board_name(&self) -> &str { + &self.board_name + } + fn prod_family(&self) -> &str { + &self.prod_family + } +} + +enum GX502GWKeys { + Rog = 0x38, + MicToggle = 0x7C, + Fan = 0xAE, + ScreenToggle = 0x35, + ScreenBrightDown = 0x10, + ScreenBrightUp = 0x20, + TouchPadToggle = 0x6b, + Sleep = 0x6C, + AirplaneMode = 0x88, + LedBrightUp = 0xC4, + LedBrightDown = 0xC5, + AuraPrevious = 0xB2, + AuraNext = 0xB3, + None, +} + +impl From for GX502GWKeys { + fn from(byte: u8) -> Self { + match byte { + 0x38 => GX502GWKeys::Rog, + 0x7C => GX502GWKeys::MicToggle, + 0xAE => GX502GWKeys::Fan, + 0x35 => GX502GWKeys::ScreenToggle, + 0x10 => GX502GWKeys::ScreenBrightDown, + 0x20 => GX502GWKeys::ScreenBrightUp, + 0x6b => GX502GWKeys::TouchPadToggle, + 0x6C => GX502GWKeys::Sleep, + 0x88 => GX502GWKeys::AirplaneMode, + 0xC4 => GX502GWKeys::LedBrightUp, + 0xC5 => GX502GWKeys::LedBrightDown, + 0xB2 => GX502GWKeys::AuraPrevious, + 0xB3 => GX502GWKeys::AuraNext, + _ => GX502GWKeys::None, + } + } +} diff --git a/src/laptops/mod.rs b/src/laptops/mod.rs new file mode 100644 index 00000000..18e111b1 --- /dev/null +++ b/src/laptops/mod.rs @@ -0,0 +1,45 @@ +use crate::aura::BuiltInModeByte; +use crate::core::RogCore; +use crate::error::AuraError; +//use keycode::{KeyMap, KeyMappingId, KeyState, KeyboardState}; +use log::info; + +mod gx502gw; +use gx502gw::LaptopGX502GW; + +pub(crate) fn match_laptop() -> Box { + let dmi = sysfs_class::DmiId::default(); + let board_name = dmi.board_name().unwrap(); + match board_name.as_str() { + // The hell does it have a \n for anyway? + "GX502GW\n" => { + info!("Found GX502GW"); + Box::new(LaptopGX502GW::new()) + } + _ => { + panic!("could not match laptop"); + } + } +} + +/// All laptop models should implement this trait. The role of a `Laptop` is to +/// "drive" the `RogCore`. +/// +/// `do_hotkey_action` is passed the byte that a hotkey emits, and is expected to +/// perform whichever action matches that. For now the only key bytes passed in are +/// the ones which match `byte[0] == hotkey_group_byte`. On the GX502GW the keyboard +/// has 3 explicit groups: main, vol+media, and the ones that the Linux kernel doesn't +/// map. +/// +/// If using the `keycode` crate to build keyboard input, the report must be prefixed +/// with the report ID (usually `0x01` for the virtual keyboard). +pub(crate) trait Laptop { + fn board_name(&self) -> &str; + fn prod_family(&self) -> &str; + fn run(&self, core: &mut RogCore) -> Result<(), AuraError>; + fn led_endpoint(&self) -> u8; + fn key_endpoint(&self) -> u8; + fn usb_vendor(&self) -> u16; + fn usb_product(&self) -> u16; + fn supported_modes(&self) -> &[BuiltInModeByte]; +} diff --git a/wireshark_data/per_key_raw_bytes b/wireshark_data/per_key_raw_bytes index 8b99e534..7949d6ca 100755 --- a/wireshark_data/per_key_raw_bytes +++ b/wireshark_data/per_key_raw_bytes @@ -1,97 +1,107 @@ -VOL_DN = 5dbc00010101001000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -VOL_UP = 5dbc00010101001000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - MIC = 5dbc00010101001000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - ROG = 5dbc00010101001000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - ESC = 5dbc00010101101000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - F1 = 5dbc00010101101000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 - F2 = 5dbc00010101101000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - F3 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - F4 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - F5 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - F6 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000 - F7 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - F8 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - F9 = 5dbc00010101201000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - F10 = 5dbc00010101201000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - F11 = 5dbc00010101201000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - F12 = 5dbc00010101201000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - Del = 5dbc00010101201000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - ~ = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - 1 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - 2 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - 3 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000 - 4 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - 5 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - 6 = 5dbc00010101301000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 7 = 5dbc00010101301000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 8 = 5dbc00010101301000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 9 = 5dbc00010101301000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 0 = 5dbc00010101301000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - - = 5dbc00010101301000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - = = 5dbc00010101301000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000 -BkSpc1 = 5dbc00010101301000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 -BkSpc2 = 5dbc00010101301000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 -BkSpc3 = 5dbc00010101301000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - Home = 5dbc00010101301000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - Tab = 5dbc00010101301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - Q = 5dbc00010101401000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - W = 5dbc00010101401000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - E = 5dbc00010101401000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - R = 5dbc00010101401000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - T = 5dbc00010101401000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - Y = 5dbc00010101401000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - U = 5dbc00010101401000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000 - I = 5dbc00010101401000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 - O = 5dbc00010101401000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - P = 5dbc00010101401000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - [ = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - ] = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - \ = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - PgUp = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - Caps = 5dbc00010101501000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - A = 5dbc00010101501000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - S = 5dbc00010101501000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000 - D = 5dbc00010101501000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 - F = 5dbc00010101501000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - G = 5dbc00010101501000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - H = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - J = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - K = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - L = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000 - ; = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - ' = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 -Enter1 = 5dbc00010101601000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Enter2 = 5dbc00010101601000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Enter3 = 5dbc00010101601000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - PgDn = 5dbc00010101601000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 -LShfit = 5dbc00010101601000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - Z = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - X = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - C = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000 - V = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - B = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - N = 5dbc00010101701000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - M = 5dbc00010101701000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - , = 5dbc00010101701000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - . = 5dbc00010101701000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - / = 5dbc00010101701000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 -Rshft1 = 5dbc00010101701000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000 -Rshft1 = 5dbc00010101701000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 -Rshft1 = 5dbc00010101701000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - End = 5dbc00010101701000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - Ctrl = 5dbc00010101701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - LFn = 5dbc00010101701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - Meta = 5dbc00010101801000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - LAlt = 5dbc00010101801000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Space1 = 5dbc00010101801000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Space2 = 5dbc00010101801000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Space3 = 5dbc00010101801000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 -Space4 = 5dbc00010101801000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - RAlt = 5dbc00010101801000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 -PrtScn = 5dbc00010101801000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - RCtrl = 5dbc00010101801000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - Up = 5dbc00010101801000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - RFn = 5dbc00010101801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - Left = 5dbc00010101901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - Down = 5dbc00010101a00800ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - Right = 5dbc00010101a00800000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +VOL_DN = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +VOL_UP = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + MIC = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + ROG = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + + ESC = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F1 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F2 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F3 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F4 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F5 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F6 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00, + F7 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + F8 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + F9 = 5d,bc,00,01,01,01,20,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F10 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F11 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F12 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Del = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + ~ = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 1 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 2 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 3 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00, + 4 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + 5 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + 6 = 5d,bc,00,01,01,01,30,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 7 = 5d,bc,00,01,01,01,30,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 8 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 9 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 0 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + - = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + = = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +BkSpc1 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +BkSpc2 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +BkSpc3 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Home = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Tab = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + Q = 5d,bc,00,01,01,01,40,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + W = 5d,bc,00,01,01,01,40,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + E = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + R = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + T = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Y = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + U = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + I = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + O = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + P = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + [ = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + ] = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + \ = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + PgUp = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + Caps = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + A = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + S = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + D = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + G = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + H = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + J = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + K = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + L = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00, + ; = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + ' = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + +Enter1 = 5d,bc,00,01,01,01,60,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Enter2 = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Enter3 = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + PgDn = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +LShfit = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Z = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + X = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + C = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00, + V = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + B = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + N = 5d,bc,00,01,01,01,70,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + M = 5d,bc,00,01,01,01,70,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + , = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + . = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + / = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + End = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Ctrl = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + LFn = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + Meta = 5d,bc,00,01,01,01,80,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + LAlt = 5d,bc,00,01,01,01,80,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Space1 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Space2 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Space3 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Space4 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + RAlt = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +PrtScn = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + RCtrl = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Up = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + RFn = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + + Left = 5d,bc,00,01,01,01,90,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + Down = 5d,bc,00,01,01,01,a0,08,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Right = 5d,bc,00,01,01,01,a0,08,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, \ No newline at end of file diff --git a/wireshark_data/per_key_raw_bytes.ods b/wireshark_data/per_key_raw_bytes.ods new file mode 100644 index 0000000000000000000000000000000000000000..3d905f2fabc6dff721dec192a6fe6b567bb017c7 GIT binary patch literal 21643 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 literal 0 HcmV?d00001