TriggerAction GPIO support introduced

This commit is contained in:
MaMe82 2018-11-07 23:50:50 +01:00
parent 1ad1c35318
commit 5c0d8310ed
14 changed files with 735 additions and 1510 deletions

View File

@ -1,50 +0,0 @@
// +build linux,arm
package main
import (
"github.com/mame82/P4wnP1_go/service"
"log"
pb "github.com/mame82/P4wnP1_go/proto"
"fmt"
"time"
)
func main() {
ap_settings := &pb.WiFiSettings{
Mode: pb.WiFiSettings_AP,
AuthMode: pb.WiFiSettings_WPA2_PSK,
Disabled: false,
Reg: "US",
ApChannel: 6,
ApHideSsid: false,
BssCfgAP: &pb.BSSCfg{
SSID: "P4wnP1",
PSK: "MaMe82-P4wnP1",
},
DisableNexmon: true,
BssCfgClient: nil, //not needed
}
sta_settings := &pb.WiFiSettings{
Mode: pb.WiFiSettings_STA,
AuthMode: pb.WiFiSettings_WPA2_PSK,
Disabled: false,
Reg: "DE",
BssCfgClient: &pb.BSSCfg{
SSID: "WLAN-579086",
PSK: "5824989790864470",
},
DisableNexmon: true,
BssCfgAP: nil, //not needed
}
err := service.DeployWifiSettings(ap_settings)
if err != nil { log.Println(err)}
err = service.DeployWifiSettings(sta_settings)
if err != nil { log.Println(err)}
fmt.Println("Sleeping 10 seconds")
time.Sleep(time.Second * 10)
}

View File

@ -1,719 +0,0 @@
package main
import (
"github.com/mame82/P4wnP1_go/service"
"log"
"fmt"
)
var iw_scan_out = `BSS 4e:66:41:a0:5b:35(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2437
beacon interval: 100 TUs
capability: ESS Privacy SpectrumMgmt ShortSlotTime RadioMeasure (0x1511)
signal: -43.01 dBm
last seen: 13740 ms ago
SSID: Android AP8905
Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
DS Parameter set: channel 6
TIM: DTIM Count 0 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0
Country: DE Environment: Indoor/Outdoor
Channels [1 - 13] @ 20 dBm
Power constraint: 0 dB
TPC report: TX power: 17 dBm
ERP: <no flags>
Extended supported rates: 6.0 9.0 12.0 48.0
RSN: * Version: 1
* Group cipher: CCMP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)
HT capabilities:
Capabilities: 0x1ad
RX LDPC
HT20
SM Power Save disabled
RX HT20 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 3839 bytes
No DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 4 usec (0x05)
HT RX MCS rate indexes supported: 0-15
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 6
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 1
* HT protection: no
* non-GF present: 0
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Extended capabilities: Extended Channel Switching, BSS Transition, 6
WMM: * Parameter version 1
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
BSS 5c:dc:96:b4:59:af(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2437
beacon interval: 100 TUs
capability: ESS Privacy ShortSlotTime RadioMeasure (0x1411)
signal: -38.00 dBm
last seen: 10 ms ago
SSID: WLAN-579086
Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
DS Parameter set: channel 6
Country: DE Environment: Indoor/Outdoor
Channels [1 - 13] @ 22 dBm
ERP: <no flags>
ERP D4.0: <no flags>
RSN: * Version: 1
* Group cipher: CCMP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)
Extended supported rates: 6.0 9.0 12.0 48.0
HT capabilities:
Capabilities: 0x19fe
HT20/HT40
SM Power Save disabled
RX Greenfield
RX HT20 SGI
RX HT40 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 7935 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 16 usec (0x07)
HT RX MCS rate indexes supported: 0-15, 32
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 6
* secondary channel offset: below
* STA channel width: any
* RIFS: 1
* HT protection: no
* non-GF present: 0
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Overlapping BSS scan params:
* passive dwell: 20 TUs
* active dwell: 10 TUs
* channel width trigger scan interval: 300 s
* scan passive total per channel: 200 TUs
* scan active total per channel: 20 TUs
* BSS width channel transition delay factor: 5
* OBSS Scan Activity Threshold: 0.25 %
Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* Response Type: 3 (AP)
* UUID: 7470bfaa-0621-242d-7915-13686f9ded23
* Manufacturer: ARCADYAN
* Model: DT724
* Model Number: 1.0
* Serial Number: 888
* Primary Device Type: 6-0050f204-1
* Device name: DT724
* Config methods:
* RF Bands: 0x3
* Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20
WMM: * Parameter version 1
* u-APSD
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
BSS 4e:66:41:a0:5b:35(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2462
beacon interval: 100 TUs
capability: ESS SpectrumMgmt ShortSlotTime RadioMeasure (0x1501)
signal: -35.00 dBm
last seen: 10 ms ago
SSID: AndroidAP8905
Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
DS Parameter set: channel 11
TIM: DTIM Count 0 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0
Country: DE Environment: Indoor/Outdoor
Channels [1 - 13] @ 20 dBm
Power constraint: 0 dB
TPC report: TX power: 17 dBm
ERP: <no flags>
Extended supported rates: 6.0 9.0 12.0 48.0
HT capabilities:
Capabilities: 0x1ad
RX LDPC
HT20
SM Power Save disabled
RX HT20 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 3839 bytes
No DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 4 usec (0x05)
HT RX MCS rate indexes supported: 0-15
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 11
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 1
* HT protection: no
* non-GF present: 0
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Extended capabilities: Extended Channel Switching, BSS Transition, 6
WMM: * Parameter version 1
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
BSS 88:e3:ab:9d:38:f5(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2412
beacon interval: 100 TUs
capability: ESS Privacy ShortSlotTime RadioMeasure (0x1411)
signal: -84.00 dBm
last seen: 0 ms ago
SSID: WLAN-WGF3FG
Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
DS Parameter set: channel 1
ERP: Barker_Preamble_Mode
ERP D4.0: Barker_Preamble_Mode
RSN: * Version: 1
* Group cipher: CCMP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)
Extended supported rates: 6.0 9.0 12.0 48.0
HT capabilities:
Capabilities: 0x19ac
HT20
SM Power Save disabled
RX HT20 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 7935 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT RX MCS rate indexes supported: 0-15
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 1
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 0
* HT protection: no
* non-GF present: 1
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Overlapping BSS scan params:
* passive dwell: 20 TUs
* active dwell: 10 TUs
* channel width trigger scan interval: 300 s
* scan passive total per channel: 200 TUs
* scan active total per channel: 20 TUs
* BSS width channel transition delay factor: 5
* OBSS Scan Activity Threshold: 0.25 %
Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* Response Type: 3 (AP)
* UUID: 13082394-62d2-8063-e9de-c42e3a2d1071
* Manufacturer: Broadcom
* Model: Broadcom
* Model Number: 123456
* Serial Number: 1234
* Primary Device Type: 6-0050f204-1
* Device name: BroadcomAP
* Config methods:
* RF Bands: 0x3
* Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20
WMM: * Parameter version 1
* u-APSD
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
BSS b8:bc:1b:63:33:d9(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2412
beacon interval: 100 TUs
capability: ESS Privacy ShortSlotTime RadioMeasure (0x1411)
signal: -81.00 dBm
last seen: 0 ms ago
SSID: schmidtderhit
Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
DS Parameter set: channel 1
ERP: Barker_Preamble_Mode
ERP D4.0: Barker_Preamble_Mode
RSN: * Version: 1
* Group cipher: CCMP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)
Extended supported rates: 6.0 9.0 12.0 48.0
HT capabilities:
Capabilities: 0x19ac
HT20
SM Power Save disabled
RX HT20 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 7935 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT RX MCS rate indexes supported: 0-15
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 1
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 0
* HT protection: no
* non-GF present: 1
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Overlapping BSS scan params:
* passive dwell: 20 TUs
* active dwell: 10 TUs
* channel width trigger scan interval: 300 s
* scan passive total per channel: 200 TUs
* scan active total per channel: 20 TUs
* BSS width channel transition delay factor: 5
* OBSS Scan Activity Threshold: 0.25 %
Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* Response Type: 3 (AP)
* UUID: 8e998705-3ed2-399e-e43d-0d4c0a412fec
* Manufacturer: Broadcom
* Model: Broadcom
* Model Number: 123456
* Serial Number: 1234
* Primary Device Type: 6-0050f204-1
* Device name: BroadcomAP
* Config methods:
* RF Bands: 0x3
* Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20
WMM: * Parameter version 1
* u-APSD
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
BSS 88:e3:ab:9d:38:f6(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2412
beacon interval: 100 TUs
capability: ESS ShortSlotTime RadioMeasure (0x1401)
signal: -84.00 dBm
last seen: 0 ms ago
SSID: Telekom_FON
Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
DS Parameter set: channel 1
ERP: Barker_Preamble_Mode
ERP D4.0: Barker_Preamble_Mode
Extended supported rates: 6.0 9.0 12.0 48.0
HT capabilities:
Capabilities: 0x19ac
HT20
SM Power Save disabled
RX HT20 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 7935 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT RX MCS rate indexes supported: 0-15
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 1
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 0
* HT protection: no
* non-GF present: 1
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Overlapping BSS scan params:
* passive dwell: 20 TUs
* active dwell: 10 TUs
* channel width trigger scan interval: 300 s
* scan passive total per channel: 200 TUs
* scan active total per channel: 20 TUs
* BSS width channel transition delay factor: 5
* OBSS Scan Activity Threshold: 0.25 %
Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6
WMM: * Parameter version 1
* u-APSD
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
BSS b8:bc:1b:63:33:da(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2412
beacon interval: 100 TUs
capability: ESS ShortSlotTime RadioMeasure (0x1401)
signal: -83.00 dBm
last seen: 0 ms ago
SSID: Telekom_FON
Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0
DS Parameter set: channel 1
ERP: Barker_Preamble_Mode
ERP D4.0: Barker_Preamble_Mode
Extended supported rates: 6.0 9.0 12.0 48.0
HT capabilities:
Capabilities: 0x19ac
HT20
SM Power Save disabled
RX HT20 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 7935 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT RX MCS rate indexes supported: 0-15
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 1
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 0
* HT protection: no
* non-GF present: 1
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Overlapping BSS scan params:
* passive dwell: 20 TUs
* active dwell: 10 TUs
* channel width trigger scan interval: 300 s
* scan passive total per channel: 200 TUs
* scan active total per channel: 20 TUs
* BSS width channel transition delay factor: 5
* OBSS Scan Activity Threshold: 0.25 %
Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6
WMM: * Parameter version 1
* u-APSD
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
BSS 24:65:11:89:1c:28(on wlan0) -- associated
TSF: 0 usec (0d, 00:00:00)
freq: 2462
beacon interval: 100 TUs
capability: ESS Privacy ShortPreamble ShortSlotTime (0x0431)
signal: -40.00 dBm
last seen: 0 ms ago
SSID: spycki3
Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0* 9.0 12.0* 18.0
DS Parameter set: channel 11
TIM: DTIM Count 0 DTIM Period 1 Bitmap Control 0x0 Bitmap[0] 0x1
Country: DE Environment: Indoor/Outdoor
Channels [1 - 13] @ 20 dBm
ERP: <no flags>
RSN: * Version: 1
* Group cipher: TKIP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)
Extended supported rates: 24.0* 36.0 48.0 54.0
HT capabilities:
Capabilities: 0x11ce
HT20/HT40
SM Power Save disabled
RX HT40 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 3839 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT RX MCS rate indexes supported: 0-15
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 11
* secondary channel offset: below
* STA channel width: any
* RIFS: 1
* HT protection: 20 MHz
* non-GF present: 1
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
WPA: * Version: 1
* Group cipher: TKIP
* Pairwise ciphers: TKIP
* Authentication suites: PSK
WMM: * Parameter version 1
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* UUID: 0cb4b30f-b5d6-7e18-4ec8-246511891c10
* RF Bands: 0x3
BSS c0:25:06:eb:8e:7d(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2437
beacon interval: 100 TUs
capability: ESS Privacy ShortPreamble ShortSlotTime (0x0431)
signal: -84.00 dBm
last seen: 0 ms ago
SSID: FRITZ!Box Fon WLAN 7390
Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0* 9.0 12.0* 18.0
DS Parameter set: channel 6
Country: DE Environment: Indoor/Outdoor
Channels [1 - 13] @ 20 dBm
ERP: <no flags>
Extended supported rates: 24.0* 36.0 48.0 54.0
HT capabilities:
Capabilities: 0x18c
HT20
SM Power Save disabled
TX STBC
RX STBC 1-stream
Max AMSDU length: 3839 bytes
No DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT TX/RX MCS rate indexes supported: 0-15
HT operation:
* primary channel: 6
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 1
* HT protection: no
* non-GF present: 0
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Extended capabilities: 6
WMM: * Parameter version 1
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
RSN: * Version: 1
* Group cipher: TKIP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)
WPA: * Version: 1
* Group cipher: TKIP
* Pairwise ciphers: TKIP
* Authentication suites: PSK
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* Response Type: 3 (AP)
* UUID: 76fc7d2e-2e0b-5c3b-7135-c02506eb8e7c
* Manufacturer: AVM
* Model: FBox
* Model Number: 0000
* Serial Number: 0000
* Primary Device Type: 6-0050f204-1
* Device name: FBox
* Config methods: Display, PBC, Keypad
* RF Bands: 0x3
* Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20
BSS c2:25:06:eb:8e:7d(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2437
beacon interval: 100 TUs
capability: ESS Privacy ShortPreamble ShortSlotTime (0x0431)
signal: -82.00 dBm
last seen: 0 ms ago
SSID: SDK Gast
Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0* 9.0 12.0* 18.0
DS Parameter set: channel 6
Country: DE Environment: Indoor/Outdoor
Channels [1 - 13] @ 20 dBm
ERP: <no flags>
Extended supported rates: 24.0* 36.0 48.0 54.0
HT capabilities:
Capabilities: 0x18c
HT20
SM Power Save disabled
TX STBC
RX STBC 1-stream
Max AMSDU length: 3839 bytes
No DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT TX/RX MCS rate indexes supported: 0-15
HT operation:
* primary channel: 6
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 1
* HT protection: no
* non-GF present: 0
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Extended capabilities: 6
WMM: * Parameter version 1
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
RSN: * Version: 1
* Group cipher: TKIP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)
WPA: * Version: 1
* Group cipher: TKIP
* Pairwise ciphers: TKIP
* Authentication suites: PSK
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* Response Type: 3 (AP)
* UUID: dfb77a7a-25b2-93f6-7ba8-01e7cd0bdb51
* Manufacturer: AVM
* Model: FBox
* Model Number: 0000
* Serial Number: 0000
* Primary Device Type: 6-0050f204-1
* Device name: FBox
* Config methods: Display, PBC, Keypad
* RF Bands: 0x3
* Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20
BSS e0:28:6d:dd:b1:fc(on wlan0)
TSF: 0 usec (0d, 00:00:00)
freq: 2462
beacon interval: 100 TUs
capability: ESS Privacy ShortPreamble (0x0031)
signal: -75.00 dBm
last seen: 0 ms ago
SSID: FRITZ!Box 7362 SL
Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0* 9.0 12.0* 18.0
DS Parameter set: channel 11
Country: DE Environment: Indoor/Outdoor
Channels [1 - 13] @ 20 dBm
ERP: <no flags>
Extended supported rates: 24.0* 36.0 48.0 54.0
HT capabilities:
Capabilities: 0x1ad
RX LDPC
HT20
SM Power Save disabled
RX HT20 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 3839 bytes
No DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT TX/RX MCS rate indexes supported: 0-23
HT operation:
* primary channel: 11
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 1
* HT protection: no
* non-GF present: 1
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
Extended capabilities: 6
WMM: * Parameter version 1
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec
RSN: * Version: 1
* Group cipher: CCMP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* Response Type: 3 (AP)
* UUID: 80ffd276-a392-0a84-6421-e0286dddb1fc
* Manufacturer: AVM
* Model: FBox
* Model Number: 0000
* Serial Number: 0000
* Primary Device Type: 6-0050f204-1
* Device name: FBox
* Config methods: Display, PBC, Keypad
* RF Bands: 0x1
* Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20`
func main() {
//res, err := service.ParseIwScan(iw_scan_out)
res, err := service.WifiScan("wlan0")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Parsed scan result:\n%v\n", res)
err = service.WifiCreateWpaSupplicantConfigFile("spycki1 2 3", "a b c c b b", "/tmp/wpa_supplicant.conf")
if err != nil { log.Fatal(err)}
}

View File

@ -177,110 +177,6 @@ func (x GPIOInEdge) String() string {
return GPIOInEdge_name[int(x)]
}
type GPIONum int
const (
GPIONum_NUM_1 GPIONum = 0
GPIONum_NUM_2 GPIONum = 1
GPIONum_NUM_3 GPIONum = 2
GPIONum_NUM_4 GPIONum = 3
GPIONum_NUM_5 GPIONum = 4
GPIONum_NUM_6 GPIONum = 5
GPIONum_NUM_7 GPIONum = 6
GPIONum_NUM_8 GPIONum = 7
GPIONum_NUM_9 GPIONum = 8
GPIONum_NUM_10 GPIONum = 9
GPIONum_NUM_11 GPIONum = 10
GPIONum_NUM_12 GPIONum = 11
GPIONum_NUM_13 GPIONum = 12
GPIONum_NUM_14 GPIONum = 13
GPIONum_NUM_15 GPIONum = 14
GPIONum_NUM_16 GPIONum = 15
GPIONum_NUM_17 GPIONum = 16
GPIONum_NUM_18 GPIONum = 17
GPIONum_NUM_19 GPIONum = 18
GPIONum_NUM_20 GPIONum = 19
GPIONum_NUM_21 GPIONum = 20
GPIONum_NUM_22 GPIONum = 21
GPIONum_NUM_23 GPIONum = 22
GPIONum_NUM_24 GPIONum = 23
GPIONum_NUM_25 GPIONum = 24
GPIONum_NUM_26 GPIONum = 25
GPIONum_NUM_27 GPIONum = 26
GPIONum_NUM_28 GPIONum = 27
GPIONum_NUM_29 GPIONum = 28
GPIONum_NUM_30 GPIONum = 29
)
var GPIONum_name = map[int]string{
0: "NUM_1",
1: "NUM_2",
2: "NUM_3",
3: "NUM_4",
4: "NUM_5",
5: "NUM_6",
6: "NUM_7",
7: "NUM_8",
8: "NUM_9",
9: "NUM_10",
10: "NUM_11",
11: "NUM_12",
12: "NUM_13",
13: "NUM_14",
14: "NUM_15",
15: "NUM_16",
16: "NUM_17",
17: "NUM_18",
18: "NUM_19",
19: "NUM_20",
20: "NUM_21",
21: "NUM_22",
22: "NUM_23",
23: "NUM_24",
24: "NUM_25",
25: "NUM_26",
26: "NUM_27",
27: "NUM_28",
28: "NUM_29",
29: "NUM_30",
}
var GPIONum_value = map[string]int{
"NUM_1": 0,
"NUM_2": 1,
"NUM_3": 2,
"NUM_4": 3,
"NUM_5": 4,
"NUM_6": 5,
"NUM_7": 6,
"NUM_8": 7,
"NUM_9": 8,
"NUM_10": 9,
"NUM_11": 10,
"NUM_12": 11,
"NUM_13": 12,
"NUM_14": 13,
"NUM_15": 14,
"NUM_16": 15,
"NUM_17": 16,
"NUM_18": 17,
"NUM_19": 18,
"NUM_20": 19,
"NUM_21": 20,
"NUM_22": 21,
"NUM_23": 22,
"NUM_24": 23,
"NUM_25": 24,
"NUM_26": 25,
"NUM_27": 26,
"NUM_28": 27,
"NUM_29": 28,
"NUM_30": 29,
}
func (x GPIONum) String() string {
return GPIONum_name[int(x)]
}
type GPIOOutValue int
const (
@ -2719,17 +2615,17 @@ func (m *TriggerGroupReceiveMulti) Unmarshal(rawBytes []byte) (*TriggerGroupRece
}
type TriggerGPIOIn struct {
GpioNum GPIONum
GpioName string
PullUpDown GPIOInPullUpDown
GpioInEdge GPIOInEdge
}
// GetGpioNum gets the GpioNum of the TriggerGPIOIn.
func (m *TriggerGPIOIn) GetGpioNum() (x GPIONum) {
// GetGpioName gets the GpioName of the TriggerGPIOIn.
func (m *TriggerGPIOIn) GetGpioName() (x string) {
if m == nil {
return x
}
return m.GpioNum
return m.GpioName
}
// GetPullUpDown gets the PullUpDown of the TriggerGPIOIn.
@ -2754,8 +2650,8 @@ func (m *TriggerGPIOIn) MarshalToWriter(writer jspb.Writer) {
return
}
if int(m.GpioNum) != 0 {
writer.WriteEnum(1, int(m.GpioNum))
if len(m.GpioName) > 0 {
writer.WriteString(1, m.GpioName)
}
if int(m.PullUpDown) != 0 {
@ -2785,7 +2681,7 @@ func (m *TriggerGPIOIn) UnmarshalFromReader(reader jspb.Reader) *TriggerGPIOIn {
switch reader.GetFieldNumber() {
case 1:
m.GpioNum = GPIONum(reader.ReadEnum())
m.GpioName = reader.ReadString()
case 2:
m.PullUpDown = GPIOInPullUpDown(reader.ReadEnum())
case 3:
@ -3064,16 +2960,16 @@ func (m *ActionLog) Unmarshal(rawBytes []byte) (*ActionLog, error) {
}
type ActionGPIOOut struct {
GpioNum GPIONum
Value GPIOOutValue
GpioName string
Value GPIOOutValue
}
// GetGpioNum gets the GpioNum of the ActionGPIOOut.
func (m *ActionGPIOOut) GetGpioNum() (x GPIONum) {
// GetGpioName gets the GpioName of the ActionGPIOOut.
func (m *ActionGPIOOut) GetGpioName() (x string) {
if m == nil {
return x
}
return m.GpioNum
return m.GpioName
}
// GetValue gets the Value of the ActionGPIOOut.
@ -3090,8 +2986,8 @@ func (m *ActionGPIOOut) MarshalToWriter(writer jspb.Writer) {
return
}
if int(m.GpioNum) != 0 {
writer.WriteEnum(1, int(m.GpioNum))
if len(m.GpioName) > 0 {
writer.WriteString(1, m.GpioName)
}
if int(m.Value) != 0 {
@ -3117,7 +3013,7 @@ func (m *ActionGPIOOut) UnmarshalFromReader(reader jspb.Reader) *ActionGPIOOut {
switch reader.GetFieldNumber() {
case 1:
m.GpioNum = GPIONum(reader.ReadEnum())
m.GpioName = reader.ReadString()
case 2:
m.Value = GPIOOutValue(reader.ReadEnum())
default:
@ -6642,6 +6538,8 @@ type P4WNP1Client interface {
ListStoredHIDScripts(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error)
ListStoredBashScripts(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error)
ListStoredDBBackups(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error)
// GPIO
GetAvailableGpios(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error)
}
type p4WNP1Client struct {
@ -7370,3 +7268,12 @@ func (c *p4WNP1Client) ListStoredDBBackups(ctx context.Context, in *Empty, opts
return new(StringMessageArray).Unmarshal(resp)
}
func (c *p4WNP1Client) GetAvailableGpios(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error) {
resp, err := c.client.RPCCall(ctx, "GetAvailableGpios", in.Marshal(), opts...)
if err != nil {
return nil, err
}
return new(StringMessageArray).Unmarshal(resp)
}

View File

@ -189,111 +189,6 @@ func (x GPIOInEdge) String() string {
}
func (GPIOInEdge) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
type GPIONum int32
const (
GPIONum_NUM_1 GPIONum = 0
GPIONum_NUM_2 GPIONum = 1
GPIONum_NUM_3 GPIONum = 2
GPIONum_NUM_4 GPIONum = 3
GPIONum_NUM_5 GPIONum = 4
GPIONum_NUM_6 GPIONum = 5
GPIONum_NUM_7 GPIONum = 6
GPIONum_NUM_8 GPIONum = 7
GPIONum_NUM_9 GPIONum = 8
GPIONum_NUM_10 GPIONum = 9
GPIONum_NUM_11 GPIONum = 10
GPIONum_NUM_12 GPIONum = 11
GPIONum_NUM_13 GPIONum = 12
GPIONum_NUM_14 GPIONum = 13
GPIONum_NUM_15 GPIONum = 14
GPIONum_NUM_16 GPIONum = 15
GPIONum_NUM_17 GPIONum = 16
GPIONum_NUM_18 GPIONum = 17
GPIONum_NUM_19 GPIONum = 18
GPIONum_NUM_20 GPIONum = 19
GPIONum_NUM_21 GPIONum = 20
GPIONum_NUM_22 GPIONum = 21
GPIONum_NUM_23 GPIONum = 22
GPIONum_NUM_24 GPIONum = 23
GPIONum_NUM_25 GPIONum = 24
GPIONum_NUM_26 GPIONum = 25
GPIONum_NUM_27 GPIONum = 26
GPIONum_NUM_28 GPIONum = 27
GPIONum_NUM_29 GPIONum = 28
GPIONum_NUM_30 GPIONum = 29
)
var GPIONum_name = map[int32]string{
0: "NUM_1",
1: "NUM_2",
2: "NUM_3",
3: "NUM_4",
4: "NUM_5",
5: "NUM_6",
6: "NUM_7",
7: "NUM_8",
8: "NUM_9",
9: "NUM_10",
10: "NUM_11",
11: "NUM_12",
12: "NUM_13",
13: "NUM_14",
14: "NUM_15",
15: "NUM_16",
16: "NUM_17",
17: "NUM_18",
18: "NUM_19",
19: "NUM_20",
20: "NUM_21",
21: "NUM_22",
22: "NUM_23",
23: "NUM_24",
24: "NUM_25",
25: "NUM_26",
26: "NUM_27",
27: "NUM_28",
28: "NUM_29",
29: "NUM_30",
}
var GPIONum_value = map[string]int32{
"NUM_1": 0,
"NUM_2": 1,
"NUM_3": 2,
"NUM_4": 3,
"NUM_5": 4,
"NUM_6": 5,
"NUM_7": 6,
"NUM_8": 7,
"NUM_9": 8,
"NUM_10": 9,
"NUM_11": 10,
"NUM_12": 11,
"NUM_13": 12,
"NUM_14": 13,
"NUM_15": 14,
"NUM_16": 15,
"NUM_17": 16,
"NUM_18": 17,
"NUM_19": 18,
"NUM_20": 19,
"NUM_21": 20,
"NUM_22": 21,
"NUM_23": 22,
"NUM_24": 23,
"NUM_25": 24,
"NUM_26": 25,
"NUM_27": 26,
"NUM_28": 27,
"NUM_29": 28,
"NUM_30": 29,
}
func (x GPIONum) String() string {
return proto.EnumName(GPIONum_name, int32(x))
}
func (GPIONum) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
type GPIOOutValue int32
const (
@ -316,7 +211,7 @@ var GPIOOutValue_value = map[string]int32{
func (x GPIOOutValue) String() string {
return proto.EnumName(GPIOOutValue_name, int32(x))
}
func (GPIOOutValue) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (GPIOOutValue) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
// WiFi2 (distinguish state and settings)
type WiFiWorkingMode int32
@ -344,7 +239,7 @@ var WiFiWorkingMode_value = map[string]int32{
func (x WiFiWorkingMode) String() string {
return proto.EnumName(WiFiWorkingMode_name, int32(x))
}
func (WiFiWorkingMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (WiFiWorkingMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
type WiFiStateMode int32
@ -368,7 +263,7 @@ var WiFiStateMode_value = map[string]int32{
func (x WiFiStateMode) String() string {
return proto.EnumName(WiFiStateMode_name, int32(x))
}
func (WiFiStateMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (WiFiStateMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
type WiFiAuthMode int32
@ -389,7 +284,7 @@ var WiFiAuthMode_value = map[string]int32{
func (x WiFiAuthMode) String() string {
return proto.EnumName(WiFiAuthMode_name, int32(x))
}
func (WiFiAuthMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (WiFiAuthMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
type AccessibleFolder int32
@ -413,7 +308,7 @@ var AccessibleFolder_value = map[string]int32{
func (x AccessibleFolder) String() string {
return proto.EnumName(AccessibleFolder_name, int32(x))
}
func (AccessibleFolder) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (AccessibleFolder) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
type ActionDeploySettingsTemplate_TemplateType int32
@ -1661,7 +1556,7 @@ func (m *TriggerGroupReceiveMulti) GetType() GroupReceiveMultiType {
}
type TriggerGPIOIn struct {
GpioNum GPIONum `protobuf:"varint,1,opt,name=gpioNum,enum=P4wnP1_grpc.GPIONum" json:"gpioNum,omitempty"`
GpioName string `protobuf:"bytes,1,opt,name=gpio_name,json=gpioName" json:"gpio_name,omitempty"`
PullUpDown GPIOInPullUpDown `protobuf:"varint,2,opt,name=pullUpDown,enum=P4wnP1_grpc.GPIOInPullUpDown" json:"pullUpDown,omitempty"`
GpioInEdge GPIOInEdge `protobuf:"varint,3,opt,name=gpioInEdge,enum=P4wnP1_grpc.GPIOInEdge" json:"gpioInEdge,omitempty"`
}
@ -1671,11 +1566,11 @@ func (m *TriggerGPIOIn) String() string { return proto.CompactTextStr
func (*TriggerGPIOIn) ProtoMessage() {}
func (*TriggerGPIOIn) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *TriggerGPIOIn) GetGpioNum() GPIONum {
func (m *TriggerGPIOIn) GetGpioName() string {
if m != nil {
return m.GpioNum
return m.GpioName
}
return GPIONum_NUM_1
return ""
}
func (m *TriggerGPIOIn) GetPullUpDown() GPIOInPullUpDown {
@ -1757,8 +1652,8 @@ func (*ActionLog) ProtoMessage() {}
func (*ActionLog) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
type ActionGPIOOut struct {
GpioNum GPIONum `protobuf:"varint,1,opt,name=gpioNum,enum=P4wnP1_grpc.GPIONum" json:"gpioNum,omitempty"`
Value GPIOOutValue `protobuf:"varint,2,opt,name=value,enum=P4wnP1_grpc.GPIOOutValue" json:"value,omitempty"`
GpioName string `protobuf:"bytes,1,opt,name=gpio_name,json=gpioName" json:"gpio_name,omitempty"`
Value GPIOOutValue `protobuf:"varint,2,opt,name=value,enum=P4wnP1_grpc.GPIOOutValue" json:"value,omitempty"`
}
func (m *ActionGPIOOut) Reset() { *m = ActionGPIOOut{} }
@ -1766,11 +1661,11 @@ func (m *ActionGPIOOut) String() string { return proto.CompactTextStr
func (*ActionGPIOOut) ProtoMessage() {}
func (*ActionGPIOOut) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (m *ActionGPIOOut) GetGpioNum() GPIONum {
func (m *ActionGPIOOut) GetGpioName() string {
if m != nil {
return m.GpioNum
return m.GpioName
}
return GPIONum_NUM_1
return ""
}
func (m *ActionGPIOOut) GetValue() GPIOOutValue {
@ -3113,7 +3008,6 @@ func init() {
proto.RegisterEnum("P4wnP1_grpc.GroupReceiveMultiType", GroupReceiveMultiType_name, GroupReceiveMultiType_value)
proto.RegisterEnum("P4wnP1_grpc.GPIOInPullUpDown", GPIOInPullUpDown_name, GPIOInPullUpDown_value)
proto.RegisterEnum("P4wnP1_grpc.GPIOInEdge", GPIOInEdge_name, GPIOInEdge_value)
proto.RegisterEnum("P4wnP1_grpc.GPIONum", GPIONum_name, GPIONum_value)
proto.RegisterEnum("P4wnP1_grpc.GPIOOutValue", GPIOOutValue_name, GPIOOutValue_value)
proto.RegisterEnum("P4wnP1_grpc.WiFiWorkingMode", WiFiWorkingMode_name, WiFiWorkingMode_value)
proto.RegisterEnum("P4wnP1_grpc.WiFiStateMode", WiFiStateMode_name, WiFiStateMode_value)
@ -3223,6 +3117,8 @@ type P4WNP1Client interface {
ListStoredHIDScripts(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error)
ListStoredBashScripts(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error)
ListStoredDBBackups(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error)
// GPIO
GetAvailableGpios(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error)
}
type p4WNP1Client struct {
@ -3949,6 +3845,15 @@ func (c *p4WNP1Client) ListStoredDBBackups(ctx context.Context, in *Empty, opts
return out, nil
}
func (c *p4WNP1Client) GetAvailableGpios(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error) {
out := new(StringMessageArray)
err := grpc.Invoke(ctx, "/P4wnP1_grpc.P4WNP1/GetAvailableGpios", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for P4WNP1 service
type P4WNP1Server interface {
@ -4041,6 +3946,8 @@ type P4WNP1Server interface {
ListStoredHIDScripts(context.Context, *Empty) (*StringMessageArray, error)
ListStoredBashScripts(context.Context, *Empty) (*StringMessageArray, error)
ListStoredDBBackups(context.Context, *Empty) (*StringMessageArray, error)
// GPIO
GetAvailableGpios(context.Context, *Empty) (*StringMessageArray, error)
}
func RegisterP4WNP1Server(s *grpc.Server, srv P4WNP1Server) {
@ -5436,6 +5343,24 @@ func _P4WNP1_ListStoredDBBackups_Handler(srv interface{}, ctx context.Context, d
return interceptor(ctx, in, info, handler)
}
func _P4WNP1_GetAvailableGpios_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(Empty)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(P4WNP1Server).GetAvailableGpios(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/P4wnP1_grpc.P4WNP1/GetAvailableGpios",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(P4WNP1Server).GetAvailableGpios(ctx, req.(*Empty))
}
return interceptor(ctx, in, info, handler)
}
var _P4WNP1_serviceDesc = grpc.ServiceDesc{
ServiceName: "P4wnP1_grpc.P4WNP1",
HandlerType: (*P4WNP1Server)(nil),
@ -5744,6 +5669,10 @@ var _P4WNP1_serviceDesc = grpc.ServiceDesc{
MethodName: "ListStoredDBBackups",
Handler: _P4WNP1_ListStoredDBBackups_Handler,
},
{
MethodName: "GetAvailableGpios",
Handler: _P4WNP1_GetAvailableGpios_Handler,
},
},
Streams: []grpc.StreamDesc{
{
@ -5758,319 +5687,310 @@ var _P4WNP1_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("grpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 5022 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x5c, 0x49, 0x73, 0x23, 0x47,
0x76, 0xc6, 0xc2, 0x05, 0x78, 0x20, 0xc8, 0x62, 0x36, 0x17, 0x34, 0x7b, 0xaf, 0x69, 0x69, 0x5a,
0x94, 0x44, 0xa9, 0xd9, 0xad, 0xee, 0x96, 0x46, 0xb2, 0x06, 0x1b, 0x01, 0x74, 0x83, 0x00, 0x54,
0x05, 0x34, 0x35, 0x8b, 0x5d, 0x53, 0xa8, 0x4a, 0x82, 0xa5, 0x06, 0xaa, 0xe0, 0x5a, 0x48, 0xd1,
0x8e, 0x98, 0x08, 0x4f, 0x84, 0x23, 0xe6, 0xe0, 0xbb, 0x0f, 0xfe, 0x0d, 0xf6, 0xcd, 0xe1, 0x5f,
0xe4, 0x08, 0xfb, 0x32, 0x37, 0x5f, 0x7c, 0xb1, 0x23, 0x33, 0x6b, 0x05, 0xaa, 0xb8, 0xb5, 0x74,
0xcb, 0x7c, 0xf9, 0xf2, 0xcb, 0xe5, 0x2d, 0xf9, 0xf2, 0x65, 0x01, 0x00, 0x23, 0x73, 0xaa, 0xec,
0x4d, 0x4d, 0xc3, 0x36, 0x50, 0xa1, 0xf7, 0xfc, 0x4c, 0xef, 0x3d, 0x95, 0x08, 0x89, 0xff, 0x97,
0x0c, 0xac, 0x1e, 0xca, 0x96, 0x8d, 0xcd, 0x3e, 0x9e, 0x4c, 0xc7, 0xb2, 0x8d, 0xd1, 0x0b, 0xd8,
0xb6, 0xdd, 0xb2, 0xa4, 0xcb, 0x13, 0x2c, 0x0d, 0xc7, 0x0e, 0xb6, 0x0d, 0xc3, 0x3e, 0x29, 0xa5,
0x1f, 0xa6, 0x9f, 0xe4, 0x85, 0x4d, 0xaf, 0xb9, 0x23, 0x4f, 0x70, 0xc5, 0x6b, 0x44, 0xbb, 0xb0,
0x1e, 0xed, 0xe7, 0x58, 0xc3, 0x52, 0x86, 0xf6, 0x58, 0x0b, 0xf7, 0x18, 0x58, 0x43, 0xf4, 0x09,
0xa0, 0x28, 0xef, 0x99, 0x76, 0xac, 0x95, 0xb2, 0x94, 0x99, 0x0b, 0x33, 0x1f, 0x69, 0xc7, 0x1a,
0x2a, 0xc3, 0xbd, 0x28, 0xb7, 0x6d, 0x6a, 0xa3, 0x11, 0x36, 0x25, 0x59, 0xb1, 0x35, 0x43, 0xb7,
0x4a, 0x0b, 0xb4, 0xe3, 0x4e, 0xb8, 0x63, 0x9f, 0xb1, 0x94, 0x19, 0x07, 0x7a, 0x0e, 0x5b, 0x11,
0x08, 0x4b, 0xd2, 0xb1, 0x7d, 0x66, 0x98, 0xef, 0x4a, 0x8b, 0x0f, 0xb3, 0x4f, 0xf2, 0xc2, 0x46,
0xb8, 0xaf, 0xd5, 0x61, 0x6d, 0xfc, 0xdf, 0xc3, 0x5d, 0x01, 0xff, 0xad, 0x83, 0x2d, 0x3b, 0xba,
0x47, 0xa2, 0x6d, 0x98, 0xf2, 0x08, 0x23, 0x1e, 0x56, 0xfa, 0xa1, 0x7e, 0xee, 0xfe, 0x44, 0x68,
0xe8, 0x25, 0xe4, 0x3c, 0x6c, 0xba, 0x1b, 0x85, 0xfd, 0x3b, 0x7b, 0x21, 0x09, 0xec, 0x45, 0x91,
0x05, 0x9f, 0x99, 0xff, 0x87, 0x34, 0x3c, 0xf0, 0x77, 0xd7, 0x9d, 0x86, 0x88, 0x6d, 0x5b, 0xd3,
0x47, 0xd6, 0x75, 0x26, 0xf0, 0x15, 0xe4, 0x2c, 0xb7, 0x9b, 0x3b, 0x81, 0xfb, 0x91, 0x09, 0xf8,
0x63, 0x78, 0xe0, 0x82, 0xcf, 0xcf, 0xff, 0x63, 0x1a, 0xd6, 0xe7, 0xda, 0xd1, 0xaf, 0x20, 0xa3,
0x68, 0x74, 0xac, 0xc2, 0xfe, 0xc7, 0xf1, 0x58, 0x55, 0x43, 0xb7, 0x4d, 0x63, 0x3c, 0xc6, 0x66,
0x4b, 0x3f, 0x36, 0xcc, 0x89, 0x4c, 0xc4, 0x20, 0x64, 0x14, 0x0d, 0x3d, 0x83, 0x8c, 0xec, 0x4d,
0xe4, 0x17, 0xf1, 0x9d, 0xcb, 0x23, 0xac, 0xfb, 0x4b, 0x15, 0x32, 0xb2, 0xc5, 0xef, 0xc2, 0x56,
0x7c, 0x2b, 0xe2, 0x20, 0x3b, 0xd5, 0x74, 0x77, 0xe1, 0xa4, 0xc8, 0xff, 0x6f, 0x1a, 0xb6, 0x7d,
0x66, 0x57, 0x92, 0x22, 0x36, 0x4f, 0x35, 0x05, 0x13, 0x35, 0x30, 0xf1, 0x48, 0x23, 0x3b, 0x2e,
0x19, 0xa6, 0xe4, 0xe8, 0x5e, 0x8d, 0x02, 0xe4, 0x84, 0x0d, 0xaf, 0xde, 0x35, 0x07, 0x7e, 0x1b,
0xd1, 0x6c, 0x0b, 0x9b, 0xa7, 0xac, 0x8f, 0x62, 0xe8, 0x3a, 0x56, 0x6c, 0xba, 0x82, 0x9c, 0xb0,
0xc6, 0x1a, 0xba, 0x66, 0x95, 0x91, 0xd1, 0xd7, 0xb0, 0x60, 0x9f, 0x4f, 0x31, 0xd5, 0xe5, 0xd5,
0xfd, 0x27, 0xf1, 0x0b, 0x8c, 0xce, 0xaa, 0x7f, 0x3e, 0xc5, 0x02, 0xed, 0x85, 0xee, 0x43, 0x61,
0x22, 0x2b, 0x64, 0x18, 0xa2, 0xa4, 0xae, 0x5e, 0xe7, 0x27, 0xb2, 0xd2, 0x35, 0xa9, 0x2c, 0x1f,
0x40, 0x61, 0x68, 0x6a, 0xea, 0x88, 0x29, 0x71, 0x69, 0x91, 0xb6, 0x03, 0x23, 0x11, 0x06, 0xfe,
0xbf, 0x17, 0xe0, 0x4e, 0x8c, 0x10, 0xfc, 0xed, 0x2a, 0xc1, 0xf2, 0xd4, 0x38, 0xc3, 0x26, 0x56,
0xdd, 0x15, 0x7b, 0x55, 0xf4, 0x10, 0x0a, 0xee, 0xd2, 0xe4, 0xe1, 0x18, 0xbb, 0xcb, 0x0b, 0x93,
0xd0, 0x47, 0xc0, 0x1d, 0xcb, 0x96, 0x2d, 0x85, 0xd9, 0xb2, 0x6c, 0x17, 0x08, 0xbd, 0x1a, 0x62,
0xe5, 0x61, 0x45, 0xd5, 0x2c, 0xc5, 0x38, 0xc5, 0x26, 0x65, 0x5b, 0xa0, 0x6c, 0x11, 0x1a, 0xda,
0x81, 0xdc, 0xd0, 0xd0, 0x55, 0xda, 0xbe, 0x48, 0xdb, 0xfd, 0x3a, 0xda, 0x83, 0x5b, 0x63, 0x4d,
0x7f, 0x27, 0x8d, 0xf1, 0x29, 0x1e, 0x4b, 0x16, 0x56, 0x1c, 0x53, 0xb3, 0xcf, 0x4b, 0x4b, 0x94,
0x6d, 0x9d, 0x34, 0xb5, 0x49, 0x8b, 0xe8, 0x36, 0xa0, 0x7d, 0xd8, 0xa4, 0x4c, 0x58, 0xb2, 0xb4,
0xc9, 0x74, 0x8c, 0xa5, 0xa9, 0xac, 0x99, 0x9a, 0x3e, 0x2a, 0x2d, 0xd3, 0x1e, 0xb7, 0x58, 0xa3,
0x48, 0xdb, 0x7a, 0xac, 0x09, 0x6d, 0xc2, 0xd2, 0xd0, 0x94, 0xb0, 0x6a, 0x96, 0x72, 0x94, 0x69,
0x71, 0x68, 0xd6, 0x55, 0x13, 0xdd, 0x03, 0x38, 0xd1, 0x46, 0x27, 0x92, 0x35, 0xc5, 0x58, 0x2d,
0xe5, 0x69, 0x53, 0x9e, 0x50, 0x44, 0x42, 0x20, 0xcd, 0x63, 0xe3, 0x4c, 0xc2, 0x3a, 0x36, 0x47,
0xe7, 0x25, 0x60, 0xcd, 0x63, 0xe3, 0xac, 0x4e, 0x09, 0x64, 0x17, 0x65, 0xf5, 0x14, 0x9b, 0xb6,
0x66, 0x91, 0xe1, 0x0b, 0x6c, 0x17, 0x43, 0x24, 0xf4, 0x29, 0x20, 0x77, 0xaa, 0xee, 0x3e, 0x52,
0x0f, 0xb6, 0xc2, 0x56, 0xc6, 0x5a, 0xaa, 0x41, 0x03, 0x19, 0x4f, 0xc5, 0x43, 0x67, 0x24, 0xbd,
0xc3, 0xe7, 0x56, 0xa9, 0xc8, 0xc6, 0xa3, 0x94, 0x37, 0xf8, 0x9c, 0xc9, 0xd3, 0xd4, 0x4e, 0x65,
0xe5, 0xbc, 0xb4, 0xea, 0xca, 0x93, 0x55, 0xd1, 0x97, 0x50, 0x52, 0x7c, 0xf9, 0x93, 0xb1, 0x8e,
0xb5, 0x91, 0x63, 0x52, 0x3b, 0x2c, 0xad, 0x51, 0xd6, 0xed, 0xa0, 0xbd, 0x1a, 0x6e, 0x46, 0x1f,
0xc0, 0xaa, 0x65, 0xcb, 0xb6, 0xa6, 0x48, 0xb2, 0xaa, 0x9a, 0xd8, 0xb2, 0x4a, 0x1c, 0xed, 0x50,
0x64, 0xd4, 0x32, 0x23, 0xf2, 0x7f, 0x59, 0x80, 0xfb, 0x17, 0x1b, 0x3c, 0x99, 0x9e, 0x07, 0x41,
0xd4, 0x6d, 0x45, 0xf0, 0xaa, 0xe8, 0x63, 0x58, 0xf7, 0xcf, 0x15, 0xe9, 0x14, 0x9b, 0x16, 0x99,
0x17, 0x51, 0xba, 0xa2, 0xc0, 0xf9, 0x0d, 0x6f, 0x19, 0x9d, 0xa8, 0xd3, 0x44, 0xd6, 0x9d, 0x63,
0x59, 0xb1, 0x1d, 0x13, 0x9b, 0x54, 0xeb, 0x8a, 0x42, 0x84, 0x86, 0x8e, 0x00, 0x59, 0xce, 0x74,
0x6a, 0x98, 0x36, 0x56, 0x25, 0xdf, 0xe1, 0x2d, 0x50, 0x3f, 0xf3, 0xe4, 0x32, 0x27, 0xe5, 0x3b,
0x9b, 0x75, 0x1f, 0xc3, 0x37, 0x19, 0x11, 0x38, 0xc5, 0x31, 0x4d, 0xac, 0xdb, 0x01, 0xec, 0xe2,
0x35, 0x61, 0xd7, 0x5c, 0x04, 0x1f, 0xf4, 0x43, 0x58, 0x53, 0xc6, 0xb2, 0x65, 0x49, 0xc6, 0xb1,
0xa4, 0x62, 0xe2, 0x05, 0xa8, 0x72, 0xaf, 0x08, 0x45, 0x4a, 0xee, 0x1e, 0xd7, 0x28, 0x11, 0x21,
0x58, 0xa0, 0x96, 0xbe, 0x4c, 0x2d, 0x9d, 0x96, 0x89, 0x4a, 0x58, 0x27, 0x86, 0x69, 0x33, 0x1f,
0x90, 0x63, 0x3e, 0x82, 0x52, 0xa8, 0x8f, 0x78, 0x04, 0x2b, 0x9a, 0x25, 0xc9, 0xa7, 0xb2, 0x36,
0xa6, 0xb6, 0xc5, 0x54, 0xb8, 0xa0, 0x59, 0x65, 0x8f, 0x84, 0x7e, 0x05, 0x3b, 0x16, 0xf3, 0x3d,
0xde, 0x31, 0x28, 0xb9, 0x0e, 0x4e, 0x97, 0xa7, 0xae, 0x52, 0x6f, 0xbb, 0x1c, 0x21, 0x5f, 0x85,
0xcd, 0x8e, 0x3c, 0x45, 0xdf, 0xc0, 0x9d, 0x84, 0xce, 0x53, 0x59, 0x77, 0x5c, 0x95, 0x2f, 0xc5,
0xf5, 0xee, 0xc9, 0xba, 0x83, 0xbe, 0x84, 0xdb, 0x09, 0xdd, 0x47, 0xba, 0x6b, 0x06, 0x5b, 0x71,
0x9d, 0x1b, 0x3a, 0xff, 0x03, 0x70, 0x91, 0x63, 0x5d, 0xc4, 0x36, 0xaa, 0xc0, 0x6a, 0xf4, 0xa8,
0x2f, 0xa5, 0x1f, 0x66, 0x9f, 0x14, 0xf6, 0x77, 0x22, 0xb2, 0x89, 0xb0, 0x08, 0x33, 0x3d, 0xc8,
0x26, 0xd3, 0xd3, 0x93, 0x05, 0x2b, 0xb4, 0xcc, 0xff, 0x2b, 0x40, 0x31, 0xc2, 0x86, 0x56, 0x21,
0xa3, 0x31, 0xaf, 0x59, 0x14, 0x32, 0x9a, 0x4a, 0x74, 0xdb, 0xd0, 0xb1, 0x78, 0x62, 0x78, 0x67,
0x81, 0x57, 0x25, 0x9e, 0x4d, 0xb3, 0x48, 0xaf, 0x53, 0xcf, 0x41, 0xfa, 0x75, 0x74, 0x17, 0xf2,
0xda, 0x64, 0xe2, 0xd8, 0x21, 0xb7, 0x18, 0x10, 0x50, 0x1b, 0x56, 0xdd, 0xb5, 0x8b, 0xb6, 0x4c,
0xb4, 0xd0, 0xd5, 0x34, 0x3e, 0x6e, 0x35, 0x62, 0x84, 0xb3, 0x99, 0x12, 0x66, 0xfa, 0xa2, 0xef,
0x01, 0x39, 0xd6, 0xb0, 0x21, 0xab, 0x23, 0xec, 0x79, 0x67, 0xac, 0x52, 0x3d, 0x2b, 0xec, 0x7f,
0x18, 0x87, 0x38, 0x10, 0x2b, 0x33, 0xdc, 0xcd, 0x94, 0x10, 0x83, 0x81, 0x64, 0xd8, 0xf4, 0xa9,
0x35, 0xe2, 0xd4, 0x3d, 0xf0, 0x65, 0x0a, 0xfe, 0xd1, 0x85, 0xe0, 0xe1, 0x0e, 0xcd, 0x94, 0x10,
0x8f, 0x84, 0x5a, 0x50, 0x24, 0x41, 0x61, 0xb9, 0xe7, 0xed, 0x44, 0x8e, 0x42, 0x3f, 0x8a, 0x83,
0x3e, 0x0a, 0x33, 0x36, 0x53, 0x42, 0xb4, 0x27, 0xd9, 0x07, 0x42, 0xf0, 0xa7, 0x5f, 0xb6, 0x44,
0x5b, 0xa6, 0x76, 0x91, 0xb0, 0x0f, 0x47, 0x73, 0xdc, 0x64, 0x1f, 0xe6, 0x31, 0x68, 0x6c, 0x65,
0x9d, 0xb4, 0x8d, 0x91, 0xa6, 0x53, 0xb3, 0x29, 0xec, 0xdf, 0x8d, 0x95, 0x94, 0xd8, 0xa4, 0x3c,
0xcd, 0x94, 0xe0, 0xf3, 0x23, 0x01, 0x38, 0xf5, 0x44, 0x99, 0xb6, 0xb1, 0x6c, 0xe1, 0x86, 0x29,
0xeb, 0x64, 0x8d, 0x05, 0x8a, 0xf1, 0x38, 0x0e, 0xa3, 0xd6, 0xac, 0xf6, 0xc2, 0xbc, 0xcd, 0x94,
0x30, 0xd7, 0x1f, 0x1d, 0xc0, 0xca, 0xc8, 0x34, 0x9c, 0xa9, 0x80, 0x15, 0x4c, 0xb4, 0x6f, 0x85,
0xe2, 0x3d, 0x8c, 0xc3, 0x6b, 0x84, 0xf8, 0x9a, 0x29, 0x21, 0xd2, 0x0f, 0x0d, 0x60, 0x3d, 0x5c,
0x3f, 0x74, 0xc6, 0xb6, 0x46, 0x0f, 0x9f, 0xc2, 0xfe, 0x07, 0x97, 0x81, 0x51, 0xe6, 0x66, 0x4a,
0x98, 0x47, 0x40, 0xcf, 0x61, 0x69, 0x34, 0xd5, 0x8c, 0x96, 0x4e, 0x0f, 0xab, 0x04, 0x23, 0x6d,
0xf4, 0x5a, 0xdd, 0x16, 0xd9, 0x2a, 0x97, 0x17, 0xd5, 0x00, 0x86, 0xb2, 0x75, 0x22, 0x2a, 0xa6,
0x36, 0xb5, 0xe9, 0xd9, 0x35, 0x6b, 0x10, 0xae, 0x3b, 0x20, 0xe2, 0xae, 0xf8, 0x9c, 0xcd, 0xb4,
0x10, 0xea, 0x87, 0xca, 0x90, 0x3f, 0xd1, 0x54, 0x17, 0x84, 0x8b, 0xd1, 0xa5, 0x10, 0x48, 0xb3,
0x55, 0xf3, 0x31, 0x82, 0x5e, 0x48, 0x81, 0x2d, 0x15, 0x4f, 0xc7, 0xc6, 0xb9, 0xe7, 0xc6, 0xbd,
0x38, 0xbb, 0xb4, 0x1e, 0xa3, 0xf6, 0x0c, 0xaf, 0x16, 0xdb, 0xa1, 0x99, 0x16, 0x12, 0xa0, 0xd0,
0x2e, 0x64, 0xc7, 0xc6, 0xa8, 0x84, 0x28, 0xe2, 0x56, 0x0c, 0x62, 0xdb, 0x18, 0x35, 0xd3, 0x02,
0x61, 0x42, 0x2f, 0x60, 0x99, 0xec, 0x51, 0xd7, 0xb1, 0x4b, 0xb7, 0x62, 0x36, 0x94, 0xf1, 0x93,
0xfd, 0xec, 0x3a, 0x64, 0x29, 0x1e, 0x33, 0xfa, 0x1a, 0xf2, 0x54, 0x38, 0x22, 0xd6, 0xd5, 0xd2,
0x46, 0x8c, 0xde, 0xba, 0x3d, 0x3d, 0x1e, 0xb2, 0x0d, 0x7e, 0x87, 0x4a, 0x1e, 0x96, 0x5d, 0x51,
0x55, 0x72, 0xb0, 0xc4, 0x58, 0xf9, 0x6d, 0xd8, 0x8c, 0x75, 0x4b, 0xfc, 0x1d, 0xb8, 0x9d, 0xe8,
0x5d, 0xf8, 0xfb, 0x70, 0xf7, 0x22, 0xef, 0xc0, 0x6f, 0xc1, 0x46, 0x9c, 0x89, 0x87, 0x40, 0xe7,
0x4d, 0x95, 0xff, 0x0c, 0xd6, 0x66, 0xec, 0x8e, 0x78, 0xdd, 0x31, 0x29, 0x0c, 0x2c, 0x37, 0xd4,
0xcf, 0x0b, 0x01, 0x81, 0xbf, 0x0d, 0xdb, 0x09, 0x46, 0xc6, 0xb7, 0xe0, 0x56, 0x8c, 0x8a, 0x13,
0x3c, 0xba, 0x1f, 0xa1, 0x4b, 0x57, 0x40, 0x40, 0x1b, 0xb0, 0x78, 0x2a, 0x8f, 0x1d, 0x76, 0xa0,
0x2c, 0x0a, 0xac, 0xc2, 0xff, 0x39, 0x0d, 0xa5, 0x24, 0x73, 0xb9, 0x04, 0x70, 0x0b, 0x96, 0x28,
0x86, 0x55, 0xca, 0x3e, 0xcc, 0x3e, 0x59, 0x14, 0xdc, 0x1a, 0x7a, 0xe1, 0x5e, 0x36, 0x16, 0xe8,
0x65, 0x23, 0x6a, 0x13, 0x73, 0x63, 0x04, 0xd7, 0x0c, 0xfe, 0x3f, 0xd2, 0xfe, 0xe1, 0xc6, 0xac,
0x0d, 0xed, 0x31, 0x4d, 0xea, 0x38, 0x13, 0x3a, 0xfa, 0xea, 0xfe, 0x46, 0x14, 0xac, 0xd7, 0xea,
0x76, 0x9c, 0x89, 0xe0, 0x31, 0xa1, 0x6f, 0x00, 0xa6, 0xce, 0x78, 0x3c, 0x98, 0xd6, 0x8c, 0x33,
0x16, 0xb7, 0xad, 0xee, 0xdf, 0x9b, 0xeb, 0xd2, 0xd2, 0x7b, 0x3e, 0x93, 0x10, 0xea, 0x80, 0x5e,
0x02, 0x30, 0xe3, 0xae, 0xab, 0x23, 0xef, 0xae, 0xb4, 0x1d, 0xd3, 0x9d, 0x34, 0x0b, 0x21, 0x56,
0xfe, 0x25, 0x6c, 0xc6, 0x1a, 0x3b, 0xba, 0x0f, 0x60, 0xd1, 0x52, 0x68, 0x07, 0x43, 0x14, 0xfe,
0x05, 0x6c, 0xc4, 0x19, 0xf8, 0xa5, 0xfd, 0xfe, 0x27, 0x0d, 0x77, 0x2f, 0xb2, 0x64, 0x12, 0x9b,
0xda, 0x31, 0x57, 0xf0, 0x30, 0x0d, 0xbd, 0x76, 0xe5, 0xc4, 0xf6, 0xe9, 0xc5, 0x95, 0xdd, 0xc4,
0x9e, 0x57, 0x08, 0xc9, 0x0e, 0x07, 0x57, 0x7e, 0x42, 0x45, 0xeb, 0x50, 0x3c, 0x18, 0xb4, 0xdb,
0x92, 0x58, 0xef, 0xf7, 0x5b, 0x9d, 0x86, 0xc8, 0xa5, 0x50, 0x01, 0x96, 0x3b, 0xf5, 0xfe, 0x51,
0x57, 0x78, 0xc3, 0xa5, 0x51, 0x0e, 0x16, 0x8e, 0x5a, 0x07, 0x2d, 0x2e, 0x83, 0x96, 0x21, 0x3b,
0x10, 0x2b, 0x5c, 0x16, 0x15, 0x21, 0x5f, 0x69, 0x0f, 0xea, 0xfd, 0x6e, 0xb7, 0xdf, 0xe4, 0x16,
0xd0, 0x2d, 0x58, 0xeb, 0x0b, 0xad, 0x46, 0xa3, 0x2e, 0x48, 0xe5, 0x6a, 0xbf, 0xd5, 0xed, 0x88,
0xdc, 0x22, 0x5f, 0x80, 0xbc, 0xef, 0x6e, 0xf8, 0x29, 0x14, 0x23, 0xbe, 0xe4, 0xda, 0xea, 0xf2,
0x59, 0xd8, 0x22, 0x56, 0xf7, 0x6f, 0xcf, 0x71, 0x77, 0x1d, 0xfb, 0x2d, 0x61, 0xf0, 0x8c, 0xa5,
0x0e, 0x6b, 0x33, 0x3e, 0xe8, 0x46, 0x36, 0x77, 0x06, 0x3b, 0xc4, 0x41, 0xbc, 0x47, 0xf6, 0xe4,
0x8b, 0xb9, 0xec, 0x49, 0x74, 0xf2, 0x47, 0xda, 0x81, 0x16, 0x93, 0x38, 0xf9, 0xe7, 0x2c, 0xac,
0x84, 0x9b, 0xfc, 0x40, 0x3e, 0x1d, 0x0a, 0xe4, 0x77, 0x20, 0xa7, 0x6a, 0x16, 0x09, 0xfc, 0x54,
0x37, 0x84, 0xf4, 0xeb, 0x44, 0x2f, 0x4d, 0x3c, 0x72, 0xc6, 0xb2, 0x6d, 0x98, 0xe7, 0x6e, 0x66,
0x2c, 0x44, 0x41, 0xdf, 0xc2, 0x0a, 0x89, 0x8d, 0x35, 0x7d, 0x24, 0x4d, 0x0c, 0xd5, 0x73, 0x01,
0x77, 0xe7, 0xe6, 0x76, 0xc4, 0x98, 0x0e, 0x0d, 0x15, 0x0b, 0x85, 0xb3, 0xa0, 0x82, 0x5e, 0x40,
0x5e, 0x76, 0xec, 0x13, 0xd6, 0x7b, 0x31, 0x46, 0x2c, 0xa4, 0x77, 0xd9, 0xb1, 0x4f, 0x68, 0xd7,
0x9c, 0xec, 0x96, 0x48, 0xd8, 0xab, 0x9c, 0xc8, 0xba, 0x8e, 0xc7, 0x34, 0x92, 0x2c, 0x0a, 0x5e,
0x15, 0xed, 0xc1, 0x92, 0x3c, 0x95, 0x2a, 0xa2, 0xe8, 0x46, 0x81, 0xdb, 0x73, 0x70, 0x15, 0x51,
0xac, 0x1e, 0x8f, 0x84, 0x45, 0x79, 0x5a, 0x11, 0x45, 0xf4, 0x2d, 0xb9, 0x03, 0x69, 0xe4, 0x5e,
0x55, 0x11, 0x45, 0x69, 0xac, 0x59, 0x76, 0x29, 0x47, 0x63, 0xf7, 0xc4, 0x8e, 0x45, 0xc6, 0x5f,
0x11, 0xc5, 0xb6, 0x66, 0xd9, 0xe8, 0x0e, 0x3d, 0xd2, 0xb1, 0x64, 0x59, 0x9a, 0x77, 0x53, 0xcf,
0x11, 0x82, 0x68, 0x69, 0x2a, 0xf1, 0x99, 0x3a, 0xfe, 0x71, 0x62, 0xe8, 0xee, 0xa5, 0xd9, 0xad,
0xf1, 0xff, 0x96, 0x86, 0x3c, 0x95, 0x8c, 0x4d, 0xac, 0x77, 0x0f, 0x16, 0xe8, 0x06, 0x30, 0x2d,
0xde, 0x99, 0x17, 0x2d, 0xe1, 0xa2, 0x3b, 0x40, 0xf9, 0xc2, 0xab, 0xcf, 0x44, 0x57, 0x8f, 0x60,
0x81, 0xce, 0x83, 0x89, 0x8a, 0x96, 0x51, 0x15, 0x66, 0x2f, 0x7e, 0xee, 0x85, 0xf4, 0x02, 0x1d,
0x9a, 0xed, 0xc1, 0xef, 0x03, 0x04, 0x5b, 0x40, 0x86, 0x11, 0xc5, 0x56, 0xcd, 0xd3, 0x23, 0x52,
0x46, 0x1c, 0x64, 0x7b, 0xe2, 0x1b, 0xf7, 0xfa, 0x42, 0x8a, 0xfc, 0x23, 0x28, 0x8a, 0xb6, 0x49,
0x44, 0x8d, 0x2d, 0x8b, 0xa8, 0x3a, 0x07, 0xd9, 0x89, 0x35, 0xf2, 0xd2, 0x64, 0x13, 0x6b, 0xc4,
0x7f, 0x0e, 0x28, 0xc2, 0x52, 0x36, 0x4d, 0xf9, 0x9c, 0xa8, 0xe4, 0xc4, 0x1a, 0xd1, 0x32, 0xbd,
0x48, 0xe5, 0x05, 0xbf, 0xce, 0xef, 0xc1, 0x4a, 0xfd, 0x14, 0xeb, 0xb6, 0x6b, 0x4d, 0x44, 0x45,
0x89, 0xd0, 0xb0, 0x4e, 0xfc, 0x10, 0x85, 0xce, 0x0a, 0x21, 0x0a, 0x2f, 0x03, 0x50, 0x7e, 0x6a,
0xd8, 0x68, 0x07, 0x96, 0x6d, 0x8b, 0x0e, 0xc8, 0x66, 0xd1, 0x4c, 0x09, 0x1e, 0x01, 0x6d, 0xc1,
0xa2, 0x3d, 0x34, 0x0c, 0xb6, 0xa7, 0xb9, 0x66, 0x4a, 0x60, 0x55, 0x54, 0x82, 0x25, 0x5b, 0xd3,
0xed, 0x17, 0xcf, 0xe9, 0xae, 0x66, 0x49, 0x4c, 0xc8, 0xea, 0x95, 0x45, 0xc8, 0x9e, 0xca, 0x63,
0xbe, 0x0d, 0x8b, 0x74, 0x08, 0xb2, 0x2d, 0x76, 0x30, 0x0b, 0x96, 0x4c, 0xfb, 0xcc, 0x3f, 0x35,
0x33, 0x31, 0x6a, 0x15, 0x4c, 0xcd, 0x3b, 0x4e, 0xf9, 0x3f, 0xc0, 0x06, 0xb1, 0xfd, 0x9a, 0x66,
0x76, 0xcd, 0x03, 0x6d, 0x8c, 0xbd, 0x85, 0x72, 0x90, 0x55, 0x35, 0x2f, 0x6e, 0x20, 0x45, 0xa2,
0x5c, 0x53, 0x13, 0x1f, 0x6b, 0x3f, 0xba, 0x9b, 0xee, 0xd6, 0xc8, 0x96, 0x18, 0xfa, 0xf8, 0xfc,
0xc0, 0x18, 0xab, 0x6e, 0x9a, 0x22, 0x27, 0x84, 0x28, 0xe4, 0xf8, 0x9a, 0x19, 0xc1, 0x9a, 0x1a,
0xba, 0x85, 0x99, 0xb9, 0x5b, 0xce, 0xd8, 0xee, 0xc9, 0x7e, 0x9e, 0x3d, 0x44, 0xe1, 0xff, 0x29,
0x0d, 0x6b, 0x02, 0x96, 0xd5, 0xf0, 0xb4, 0xbe, 0x80, 0xa5, 0x63, 0x36, 0x50, 0x3a, 0xe6, 0xfc,
0x2d, 0x2b, 0x0a, 0xb6, 0x2c, 0x6d, 0x38, 0xc6, 0x6c, 0x6c, 0xc1, 0x65, 0x26, 0x22, 0x3e, 0xd6,
0xc6, 0x58, 0x0f, 0x6e, 0xbc, 0x7e, 0x9d, 0x78, 0x51, 0x8b, 0x9c, 0x8f, 0x6c, 0xbf, 0x05, 0x56,
0x21, 0xeb, 0x1f, 0x63, 0x9d, 0xaa, 0x6e, 0x56, 0x20, 0x45, 0xbe, 0x06, 0x5c, 0x30, 0x1b, 0x77,
0x09, 0x77, 0x21, 0x6f, 0x62, 0x59, 0xad, 0x1a, 0x8e, 0x6e, 0xbb, 0x72, 0x08, 0x08, 0x44, 0x40,
0xaa, 0x6c, 0xcb, 0x74, 0xc4, 0x15, 0x81, 0x96, 0xf9, 0x7f, 0x4f, 0x03, 0x77, 0x64, 0x6a, 0x36,
0xfe, 0x99, 0x57, 0xb5, 0x45, 0x1c, 0xd3, 0x94, 0xc4, 0xba, 0x4c, 0x22, 0x6e, 0x8d, 0xa6, 0x95,
0x1c, 0xcb, 0xee, 0x18, 0x76, 0xfd, 0x47, 0xe2, 0x7d, 0xdc, 0x2c, 0x65, 0x98, 0xe6, 0xcf, 0x7b,
0x31, 0x34, 0xef, 0x0f, 0x60, 0x8d, 0xcc, 0xb8, 0xa5, 0x1f, 0x1b, 0xde, 0xac, 0x11, 0x2c, 0x4c,
0x03, 0xc9, 0xd1, 0x32, 0xff, 0x47, 0xe0, 0x02, 0x36, 0x77, 0x93, 0xe2, 0x8e, 0x01, 0xe2, 0x39,
0xb4, 0xbf, 0x63, 0xd3, 0xce, 0x0a, 0xb4, 0x4c, 0x68, 0xd4, 0x2f, 0xb1, 0x4c, 0x97, 0xef, 0x7b,
0x26, 0x86, 0xda, 0xd7, 0xdc, 0xc4, 0x70, 0x56, 0xf0, 0xaa, 0x44, 0x6c, 0x9a, 0x55, 0xd3, 0x4c,
0x37, 0x8f, 0xca, 0x2a, 0xfc, 0x6f, 0x81, 0xf3, 0xe3, 0x9c, 0x90, 0xcd, 0xb2, 0xe0, 0x26, 0xac,
0x67, 0x01, 0x05, 0x7d, 0x08, 0xab, 0xb6, 0x36, 0xc1, 0x86, 0x63, 0x8b, 0x58, 0x31, 0x74, 0xd5,
0x72, 0xdd, 0xdc, 0x0c, 0x95, 0xbf, 0x0f, 0x2b, 0x3e, 0xf6, 0x6b, 0x63, 0x38, 0x9b, 0x1c, 0xe1,
0x1f, 0x87, 0xc6, 0x7e, 0x6d, 0x0c, 0xa9, 0xbb, 0xe6, 0x20, 0xab, 0xa9, 0x2c, 0x3f, 0x53, 0x14,
0x48, 0x91, 0x7f, 0x0b, 0xa5, 0x66, 0xab, 0x26, 0x38, 0xba, 0xae, 0xe9, 0xa3, 0xd7, 0xc6, 0x90,
0x7a, 0x5b, 0x81, 0x6a, 0x7d, 0x08, 0x31, 0x4b, 0xd3, 0x2d, 0x08, 0x16, 0x4e, 0x27, 0x2d, 0xd5,
0xdb, 0x25, 0x52, 0x26, 0x82, 0xb5, 0x0c, 0xc7, 0x54, 0xb0, 0xeb, 0x75, 0xdd, 0x1a, 0xff, 0x47,
0x58, 0x0b, 0xad, 0x9c, 0xc2, 0x7d, 0x0c, 0xd9, 0x1f, 0x8c, 0xa1, 0xfb, 0x68, 0x11, 0x75, 0xbf,
0xe1, 0x89, 0x0a, 0x84, 0x8b, 0xec, 0x92, 0x66, 0x1d, 0x68, 0xba, 0x66, 0x9d, 0xf8, 0x47, 0x73,
0x88, 0x12, 0x58, 0xeb, 0x6b, 0xcb, 0xd0, 0x83, 0xc3, 0xd9, 0xa3, 0xf0, 0x7b, 0x50, 0x68, 0xd7,
0x6b, 0xfe, 0xd9, 0xff, 0x00, 0x0a, 0x43, 0x9a, 0xce, 0x56, 0x7c, 0xdb, 0x28, 0x0a, 0x40, 0x49,
0xd4, 0x38, 0xf8, 0x1f, 0xe1, 0xf6, 0x40, 0xac, 0xbc, 0x47, 0x94, 0xf2, 0x72, 0x2e, 0x4a, 0x89,
0x3e, 0x32, 0xb1, 0xab, 0x55, 0x4c, 0x9c, 0xf2, 0x97, 0x45, 0x58, 0x8d, 0x36, 0x12, 0x35, 0xc3,
0x3a, 0x0b, 0x4a, 0xdc, 0x27, 0x02, 0xb7, 0x4a, 0x04, 0x78, 0xaa, 0xa9, 0xde, 0x39, 0x73, 0xaa,
0xa9, 0xec, 0xf5, 0xc5, 0x3b, 0xf3, 0x48, 0x71, 0x2e, 0x55, 0xcb, 0x9e, 0x30, 0xa2, 0xa9, 0x5a,
0x9a, 0xb4, 0x36, 0x54, 0x47, 0xb1, 0xdd, 0x17, 0x0c, 0xaf, 0x4a, 0x05, 0x8a, 0x4d, 0x4d, 0x66,
0xb1, 0x05, 0x11, 0x28, 0xad, 0xa1, 0xfb, 0x50, 0x70, 0x2c, 0x2c, 0x55, 0x6b, 0x55, 0xa9, 0x5e,
0x3d, 0x74, 0xb3, 0xfa, 0x79, 0xc7, 0xc2, 0xd5, 0x5a, 0xb5, 0x5e, 0x3d, 0x24, 0x91, 0x00, 0x69,
0x17, 0x3a, 0xb5, 0x96, 0xe8, 0xa6, 0xf3, 0x73, 0x8e, 0x85, 0x69, 0x1d, 0x3d, 0x01, 0x8e, 0x34,
0x36, 0x5b, 0x35, 0xe9, 0x4d, 0xfd, 0x37, 0x95, 0x6e, 0x59, 0xa8, 0xb9, 0xd1, 0xc2, 0xaa, 0x63,
0xe1, 0x66, 0xab, 0xe6, 0x51, 0x11, 0x0f, 0x45, 0x8f, 0xf3, 0xb0, 0x3b, 0x10, 0xeb, 0x6e, 0x2a,
0xb4, 0xc0, 0xd8, 0x28, 0xc9, 0x9b, 0x0a, 0xe1, 0x11, 0xca, 0x47, 0x6e, 0xba, 0x33, 0xcf, 0x38,
0x84, 0xf2, 0x11, 0xda, 0x86, 0x65, 0xd2, 0x3e, 0x38, 0x14, 0xdd, 0x6c, 0xe6, 0x92, 0x63, 0xe1,
0xc1, 0xa1, 0x88, 0xee, 0x01, 0x90, 0x06, 0xb1, 0x2e, 0xb4, 0xca, 0x6d, 0x2f, 0x93, 0xef, 0x58,
0x98, 0x11, 0xd0, 0x6b, 0x58, 0x35, 0x75, 0x55, 0xb3, 0x82, 0x24, 0xf3, 0x6a, 0xcc, 0x1b, 0x59,
0x54, 0x56, 0x75, 0xfb, 0x04, 0x9b, 0x3a, 0xb6, 0x85, 0x22, 0xed, 0xea, 0x8b, 0xf0, 0x10, 0x38,
0x45, 0x55, 0x24, 0xac, 0x4c, 0x02, 0xb4, 0xb5, 0xab, 0xa3, 0xad, 0x2a, 0xaa, 0x52, 0x57, 0x26,
0x3e, 0x5c, 0x19, 0x56, 0x9c, 0x49, 0x68, 0x62, 0x5c, 0xcc, 0x2b, 0x62, 0x14, 0x6a, 0x70, 0x28,
0x0a, 0x05, 0x67, 0x12, 0xcc, 0xe8, 0x29, 0x6c, 0xaa, 0xf8, 0x54, 0x22, 0x7e, 0x51, 0x3a, 0xd1,
0x54, 0xe9, 0x1d, 0x3e, 0x1f, 0x1a, 0xb2, 0xa9, 0xd2, 0x3c, 0x47, 0x5e, 0x40, 0x2a, 0x3e, 0x25,
0xfe, 0xa7, 0xa9, 0xa9, 0x6f, 0xdc, 0x16, 0xf4, 0x31, 0xa0, 0x48, 0x97, 0x89, 0xe1, 0x58, 0x98,
0xe6, 0x39, 0xf2, 0xc2, 0x5a, 0xc0, 0x7f, 0x48, 0xc8, 0xe8, 0x97, 0xc0, 0x45, 0x98, 0x4d, 0xf9,
0x8c, 0x26, 0x36, 0xf2, 0x42, 0x31, 0x60, 0x15, 0xe4, 0x33, 0xbe, 0x07, 0x5b, 0xf1, 0xab, 0xa6,
0xd1, 0xa4, 0x61, 0xd9, 0xf4, 0xcd, 0xc3, 0x35, 0xb2, 0x1c, 0x21, 0x94, 0x55, 0xd5, 0x44, 0xb7,
0x21, 0x47, 0xf0, 0x69, 0x1b, 0xd3, 0xff, 0x65, 0x15, 0x9f, 0x92, 0x26, 0xfe, 0x1b, 0x58, 0x9f,
0x5b, 0x3c, 0xf1, 0xc8, 0x8a, 0x6a, 0x1a, 0x13, 0xd7, 0x84, 0x58, 0x85, 0xf8, 0x30, 0x72, 0x28,
0x79, 0x89, 0x66, 0x52, 0xe6, 0xff, 0x9c, 0x86, 0xfb, 0xfe, 0xce, 0xdf, 0xdc, 0x03, 0x54, 0xe6,
0x3c, 0x40, 0x34, 0xb3, 0xe9, 0x0d, 0xd1, 0xd2, 0x6d, 0x6c, 0x1e, 0xcb, 0x0a, 0x8e, 0x71, 0x06,
0x12, 0x3c, 0x62, 0xf7, 0x50, 0xac, 0x26, 0xb2, 0xa3, 0xaf, 0x60, 0x81, 0x86, 0xea, 0x2c, 0xcd,
0x7e, 0xd5, 0x41, 0x68, 0x1f, 0xfe, 0x4f, 0x59, 0xb8, 0x9d, 0x8c, 0x1c, 0x77, 0x36, 0x7e, 0xeb,
0x9e, 0x83, 0xec, 0xde, 0xf8, 0xf1, 0xd5, 0x46, 0xdb, 0x0b, 0x05, 0xec, 0xc4, 0x95, 0x4f, 0xdd,
0x17, 0xab, 0xe7, 0x9e, 0xab, 0x0e, 0x28, 0x24, 0x6e, 0xd0, 0xb1, 0x3d, 0x91, 0xad, 0x77, 0xcf,
0x5d, 0x5f, 0xe5, 0xd7, 0xc3, 0x9e, 0x70, 0x31, 0xea, 0x09, 0xbb, 0x80, 0xd4, 0x13, 0x65, 0xca,
0x5e, 0x26, 0xfc, 0xd8, 0x9e, 0x65, 0xd6, 0x1f, 0x44, 0x26, 0x59, 0x6b, 0x56, 0x7b, 0x51, 0x36,
0x21, 0xa6, 0x2b, 0x7a, 0x0c, 0x45, 0x4f, 0x0c, 0x2d, 0x7d, 0x60, 0x61, 0xd7, 0xc5, 0x45, 0x89,
0x7c, 0x15, 0x16, 0xe8, 0x1d, 0x0c, 0x60, 0xe9, 0xb0, 0xdc, 0x19, 0x94, 0xdb, 0x5c, 0x0a, 0xad,
0x41, 0x81, 0x8c, 0x21, 0x55, 0xdb, 0xad, 0x7a, 0xa7, 0xcf, 0xa5, 0x7d, 0x82, 0x58, 0x17, 0xde,
0xd6, 0x05, 0x2e, 0x43, 0xae, 0xfb, 0x83, 0xce, 0x61, 0xb9, 0x53, 0x6e, 0xd4, 0x6b, 0x5c, 0x96,
0xff, 0xbf, 0x2c, 0xa0, 0xf9, 0x59, 0x05, 0xd1, 0x7c, 0xcf, 0x30, 0xfd, 0x33, 0x2a, 0xa0, 0xa0,
0x27, 0xb0, 0xc6, 0x6a, 0xfe, 0x76, 0x7b, 0x1f, 0x77, 0xcc, 0x90, 0x69, 0xb2, 0x0d, 0xcb, 0x16,
0x8d, 0xea, 0xdc, 0x1d, 0x0f, 0x08, 0x68, 0x17, 0x38, 0xdd, 0xb0, 0xc9, 0xc5, 0xd2, 0x30, 0x35,
0x5b, 0xa6, 0x8f, 0x24, 0x2c, 0xf0, 0x9a, 0xa3, 0xa3, 0x3d, 0x40, 0xaa, 0xd1, 0x31, 0xec, 0x8a,
0xa6, 0xab, 0xc1, 0xb0, 0x4c, 0x16, 0x31, 0x2d, 0x24, 0x7a, 0x51, 0xe4, 0xf1, 0x78, 0x28, 0x2b,
0xef, 0xdc, 0x44, 0x2f, 0x3b, 0x46, 0x66, 0xa8, 0xe8, 0x39, 0x2c, 0x99, 0xb2, 0x3e, 0xc2, 0x56,
0x69, 0x99, 0x6a, 0xf1, 0xdd, 0x04, 0x91, 0x09, 0x84, 0x49, 0x70, 0x79, 0xd1, 0x01, 0x2c, 0x1b,
0x53, 0xf6, 0xc6, 0xc4, 0xee, 0xa9, 0x9f, 0x5c, 0x22, 0xe9, 0xbd, 0x2e, 0x63, 0xaf, 0xeb, 0xb6,
0x79, 0x2e, 0x78, 0x9d, 0x51, 0x15, 0x0a, 0xec, 0x21, 0xb5, 0x69, 0x58, 0xb6, 0x55, 0xca, 0x53,
0xac, 0x47, 0x49, 0x58, 0x3e, 0xa7, 0x10, 0xee, 0xb5, 0xf3, 0x15, 0xac, 0x84, 0xd1, 0xc9, 0x49,
0xfc, 0x0e, 0x9f, 0xbb, 0x72, 0x23, 0xc5, 0x68, 0x46, 0x24, 0xef, 0x66, 0x44, 0xbe, 0xca, 0xbc,
0x4a, 0xf3, 0x06, 0xac, 0xcd, 0xac, 0x91, 0x46, 0x34, 0xa4, 0xd0, 0x36, 0xce, 0xfc, 0x0c, 0x69,
0x88, 0xe2, 0xb7, 0x0f, 0xa6, 0x53, 0xec, 0x79, 0xc0, 0x10, 0xc5, 0x97, 0x39, 0x8d, 0x4e, 0xc3,
0x32, 0x27, 0x04, 0xfe, 0x15, 0x6c, 0xc4, 0xad, 0x88, 0xde, 0x4a, 0x65, 0xc5, 0xbf, 0x95, 0xca,
0x0a, 0x8d, 0xfa, 0xa6, 0x2e, 0x7e, 0x46, 0x9b, 0xf2, 0xcb, 0xb0, 0x58, 0x9f, 0x4c, 0xed, 0xf3,
0xdd, 0x57, 0xa1, 0xef, 0x1a, 0xe6, 0x3f, 0x9f, 0x40, 0xcb, 0x90, 0xed, 0x94, 0x7b, 0x5c, 0x0a,
0xe5, 0x60, 0xa1, 0x57, 0xee, 0x0c, 0xb8, 0x34, 0x5a, 0x82, 0x4c, 0xa3, 0xc3, 0x65, 0x76, 0x5f,
0xc3, 0x66, 0x6c, 0x2e, 0x14, 0xad, 0x40, 0x4e, 0xac, 0x7f, 0x37, 0xa8, 0x77, 0xaa, 0x75, 0x2e,
0x45, 0x10, 0xca, 0x9d, 0x1a, 0xeb, 0xd7, 0x25, 0x66, 0x83, 0x60, 0xb5, 0xfe, 0x7d, 0xb9, 0xda,
0x97, 0x7c, 0xa6, 0xec, 0xee, 0xa7, 0xc0, 0xcd, 0xe6, 0x35, 0x09, 0xff, 0xc0, 0x1d, 0xb9, 0xd6,
0x3d, 0xea, 0x70, 0x69, 0x02, 0xd5, 0x3d, 0x38, 0xe0, 0x32, 0xbb, 0x9f, 0x01, 0x04, 0x79, 0x4c,
0x62, 0xb5, 0x42, 0x4b, 0x6c, 0x75, 0x1a, 0x2c, 0x45, 0x77, 0x50, 0x6e, 0xb7, 0x49, 0x85, 0xa6,
0xe8, 0x2a, 0xdd, 0x7e, 0x93, 0xcb, 0xec, 0xfe, 0x57, 0x06, 0x96, 0xdd, 0xe4, 0x19, 0xca, 0xc3,
0x62, 0x67, 0x70, 0x28, 0x3d, 0xe5, 0x52, 0x5e, 0x71, 0x9f, 0x4b, 0x7b, 0xc5, 0x67, 0x5c, 0xc6,
0x2b, 0x3e, 0xe7, 0xb2, 0x5e, 0xf1, 0x0b, 0x6e, 0xc1, 0x2b, 0xbe, 0xe0, 0x16, 0xbd, 0xe2, 0x4b,
0x6e, 0xc9, 0x2b, 0xbe, 0xe2, 0x96, 0xbd, 0xe2, 0x97, 0x5c, 0x8e, 0xcc, 0x88, 0x0e, 0xf1, 0x39,
0x97, 0xf7, 0xcb, 0x4f, 0x39, 0xf0, 0xcb, 0xfb, 0x5c, 0xc1, 0x2f, 0x3f, 0xe3, 0x56, 0xfc, 0xf2,
0x73, 0xae, 0xe8, 0x97, 0xbf, 0xe0, 0x56, 0xfd, 0xf2, 0x0b, 0x6e, 0xcd, 0x2f, 0xbf, 0xe4, 0x38,
0xbf, 0xfc, 0x8a, 0x5b, 0xf7, 0xcb, 0x5f, 0x72, 0xc8, 0x2b, 0xef, 0x7f, 0xce, 0xdd, 0xf2, 0xcb,
0x4f, 0xb9, 0x0d, 0xbf, 0xbc, 0xcf, 0x6d, 0xfa, 0xe5, 0x67, 0xdc, 0x96, 0x5f, 0x7e, 0xce, 0x6d,
0xfb, 0xe5, 0x2f, 0xb8, 0x92, 0x5f, 0x7e, 0xc1, 0xdd, 0xf6, 0xcb, 0x2f, 0xb9, 0x1d, 0xbf, 0xfc,
0x8a, 0xbb, 0xe3, 0x97, 0xbf, 0xe4, 0xee, 0x7a, 0xe5, 0x67, 0x9f, 0x73, 0xf7, 0x76, 0x3f, 0x85,
0x95, 0x70, 0xe2, 0x91, 0x08, 0xad, 0xdd, 0x3d, 0x62, 0x72, 0x6c, 0xb6, 0x1a, 0x4d, 0x2e, 0x4d,
0xd8, 0xfb, 0xdd, 0x46, 0xa3, 0x5d, 0xe7, 0x32, 0xbb, 0x35, 0x58, 0x9b, 0x49, 0xa7, 0x11, 0x19,
0x0e, 0x3a, 0x6f, 0x3a, 0x44, 0xe6, 0x29, 0xa2, 0x05, 0xe5, 0x1e, 0x93, 0xbd, 0xd8, 0x2f, 0x73,
0x19, 0x74, 0x0b, 0xd6, 0xc4, 0x7e, 0x59, 0x3a, 0x28, 0xb7, 0xda, 0xdd, 0xb7, 0x75, 0x41, 0x2a,
0xf7, 0xb8, 0xec, 0x6e, 0x0d, 0x8a, 0x91, 0xac, 0x12, 0xda, 0x84, 0x75, 0xc2, 0xd5, 0xe9, 0xf6,
0xa5, 0x6a, 0xb7, 0xd3, 0xa9, 0x57, 0xfb, 0xf5, 0x1a, 0x13, 0x78, 0xb9, 0x27, 0x0d, 0x08, 0xe0,
0x3a, 0x14, 0x09, 0x47, 0xd0, 0x9a, 0xd9, 0xfd, 0x90, 0xe5, 0x16, 0xbd, 0xe4, 0x1c, 0x51, 0xe4,
0xa3, 0x5e, 0x79, 0x5f, 0xea, 0x89, 0x6f, 0xd8, 0xfc, 0xbb, 0xbd, 0x7a, 0x87, 0x4b, 0xef, 0xfe,
0x15, 0x70, 0xb3, 0xf7, 0x65, 0x32, 0xbf, 0xfe, 0x21, 0x51, 0x57, 0x0e, 0x56, 0x2a, 0x65, 0xb1,
0x29, 0x89, 0x55, 0xa1, 0xd5, 0xeb, 0x8b, 0xec, 0xe0, 0x20, 0x51, 0xad, 0x47, 0xc8, 0xec, 0xff,
0xe7, 0x3e, 0x2c, 0xf5, 0x9e, 0x1f, 0x75, 0x7a, 0x4f, 0xd1, 0x31, 0x3c, 0x6a, 0x60, 0xfb, 0x92,
0xaf, 0x3d, 0x50, 0xf4, 0x78, 0x26, 0x76, 0xbb, 0x73, 0x9d, 0xef, 0xc3, 0xf8, 0x14, 0xfa, 0x53,
0x1a, 0x1e, 0xb3, 0x18, 0xe4, 0x92, 0xb1, 0xae, 0x83, 0x7b, 0xdd, 0x49, 0xbc, 0x85, 0xdb, 0xe1,
0xc5, 0x46, 0x3f, 0x38, 0x8b, 0x5b, 0xe4, 0x55, 0xbe, 0x63, 0xe3, 0x53, 0xe8, 0x07, 0xb8, 0x3b,
0xb3, 0xb6, 0x28, 0xf4, 0x55, 0x60, 0xae, 0x3a, 0xd6, 0xf7, 0xb0, 0x23, 0x86, 0xd6, 0x30, 0xf3,
0x1d, 0xdc, 0xe3, 0xab, 0x7c, 0x97, 0xb6, 0x13, 0xb3, 0x54, 0x3e, 0x85, 0x7e, 0x07, 0xdb, 0x33,
0xab, 0x08, 0x62, 0x88, 0x8b, 0x3f, 0x2c, 0xdc, 0xb9, 0xa4, 0x9d, 0x4f, 0xa1, 0xdf, 0xc3, 0x16,
0x89, 0x7a, 0xf1, 0x3c, 0xf6, 0x27, 0xf1, 0x7d, 0xe3, 0x43, 0xe6, 0x84, 0xa9, 0xff, 0x16, 0x76,
0x1a, 0xd8, 0xa6, 0x03, 0xa8, 0xf3, 0x23, 0x44, 0xb3, 0xbf, 0x91, 0xe4, 0xe8, 0x15, 0x66, 0xfe,
0xd7, 0x70, 0xcf, 0x7d, 0xc4, 0xf9, 0x59, 0xe0, 0xbf, 0x23, 0xf0, 0x63, 0xcc, 0xbe, 0x3d, 0xbd,
0x2e, 0x7c, 0xfc, 0x6e, 0x08, 0x70, 0x9f, 0x82, 0x79, 0x31, 0xff, 0x4f, 0x81, 0xd9, 0x87, 0x3b,
0x6d, 0xcd, 0x4a, 0xdc, 0xe2, 0x38, 0xe3, 0x79, 0x90, 0x3c, 0x08, 0xcb, 0x3b, 0xa7, 0xd0, 0x21,
0x94, 0x1a, 0xd8, 0xf6, 0xe6, 0x19, 0xb9, 0x6d, 0xc5, 0x42, 0x5e, 0x94, 0xfc, 0xe0, 0x53, 0xa8,
0x09, 0xb7, 0x18, 0xd6, 0x7b, 0x23, 0x1d, 0xc0, 0x7a, 0x03, 0xdb, 0x33, 0x09, 0x94, 0x1b, 0xe0,
0x74, 0x61, 0x5d, 0x9c, 0xc3, 0xb9, 0xa8, 0xcf, 0x65, 0x80, 0xbf, 0x86, 0xd5, 0x06, 0xb6, 0xc3,
0x49, 0xa8, 0xb8, 0x59, 0x95, 0x22, 0xb4, 0x10, 0x37, 0x43, 0x10, 0xa3, 0x08, 0x89, 0xdc, 0x09,
0xba, 0x50, 0x83, 0x95, 0x43, 0xc3, 0xd1, 0xed, 0xc1, 0xa1, 0x48, 0x23, 0xff, 0x4b, 0x12, 0x06,
0x09, 0x28, 0x3d, 0xe0, 0xa8, 0x36, 0x0d, 0xc4, 0x4a, 0xf0, 0xf5, 0x5c, 0x84, 0x33, 0x31, 0x75,
0x96, 0x80, 0xf8, 0x1d, 0x6c, 0xf8, 0x5e, 0x20, 0x8c, 0x7a, 0x91, 0xb6, 0x5f, 0xb2, 0xdd, 0x7d,
0xcf, 0x27, 0xfe, 0xa4, 0xa8, 0x6f, 0x08, 0x6a, 0x60, 0xf3, 0x57, 0x45, 0x8d, 0x5f, 0x75, 0x1b,
0x4a, 0x11, 0x6b, 0x7f, 0x3f, 0xb4, 0x0e, 0x6c, 0x06, 0x76, 0x1e, 0x86, 0xba, 0xb1, 0x85, 0xaf,
0xb0, 0x4c, 0xb0, 0x7b, 0x43, 0xbb, 0x17, 0x9f, 0xa1, 0x75, 0xe5, 0xbc, 0x73, 0x37, 0xa9, 0xd9,
0x72, 0xc6, 0x36, 0x85, 0x5b, 0x0b, 0xc3, 0xbd, 0x36, 0x86, 0x97, 0x21, 0x26, 0xa7, 0x84, 0xa9,
0xa7, 0xdc, 0x6c, 0xb6, 0x6a, 0x44, 0x69, 0xfc, 0x3c, 0x31, 0xcb, 0x2a, 0x27, 0xf7, 0xba, 0x74,
0x8a, 0x75, 0x40, 0xcd, 0x56, 0xad, 0x2a, 0xeb, 0x0a, 0x1e, 0x07, 0xb3, 0xbc, 0x00, 0x30, 0x49,
0x10, 0xdb, 0x6c, 0x6a, 0x6e, 0x16, 0xdd, 0xe7, 0x8f, 0x17, 0xc5, 0xbd, 0x44, 0x7c, 0x22, 0x4e,
0x3e, 0x85, 0x2a, 0xb0, 0xe5, 0x4f, 0xab, 0x3c, 0x1e, 0x5f, 0x02, 0x97, 0x14, 0x21, 0x6c, 0x46,
0xe6, 0xe4, 0x65, 0xf6, 0x2f, 0x5a, 0xdd, 0x07, 0xb3, 0x4d, 0xb1, 0xaf, 0x02, 0x74, 0x82, 0x85,
0x03, 0xd1, 0x7f, 0x35, 0x9a, 0x11, 0xeb, 0xec, 0x6b, 0x52, 0xc2, 0x04, 0xdf, 0x00, 0x1c, 0x88,
0xde, 0x03, 0x16, 0x8a, 0x4a, 0x6a, 0xe6, 0x95, 0x6d, 0x66, 0xc7, 0x66, 0x5f, 0xbd, 0xa8, 0x04,
0x8a, 0x07, 0x62, 0x03, 0xdb, 0xde, 0x5b, 0xcf, 0x0c, 0xde, 0xcc, 0x4b, 0xd1, 0x0c, 0xde, 0xec,
0x03, 0x11, 0x9f, 0x42, 0x7f, 0x80, 0xcd, 0x03, 0xb1, 0x6a, 0x62, 0xd9, 0xc6, 0x91, 0xb7, 0x42,
0x34, 0xf3, 0xe9, 0x63, 0xcc, 0x4b, 0xe5, 0x0e, 0x7f, 0x11, 0x8b, 0x3f, 0xc2, 0xaf, 0xa1, 0x40,
0x5f, 0x3f, 0xdb, 0x34, 0x71, 0x33, 0x23, 0x95, 0xf0, 0x13, 0xef, 0xec, 0xf6, 0x91, 0x26, 0x3e,
0xf5, 0x79, 0x1a, 0x35, 0xa0, 0x50, 0x57, 0x4e, 0xfc, 0xd7, 0xaf, 0x8b, 0xfc, 0xc7, 0x05, 0x6d,
0x7c, 0x0a, 0xb5, 0x00, 0x31, 0x87, 0x14, 0xf9, 0x58, 0x22, 0xf9, 0x79, 0x7c, 0x67, 0x2b, 0xfe,
0x89, 0x9e, 0x4f, 0xa1, 0xaf, 0x61, 0xa5, 0x81, 0xed, 0xe0, 0x69, 0x3f, 0x4e, 0x5f, 0x93, 0x7b,
0x1f, 0xc0, 0x16, 0xdb, 0x0e, 0x9f, 0x58, 0x3d, 0x61, 0x69, 0x9f, 0xeb, 0xe1, 0x08, 0xb0, 0x4e,
0x9d, 0xe2, 0x91, 0x76, 0x1c, 0xac, 0xe7, 0x97, 0x33, 0xec, 0x49, 0x5f, 0xa4, 0x24, 0x1e, 0x81,
0x9b, 0xfe, 0x81, 0x15, 0xc1, 0xbd, 0x68, 0xdf, 0x93, 0xf7, 0x90, 0x22, 0x96, 0xc2, 0xe7, 0xd5,
0x95, 0x41, 0x93, 0xd7, 0xdd, 0x26, 0x88, 0xc1, 0x59, 0x75, 0x65, 0xc4, 0xf8, 0x15, 0x1f, 0xc2,
0xed, 0xc8, 0x61, 0xf5, 0x9e, 0x70, 0x5d, 0x26, 0xdc, 0x98, 0xa9, 0xdd, 0xf0, 0xb8, 0x92, 0xe0,
0x01, 0x9b, 0x5a, 0x72, 0x36, 0xfb, 0x8a, 0x99, 0xf1, 0x84, 0x19, 0x1b, 0xf0, 0xcb, 0x06, 0xb6,
0xcb, 0xe3, 0xf1, 0xe5, 0x09, 0xf9, 0xb8, 0x25, 0xec, 0x45, 0xb3, 0x89, 0x97, 0x61, 0xf0, 0x29,
0x34, 0x86, 0xc7, 0xa1, 0x10, 0x3b, 0x79, 0xb4, 0x8b, 0x36, 0xff, 0x8a, 0x4b, 0xe6, 0x53, 0x48,
0x71, 0xaf, 0x1e, 0xc9, 0xe3, 0xc4, 0xa7, 0xfa, 0xaf, 0x65, 0x36, 0x3f, 0x00, 0xef, 0x9b, 0xcd,
0xcf, 0xbd, 0xa0, 0xdf, 0xc0, 0x07, 0x61, 0x83, 0xba, 0xd9, 0x70, 0xf1, 0xcb, 0xa0, 0xd0, 0x81,
0x65, 0xfd, 0x94, 0xd0, 0xbf, 0x87, 0x5f, 0x04, 0x76, 0x71, 0x3d, 0x0d, 0xbb, 0x82, 0x91, 0x08,
0x70, 0x27, 0xa4, 0x52, 0x73, 0xbf, 0xdc, 0xb8, 0x3c, 0x3c, 0x99, 0xed, 0x42, 0x0d, 0xcf, 0xbd,
0x65, 0xcf, 0xb6, 0x09, 0x78, 0x3a, 0x96, 0x95, 0xd9, 0x78, 0x60, 0x96, 0xeb, 0xf2, 0x01, 0x7e,
0x07, 0xb7, 0xe3, 0x07, 0x28, 0xab, 0xea, 0x7b, 0x83, 0xff, 0x8d, 0x97, 0x00, 0x9a, 0x9f, 0xfd,
0xc4, 0x38, 0x7d, 0xff, 0xc9, 0x47, 0x6e, 0xdf, 0xb3, 0xed, 0x37, 0x96, 0x63, 0x1b, 0x36, 0x29,
0xe2, 0x9c, 0x04, 0x2f, 0x99, 0x6e, 0xbc, 0xce, 0x0d, 0xe1, 0x17, 0x61, 0x4b, 0x49, 0x92, 0xe3,
0x45, 0xca, 0x7c, 0x85, 0x7d, 0x7e, 0x70, 0xd1, 0x18, 0x44, 0x94, 0xef, 0x85, 0xdf, 0x23, 0x72,
0x0c, 0x4c, 0x72, 0x6e, 0x63, 0xae, 0x6f, 0x89, 0xdf, 0xc1, 0xf6, 0x91, 0xac, 0xd9, 0x71, 0xdf,
0x9a, 0x5f, 0xfa, 0xeb, 0x8d, 0x04, 0xc8, 0x16, 0xdc, 0x3a, 0xd0, 0x4c, 0x3c, 0xf7, 0x19, 0xed,
0x45, 0x1f, 0xfa, 0x27, 0x42, 0x6d, 0xb0, 0xfd, 0x9c, 0xf9, 0xa9, 0xf8, 0x45, 0xbf, 0x64, 0x4e,
0x80, 0x7a, 0x0b, 0xb7, 0xe8, 0xa6, 0xcd, 0x20, 0x7d, 0x34, 0x13, 0x65, 0x27, 0xff, 0xe8, 0x3a,
0x31, 0xf1, 0xb4, 0xed, 0x3b, 0xfb, 0x19, 0xec, 0xab, 0xdf, 0xc0, 0xa3, 0x1d, 0xf9, 0x14, 0x3a,
0x82, 0x9d, 0xb0, 0x22, 0xfd, 0x74, 0xc0, 0x1d, 0x02, 0x1c, 0x68, 0xd0, 0x35, 0x80, 0x93, 0xf4,
0xa7, 0x14, 0x58, 0xfe, 0x0c, 0xda, 0x0d, 0xcd, 0xfe, 0x6b, 0xc8, 0xd5, 0x2a, 0x15, 0x59, 0x79,
0xe7, 0x4c, 0x6f, 0x30, 0xa1, 0x6f, 0x20, 0x5f, 0xab, 0x08, 0xd8, 0x22, 0x13, 0xba, 0x51, 0x00,
0xb8, 0x11, 0xac, 0xc7, 0xbf, 0x28, 0xde, 0xd8, 0x85, 0x45, 0xd2, 0x15, 0xc1, 0xaf, 0x06, 0xde,
0xc3, 0x25, 0xde, 0x0a, 0xf0, 0xbc, 0x5d, 0xba, 0x29, 0xda, 0x70, 0x89, 0xfe, 0x31, 0xc3, 0xb3,
0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x96, 0xc4, 0xbb, 0x95, 0xa6, 0x41, 0x00, 0x00,
// 4874 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x7c, 0xc9, 0x73, 0x23, 0x47,
0x76, 0x37, 0x16, 0x2e, 0xc0, 0x03, 0x41, 0x16, 0xb3, 0x9b, 0x24, 0x9a, 0xbd, 0xd7, 0xb4, 0x34,
0x2d, 0x4a, 0xa2, 0x46, 0x54, 0x4f, 0x4b, 0xa3, 0x91, 0x3e, 0x0d, 0x36, 0x02, 0xe8, 0x06, 0x01,
0xa8, 0x0a, 0x68, 0x6a, 0xb6, 0xaf, 0xa6, 0x50, 0x95, 0x04, 0x4b, 0x0d, 0x54, 0xc1, 0xb5, 0x90,
0xa2, 0x1d, 0x31, 0x11, 0x9e, 0x08, 0x47, 0xf8, 0xe0, 0xbb, 0x0f, 0xbe, 0xfa, 0x6a, 0x47, 0xf8,
0xe0, 0x3f, 0xca, 0x97, 0xb9, 0xf9, 0xe2, 0x8b, 0x1d, 0x99, 0x59, 0x3b, 0xaa, 0xb8, 0xb5, 0x74,
0xab, 0x7c, 0xf9, 0xf2, 0x97, 0x2f, 0xdf, 0x96, 0x99, 0x2f, 0x41, 0x02, 0x4c, 0xcc, 0xb9, 0xb2,
0x3f, 0x37, 0x0d, 0xdb, 0x40, 0xa5, 0xc1, 0x8b, 0x73, 0x7d, 0xf0, 0xa9, 0x44, 0x48, 0xfc, 0xbf,
0xe4, 0x60, 0xfd, 0x48, 0xb6, 0x6c, 0x6c, 0x0e, 0xf1, 0x6c, 0x3e, 0x95, 0x6d, 0x8c, 0x5e, 0xc2,
0x8e, 0xed, 0x7e, 0x4b, 0xba, 0x3c, 0xc3, 0xd2, 0x78, 0xea, 0x60, 0xdb, 0x30, 0xec, 0xd3, 0x4a,
0xf6, 0x49, 0xf6, 0x79, 0x51, 0xd8, 0xf2, 0xba, 0x7b, 0xf2, 0x0c, 0xd7, 0xbc, 0x4e, 0xb4, 0x07,
0x9b, 0xd1, 0x71, 0x8e, 0x35, 0xae, 0xe4, 0xe8, 0x88, 0x8d, 0xf0, 0x88, 0x91, 0x35, 0x46, 0x1f,
0x01, 0x8a, 0xf2, 0x9e, 0x6b, 0x27, 0x5a, 0x25, 0x4f, 0x99, 0xb9, 0x30, 0xf3, 0xb1, 0x76, 0xa2,
0xa1, 0x2a, 0x3c, 0x8c, 0x72, 0xdb, 0xa6, 0x36, 0x99, 0x60, 0x53, 0x92, 0x15, 0x5b, 0x33, 0x74,
0xab, 0xb2, 0x44, 0x07, 0xee, 0x86, 0x07, 0x0e, 0x19, 0x4b, 0x95, 0x71, 0xa0, 0x17, 0xb0, 0x1d,
0x81, 0xb0, 0x24, 0x1d, 0xdb, 0xe7, 0x86, 0xf9, 0xb6, 0xb2, 0xfc, 0x24, 0xff, 0xbc, 0x28, 0xdc,
0x0d, 0x8f, 0xb5, 0x7a, 0xac, 0x8f, 0xff, 0x3b, 0x78, 0x20, 0xe0, 0xbf, 0x71, 0xb0, 0x65, 0x47,
0x75, 0x24, 0xda, 0x86, 0x29, 0x4f, 0x30, 0xe2, 0x61, 0x6d, 0x18, 0x1a, 0xe7, 0xea, 0x27, 0x42,
0x43, 0x9f, 0x43, 0xc1, 0xc3, 0xa6, 0xda, 0x28, 0x1d, 0xdc, 0xdf, 0x0f, 0x59, 0x60, 0x3f, 0x8a,
0x2c, 0xf8, 0xcc, 0xfc, 0xdf, 0x67, 0xe1, 0xb1, 0xaf, 0x5d, 0x57, 0x0c, 0x11, 0xdb, 0xb6, 0xa6,
0x4f, 0xac, 0x9b, 0x08, 0xf0, 0x25, 0x14, 0x2c, 0x77, 0x98, 0x2b, 0xc0, 0xa3, 0x88, 0x00, 0xfe,
0x1c, 0x1e, 0xb8, 0xe0, 0xf3, 0xf3, 0xff, 0x90, 0x85, 0xcd, 0x85, 0x7e, 0xf4, 0x6b, 0xc8, 0x29,
0x1a, 0x9d, 0xab, 0x74, 0xf0, 0x61, 0x32, 0x56, 0xdd, 0xd0, 0x6d, 0xd3, 0x98, 0x4e, 0xb1, 0xd9,
0xd1, 0x4f, 0x0c, 0x73, 0x26, 0x13, 0x33, 0x08, 0x39, 0x45, 0x43, 0x9f, 0x41, 0x4e, 0xf6, 0x04,
0xf9, 0x59, 0xf2, 0xe0, 0xea, 0x04, 0xeb, 0xfe, 0x52, 0x85, 0x9c, 0x6c, 0xf1, 0x7b, 0xb0, 0x9d,
0xdc, 0x8b, 0x38, 0xc8, 0xcf, 0x35, 0xdd, 0x5d, 0x38, 0xf9, 0xe4, 0xff, 0x27, 0x0b, 0x3b, 0x3e,
0xb3, 0x6b, 0x49, 0x11, 0x9b, 0x67, 0x9a, 0x82, 0x89, 0x1b, 0x98, 0x78, 0xa2, 0x11, 0x8d, 0x4b,
0x86, 0x29, 0x39, 0xba, 0xd7, 0xa2, 0x00, 0x05, 0xe1, 0xae, 0xd7, 0xee, 0x9b, 0x23, 0xbf, 0x8f,
0x78, 0xb6, 0x85, 0xcd, 0x33, 0x36, 0x46, 0x31, 0x74, 0x1d, 0x2b, 0x36, 0x5d, 0x41, 0x41, 0xd8,
0x60, 0x1d, 0x7d, 0xb3, 0xce, 0xc8, 0xe8, 0x2b, 0x58, 0xb2, 0x2f, 0xe6, 0x98, 0xfa, 0xf2, 0xfa,
0xc1, 0xf3, 0xe4, 0x05, 0x46, 0xa5, 0x1a, 0x5e, 0xcc, 0xb1, 0x40, 0x47, 0xa1, 0x47, 0x50, 0x9a,
0xc9, 0x0a, 0x99, 0x86, 0x38, 0xa9, 0xeb, 0xd7, 0xc5, 0x99, 0xac, 0xf4, 0x4d, 0x6a, 0xcb, 0xc7,
0x50, 0x1a, 0x9b, 0x9a, 0x3a, 0x61, 0x4e, 0x5c, 0x59, 0xa6, 0xfd, 0xc0, 0x48, 0x84, 0x81, 0xff,
0xaf, 0x25, 0xb8, 0x9f, 0x60, 0x04, 0x5f, 0x5d, 0x15, 0x58, 0x9d, 0x1b, 0xe7, 0xd8, 0xc4, 0xaa,
0xbb, 0x62, 0xaf, 0x89, 0x9e, 0x40, 0xc9, 0x5d, 0x9a, 0x3c, 0x9e, 0x62, 0x77, 0x79, 0x61, 0x12,
0xfa, 0x00, 0xb8, 0x13, 0xd9, 0xb2, 0xa5, 0x30, 0x5b, 0x9e, 0x69, 0x81, 0xd0, 0xeb, 0x21, 0x56,
0x1e, 0xd6, 0x54, 0xcd, 0x52, 0x8c, 0x33, 0x6c, 0x52, 0xb6, 0x25, 0xca, 0x16, 0xa1, 0xa1, 0x5d,
0x28, 0x8c, 0x0d, 0x5d, 0xa5, 0xfd, 0xcb, 0xb4, 0xdf, 0x6f, 0xa3, 0x7d, 0xb8, 0x33, 0xd5, 0xf4,
0xb7, 0xd2, 0x14, 0x9f, 0xe1, 0xa9, 0x64, 0x61, 0xc5, 0x31, 0x35, 0xfb, 0xa2, 0xb2, 0x42, 0xd9,
0x36, 0x49, 0x57, 0x97, 0xf4, 0x88, 0x6e, 0x07, 0x3a, 0x80, 0x2d, 0xca, 0x84, 0x25, 0x4b, 0x9b,
0xcd, 0xa7, 0x58, 0x9a, 0xcb, 0x9a, 0xa9, 0xe9, 0x93, 0xca, 0x2a, 0x1d, 0x71, 0x87, 0x75, 0x8a,
0xb4, 0x6f, 0xc0, 0xba, 0xd0, 0x16, 0xac, 0x8c, 0x4d, 0x09, 0xab, 0x66, 0xa5, 0x40, 0x99, 0x96,
0xc7, 0x66, 0x53, 0x35, 0xd1, 0x43, 0x80, 0x53, 0x6d, 0x72, 0x2a, 0x59, 0x73, 0x8c, 0xd5, 0x4a,
0x91, 0x76, 0x15, 0x09, 0x45, 0x24, 0x04, 0xd2, 0x3d, 0x35, 0xce, 0x25, 0xac, 0x63, 0x73, 0x72,
0x51, 0x01, 0xd6, 0x3d, 0x35, 0xce, 0x9b, 0x94, 0x40, 0xb4, 0x28, 0xab, 0x67, 0xd8, 0xb4, 0x35,
0x8b, 0x4c, 0x5f, 0x62, 0x5a, 0x0c, 0x91, 0xd0, 0xc7, 0x80, 0x5c, 0x51, 0x5d, 0x3d, 0xd2, 0x0c,
0xb6, 0xc6, 0x56, 0xc6, 0x7a, 0xea, 0x41, 0x07, 0x99, 0x4f, 0xc5, 0x63, 0x67, 0x22, 0xbd, 0xc5,
0x17, 0x56, 0xa5, 0xcc, 0xe6, 0xa3, 0x94, 0xd7, 0xf8, 0x82, 0xd9, 0xd3, 0xd4, 0xce, 0x64, 0xe5,
0xa2, 0xb2, 0xee, 0xda, 0x93, 0x35, 0xd1, 0xaf, 0xa0, 0xa2, 0xf8, 0xf6, 0x27, 0x73, 0x9d, 0x68,
0x13, 0xc7, 0xa4, 0x71, 0x58, 0xd9, 0xa0, 0xac, 0x3b, 0x41, 0x7f, 0x3d, 0xdc, 0x8d, 0xde, 0x83,
0x75, 0xcb, 0x96, 0x6d, 0x4d, 0x91, 0x64, 0x55, 0x35, 0xb1, 0x65, 0x55, 0x38, 0x3a, 0xa0, 0xcc,
0xa8, 0x55, 0x46, 0xe4, 0xff, 0xba, 0x04, 0x8f, 0x2e, 0x0f, 0x78, 0x22, 0x9e, 0x07, 0x41, 0xdc,
0x6d, 0x4d, 0xf0, 0x9a, 0xe8, 0x43, 0xd8, 0xf4, 0xf7, 0x15, 0xe9, 0x0c, 0x9b, 0x16, 0x91, 0x8b,
0x38, 0x5d, 0x59, 0xe0, 0xfc, 0x8e, 0x37, 0x8c, 0x4e, 0xdc, 0x69, 0x26, 0xeb, 0xce, 0x89, 0xac,
0xd8, 0x8e, 0x89, 0x4d, 0xea, 0x75, 0x65, 0x21, 0x42, 0x43, 0xc7, 0x80, 0x2c, 0x67, 0x3e, 0x37,
0x4c, 0x1b, 0xab, 0x92, 0x9f, 0xf0, 0x96, 0x68, 0x9e, 0x79, 0x7e, 0x55, 0x92, 0xf2, 0x93, 0xcd,
0xa6, 0x8f, 0xe1, 0x87, 0x8c, 0x08, 0x9c, 0xe2, 0x98, 0x26, 0xd6, 0xed, 0x00, 0x76, 0xf9, 0x86,
0xb0, 0x1b, 0x2e, 0x82, 0x0f, 0xfa, 0x3e, 0x6c, 0x28, 0x53, 0xd9, 0xb2, 0x24, 0xe3, 0x44, 0x52,
0x31, 0xc9, 0x02, 0xd4, 0xb9, 0xd7, 0x84, 0x32, 0x25, 0xf7, 0x4f, 0x1a, 0x94, 0x88, 0x10, 0x2c,
0xd1, 0x48, 0x5f, 0xa5, 0x91, 0x4e, 0xbf, 0x89, 0x4b, 0x58, 0xa7, 0x86, 0x69, 0xb3, 0x1c, 0x50,
0x60, 0x39, 0x82, 0x52, 0x68, 0x8e, 0x78, 0x0a, 0x6b, 0x9a, 0x25, 0xc9, 0x67, 0xb2, 0x36, 0xa5,
0xb1, 0xc5, 0x5c, 0xb8, 0xa4, 0x59, 0x55, 0x8f, 0x84, 0x7e, 0x0d, 0xbb, 0x16, 0xcb, 0x3d, 0xde,
0x36, 0x28, 0xb9, 0x09, 0x4e, 0x97, 0xe7, 0xae, 0x53, 0xef, 0xb8, 0x1c, 0xa1, 0x5c, 0x85, 0xcd,
0x9e, 0x3c, 0x47, 0x5f, 0xc3, 0xfd, 0x94, 0xc1, 0x73, 0x59, 0x77, 0x5c, 0x97, 0xaf, 0x24, 0x8d,
0x1e, 0xc8, 0xba, 0x83, 0x7e, 0x05, 0xf7, 0x52, 0x86, 0x4f, 0x74, 0x37, 0x0c, 0xb6, 0x93, 0x06,
0xb7, 0x74, 0xfe, 0x7b, 0xe0, 0x22, 0xdb, 0xba, 0x88, 0x6d, 0x54, 0x83, 0xf5, 0xe8, 0x56, 0x5f,
0xc9, 0x3e, 0xc9, 0x3f, 0x2f, 0x1d, 0xec, 0x46, 0x6c, 0x13, 0x61, 0x11, 0x62, 0x23, 0x88, 0x92,
0xe9, 0xee, 0xc9, 0x0e, 0x2b, 0xf4, 0x9b, 0xff, 0x37, 0x80, 0x72, 0x84, 0x0d, 0xad, 0x43, 0x4e,
0x63, 0x59, 0xb3, 0x2c, 0xe4, 0x34, 0x95, 0xf8, 0xb6, 0xa1, 0x63, 0xf1, 0xd4, 0xf0, 0xf6, 0x02,
0xaf, 0x49, 0x32, 0x9b, 0x66, 0x91, 0x51, 0x67, 0x5e, 0x82, 0xf4, 0xdb, 0xe8, 0x01, 0x14, 0xb5,
0xd9, 0xcc, 0xb1, 0x43, 0x69, 0x31, 0x20, 0xa0, 0x2e, 0xac, 0xbb, 0x6b, 0x17, 0x6d, 0x99, 0x78,
0xa1, 0xeb, 0x69, 0x7c, 0xd2, 0x6a, 0xc4, 0x08, 0x67, 0x3b, 0x23, 0xc4, 0xc6, 0xa2, 0xef, 0x00,
0x39, 0xd6, 0xb8, 0x25, 0xab, 0x13, 0xec, 0x65, 0x67, 0xac, 0x52, 0x3f, 0x2b, 0x1d, 0xbc, 0x9f,
0x84, 0x38, 0x12, 0x6b, 0x31, 0xee, 0x76, 0x46, 0x48, 0xc0, 0x40, 0x32, 0x6c, 0xf9, 0xd4, 0x06,
0x49, 0xea, 0x1e, 0xf8, 0x2a, 0x05, 0xff, 0xe0, 0x52, 0xf0, 0xf0, 0x80, 0x76, 0x46, 0x48, 0x46,
0x42, 0x1d, 0x28, 0x93, 0x43, 0x61, 0x75, 0xe0, 0x69, 0xa2, 0x40, 0xa1, 0x9f, 0x26, 0x41, 0x1f,
0x87, 0x19, 0xdb, 0x19, 0x21, 0x3a, 0x92, 0xe8, 0x81, 0x10, 0x7c, 0xf1, 0xab, 0x96, 0x68, 0xcb,
0x34, 0x2e, 0x52, 0xf4, 0x70, 0xbc, 0xc0, 0x4d, 0xf4, 0xb0, 0x88, 0x41, 0xcf, 0x56, 0xd6, 0x69,
0xd7, 0x98, 0x68, 0x3a, 0x0d, 0x9b, 0xd2, 0xc1, 0x83, 0x44, 0x4b, 0x89, 0x6d, 0xca, 0xd3, 0xce,
0x08, 0x3e, 0x3f, 0x12, 0x80, 0x53, 0x4f, 0x95, 0x79, 0x17, 0xcb, 0x16, 0x6e, 0x99, 0xb2, 0x4e,
0xd6, 0x58, 0xa2, 0x18, 0xcf, 0x92, 0x30, 0x1a, 0xed, 0xfa, 0x20, 0xcc, 0xdb, 0xce, 0x08, 0x0b,
0xe3, 0xd1, 0x21, 0xac, 0x4d, 0x4c, 0xc3, 0x99, 0x0b, 0x58, 0xc1, 0xc4, 0xfb, 0xd6, 0x28, 0xde,
0x93, 0x24, 0xbc, 0x56, 0x88, 0xaf, 0x9d, 0x11, 0x22, 0xe3, 0xd0, 0x08, 0x36, 0xc3, 0xed, 0x23,
0x67, 0x6a, 0x6b, 0x74, 0xf3, 0x29, 0x1d, 0xbc, 0x77, 0x15, 0x18, 0x65, 0x6e, 0x67, 0x84, 0x45,
0x04, 0xf4, 0x02, 0x56, 0x26, 0x73, 0xcd, 0xe8, 0xe8, 0x74, 0xb3, 0x4a, 0x09, 0xd2, 0xd6, 0xa0,
0xd3, 0xef, 0x10, 0x55, 0xb9, 0xbc, 0xa8, 0x01, 0x30, 0x96, 0xad, 0x53, 0x51, 0x31, 0xb5, 0xb9,
0x4d, 0xf7, 0xae, 0x78, 0x40, 0xb8, 0xe9, 0x80, 0x98, 0xbb, 0xe6, 0x73, 0xb6, 0xb3, 0x42, 0x68,
0x1c, 0xaa, 0x42, 0xf1, 0x54, 0x53, 0x5d, 0x10, 0x2e, 0xc1, 0x97, 0x42, 0x20, 0xed, 0x4e, 0xc3,
0xc7, 0x08, 0x46, 0x21, 0x05, 0xb6, 0x55, 0x3c, 0x9f, 0x1a, 0x17, 0x5e, 0x1a, 0xf7, 0xce, 0xd9,
0x95, 0xcd, 0x04, 0xb7, 0x67, 0x78, 0x8d, 0xc4, 0x01, 0xed, 0xac, 0x90, 0x02, 0x85, 0xf6, 0x20,
0x3f, 0x35, 0x26, 0x15, 0x44, 0x11, 0xb7, 0x13, 0x10, 0xbb, 0xc6, 0xa4, 0x9d, 0x15, 0x08, 0x13,
0x7a, 0x09, 0xab, 0x44, 0x47, 0x7d, 0xc7, 0xae, 0xdc, 0x49, 0x50, 0x28, 0xe3, 0x27, 0xfa, 0xec,
0x3b, 0x64, 0x29, 0x1e, 0x33, 0xfa, 0x0a, 0x8a, 0xd4, 0x38, 0x22, 0xd6, 0xd5, 0xca, 0xdd, 0x04,
0xbf, 0x75, 0x47, 0x7a, 0x3c, 0x44, 0x0d, 0xfe, 0x80, 0x5a, 0x11, 0x56, 0x5d, 0x53, 0xd5, 0x0a,
0xb0, 0xc2, 0x58, 0xf9, 0x1d, 0xd8, 0x4a, 0x4c, 0x4b, 0xfc, 0x7d, 0xb8, 0x97, 0x9a, 0x5d, 0xf8,
0x47, 0xf0, 0xe0, 0xb2, 0xec, 0xc0, 0x6f, 0xc3, 0xdd, 0xa4, 0x10, 0x0f, 0x81, 0x2e, 0x86, 0x2a,
0xff, 0x09, 0x6c, 0xc4, 0xe2, 0x8e, 0x64, 0xdd, 0x29, 0xf9, 0x18, 0x59, 0xee, 0x51, 0xbf, 0x28,
0x04, 0x04, 0xfe, 0x1e, 0xec, 0xa4, 0x04, 0x19, 0xdf, 0x81, 0x3b, 0x09, 0x2e, 0x4e, 0xf0, 0xa8,
0x3e, 0x42, 0x97, 0xae, 0x80, 0x80, 0xee, 0xc2, 0xf2, 0x99, 0x3c, 0x75, 0xd8, 0x86, 0xb2, 0x2c,
0xb0, 0x06, 0xff, 0x8f, 0x59, 0xa8, 0xa4, 0x85, 0xcb, 0x15, 0x80, 0xdb, 0xb0, 0x42, 0x31, 0xac,
0x4a, 0xfe, 0x49, 0xfe, 0xf9, 0xb2, 0xe0, 0xb6, 0xd0, 0x4b, 0xf7, 0xb2, 0xb1, 0x44, 0x2f, 0x1b,
0xd1, 0x98, 0x58, 0x98, 0x23, 0xb8, 0x66, 0xf0, 0xff, 0x9a, 0xf5, 0x37, 0x37, 0x16, 0x6d, 0xe8,
0x3e, 0x14, 0x89, 0x73, 0xb0, 0x23, 0x05, 0x9b, 0xbf, 0x40, 0x08, 0x74, 0xfa, 0xaf, 0x01, 0xe6,
0xce, 0x74, 0x3a, 0x9a, 0x37, 0x8c, 0x73, 0x76, 0x48, 0x5b, 0x3f, 0x78, 0x18, 0x9d, 0x8c, 0xa2,
0x0c, 0x7c, 0x26, 0x21, 0x34, 0x00, 0x7d, 0x0e, 0xc0, 0x22, 0xb9, 0xa9, 0x4e, 0xbc, 0x8b, 0xd1,
0x4e, 0xc2, 0x70, 0xd2, 0x2d, 0x84, 0x58, 0xf9, 0xcf, 0x61, 0x2b, 0x31, 0xb2, 0xd1, 0x23, 0x00,
0x8b, 0x7e, 0x85, 0xd4, 0x15, 0xa2, 0xf0, 0x2f, 0xe1, 0x6e, 0x52, 0x34, 0x5f, 0x39, 0xee, 0xbf,
0xb3, 0xf0, 0xe0, 0xb2, 0xb0, 0x25, 0x07, 0x51, 0x3b, 0xe1, 0xbe, 0x1d, 0xa6, 0xa1, 0x57, 0xae,
0x51, 0x98, 0x9e, 0x5e, 0x5e, 0x3b, 0x27, 0xec, 0x7b, 0x1f, 0x21, 0x43, 0xe1, 0xe0, 0x7e, 0x4f,
0xa8, 0x68, 0x13, 0xca, 0x87, 0xa3, 0x6e, 0x57, 0x12, 0x9b, 0xc3, 0x61, 0xa7, 0xd7, 0x12, 0xb9,
0x0c, 0x2a, 0xc1, 0x6a, 0xaf, 0x39, 0x3c, 0xee, 0x0b, 0xaf, 0xb9, 0x2c, 0x2a, 0xc0, 0xd2, 0x71,
0xe7, 0xb0, 0xc3, 0xe5, 0xd0, 0x2a, 0xe4, 0x47, 0x62, 0x8d, 0xcb, 0xa3, 0x32, 0x14, 0x6b, 0xdd,
0x51, 0x73, 0xd8, 0xef, 0x0f, 0xdb, 0xdc, 0x12, 0xba, 0x03, 0x1b, 0x43, 0xa1, 0xd3, 0x6a, 0x35,
0x05, 0xa9, 0x5a, 0x1f, 0x76, 0xfa, 0x3d, 0x91, 0x5b, 0xe6, 0x4b, 0x50, 0xf4, 0x73, 0x0b, 0xff,
0x47, 0x28, 0x47, 0x12, 0xc7, 0xe5, 0xbe, 0xf1, 0x49, 0xd8, 0xd7, 0xd7, 0x0f, 0xee, 0x2d, 0xd8,
0xb5, 0xef, 0xd8, 0x6f, 0x08, 0x83, 0x17, 0x06, 0x4d, 0xd8, 0x88, 0x65, 0x97, 0x5b, 0x45, 0xd3,
0x39, 0xec, 0x92, 0xd0, 0x7f, 0x87, 0xba, 0xc8, 0x2f, 0x17, 0xea, 0x22, 0x51, 0xe1, 0x8f, 0xb5,
0x43, 0x2d, 0xa1, 0x24, 0xf2, 0xcf, 0x79, 0x58, 0x0b, 0x77, 0xf9, 0x47, 0xf4, 0x6c, 0xe8, 0x88,
0xbe, 0x0b, 0x05, 0x55, 0xb3, 0xc8, 0x91, 0x4e, 0x75, 0x0f, 0x87, 0x7e, 0x9b, 0x38, 0xa1, 0x89,
0x27, 0xce, 0x54, 0xb6, 0x0d, 0xf3, 0xc2, 0xad, 0x79, 0x85, 0x28, 0xe8, 0x1b, 0x58, 0x23, 0xa7,
0x5e, 0x4d, 0x9f, 0x48, 0x33, 0x43, 0xf5, 0x82, 0xfb, 0xc1, 0x82, 0x6c, 0xc7, 0x8c, 0xe9, 0xc8,
0x50, 0xb1, 0x50, 0x3a, 0x0f, 0x1a, 0xe8, 0x25, 0x14, 0x65, 0xc7, 0x3e, 0x65, 0xa3, 0x97, 0x13,
0xcc, 0x42, 0x46, 0x57, 0x1d, 0xfb, 0x94, 0x0e, 0x2d, 0xc8, 0xee, 0x17, 0x39, 0xd0, 0x2a, 0xa7,
0xb2, 0xae, 0xe3, 0x29, 0x3d, 0x23, 0x96, 0x05, 0xaf, 0x89, 0xf6, 0x61, 0x45, 0x9e, 0x4b, 0x35,
0x51, 0x74, 0xcf, 0x77, 0x3b, 0x0b, 0x70, 0x35, 0x51, 0xac, 0x9f, 0x4c, 0x84, 0x65, 0x79, 0x5e,
0x13, 0x45, 0xf4, 0x0d, 0xb9, 0xdd, 0x68, 0xe4, 0xc6, 0x54, 0x13, 0x45, 0x69, 0xaa, 0x59, 0x76,
0xa5, 0x40, 0x4f, 0xe5, 0xa9, 0x03, 0xcb, 0x8c, 0xbf, 0x26, 0x8a, 0x5d, 0xcd, 0xa2, 0x2e, 0x77,
0xaa, 0xa9, 0x58, 0xb2, 0x2c, 0xcd, 0xbb, 0x83, 0x17, 0x08, 0x41, 0xb4, 0x34, 0x95, 0x64, 0x43,
0x1d, 0xff, 0x30, 0x33, 0x74, 0xf7, 0x3a, 0xec, 0xb6, 0xf8, 0x7f, 0xcf, 0x42, 0x91, 0x5a, 0xc6,
0x26, 0xa1, 0xba, 0x0f, 0x4b, 0x54, 0x01, 0x59, 0xaa, 0x80, 0xdd, 0x45, 0xd3, 0x12, 0x2e, 0xaa,
0x01, 0xca, 0x17, 0x5e, 0x7d, 0x2e, 0xba, 0x7a, 0x04, 0x4b, 0x54, 0x0e, 0x66, 0x2a, 0xfa, 0x8d,
0xea, 0x10, 0xbf, 0xd2, 0xb9, 0x57, 0xcd, 0x4b, 0x7c, 0x28, 0x3e, 0x82, 0x3f, 0x00, 0x08, 0x54,
0x40, 0xa6, 0x11, 0xc5, 0x4e, 0xc3, 0xf3, 0x23, 0xf2, 0x8d, 0x38, 0xc8, 0x0f, 0xc4, 0xd7, 0xee,
0xc5, 0x84, 0x7c, 0xf2, 0x4f, 0xa1, 0x2c, 0xda, 0x26, 0x31, 0x35, 0xb6, 0x2c, 0xe2, 0xea, 0x1c,
0xe4, 0x67, 0xd6, 0xc4, 0x2b, 0x80, 0xcd, 0xac, 0x09, 0xff, 0x0b, 0x40, 0x11, 0x96, 0xaa, 0x69,
0xca, 0x17, 0xc4, 0x25, 0x67, 0xd6, 0x84, 0x7e, 0xd3, 0x2b, 0x52, 0x51, 0xf0, 0xdb, 0xfc, 0x3e,
0xac, 0x35, 0xcf, 0xb0, 0x6e, 0xbb, 0xd1, 0x44, 0x5c, 0x94, 0x18, 0x0d, 0xeb, 0x24, 0xe9, 0x50,
0xe8, 0xbc, 0x10, 0xa2, 0xf0, 0x32, 0x00, 0xe5, 0xa7, 0x81, 0x8d, 0x76, 0x61, 0xd5, 0xb6, 0xe8,
0x84, 0x4c, 0x8a, 0x76, 0x46, 0xf0, 0x08, 0x68, 0x1b, 0x96, 0xed, 0xb1, 0x61, 0x30, 0x9d, 0x16,
0xda, 0x19, 0x81, 0x35, 0x51, 0x05, 0x56, 0x6c, 0x4d, 0xb7, 0x5f, 0xbe, 0xa0, 0x5a, 0xcd, 0x93,
0xd3, 0x1e, 0x6b, 0xd7, 0x96, 0x21, 0x7f, 0x26, 0x4f, 0xf9, 0x2e, 0x2c, 0xd3, 0x29, 0x88, 0x5a,
0xec, 0x40, 0x0a, 0x56, 0x26, 0xfb, 0xc4, 0xdf, 0x0f, 0x73, 0x09, 0x6e, 0x15, 0x88, 0xe6, 0x6d,
0x94, 0xfc, 0x9f, 0xe0, 0x2e, 0x89, 0xfd, 0x86, 0x66, 0xf6, 0xcd, 0x43, 0x6d, 0x8a, 0xbd, 0x85,
0x72, 0x90, 0x57, 0x35, 0xef, 0x44, 0x40, 0x3e, 0x89, 0x73, 0xcd, 0x4d, 0x7c, 0xa2, 0xfd, 0xe0,
0x2a, 0xdd, 0x6d, 0x11, 0x95, 0x18, 0xfa, 0xf4, 0xe2, 0xd0, 0x98, 0xaa, 0x6e, 0x01, 0xa2, 0x20,
0x84, 0x28, 0x64, 0xaf, 0x8a, 0xcd, 0x60, 0xcd, 0x0d, 0xdd, 0xc2, 0x2c, 0xdc, 0x2d, 0x67, 0x6a,
0x0f, 0x64, 0xbf, 0x82, 0x1e, 0xa2, 0xf0, 0xff, 0x94, 0x85, 0x0d, 0x01, 0xcb, 0x6a, 0x58, 0xac,
0x5f, 0xc2, 0xca, 0x09, 0x9b, 0x28, 0x9b, 0xb0, 0xd9, 0x56, 0x15, 0x05, 0x5b, 0x96, 0x36, 0x9e,
0x62, 0x36, 0xb7, 0xe0, 0x32, 0x13, 0x13, 0x9f, 0x68, 0x53, 0xac, 0x07, 0x77, 0x59, 0xbf, 0x4d,
0xb2, 0xa8, 0x45, 0x36, 0x43, 0xa6, 0x6f, 0x81, 0x35, 0xc8, 0xfa, 0xa7, 0x58, 0xa7, 0xae, 0x9b,
0x17, 0xc8, 0x27, 0xdf, 0x00, 0x2e, 0x90, 0xc6, 0x5d, 0xc2, 0x03, 0x28, 0x9a, 0x58, 0x56, 0xeb,
0x86, 0xa3, 0xdb, 0xae, 0x1d, 0x02, 0x02, 0x31, 0x90, 0x2a, 0xdb, 0x32, 0x9d, 0x71, 0x4d, 0xa0,
0xdf, 0xfc, 0x7f, 0x66, 0x81, 0x3b, 0x36, 0x35, 0x1b, 0xff, 0xc4, 0xab, 0xda, 0x26, 0x89, 0x69,
0x4e, 0x4e, 0xb1, 0xcc, 0x22, 0x6e, 0x8b, 0x16, 0x8c, 0x1c, 0xcb, 0xee, 0x19, 0x76, 0xf3, 0x07,
0x92, 0x7d, 0xdc, 0xfa, 0x63, 0x98, 0xe6, 0xcb, 0xbd, 0x1c, 0x92, 0xfb, 0x3d, 0xd8, 0x20, 0x12,
0x77, 0xf4, 0x13, 0xc3, 0x93, 0x1a, 0xc1, 0xd2, 0x3c, 0xb0, 0x1c, 0xfd, 0xe6, 0xff, 0x0c, 0x5c,
0xc0, 0xe6, 0x2a, 0x29, 0x69, 0x1b, 0x20, 0x99, 0x43, 0xfb, 0x5b, 0x26, 0x76, 0x5e, 0xa0, 0xdf,
0x84, 0x46, 0xf3, 0x12, 0xab, 0x61, 0xf9, 0xb9, 0x67, 0x66, 0xa8, 0x43, 0xcd, 0x2d, 0xf9, 0xe6,
0x05, 0xaf, 0x49, 0xcc, 0xa6, 0x59, 0x0d, 0xcd, 0x74, 0x2b, 0xa4, 0xac, 0xc1, 0xff, 0x0e, 0x38,
0xff, 0x50, 0x13, 0x8a, 0x59, 0x76, 0x92, 0x09, 0xfb, 0x59, 0x40, 0x41, 0xef, 0xc3, 0xba, 0xad,
0xcd, 0xb0, 0xe1, 0xd8, 0x22, 0x56, 0x0c, 0x5d, 0xb5, 0xdc, 0x34, 0x17, 0xa3, 0xf2, 0x8f, 0x60,
0xcd, 0xc7, 0x7e, 0x65, 0x8c, 0xe3, 0x65, 0x0f, 0xfe, 0x59, 0x68, 0xee, 0x57, 0xc6, 0x98, 0xa6,
0x6b, 0x0e, 0xf2, 0x9a, 0xca, 0x2a, 0x2f, 0x65, 0x81, 0x7c, 0xf2, 0x6f, 0xa0, 0xd2, 0xee, 0x34,
0x04, 0x47, 0xd7, 0x35, 0x7d, 0xf2, 0xca, 0x18, 0xd3, 0x6c, 0x2b, 0x50, 0xaf, 0x0f, 0x21, 0xe6,
0x69, 0x21, 0x05, 0xc1, 0xd2, 0xd9, 0xac, 0xa3, 0x7a, 0x5a, 0x22, 0xdf, 0xc4, 0xb0, 0x96, 0xe1,
0x98, 0x0a, 0x76, 0xb3, 0xae, 0xdb, 0xe2, 0xff, 0x0c, 0x1b, 0xa1, 0x95, 0x53, 0xb8, 0x0f, 0x21,
0xff, 0xbd, 0x31, 0x76, 0x9f, 0x23, 0xa2, 0xe9, 0x37, 0x2c, 0xa8, 0x40, 0xb8, 0x88, 0x96, 0x34,
0xeb, 0x50, 0xd3, 0x35, 0xeb, 0xd4, 0xdf, 0x9a, 0x43, 0x94, 0x20, 0x5a, 0x5f, 0x59, 0x86, 0x1e,
0x6c, 0xce, 0x1e, 0x85, 0xdf, 0x87, 0x52, 0xb7, 0xd9, 0xf0, 0xf7, 0xfe, 0xc7, 0x50, 0x1a, 0xd3,
0x42, 0xb5, 0xe2, 0xc7, 0x46, 0x59, 0x00, 0x4a, 0xa2, 0xc1, 0xc1, 0xff, 0x00, 0xf7, 0x46, 0x62,
0xed, 0x1d, 0x4e, 0x29, 0x9f, 0x2f, 0x9c, 0x52, 0xa2, 0xcf, 0x47, 0xec, 0xd2, 0x94, 0x70, 0x4e,
0xf9, 0xeb, 0x32, 0xac, 0x47, 0x3b, 0x89, 0x9b, 0x61, 0x9d, 0x1d, 0x4a, 0xdc, 0xe2, 0xbf, 0xdb,
0x24, 0x06, 0x3c, 0xd3, 0x54, 0x6f, 0x9f, 0x39, 0xd3, 0x54, 0xf6, 0xae, 0xe2, 0xed, 0x79, 0xe4,
0x73, 0xa1, 0x08, 0xcb, 0x1e, 0x27, 0xa2, 0x45, 0x58, 0x5a, 0x8e, 0x36, 0x54, 0x47, 0xb1, 0xdd,
0xb7, 0x09, 0xaf, 0x49, 0x0d, 0x8a, 0x4d, 0x4d, 0x66, 0x67, 0x0b, 0x62, 0x50, 0xda, 0x42, 0x8f,
0xa0, 0xe4, 0x58, 0x58, 0xaa, 0x37, 0xea, 0x52, 0xb3, 0x7e, 0xe4, 0xd6, 0xeb, 0x8b, 0x8e, 0x85,
0xeb, 0x8d, 0x7a, 0xb3, 0x7e, 0x44, 0x4e, 0x02, 0xa4, 0x5f, 0xe8, 0x35, 0x3a, 0xa2, 0x5b, 0xa8,
0x2f, 0x38, 0x16, 0xa6, 0x6d, 0xf4, 0x1c, 0x38, 0xd2, 0xd9, 0xee, 0x34, 0xa4, 0xd7, 0xcd, 0xdf,
0xd6, 0xfa, 0x55, 0xa1, 0xe1, 0x9e, 0x16, 0xd6, 0x1d, 0x0b, 0xb7, 0x3b, 0x0d, 0x8f, 0x8a, 0x78,
0x28, 0x7b, 0x9c, 0x47, 0xfd, 0x91, 0xd8, 0x74, 0x8b, 0x9c, 0x25, 0xc6, 0x46, 0x49, 0x9e, 0x28,
0x84, 0x47, 0xa8, 0x1e, 0xbb, 0x85, 0xcc, 0x22, 0xe3, 0x10, 0xaa, 0xc7, 0x68, 0x07, 0x56, 0x49,
0xff, 0xe8, 0x48, 0x74, 0xeb, 0x94, 0x2b, 0x8e, 0x85, 0x47, 0x47, 0x22, 0x7a, 0x08, 0x40, 0x3a,
0xc4, 0xa6, 0xd0, 0xa9, 0x76, 0xbd, 0x1a, 0xbd, 0x63, 0x61, 0x46, 0x40, 0xaf, 0x60, 0xdd, 0xd4,
0x55, 0xcd, 0x0a, 0xca, 0xc7, 0xeb, 0x09, 0xaf, 0x5f, 0x51, 0x5b, 0x35, 0xed, 0x53, 0x6c, 0xea,
0xd8, 0x16, 0xca, 0x74, 0xa8, 0x6f, 0xc2, 0x23, 0xe0, 0x14, 0x55, 0x91, 0xb0, 0x32, 0x0b, 0xd0,
0x36, 0xae, 0x8f, 0xb6, 0xae, 0xa8, 0x4a, 0x53, 0x99, 0xf9, 0x70, 0x55, 0x58, 0x73, 0x66, 0x21,
0xc1, 0xb8, 0x84, 0xf7, 0xc1, 0x28, 0xd4, 0xe8, 0x48, 0x14, 0x4a, 0xce, 0x2c, 0x90, 0xe8, 0x53,
0xd8, 0x52, 0xf1, 0x99, 0x44, 0xf2, 0xa2, 0x74, 0xaa, 0xa9, 0xd2, 0x5b, 0x7c, 0x31, 0x36, 0x64,
0x53, 0xa5, 0x15, 0x8c, 0xa2, 0x80, 0x54, 0x7c, 0x46, 0xf2, 0x4f, 0x5b, 0x53, 0x5f, 0xbb, 0x3d,
0xe8, 0x43, 0x40, 0x91, 0x21, 0x33, 0xc3, 0xb1, 0x30, 0xad, 0x60, 0x14, 0x85, 0x8d, 0x80, 0xff,
0x88, 0x90, 0xd1, 0xcf, 0x81, 0x8b, 0x30, 0x9b, 0xf2, 0x39, 0x2d, 0x59, 0x14, 0x85, 0x72, 0xc0,
0x2a, 0xc8, 0xe7, 0xfc, 0x00, 0xb6, 0x93, 0x57, 0x4d, 0x4f, 0x93, 0x86, 0x65, 0xd3, 0xd7, 0x0c,
0xef, 0x02, 0x43, 0x08, 0x55, 0x55, 0x35, 0xd1, 0x3d, 0x28, 0x10, 0x7c, 0xda, 0xc7, 0xfc, 0x7f,
0x55, 0xc5, 0x67, 0xa4, 0x8b, 0xff, 0x1a, 0x36, 0x17, 0x16, 0x4f, 0x32, 0xb2, 0xa2, 0x9a, 0xc6,
0xcc, 0x0d, 0x21, 0xd6, 0x20, 0x39, 0x8c, 0x6c, 0x4a, 0x5e, 0x09, 0x99, 0x7c, 0x93, 0x0b, 0xff,
0x23, 0x5f, 0xf3, 0xb7, 0xcf, 0x00, 0xb5, 0x85, 0x0c, 0x10, 0xad, 0x59, 0x7a, 0x53, 0x74, 0x74,
0x1b, 0x9b, 0x27, 0xb2, 0x82, 0x13, 0x92, 0x81, 0x04, 0x4f, 0xd9, 0xa5, 0x13, 0xab, 0xa9, 0xec,
0xe8, 0x4b, 0x58, 0xa2, 0x47, 0x75, 0x56, 0x40, 0xbf, 0xee, 0x24, 0x74, 0x0c, 0xff, 0x97, 0x3c,
0xdc, 0x4b, 0x47, 0x4e, 0xda, 0x1b, 0xbf, 0x71, 0xf7, 0x41, 0x76, 0x6f, 0xfc, 0xf0, 0x7a, 0xb3,
0xed, 0x87, 0x0e, 0xec, 0x24, 0x95, 0xcf, 0xdd, 0xb7, 0xa8, 0x17, 0x5e, 0xaa, 0x0e, 0x28, 0xe4,
0xdc, 0xa0, 0x63, 0x7b, 0x26, 0x5b, 0x6f, 0x5f, 0xb8, 0xb9, 0xca, 0x6f, 0x87, 0x33, 0xe1, 0x72,
0x34, 0x13, 0xf6, 0x01, 0xa9, 0xa7, 0xca, 0x9c, 0xbd, 0x39, 0xf8, 0x67, 0x7b, 0x56, 0x33, 0x7f,
0x1c, 0x11, 0xb2, 0xd1, 0xae, 0x0f, 0xa2, 0x6c, 0x42, 0xc2, 0x50, 0xf4, 0x0c, 0xca, 0x9e, 0x19,
0x3a, 0xfa, 0xc8, 0xc2, 0x6e, 0x8a, 0x8b, 0x12, 0xf9, 0x3a, 0x2c, 0xd1, 0x3b, 0x18, 0xc0, 0xca,
0x51, 0xb5, 0x37, 0xaa, 0x76, 0xb9, 0x0c, 0xda, 0x80, 0x12, 0x99, 0x43, 0xaa, 0x77, 0x3b, 0xcd,
0xde, 0x90, 0xcb, 0xfa, 0x04, 0xb1, 0x29, 0xbc, 0x69, 0x0a, 0x5c, 0x8e, 0xdc, 0xed, 0x47, 0xbd,
0xa3, 0x6a, 0xaf, 0xda, 0x6a, 0x36, 0xb8, 0x3c, 0xff, 0xbf, 0x79, 0x40, 0x8b, 0x52, 0x05, 0xa7,
0xf9, 0x81, 0x61, 0xfa, 0x7b, 0x54, 0x40, 0x41, 0xcf, 0x61, 0x83, 0xb5, 0x7c, 0x75, 0x7b, 0x3f,
0xdb, 0x88, 0x91, 0x69, 0x19, 0x0d, 0xcb, 0x16, 0x3d, 0xd5, 0xb9, 0x1a, 0x0f, 0x08, 0x68, 0x0f,
0x38, 0xdd, 0xb0, 0xc9, 0xc5, 0xd2, 0x30, 0x35, 0x5b, 0xa6, 0xcf, 0x1f, 0xec, 0xe0, 0xb5, 0x40,
0x47, 0xfb, 0x80, 0x54, 0xa3, 0x67, 0xd8, 0x35, 0x4d, 0x57, 0x83, 0x69, 0x99, 0x2d, 0x12, 0x7a,
0xc8, 0xe9, 0x45, 0x91, 0xa7, 0xd3, 0xb1, 0xac, 0xbc, 0x75, 0x4b, 0xb8, 0x6c, 0x1b, 0x89, 0x51,
0xd1, 0x0b, 0x58, 0x31, 0x65, 0x7d, 0x82, 0xad, 0xca, 0x2a, 0xf5, 0xe2, 0x07, 0x29, 0x26, 0x13,
0x08, 0x93, 0xe0, 0xf2, 0xa2, 0x43, 0x58, 0x35, 0xe6, 0xec, 0xf5, 0x88, 0xdd, 0x53, 0x3f, 0xba,
0xc2, 0xd2, 0xfb, 0x7d, 0xc6, 0xde, 0xd4, 0x6d, 0xf3, 0x42, 0xf0, 0x06, 0xa3, 0x3a, 0x94, 0xd8,
0x13, 0x69, 0xdb, 0xb0, 0x6c, 0xab, 0x52, 0xa4, 0x58, 0x4f, 0xd3, 0xb0, 0x7c, 0x4e, 0x21, 0x3c,
0x6a, 0xf7, 0x4b, 0x58, 0x0b, 0xa3, 0x93, 0x9d, 0xf8, 0x2d, 0xbe, 0x70, 0xed, 0x46, 0x3e, 0xa3,
0x15, 0x91, 0xa2, 0x5b, 0x11, 0xf9, 0x32, 0xf7, 0x45, 0x96, 0x37, 0x60, 0x23, 0xb6, 0x46, 0x7a,
0xa2, 0x21, 0x1f, 0x5d, 0xe3, 0xdc, 0xaf, 0x7d, 0x86, 0x28, 0x7e, 0xff, 0x68, 0x3e, 0xc7, 0x5e,
0x06, 0x0c, 0x51, 0x7c, 0x9b, 0xd3, 0xd3, 0x69, 0xd8, 0xe6, 0x84, 0xc0, 0x7f, 0x01, 0x77, 0x93,
0x56, 0x44, 0x6f, 0xa5, 0xb2, 0xe2, 0xdf, 0x4a, 0x65, 0x85, 0x9e, 0xfa, 0xe6, 0x2e, 0x7e, 0x4e,
0x9b, 0xf3, 0xab, 0xb0, 0xdc, 0x9c, 0xcd, 0xed, 0x8b, 0xbd, 0x2f, 0x42, 0xbf, 0x58, 0x58, 0xfc,
0x61, 0x04, 0x5a, 0x85, 0x7c, 0xaf, 0x3a, 0xe0, 0x32, 0xa8, 0x00, 0x4b, 0x83, 0x6a, 0x6f, 0xc4,
0x65, 0xd1, 0x0a, 0xe4, 0x5a, 0x3d, 0x2e, 0xb7, 0xf7, 0x0a, 0xb6, 0x12, 0xab, 0x9c, 0x68, 0x0d,
0x0a, 0x62, 0xf3, 0xdb, 0x51, 0xb3, 0x57, 0x6f, 0x72, 0x19, 0x82, 0x50, 0xed, 0x35, 0xd8, 0xb8,
0x3e, 0x09, 0x1b, 0x04, 0xeb, 0xcd, 0xef, 0xaa, 0xf5, 0xa1, 0xe4, 0x33, 0xe5, 0xf7, 0x3e, 0x06,
0x2e, 0x5e, 0xc4, 0x24, 0xfc, 0x23, 0x77, 0xe6, 0x46, 0xff, 0xb8, 0xc7, 0x65, 0x09, 0x54, 0xff,
0xf0, 0x90, 0xcb, 0xed, 0x7d, 0x02, 0x10, 0x14, 0x2d, 0x49, 0xd4, 0x0a, 0x1d, 0xb1, 0xd3, 0x6b,
0xb1, 0x7a, 0xdc, 0x61, 0xb5, 0xdb, 0x25, 0x0d, 0x5a, 0x8f, 0xab, 0xf5, 0x87, 0x6d, 0x2e, 0xb7,
0xf7, 0x31, 0xac, 0x85, 0xab, 0x61, 0x04, 0xa9, 0xdb, 0x3f, 0x66, 0xe0, 0xed, 0x4e, 0xab, 0xcd,
0x65, 0x09, 0xca, 0xb0, 0xdf, 0x6a, 0x75, 0x9b, 0x5c, 0x6e, 0xaf, 0x01, 0x1b, 0xb1, 0x1a, 0x0f,
0x01, 0x1e, 0xf5, 0x5e, 0xf7, 0x88, 0x20, 0x19, 0x22, 0x5a, 0x75, 0xc0, 0x04, 0x12, 0x87, 0x55,
0x2e, 0x87, 0xee, 0xc0, 0x86, 0x38, 0xac, 0x4a, 0x87, 0xd5, 0x4e, 0xb7, 0xff, 0xa6, 0x29, 0x48,
0xd5, 0x01, 0x97, 0xdf, 0x6b, 0x40, 0x39, 0x52, 0xea, 0x40, 0x5b, 0xb0, 0x49, 0xb8, 0x7a, 0xfd,
0xa1, 0x54, 0xef, 0xf7, 0x7a, 0xcd, 0xfa, 0xb0, 0xd9, 0xe0, 0x32, 0xa8, 0x08, 0xcb, 0xd5, 0x81,
0x34, 0x22, 0x80, 0x9b, 0x50, 0x26, 0x1c, 0x41, 0x6f, 0x6e, 0xef, 0x7d, 0x56, 0xf0, 0xf2, 0x2a,
0x46, 0x44, 0xbb, 0xc7, 0x83, 0xea, 0x81, 0x34, 0x10, 0x5f, 0x33, 0xf9, 0xfb, 0x83, 0x66, 0x8f,
0xcb, 0xee, 0xfd, 0x3f, 0xe0, 0xe2, 0x97, 0x38, 0x22, 0xdf, 0xf0, 0x88, 0xe8, 0x90, 0x83, 0xb5,
0x5a, 0x55, 0x6c, 0x4b, 0x62, 0x5d, 0xe8, 0x0c, 0x86, 0x22, 0xcb, 0x66, 0xe4, 0xa8, 0xe5, 0x11,
0x72, 0x07, 0xff, 0xf1, 0x19, 0xac, 0x0c, 0x5e, 0x1c, 0xf7, 0x06, 0x9f, 0xa2, 0x13, 0x78, 0xda,
0xc2, 0xf6, 0x15, 0x3f, 0x2e, 0x40, 0xd1, 0x3d, 0x83, 0x38, 0xd3, 0xee, 0x4d, 0x7e, 0x8e, 0xc4,
0x67, 0xd0, 0x5f, 0xb2, 0xf0, 0x8c, 0x6d, 0x8c, 0x57, 0xcc, 0x75, 0x13, 0xdc, 0x9b, 0x0a, 0xf1,
0x06, 0xee, 0x85, 0x17, 0x1b, 0xfd, 0x7d, 0x53, 0xd2, 0x22, 0xaf, 0xf3, 0xb3, 0x29, 0x3e, 0x83,
0xbe, 0x87, 0x07, 0xb1, 0xb5, 0x45, 0xa1, 0xaf, 0x03, 0x73, 0xdd, 0xb9, 0xbe, 0x83, 0x5d, 0x31,
0xb4, 0x86, 0xd8, 0xcf, 0xae, 0x9e, 0x5d, 0xe7, 0x67, 0x50, 0xbb, 0x09, 0x4b, 0xe5, 0x33, 0xe8,
0xf7, 0xb0, 0x13, 0x5b, 0x45, 0xb0, 0xb1, 0x5d, 0xfe, 0x3b, 0xb6, 0xdd, 0x2b, 0xfa, 0xf9, 0x0c,
0xfa, 0x03, 0x6c, 0x93, 0xa3, 0x18, 0x5e, 0xc4, 0xfe, 0x28, 0x79, 0x6c, 0xf2, 0x39, 0x2e, 0x45,
0xf4, 0xdf, 0xc1, 0x6e, 0x0b, 0xdb, 0x74, 0x02, 0x75, 0x71, 0x86, 0x68, 0x49, 0x32, 0x52, 0xb1,
0xbb, 0x86, 0xe4, 0x7f, 0x84, 0x87, 0xee, 0x33, 0xc2, 0x4f, 0x02, 0xff, 0x2d, 0x81, 0x9f, 0x62,
0xf6, 0x53, 0xc7, 0x9b, 0xc2, 0x27, 0x6b, 0x43, 0x80, 0x47, 0x14, 0xcc, 0x3b, 0x88, 0xfe, 0x18,
0x98, 0x43, 0xb8, 0xdf, 0xd5, 0xac, 0x54, 0x15, 0x27, 0x05, 0xcf, 0xe3, 0xf4, 0x49, 0x58, 0x31,
0x34, 0x83, 0x8e, 0xa0, 0xd2, 0xc2, 0xb6, 0x27, 0x67, 0xe4, 0x0a, 0x90, 0x08, 0x79, 0xd9, 0x8d,
0x9c, 0xcf, 0xa0, 0x36, 0xdc, 0x61, 0x58, 0xef, 0x8c, 0x74, 0x08, 0x9b, 0x2d, 0x6c, 0xc7, 0x6e,
0xf5, 0xb7, 0xc0, 0xe9, 0xc3, 0xa6, 0xb8, 0x80, 0x73, 0xd9, 0x98, 0xab, 0x00, 0x7f, 0x03, 0xeb,
0x2d, 0x6c, 0x87, 0x2b, 0x23, 0x49, 0x52, 0x55, 0x22, 0xb4, 0x10, 0x37, 0x43, 0x10, 0xa3, 0x08,
0xa9, 0xdc, 0x29, 0xbe, 0xd0, 0x80, 0xb5, 0x23, 0xc3, 0xd1, 0xed, 0xd1, 0x91, 0x48, 0x8f, 0xa3,
0x57, 0xdc, 0x62, 0x53, 0x50, 0x06, 0xc0, 0x51, 0x6f, 0x1a, 0x89, 0xb5, 0xe0, 0xc7, 0x5a, 0x11,
0xce, 0xd4, 0x7a, 0x4e, 0x0a, 0xe2, 0xb7, 0x70, 0xd7, 0xcf, 0x02, 0x61, 0xd4, 0xcb, 0xbc, 0xfd,
0x0a, 0x75, 0x0f, 0xbd, 0x9c, 0xf8, 0xa3, 0xa2, 0xbe, 0x26, 0xa8, 0x41, 0xcc, 0x5f, 0x17, 0x35,
0x79, 0xd5, 0x5d, 0xa8, 0x44, 0xa2, 0xfd, 0xdd, 0xd0, 0x7a, 0xb0, 0x15, 0xc4, 0x79, 0x18, 0xea,
0xd6, 0x11, 0xbe, 0xc6, 0xca, 0x93, 0xee, 0xb5, 0xe1, 0x61, 0x72, 0xd9, 0xd0, 0xb5, 0xf3, 0xee,
0x83, 0xb4, 0x6e, 0xcb, 0x99, 0xda, 0x14, 0x6e, 0x23, 0x0c, 0xf7, 0xca, 0x18, 0x5f, 0x85, 0x98,
0x5e, 0xa7, 0xa4, 0x99, 0x72, 0xab, 0xdd, 0x69, 0x10, 0xa7, 0xf1, 0x8b, 0x97, 0xac, 0xd4, 0x99,
0x3e, 0xea, 0x4a, 0x11, 0x9b, 0x80, 0xda, 0x9d, 0x46, 0x5d, 0xd6, 0x15, 0x3c, 0x0d, 0xa4, 0xbc,
0x04, 0x30, 0xcd, 0x10, 0x3b, 0x4c, 0x34, 0xb7, 0xb4, 0xeb, 0xf3, 0x27, 0x9b, 0xe2, 0x61, 0x2a,
0x3e, 0x31, 0x27, 0x9f, 0x41, 0x35, 0xd8, 0xf6, 0xc5, 0xaa, 0x4e, 0xa7, 0x57, 0xc0, 0xa5, 0x9d,
0x10, 0xb6, 0x22, 0x32, 0x79, 0xe5, 0xe6, 0xcb, 0x56, 0xf7, 0x5e, 0xbc, 0x2b, 0xb1, 0x54, 0x4d,
0x05, 0x2c, 0x1d, 0x8a, 0xfe, 0x53, 0x46, 0xcc, 0xac, 0xf1, 0x27, 0x8e, 0x14, 0x01, 0x5f, 0x03,
0x1c, 0x8a, 0xde, 0xab, 0x0a, 0x8a, 0x5a, 0x2a, 0xf6, 0xf4, 0x13, 0xd3, 0x58, 0xfc, 0x29, 0x86,
0x5a, 0xa0, 0x7c, 0x28, 0xb6, 0xb0, 0xed, 0x3d, 0x40, 0xc4, 0xf0, 0x62, 0xcf, 0x17, 0x31, 0xbc,
0xf8, 0xab, 0x05, 0x9f, 0x41, 0x7f, 0x82, 0xad, 0x43, 0xb1, 0x6e, 0x62, 0xd9, 0xc6, 0x91, 0x07,
0x2c, 0x14, 0xfb, 0xa5, 0x5d, 0xc2, 0xf3, 0xd9, 0x2e, 0x7f, 0x19, 0x8b, 0x3f, 0xc3, 0x6f, 0xa0,
0x44, 0x9f, 0xe4, 0xba, 0xb4, 0x9a, 0x10, 0xb3, 0x4a, 0xf8, 0xdd, 0x31, 0xae, 0x3e, 0xd2, 0xc5,
0x67, 0x7e, 0x91, 0x45, 0x2d, 0x28, 0x35, 0x95, 0x53, 0xff, 0x49, 0xe6, 0xb2, 0xfc, 0x71, 0x49,
0x1f, 0x9f, 0x41, 0x1d, 0x40, 0x2c, 0x21, 0x45, 0x5e, 0xf0, 0xd3, 0xdf, 0x6c, 0x77, 0xb7, 0x93,
0xdf, 0x8d, 0xf9, 0x0c, 0xfa, 0x0a, 0xd6, 0x5a, 0xd8, 0x0e, 0xde, 0x9b, 0x93, 0xfc, 0x35, 0x7d,
0xf4, 0x21, 0x6c, 0x33, 0x75, 0xf8, 0xc4, 0xfa, 0x29, 0xab, 0x45, 0xdc, 0x0c, 0x47, 0x80, 0x4d,
0x9a, 0x14, 0x8f, 0xb5, 0x93, 0x60, 0x3d, 0x3f, 0x8f, 0xb1, 0xa7, 0xfd, 0x4c, 0x22, 0x75, 0x0b,
0xdc, 0xf2, 0x37, 0xac, 0x08, 0xee, 0x65, 0x7a, 0x4f, 0xd7, 0x21, 0x45, 0xac, 0x84, 0xf7, 0xab,
0x6b, 0x83, 0xa6, 0xaf, 0xbb, 0x4b, 0x10, 0x83, 0xbd, 0xea, 0xda, 0x88, 0xc9, 0x2b, 0x3e, 0x82,
0x7b, 0x91, 0xcd, 0xea, 0x1d, 0xe1, 0xfa, 0xcc, 0xb8, 0x09, 0xa2, 0xdd, 0x72, 0xbb, 0x92, 0xe0,
0x31, 0x13, 0x2d, 0xbd, 0xc4, 0x7a, 0xcd, 0x72, 0x6d, 0x8a, 0xc4, 0x06, 0xfc, 0xbc, 0x85, 0xed,
0xea, 0x74, 0x7a, 0x75, 0x95, 0x38, 0x69, 0x09, 0xfb, 0xd1, 0x12, 0xd7, 0x55, 0x18, 0x7c, 0x06,
0x4d, 0xe1, 0x59, 0xe8, 0x88, 0x9d, 0x3e, 0xdb, 0x65, 0xca, 0xbf, 0xe6, 0x92, 0xf9, 0x0c, 0x52,
0xdc, 0xab, 0x47, 0xfa, 0x3c, 0xc9, 0xf5, 0xe7, 0x1b, 0x85, 0xcd, 0xf7, 0xc0, 0xfb, 0x61, 0xf3,
0x53, 0x2f, 0xe8, 0xb7, 0xf0, 0x5e, 0x38, 0xa0, 0x6e, 0x37, 0x5d, 0xf2, 0x32, 0x28, 0x74, 0x10,
0x59, 0x3f, 0x26, 0xf4, 0x1f, 0xe0, 0x67, 0x41, 0x5c, 0xdc, 0xcc, 0xc3, 0xae, 0x11, 0x24, 0x02,
0xdc, 0x0f, 0xb9, 0xd4, 0xc2, 0x1f, 0x0a, 0x5c, 0x7d, 0x3c, 0x89, 0x0f, 0xa1, 0x81, 0xe7, 0xde,
0xb2, 0xe3, 0x7d, 0x02, 0x9e, 0x4f, 0x65, 0x25, 0x7e, 0x1e, 0x88, 0x73, 0x5d, 0x3d, 0xc1, 0xef,
0xe1, 0x5e, 0xf2, 0x04, 0x55, 0x55, 0x7d, 0x67, 0xf0, 0xff, 0xef, 0x15, 0x80, 0x16, 0xa5, 0x9f,
0x19, 0x67, 0xef, 0x2e, 0x7c, 0xe4, 0xf6, 0x1d, 0xef, 0xbf, 0xb5, 0x1d, 0xbb, 0xb0, 0x45, 0x11,
0x17, 0x2c, 0x78, 0x85, 0xb8, 0xc9, 0x3e, 0x37, 0x86, 0x9f, 0x85, 0x23, 0x25, 0xcd, 0x8e, 0x97,
0x39, 0xf3, 0x35, 0xf4, 0xfc, 0xf8, 0xb2, 0x39, 0x88, 0x29, 0xdf, 0x09, 0x7f, 0x40, 0xec, 0x18,
0x84, 0xe4, 0x82, 0x62, 0x6e, 0x1e, 0x89, 0xdf, 0xc2, 0xce, 0xb1, 0xac, 0xd9, 0x49, 0x3f, 0x6d,
0xbe, 0xf2, 0x8f, 0x05, 0x52, 0x20, 0x3b, 0x70, 0xe7, 0x50, 0x33, 0xf1, 0xc2, 0x6f, 0x3b, 0x2f,
0xfb, 0x5d, 0x79, 0x2a, 0xd4, 0x5d, 0xa6, 0xcf, 0xd8, 0x5f, 0x26, 0x5f, 0xf6, 0x87, 0xb3, 0x29,
0x50, 0x6f, 0xe0, 0x0e, 0x55, 0x5a, 0x0c, 0xe9, 0x83, 0xd8, 0x29, 0x3b, 0xfd, 0x6f, 0x7c, 0x53,
0x0b, 0x4f, 0x3b, 0x7e, 0xb2, 0x8f, 0x61, 0x5f, 0xff, 0x06, 0x1e, 0x1d, 0xc8, 0x67, 0xd0, 0x31,
0xec, 0x86, 0x1d, 0xe9, 0xc7, 0x03, 0xee, 0x11, 0xe0, 0xc0, 0x83, 0x6e, 0x00, 0x9c, 0xe6, 0x3f,
0x95, 0x20, 0xf2, 0x63, 0x68, 0xb7, 0x0c, 0xfb, 0xaf, 0xa0, 0xd0, 0xa8, 0xd5, 0x64, 0xe5, 0xad,
0x33, 0xbf, 0x85, 0x40, 0x5f, 0x43, 0xb1, 0x51, 0x13, 0xb0, 0x45, 0x04, 0xba, 0xd5, 0x01, 0xf0,
0x6e, 0xb0, 0x1e, 0xff, 0xa2, 0x78, 0xeb, 0x14, 0x16, 0x29, 0x57, 0x04, 0xbf, 0x5b, 0x7f, 0x87,
0x94, 0x78, 0x27, 0xc0, 0xf3, 0xb4, 0x74, 0x6b, 0xb4, 0x57, 0xb4, 0x8a, 0xe8, 0xff, 0x35, 0x60,
0x6b, 0xae, 0x19, 0xb7, 0xc5, 0x1a, 0xaf, 0xd0, 0xff, 0x29, 0xf0, 0xd9, 0xff, 0x05, 0x00, 0x00,
0xff, 0xff, 0x64, 0x81, 0xd3, 0x75, 0x61, 0x40, 0x00, 0x00,
}

View File

@ -117,6 +117,9 @@ service P4WNP1 {
rpc ListStoredHIDScripts(Empty) returns (StringMessageArray) {}
rpc ListStoredBashScripts(Empty) returns (StringMessageArray) {}
rpc ListStoredDBBackups(Empty) returns (StringMessageArray) {}
/* GPIO */
rpc GetAvailableGpios(Empty) returns (StringMessageArray) {}
}
/* MasterTemplates */
@ -271,40 +274,8 @@ enum GPIOInEdge {
FALLING = 1;
BOTH = 2;
}
enum GPIONum {
NUM_1 = 0;
NUM_2 = 1;
NUM_3 = 2;
NUM_4 = 3;
NUM_5 = 4;
NUM_6 = 5;
NUM_7 = 6;
NUM_8 = 7;
NUM_9 = 8;
NUM_10 = 9;
NUM_11 = 10;
NUM_12 = 11;
NUM_13 = 12;
NUM_14 = 13;
NUM_15 = 14;
NUM_16 = 15;
NUM_17 = 16;
NUM_18 = 17;
NUM_19 = 18;
NUM_20 = 19;
NUM_21 = 20;
NUM_22 = 21;
NUM_23 = 22;
NUM_24 = 23;
NUM_25 = 24;
NUM_26 = 25;
NUM_27 = 26;
NUM_28 = 27;
NUM_29 = 28;
NUM_30 = 29;
}
message TriggerGPIOIn {
GPIONum gpioNum = 1;
string gpio_name = 1;
GPIOInPullUpDown pullUpDown = 2;
GPIOInEdge gpioInEdge = 3;
}
@ -337,7 +308,7 @@ enum GPIOOutValue {
}
message ActionGPIOOut {
GPIONum gpioNum = 1;
string gpio_name = 1;
GPIOOutValue value = 2;
}
message ActionGroupSend {

View File

@ -254,6 +254,39 @@ func ConstructEventTriggerGroupReceive(groupName string, value int32) *pb.Event
}
}
func ConstructEventTriggerGpioIn(gpioName string, level bool) *pb.Event {
return &pb.Event{
Type: common_web.EVT_TRIGGER,
Values: []*pb.EventValue{
{Val: &pb.EventValue_Tint64{Tint64: int64(common_web.TRIGGER_EVT_TYPE_GPIO_IN)}},
{Val: &pb.EventValue_Tstring{Tstring: gpioName}},
{Val: &pb.EventValue_Tbool{Tbool: level}},
},
}
}
func DeconstructEventTriggerGpioIn(evt *pb.Event) (gpioName string, level bool, err error) {
e := errors.New("Malformed GpioEvent")
if evt.Type != common_web.EVT_TRIGGER {
err = e
return
}
if evTypeInt64,match := evt.Values[0].Val.(*pb.EventValue_Tint64); !match {
err = e
return
} else {
evType := common_web.EvtTriggerType(evTypeInt64.Tint64)
if evType != common_web.TRIGGER_EVT_TYPE_GPIO_IN {
err = e
return
}
}
gpioName = evt.Values[1].GetTstring()
level = evt.Values[2].GetTbool()
return
}
func DeconstructEventTriggerGroupReceive(evt *pb.Event) (groupName string, value int32, err error) {
e := errors.New("Malformed GroupReceiveEvent")
if evt.Type != common_web.EVT_TRIGGER {

View File

@ -1,86 +1,216 @@
package service
import (
"errors"
"fmt"
"periph.io/x/periph"
"periph.io/x/periph/conn/gpio"
"periph.io/x/periph/conn/gpio/gpioreg"
"periph.io/x/periph/conn/pin/pinreg"
"periph.io/x/periph/host"
"periph.io/x/periph/host/rpi"
"sync"
pb "github.com/mame82/P4wnP1_go/proto"
)
type GpioPinState byte
const (
GPIO_PIN_STATE_DISABLED GpioPinState = iota
GPIO_PIN_STATE_INPUT
GPIO_PIN_STATE_OUTPUT
//GPIO_PIN_STATE_PWM
//GPIO_PIN_STATE_CLOCK
/*
ToDo: Entprellen + StopAllEdgeDetecting (when new TriggerActionSet is deployed)
ToDo: If a single item of the trigger action set changes, all GPIOTriggers have to be re-enumearted, to assure that there's no edge detection running for a trigger which doesn't exist anymore
*/
var (
EGpioNotAvailable = errors.New("sub system GPIO not available")
EGpioPinInvalid = errors.New("invalid GPIO pin")
)
type GpioPin struct {
*sync.Mutex
Number pb.GPIONum
InUse bool
State GpioPinState
EdgeDetectState pb.GPIOInEdge
PullUpDown pb.GPIOInPullUpDown
type GpioManager struct {
availableGpioPins []gpio.PinIO
availableGpioNames []string
rootSvc *Service
edgeDetectingMutex *sync.Mutex
edgeDetecting map[gpio.PinIO]bool
IsUsable bool
*periph.State
}
var PI_GPIO_NUMS = []pb.GPIONum{
pb.GPIONum_NUM_2, //SDA1
pb.GPIONum_NUM_3, //SCL1
pb.GPIONum_NUM_4,
pb.GPIONum_NUM_5,
pb.GPIONum_NUM_6,
pb.GPIONum_NUM_7, //CE1
pb.GPIONum_NUM_8, //CE0
pb.GPIONum_NUM_9, //MISO
pb.GPIONum_NUM_10, //MOSI
pb.GPIONum_NUM_11, //SCLK
pb.GPIONum_NUM_12,
pb.GPIONum_NUM_13,
pb.GPIONum_NUM_14, //TXD0
pb.GPIONum_NUM_15, //RXD0
pb.GPIONum_NUM_16,
pb.GPIONum_NUM_17,
pb.GPIONum_NUM_18,
pb.GPIONum_NUM_19,
pb.GPIONum_NUM_20,
pb.GPIONum_NUM_21,
pb.GPIONum_NUM_22,
pb.GPIONum_NUM_23,
pb.GPIONum_NUM_24,
pb.GPIONum_NUM_25,
pb.GPIONum_NUM_26,
pb.GPIONum_NUM_27,
func (gm *GpioManager) Start() {
}
/*
var PI_GPIO_NUMS = []pb.GPIONum{
pb.GPIONum_NUM_2, //SDA1
pb.GPIONum_NUM_3, //SCL1
pb.GPIONum_NUM_4,
pb.GPIONum_NUM_17,
pb.GPIONum_NUM_27,
pb.GPIONum_NUM_22,
pb.GPIONum_NUM_10, //MOSI
pb.GPIONum_NUM_9, //MISO
pb.GPIONum_NUM_11, //SCLK
pb.GPIONum_NUM_5,
pb.GPIONum_NUM_6,
pb.GPIONum_NUM_13,
pb.GPIONum_NUM_19,
pb.GPIONum_NUM_26,
pb.GPIONum_NUM_14, //TXD0
pb.GPIONum_NUM_15, //RXD0
pb.GPIONum_NUM_18,
pb.GPIONum_NUM_23,
pb.GPIONum_NUM_24,
pb.GPIONum_NUM_25,
pb.GPIONum_NUM_8, //CE0
pb.GPIONum_NUM_7, //CE1
pb.GPIONum_NUM_12,
pb.GPIONum_NUM_16,
pb.GPIONum_NUM_20,
pb.GPIONum_NUM_21,
func (gm *GpioManager) Stop() {
}
*/
type GpioManager struct {
availableGpioPins []byte
func NewGpioManager(rootSvc *Service) (res *GpioManager) {
gm := &GpioManager{
rootSvc: rootSvc,
}
state,err := host.Init()
if err != nil {
gm.IsUsable = false
return
}
gm.State = state
gm.IsUsable = rpi.Present()
gpios := gpioreg.All()
for _,g := range gpios {
if pinreg.IsConnected(g) {
gm.availableGpioPins = append(gm.availableGpioPins,g)
gm.availableGpioNames = append(gm.availableGpioNames, g.Name())
}
}
gm.edgeDetecting = make(map[gpio.PinIO]bool)
gm.edgeDetectingMutex = &sync.Mutex{}
return gm
}
func (gm GpioManager) GetAvailableGpios() (res []gpio.PinIO, err error) {
if gm.IsUsable {
return gm.availableGpioPins,nil
}
return res,EGpioNotAvailable
}
func (gm GpioManager) GetAvailableGpioNames() (res []string, err error) {
if gm.IsUsable {
return gm.availableGpioNames,nil
}
return res,EGpioNotAvailable
}
func (gm *GpioManager) DeployGpioTrigger(in *pb.TriggerGPIOIn) (err error) {
if !gm.IsUsable {
return EGpioNotAvailable
}
p := gpioreg.ByName(in.GpioName)
if p == nil {
return EGpioPinInvalid
}
pull := gpio.Float
switch in.PullUpDown {
case pb.GPIOInPullUpDown_DOWN:
pull = gpio.PullDown
case pb.GPIOInPullUpDown_UP:
pull = gpio.PullUp
}
edge := gpio.BothEdges
switch in.GpioInEdge {
case pb.GPIOInEdge_FALLING:
edge = gpio.FallingEdge
case pb.GPIOInEdge_RISING:
edge = gpio.RisingEdge
}
// If edge detection is already running, stop it
if gm.isEdgeDetecting(p) {
gm.stopEdgeDetectionForPin(p)
}
p.In(pull,edge)
gm.edgeDetectingMutex.Lock()
gm.edgeDetecting[p] = true
gm.edgeDetectingMutex.Unlock()
go func() {
for gm.isEdgeDetecting(p) {
p.WaitForEdge(-1)
//Edge detected, check if still edge detecting before consuming
if gm.isEdgeDetecting(p) {
switch p.Read() {
case gpio.High:
fmt.Println("Gpio " + p.Name() + " changed to high")
gm.rootSvc.SubSysEvent.Emit(ConstructEventTriggerGpioIn(p.Name(), bool(gpio.High)))
case gpio.Low:
fmt.Println("Gpio " + p.Name() + " changed to low")
gm.rootSvc.SubSysEvent.Emit(ConstructEventTriggerGpioIn(p.Name(), bool(gpio.Low)))
}
} else {
//exit for loop
break
}
}
gm.edgeDetectingMutex.Lock()
delete(gm.edgeDetecting, p)
gm.edgeDetectingMutex.Unlock()
}()
return nil
}
func (gm *GpioManager) FireGpioAction(out *pb.ActionGPIOOut) (err error) {
if !gm.IsUsable {
return EGpioNotAvailable
}
p := gpioreg.ByName(out.GpioName)
if p == nil {
return EGpioPinInvalid
}
// If edge detection is already running, stop it
if gm.isEdgeDetecting(p) {
gm.stopEdgeDetectionForPin(p)
}
level := gpio.Low
switch out.Value {
case pb.GPIOOutValue_HIGH:
level = gpio.High
case pb.GPIOOutValue_TOGGLE:
if p.Read() == gpio.Low {
level = gpio.High
}
}
p.Out(level)
return nil
}
func (gm *GpioManager) isEdgeDetecting(p gpio.PinIO) bool {
fmt.Println("Check edge detection for " + p.Name())
gm.edgeDetectingMutex.Lock()
defer gm.edgeDetectingMutex.Unlock()
if _,exists := gm.edgeDetecting[p]; exists && gm.edgeDetecting[p] {
fmt.Println("Edge detection for " + p.Name() + " running")
return true
}
fmt.Println("Edge detection for " + p.Name() + " not running")
return false
}
func (gm *GpioManager) stopEdgeDetectionForPin(p gpio.PinIO) {
gm.edgeDetectingMutex.Lock()
if _,exists := gm.edgeDetecting[p]; exists {
gm.edgeDetecting[p] = false
}
gm.edgeDetectingMutex.Unlock()
//write high/low till gpio is deleted from map, to assure pending edge detection ended
for gm.isEdgeDetecting(p) {
p.Out(gpio.High)
if gm.isEdgeDetecting(p) {
p.Out(gpio.Low)
}
}
}

View File

@ -252,8 +252,18 @@ func (tam *TriggerActionManager) onUsbGadgetDisconnected(evt *pb.Event, ta *pb.T
}
func (tam *TriggerActionManager) onGpioIn(evt *pb.Event, ta *pb.TriggerAction, tt triggerType, at actionType) error {
//ToDo: only trigger if PIN matches, important: Enum values have to be parsed for matching (0 != PIN0)
evtGpioName, evtGpioLevel,err := DeconstructEventTriggerGpioIn(evt)
if err != nil { return err }
taGpioName := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioName
if taGpioName != evtGpioName {
return nil // ignore
}
tam.executeAction(evt, ta, tt, at)
fmt.Printf("Gpio in trigger '%s' new state: %v\n", evtGpioName, evtGpioLevel)
return nil
}
@ -380,10 +390,10 @@ func (tam *TriggerActionManager) executeActionGPIOOut(evt *pb.Event, ta *pb.Trig
triggerName := triggerTypeString[tt]
actionName := actionTypeString[at]
gpioNumName := pb.GPIONum_name[int32(action.GpioNum)]
gpioNumName := action.GpioName
fmt.Printf("Trigger '%s' fired -> executing action '%s' ('%s')\n", triggerName, actionName, gpioNumName)
// ToDo: Implement
tam.rootSvc.SubSysGpio.FireGpioAction(action)
}
func (tam *TriggerActionManager) executeActionGroupSend(evt *pb.Event, ta *pb.TriggerAction, tt triggerType, at actionType, action *pb.ActionGroupSend) {
@ -408,9 +418,14 @@ func (tam *TriggerActionManager) executeActionStartHidScript(evt *pb.Event, ta *
switch tt {
case triggerTypeGpioIn:
gpioPin := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioNum
gpioPinName := pb.GPIONum_name[int32(gpioPin)]
gpioPinName := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioName
preScript += fmt.Sprintf("var GPIO_PIN='%s';\n", gpioPinName)
_,level,_ := DeconstructEventTriggerGpioIn(evt)
if level {
preScript += fmt.Sprintf("var GPIO_LEVEL=true;\n")
} else {
preScript += fmt.Sprintf("var GPIO_LEVEL=false;\n")
}
case triggerTypeGroupReceiveMulti:
groupName := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.GroupName
values := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.Values
@ -479,9 +494,14 @@ func (tam *TriggerActionManager) executeActionBashScript(evt *pb.Event, ta *pb.T
switch tt {
case triggerTypeGpioIn:
gpioPin := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioNum
gpioPinName := pb.GPIONum_name[int32(gpioPin)]
gpioPinName := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioName
env = append(env, fmt.Sprintf("GPIO_PIN=%s", gpioPinName))
_,level,_ := DeconstructEventTriggerGpioIn(evt)
if level {
env = append(env, fmt.Sprintf("GPIO_LEVEL='HIGH'"))
} else {
env = append(env, fmt.Sprintf("GPIO_LEVEL='LOW'"))
}
case triggerTypeGroupReceiveMulti:
groupName := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.GroupName
values := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.Values
@ -533,9 +553,9 @@ func (tam *TriggerActionManager) executeActionLog(evt *pb.Event, ta *pb.TriggerA
switch tt {
case triggerTypeGpioIn:
gpioPin := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioNum
gpioPinName := pb.GPIONum_name[int32(gpioPin)]
logMessage += fmt.Sprintf(" (GPIO_PIN=%s)", gpioPinName)
gpioPinName := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioName
_,level,_ := DeconstructEventTriggerGpioIn(evt)
logMessage += fmt.Sprintf(" (GPIO_PIN=%s GPIO_HIGH=%v)", gpioPinName, level)
case triggerTypeGroupReceiveMulti:
groupName := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.GroupName
values := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.Values
@ -636,6 +656,11 @@ func (tam *TriggerActionManager) AddTriggerAction(ta *pb.TriggerAction) (taAdded
tam.groupReceiveSequenceCheckersMutex.Unlock()
}
//if trigger is GpioIn, configure GPIO
if triggerGpioIn,match := ta.Trigger.(*pb.TriggerAction_GpioIn); match {
tam.rootSvc.SubSysGpio.DeployGpioTrigger(triggerGpioIn.GpioIn)
}
return taAdded,nil
}

View File

@ -51,6 +51,12 @@ type server struct {
listenAddrWeb string
}
func (s *server) GetAvailableGpios(context.Context, *pb.Empty) (res *pb.StringMessageArray, err error) {
res = &pb.StringMessageArray{}
res.MsgArray,err = s.rootSvc.SubSysGpio.GetAvailableGpioNames()
return
}
func (s *server) DeployMasterTemplate(ctx context.Context, mt *pb.MasterTemplate) (e *pb.Empty, err error) {
e = &pb.Empty{}

View File

@ -121,6 +121,7 @@ type Service struct {
SubSysBluetooth *BtService
SubSysRPC *server
SubSysTriggerActions *TriggerActionManager
SubSysGpio *GpioManager
SubSysDwc2ConnectWatcher *Dwc2ConnectWatcher
}
@ -148,12 +149,16 @@ func NewService() (svc *Service, err error) {
svc.SubSysWifi = NewWifiService(svc) //Depends on NetworkSubSys
svc.SubSysTriggerActions = NewTriggerActionManager(svc) //Depends on EventManager, UsbGadgetManager (to trigger HID scripts)
svc.SubSysGpio = NewGpioManager(svc) //Depends on event subsys
svc.SubSysTriggerActions = NewTriggerActionManager(svc) //Depends on EventManager, UsbGadgetManager (to trigger HID scripts) and GpioManager
svc.SubSysDwc2ConnectWatcher = NewDwc2ConnectWatcher(svc) // Depends on EventManager, should be started before USB gadget settings are deployed (to avoid missing initial state change)
svc.SubSysBluetooth = NewBtService(svc, time.Second * 120) //Depends on NetworkSubSys (try to bring up bluetooth for up to 120s in background)
svc.SubSysRPC = NewRpcServerService(svc) //Depends on all other
return
}
@ -163,6 +168,7 @@ func (s *Service) Start() {
s.SubSysEvent.Start()
s.SubSysDwc2ConnectWatcher.Start()
s.SubSysGpio.Start()
s.SubSysLed.Start()
s.SubSysRPC.StartRpcServerAndWeb("0.0.0.0", "50051", "8000", PATH_WEBROOT) //start gRPC service
log.Println("Starting TriggerAction event listener ...")
@ -192,7 +198,7 @@ func (s *Service) Start() {
func (s *Service) Stop() {
s.SubSysTriggerActions.Stop()
s.SubSysLed.Stop()
s.SubSysGpio.Stop()
s.SubSysBluetooth.Stop()
s.SubSysDwc2ConnectWatcher.Stop()
s.SubSysEvent.Stop()

View File

@ -78,19 +78,20 @@ func generateSelectOptionsGPIOOutValue() *js.Object {
return tts
}
func generateSelectOptionsGPIONum() *js.Object {
func generateSelectOptionsGPIONames(vm *hvue.VM) *js.Object {
tts := js.Global.Get("Array").New()
type option struct {
*js.Object
Label string `js:"label"`
Value GPIONum `js:"value"`
Value string `js:"value"`
}
for _, value := range availableGPIONums {
label := gpioNumNames[value]
gpioNames := vm.Store.Get("state").Get("GpioNamesList")
for i := 0; i < gpioNames.Length(); i++ {
gpioName := gpioNames.Index(i).String()
o := option{Object:O()}
o.Value = value
o.Label = label
o.Value = gpioName
o.Label = gpioName
tts.Call("push", o)
}
return tts
@ -283,7 +284,7 @@ func InitComponentsTriggerActions() {
case ta.IsTriggerGPIOIn():
t := jsTriggerGPIOIn{Object: ta.TriggerData}
strTrigger += " ("
strTrigger += gpioNumNames[t.GpioNum]
strTrigger += t.GpioName
strTrigger += ": " + gpioInEdgeNames[t.Edge]
strTrigger += ", resistor: " + gpioInPullUpDownNames[t.PullUpDown]
strTrigger += ")"
@ -304,7 +305,7 @@ func InitComponentsTriggerActions() {
case ta.IsActionGPIOOut():
a := jsActionGPIOOut{Object: ta.ActionData}
strAction += " ("
strAction += gpioNumNames[a.GpioNum]
strAction += a.GpioName
strAction += ": " + gpioOutValueNames[a.Value]
strAction += ")"
case ta.IsActionBashScript():
@ -392,8 +393,8 @@ func InitComponentsTriggerActions() {
hvue.Computed("edge", func(vm *hvue.VM) interface{} {
return generateSelectOptionsGPIOInEdges()
}),
hvue.Computed("gpionum", func(vm *hvue.VM) interface{} {
return generateSelectOptionsGPIONum()
hvue.Computed("gpioname", func(vm *hvue.VM) interface{} {
return generateSelectOptionsGPIONames(vm)
}),
hvue.ComputedWithGetSet(
"triggerType",
@ -554,8 +555,8 @@ func InitComponentsTriggerActions() {
hvue.Computed("gpiooutvalues", func(vm *hvue.VM) interface{} {
return generateSelectOptionsGPIOOutValue()
}),
hvue.Computed("gpionum", func(vm *hvue.VM) interface{} {
return generateSelectOptionsGPIONum()
hvue.Computed("gpioname", func(vm *hvue.VM) interface{} {
return generateSelectOptionsGPIONames(vm)
}),
hvue.Computed("templatetypes", func(vm *hvue.VM) interface{} {
return generateSelectOptionsTemplateTypes()
@ -742,7 +743,7 @@ const templateTrigger = `
<q-item-tile label>GPIO Number</q-item-tile>
<q-item-tile sublabel>The number of the GPIO to monitor</q-item-tile>
<q-item-tile>
<q-select v-model="ta.TriggerData.GpioNum" :options="gpionum" inverted :disable="!ta.IsActive"></q-select>
<q-select v-model="ta.TriggerData.GpioName" :options="gpioname" inverted :disable="!ta.IsActive"></q-select>
</q-item-tile>
</q-item-main>
</q-item>
@ -810,7 +811,7 @@ const templateAction = `
<q-item-tile label>GPIO Number</q-item-tile>
<q-item-tile sublabel>The number of the GPIO to output on</q-item-tile>
<q-item-tile>
<q-select v-model="ta.ActionData.GpioNum" :options="gpionum" color="secondary" inverted :disable="!ta.IsActive"></q-select>
<q-select v-model="ta.ActionData.GpioName" :options="gpioname" color="secondary" inverted :disable="!ta.IsActive"></q-select>
</q-item-tile>
</q-item-main>
</q-item>

View File

@ -114,7 +114,7 @@ func (dst *jsTriggerAction) fromGo(src *pb.TriggerAction) {
dst.ChangeActionType(ActionGPIOOut)
dstAction := &jsActionGPIOOut{Object: dst.ActionData}
dstAction.Value = GPIOOutValue(srcAction.GpioOut.Value)
dstAction.GpioNum = GPIONum(srcAction.GpioOut.GpioNum)
dstAction.GpioName = srcAction.GpioOut.GpioName
case *pb.TriggerAction_GroupSend:
dst.ChangeActionType(ActionGroupSend)
dstAction := &jsActionGroupSend{Object: dst.ActionData}
@ -146,7 +146,7 @@ func (dst *jsTriggerAction) fromGo(src *pb.TriggerAction) {
case *pb.TriggerAction_GpioIn:
dst.ChangeTriggerType(TriggerGPIOIn)
dstTrigger := &jsTriggerGPIOIn{Object: dst.TriggerData}
dstTrigger.GpioNum = GPIONum(srcTrigger.GpioIn.GpioNum)
dstTrigger.GpioName = srcTrigger.GpioIn.GpioName
dstTrigger.Edge = GPIOInEdge(srcTrigger.GpioIn.GpioInEdge)
dstTrigger.PullUpDown = GPIOInPullUpDown(srcTrigger.GpioIn.PullUpDown)
case *pb.TriggerAction_GroupReceive:
@ -206,7 +206,7 @@ func (ta *jsTriggerAction) toGo() (res *pb.TriggerAction) {
actionData := &jsActionGPIOOut{Object: ta.ActionData}
res.Action = &pb.TriggerAction_GpioOut{
GpioOut: &pb.ActionGPIOOut{
GpioNum: pb.GPIONum(actionData.GpioNum),
GpioName: actionData.GpioName,
Value: pb.GPIOOutValue(actionData.Value),
},
}
@ -261,7 +261,7 @@ func (ta *jsTriggerAction) toGo() (res *pb.TriggerAction) {
triggerData := &jsTriggerGPIOIn{Object: ta.TriggerData}
res.Trigger = &pb.TriggerAction_GpioIn{
GpioIn: &pb.TriggerGPIOIn{
GpioNum: pb.GPIONum(triggerData.GpioNum),
GpioName: triggerData.GpioName,
PullUpDown: pb.GPIOInPullUpDown(triggerData.PullUpDown),
GpioInEdge: pb.GPIOInEdge(triggerData.Edge),
},
@ -314,7 +314,7 @@ func (ta *jsTriggerAction) ChangeActionType(newAt actionType) {
data = d.Object
case ActionGPIOOut:
d := &jsActionGPIOOut{Object:O()}
d.GpioNum = 1
d.GpioName = ""
d.Value = GPIOOutValueHigh
data = d.Object
case ActionGroupSend:
@ -381,7 +381,7 @@ func (ta *jsTriggerAction) ChangeTriggerType(newTt triggerType) {
case TriggerGPIOIn:
d := &jsTriggerGPIOIn{Object:O()}
d.Edge = GPIOInEdgeRising
d.GpioNum = 2
d.GpioName = ""
d.PullUpDown = GPIOInPullUp
data = d.Object
case TriggerGroupReceive:
@ -505,7 +505,7 @@ var availableGroupReceiveMulti = []GroupReceiveMultiType{GroupReceiveMultiType_S
type jsTriggerGPIOIn struct {
*js.Object
GpioNum GPIONum `js:"GpioNum"`
GpioName string `js:"GpioName"`
PullUpDown GPIOInPullUpDown `js:"PullUpDown"` //PullUp resistor, pull down otherwise
Edge GPIOInEdge `js:"Edge"` // 0 == GPIO.RISING, 1 == GPIO.FALLING, every value > 1 == GPIO.BOTH
}
@ -546,7 +546,7 @@ type jsActionDeploySettingsTemplate struct {
}
type jsActionGPIOOut struct {
*js.Object
GpioNum GPIONum `js:"GpioNum"`
GpioName string `js:"GpioName"`
Value GPIOOutValue `js:"Value"` //PullUp resistor, pull down otherwise
}
type GPIOOutValue int
@ -570,53 +570,6 @@ type jsActionLog struct {
*js.Object
}
type GPIONum int
const GPIO_NUM_1 = GPIONum(pb.GPIONum_NUM_1)
const GPIO_NUM_2 = GPIONum(pb.GPIONum_NUM_2)
const GPIO_NUM_3 = GPIONum(pb.GPIONum_NUM_3)
const GPIO_NUM_4 = GPIONum(pb.GPIONum_NUM_4)
const GPIO_NUM_5 = GPIONum(pb.GPIONum_NUM_5)
const GPIO_NUM_6 = GPIONum(pb.GPIONum_NUM_6)
const GPIO_NUM_7 = GPIONum(pb.GPIONum_NUM_7)
const GPIO_NUM_8 = GPIONum(pb.GPIONum_NUM_8)
const GPIO_NUM_9 = GPIONum(pb.GPIONum_NUM_9)
const GPIO_NUM_10 = GPIONum(pb.GPIONum_NUM_10)
const GPIO_NUM_11 = GPIONum(pb.GPIONum_NUM_11)
const GPIO_NUM_12 = GPIONum(pb.GPIONum_NUM_12)
const GPIO_NUM_13 = GPIONum(pb.GPIONum_NUM_13)
const GPIO_NUM_14 = GPIONum(pb.GPIONum_NUM_14)
const GPIO_NUM_15 = GPIONum(pb.GPIONum_NUM_15)
const GPIO_NUM_16 = GPIONum(pb.GPIONum_NUM_16)
const GPIO_NUM_17 = GPIONum(pb.GPIONum_NUM_17)
const GPIO_NUM_18 = GPIONum(pb.GPIONum_NUM_18)
const GPIO_NUM_19 = GPIONum(pb.GPIONum_NUM_19)
const GPIO_NUM_20 = GPIONum(pb.GPIONum_NUM_20)
var gpioNumNames = map[GPIONum]string{
GPIO_NUM_1: "GPIO 1",
GPIO_NUM_2: "GPIO 2",
GPIO_NUM_3: "GPIO 3",
GPIO_NUM_4: "GPIO 4",
GPIO_NUM_5: "GPIO 5",
GPIO_NUM_6: "GPIO 6",
GPIO_NUM_7: "GPIO 7",
GPIO_NUM_8: "GPIO 8",
GPIO_NUM_9: "GPIO 9",
GPIO_NUM_10: "GPIO 10",
GPIO_NUM_11: "GPIO 11",
GPIO_NUM_12: "GPIO 12",
GPIO_NUM_13: "GPIO 13",
GPIO_NUM_14: "GPIO 14",
GPIO_NUM_15: "GPIO 15",
GPIO_NUM_16: "GPIO 16",
GPIO_NUM_17: "GPIO 17",
GPIO_NUM_18: "GPIO 18",
GPIO_NUM_19: "GPIO 19",
GPIO_NUM_20: "GPIO 20",
}
var availableGPIONums = []GPIONum{
GPIO_NUM_1, GPIO_NUM_2, GPIO_NUM_3, GPIO_NUM_4, GPIO_NUM_5, GPIO_NUM_6, GPIO_NUM_7, GPIO_NUM_8, GPIO_NUM_9, GPIO_NUM_10,
GPIO_NUM_11, GPIO_NUM_12, GPIO_NUM_13, GPIO_NUM_14, GPIO_NUM_15, GPIO_NUM_16, GPIO_NUM_17, GPIO_NUM_18, GPIO_NUM_19, GPIO_NUM_20,
}
type TemplateType int
const TemplateTypeFullSettings = TemplateType(pb.ActionDeploySettingsTemplate_FULL_SETTINGS)

View File

@ -123,6 +123,9 @@ const (
VUEX_MUTATION_SET_STORED_MASTER_TEMPLATE_LIST = "setStoredMasterTemplateList"
//GPIO
VUEX_ACTION_UPDATE_GPIO_NAMES_LIST = "updateGpioNamesList"
VUEX_MUTATION_SET_GPIO_NAMES_LIST = "setStoredGpioNamesList"
//Bash scripts (used by TriggerActions)
VUEX_ACTION_UPDATE_STORED_BASH_SCRIPTS_LIST = "updateStoredBashScriptsList"
@ -161,6 +164,7 @@ type GlobalState struct {
StoredUSBSettingsList []string `js:"StoredUSBSettingsList"`
StoredBluetoothSettingsList []string `js:"StoredBluetoothSettingsList"`
StoredMasterTemplateList []string `js:"StoredMasterTemplateList"`
GpioNamesList []string `js:"GpioNamesList"`
ConnectRetryCount int `js:"ConnectRetryCount"`
EventListenerRunning bool `js:"EventListenerRunning"`
@ -191,6 +195,7 @@ func createGlobalStateStruct() GlobalState {
state.StoredUSBSettingsList = []string{}
state.StoredBluetoothSettingsList = []string{}
state.StoredMasterTemplateList = []string{}
state.GpioNamesList = []string{}
//Retrieve Interface settings
state.InterfaceSettings = NewEthernetSettingsList()
@ -277,6 +282,26 @@ func actionUpdateAllStates(store *mvuex.Store, context *mvuex.ActionContext, sta
}
func actionUpdateGpioNamesList(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState) {
go func() {
println("Trying to fetch GPIO names list")
//fetch deployed gadget settings
gpioList, err := RpcClient.GetGpioNamesList(defaultTimeout)
if err != nil {
println("Couldn't retrieve GPIO names list")
return
}
//commit to current
context.Commit(VUEX_MUTATION_SET_GPIO_NAMES_LIST, gpioList)
}()
return
}
func actionDeployMasterTemplate(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState, mt *jsMasterTemplate) {
go func() {
println("Vuex dispatch " + VUEX_ACTION_DEPLOY_MASTER_TEMPLATE)
@ -1364,8 +1389,13 @@ func initMVuex() *mvuex.Store {
mvuex.Mutation(VUEX_MUTATION_SET_STORED_MASTER_TEMPLATE_LIST, func(store *mvuex.Store, state *GlobalState, mtList []interface{}) {
hvue.Set(state, "StoredMasterTemplateList", mtList)
}),
mvuex.Mutation(VUEX_MUTATION_SET_GPIO_NAMES_LIST, func(store *mvuex.Store, state *GlobalState, mtList []interface{}) {
hvue.Set(state, "GpioNamesList", mtList)
}),
mvuex.Action(VUEX_ACTION_UPDATE_GPIO_NAMES_LIST, actionUpdateGpioNamesList),
mvuex.Action(VUEX_ACTION_DEPLOY_MASTER_TEMPLATE, actionDeployMasterTemplate),
mvuex.Action(VUEX_ACTION_UPDATE_STORED_MASTER_TEMPLATE_LIST, actionUpdateStoredMasterTemplateList),
mvuex.Action(VUEX_ACTION_STORE_MASTER_TEMPLATE, actionStoreMasterTemplate),
@ -1498,6 +1528,7 @@ func initMVuex() *mvuex.Store {
store.Dispatch(VUEX_ACTION_START_EVENT_LISTEN)
store.Dispatch(VUEX_ACTION_UPDATE_GPIO_NAMES_LIST) //Should be done one time at store start (not intended to change)
/*
// fetch deployed gadget settings
store.Dispatch(VUEX_ACTION_UPDATE_CURRENT_USB_SETTINGS)

View File

@ -29,6 +29,17 @@ func NewRpcClient(addr string) Rpc {
return rcl
}
func (rpc *Rpc) GetGpioNamesList(timeout time.Duration) (ws []string, err error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
ma, err := rpc.Client.GetAvailableGpios(ctx, &pb.Empty{})
if err != nil { return ws, err }
return ma.MsgArray, err
}
func (rpc *Rpc) DeployMasterTemplate(timeout time.Duration, mt *pb.MasterTemplate) (err error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()