@voltras/node-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/cjs/bluetooth/adapters/base.js +116 -0
- package/dist/cjs/bluetooth/adapters/base.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/index.js +58 -0
- package/dist/cjs/bluetooth/adapters/index.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/native.js +473 -0
- package/dist/cjs/bluetooth/adapters/native.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/node.js +228 -0
- package/dist/cjs/bluetooth/adapters/node.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/types.js +11 -0
- package/dist/cjs/bluetooth/adapters/types.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js +187 -0
- package/dist/cjs/bluetooth/adapters/web-bluetooth-base.js.map +1 -0
- package/dist/cjs/bluetooth/adapters/web.js +112 -0
- package/dist/cjs/bluetooth/adapters/web.js.map +1 -0
- package/dist/cjs/bluetooth/controllers/scanner-controller.js +145 -0
- package/dist/cjs/bluetooth/controllers/scanner-controller.js.map +1 -0
- package/dist/cjs/bluetooth/index.js +27 -0
- package/dist/cjs/bluetooth/index.js.map +1 -0
- package/dist/cjs/bluetooth/models/connection.js +68 -0
- package/dist/cjs/bluetooth/models/connection.js.map +1 -0
- package/dist/cjs/bluetooth/models/device.js +26 -0
- package/dist/cjs/bluetooth/models/device.js.map +1 -0
- package/dist/cjs/bluetooth/models/environment.js +106 -0
- package/dist/cjs/bluetooth/models/environment.js.map +1 -0
- package/dist/cjs/errors.js +167 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +116 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/react/hooks.js +262 -0
- package/dist/cjs/react/hooks.js.map +1 -0
- package/dist/cjs/react/index.js +18 -0
- package/dist/cjs/react/index.js.map +1 -0
- package/dist/cjs/sdk/index.js +14 -0
- package/dist/cjs/sdk/index.js.map +1 -0
- package/dist/cjs/sdk/types.js +8 -0
- package/dist/cjs/sdk/types.js.map +1 -0
- package/dist/cjs/sdk/voltra-client.js +632 -0
- package/dist/cjs/sdk/voltra-client.js.map +1 -0
- package/dist/cjs/sdk/voltra-manager.js +419 -0
- package/dist/cjs/sdk/voltra-manager.js.map +1 -0
- package/dist/cjs/shared/index.js +12 -0
- package/dist/cjs/shared/index.js.map +1 -0
- package/dist/cjs/shared/utils.js +51 -0
- package/dist/cjs/shared/utils.js.map +1 -0
- package/dist/cjs/voltra/index.js +56 -0
- package/dist/cjs/voltra/index.js.map +1 -0
- package/dist/cjs/voltra/models/connection.js +68 -0
- package/dist/cjs/voltra/models/connection.js.map +1 -0
- package/dist/cjs/voltra/models/device-filter.js +28 -0
- package/dist/cjs/voltra/models/device-filter.js.map +1 -0
- package/dist/cjs/voltra/models/device.js +152 -0
- package/dist/cjs/voltra/models/device.js.map +1 -0
- package/dist/cjs/voltra/models/telemetry/frame.js +46 -0
- package/dist/cjs/voltra/models/telemetry/frame.js.map +1 -0
- package/dist/cjs/voltra/models/telemetry/index.js +14 -0
- package/dist/cjs/voltra/models/telemetry/index.js.map +1 -0
- package/dist/cjs/voltra/protocol/commands.js +230 -0
- package/dist/cjs/voltra/protocol/commands.js.map +1 -0
- package/dist/cjs/voltra/protocol/constants.js +136 -0
- package/dist/cjs/voltra/protocol/constants.js.map +1 -0
- package/dist/cjs/voltra/protocol/data/chains.json +830 -0
- package/dist/cjs/voltra/protocol/data/eccentric.json +1598 -0
- package/dist/cjs/voltra/protocol/data/protocol.json +54 -0
- package/dist/cjs/voltra/protocol/data/weights.json +62 -0
- package/dist/cjs/voltra/protocol/index.js +25 -0
- package/dist/cjs/voltra/protocol/index.js.map +1 -0
- package/dist/cjs/voltra/protocol/telemetry-decoder.js +146 -0
- package/dist/cjs/voltra/protocol/telemetry-decoder.js.map +1 -0
- package/dist/esm/bluetooth/adapters/base.js +112 -0
- package/dist/esm/bluetooth/adapters/base.js.map +1 -0
- package/dist/esm/bluetooth/adapters/index.js +51 -0
- package/dist/esm/bluetooth/adapters/index.js.map +1 -0
- package/dist/esm/bluetooth/adapters/native.js +469 -0
- package/dist/esm/bluetooth/adapters/native.js.map +1 -0
- package/dist/esm/bluetooth/adapters/node.js +191 -0
- package/dist/esm/bluetooth/adapters/node.js.map +1 -0
- package/dist/esm/bluetooth/adapters/types.js +10 -0
- package/dist/esm/bluetooth/adapters/types.js.map +1 -0
- package/dist/esm/bluetooth/adapters/web-bluetooth-base.js +183 -0
- package/dist/esm/bluetooth/adapters/web-bluetooth-base.js.map +1 -0
- package/dist/esm/bluetooth/adapters/web.js +108 -0
- package/dist/esm/bluetooth/adapters/web.js.map +1 -0
- package/dist/esm/bluetooth/controllers/scanner-controller.js +141 -0
- package/dist/esm/bluetooth/controllers/scanner-controller.js.map +1 -0
- package/dist/esm/bluetooth/index.js +17 -0
- package/dist/esm/bluetooth/index.js.map +1 -0
- package/dist/esm/bluetooth/models/connection.js +63 -0
- package/dist/esm/bluetooth/models/connection.js.map +1 -0
- package/dist/esm/bluetooth/models/device.js +22 -0
- package/dist/esm/bluetooth/models/device.js.map +1 -0
- package/dist/esm/bluetooth/models/environment.js +101 -0
- package/dist/esm/bluetooth/models/environment.js.map +1 -0
- package/dist/esm/errors.js +155 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +72 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/react/hooks.js +257 -0
- package/dist/esm/react/hooks.js.map +1 -0
- package/dist/esm/react/index.js +12 -0
- package/dist/esm/react/index.js.map +1 -0
- package/dist/esm/sdk/index.js +9 -0
- package/dist/esm/sdk/index.js.map +1 -0
- package/dist/esm/sdk/types.js +7 -0
- package/dist/esm/sdk/types.js.map +1 -0
- package/dist/esm/sdk/voltra-client.js +628 -0
- package/dist/esm/sdk/voltra-client.js.map +1 -0
- package/dist/esm/sdk/voltra-manager.js +415 -0
- package/dist/esm/sdk/voltra-manager.js.map +1 -0
- package/dist/esm/shared/index.js +5 -0
- package/dist/esm/shared/index.js.map +1 -0
- package/dist/esm/shared/utils.js +45 -0
- package/dist/esm/shared/utils.js.map +1 -0
- package/dist/esm/voltra/index.js +26 -0
- package/dist/esm/voltra/index.js.map +1 -0
- package/dist/esm/voltra/models/connection.js +63 -0
- package/dist/esm/voltra/models/connection.js.map +1 -0
- package/dist/esm/voltra/models/device-filter.js +23 -0
- package/dist/esm/voltra/models/device-filter.js.map +1 -0
- package/dist/esm/voltra/models/device.js +148 -0
- package/dist/esm/voltra/models/device.js.map +1 -0
- package/dist/esm/voltra/models/telemetry/frame.js +40 -0
- package/dist/esm/voltra/models/telemetry/frame.js.map +1 -0
- package/dist/esm/voltra/models/telemetry/index.js +7 -0
- package/dist/esm/voltra/models/telemetry/index.js.map +1 -0
- package/dist/esm/voltra/protocol/commands.js +224 -0
- package/dist/esm/voltra/protocol/commands.js.map +1 -0
- package/dist/esm/voltra/protocol/constants.js +130 -0
- package/dist/esm/voltra/protocol/constants.js.map +1 -0
- package/dist/esm/voltra/protocol/data/chains.json +830 -0
- package/dist/esm/voltra/protocol/data/eccentric.json +1598 -0
- package/dist/esm/voltra/protocol/data/protocol.json +54 -0
- package/dist/esm/voltra/protocol/data/weights.json +62 -0
- package/dist/esm/voltra/protocol/index.js +9 -0
- package/dist/esm/voltra/protocol/index.js.map +1 -0
- package/dist/esm/voltra/protocol/telemetry-decoder.js +140 -0
- package/dist/esm/voltra/protocol/telemetry-decoder.js.map +1 -0
- package/dist/types/bluetooth/adapters/base.d.ts +85 -0
- package/dist/types/bluetooth/adapters/base.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/index.d.ts +35 -0
- package/dist/types/bluetooth/adapters/index.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/native.d.ts +109 -0
- package/dist/types/bluetooth/adapters/native.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/node.d.ts +91 -0
- package/dist/types/bluetooth/adapters/node.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/types.d.ts +102 -0
- package/dist/types/bluetooth/adapters/types.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts +90 -0
- package/dist/types/bluetooth/adapters/web-bluetooth-base.d.ts.map +1 -0
- package/dist/types/bluetooth/adapters/web.d.ts +57 -0
- package/dist/types/bluetooth/adapters/web.d.ts.map +1 -0
- package/dist/types/bluetooth/controllers/scanner-controller.d.ts +93 -0
- package/dist/types/bluetooth/controllers/scanner-controller.d.ts.map +1 -0
- package/dist/types/bluetooth/index.d.ts +14 -0
- package/dist/types/bluetooth/index.d.ts.map +1 -0
- package/dist/types/bluetooth/models/connection.d.ts +37 -0
- package/dist/types/bluetooth/models/connection.d.ts.map +1 -0
- package/dist/types/bluetooth/models/device.d.ts +25 -0
- package/dist/types/bluetooth/models/device.d.ts.map +1 -0
- package/dist/types/bluetooth/models/environment.d.ts +45 -0
- package/dist/types/bluetooth/models/environment.d.ts.map +1 -0
- package/dist/types/errors.d.ts +113 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/react/hooks.d.ts +130 -0
- package/dist/types/react/hooks.d.ts.map +1 -0
- package/dist/types/react/index.d.ts +12 -0
- package/dist/types/react/index.d.ts.map +1 -0
- package/dist/types/sdk/index.d.ts +11 -0
- package/dist/types/sdk/index.d.ts.map +1 -0
- package/dist/types/sdk/types.d.ts +104 -0
- package/dist/types/sdk/types.d.ts.map +1 -0
- package/dist/types/sdk/voltra-client.d.ts +221 -0
- package/dist/types/sdk/voltra-client.d.ts.map +1 -0
- package/dist/types/sdk/voltra-manager.d.ts +226 -0
- package/dist/types/sdk/voltra-manager.d.ts.map +1 -0
- package/dist/types/shared/index.d.ts +5 -0
- package/dist/types/shared/index.d.ts.map +1 -0
- package/dist/types/shared/utils.d.ts +25 -0
- package/dist/types/shared/utils.d.ts.map +1 -0
- package/dist/types/voltra/index.d.ts +13 -0
- package/dist/types/voltra/index.d.ts.map +1 -0
- package/dist/types/voltra/models/connection.d.ts +37 -0
- package/dist/types/voltra/models/connection.d.ts.map +1 -0
- package/dist/types/voltra/models/device-filter.d.ts +19 -0
- package/dist/types/voltra/models/device-filter.d.ts.map +1 -0
- package/dist/types/voltra/models/device.d.ts +105 -0
- package/dist/types/voltra/models/device.d.ts.map +1 -0
- package/dist/types/voltra/models/telemetry/frame.d.ts +41 -0
- package/dist/types/voltra/models/telemetry/frame.d.ts.map +1 -0
- package/dist/types/voltra/models/telemetry/index.d.ts +8 -0
- package/dist/types/voltra/models/telemetry/index.d.ts.map +1 -0
- package/dist/types/voltra/protocol/commands.d.ts +99 -0
- package/dist/types/voltra/protocol/commands.d.ts.map +1 -0
- package/dist/types/voltra/protocol/constants.d.ts +103 -0
- package/dist/types/voltra/protocol/constants.d.ts.map +1 -0
- package/dist/types/voltra/protocol/index.d.ts +9 -0
- package/dist/types/voltra/protocol/index.d.ts.map +1 -0
- package/dist/types/voltra/protocol/telemetry-decoder.d.ts +45 -0
- package/dist/types/voltra/protocol/telemetry-decoder.d.ts.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Voltra BLE Protocol - Authentication, Initialization, and Telemetry",
|
|
3
|
+
"_version": "1.1.0",
|
|
4
|
+
"ble": {
|
|
5
|
+
"service_uuid": "E4DADA34-0867-8783-9F70-2CA29216C7E4",
|
|
6
|
+
"notify_char_uuid": "55CA1E52-7354-25DE-6AFC-B7DF1E8816AC",
|
|
7
|
+
"write_char_uuid": "A010891D-F50F-44F0-901F-9A2421A9E050",
|
|
8
|
+
"device_name_prefix": "VTR-"
|
|
9
|
+
},
|
|
10
|
+
"auth": {
|
|
11
|
+
"_comment": "41-byte device IDs with proprietary checksums",
|
|
12
|
+
"iphone": "552904c90110000020004f6950686f6e6500000000000000000000000000000084ab1a5f29200172d8",
|
|
13
|
+
"ipad": "552904c90110000020004f69506164000000000000000000000000000000000084ab1a5f292001ea4f"
|
|
14
|
+
},
|
|
15
|
+
"init": {
|
|
16
|
+
"_comment": "Minimal 2-command init sequence (reduced from 22+ in Beyond+ app)",
|
|
17
|
+
"commands": [
|
|
18
|
+
"550f0801aad200002000ff00aa04194000",
|
|
19
|
+
"551f044eaa100000200027811065f8c6b9179047b797d3351c04bffb925cd64100"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"workout": {
|
|
23
|
+
"_comment": "Workout control commands",
|
|
24
|
+
"prepare": "551204c7aa1014002000110100b04f01db10",
|
|
25
|
+
"setup": "55130403aa10150020000f02006a50823e8f2f",
|
|
26
|
+
"go": "55130403aa1016002000110100893e05008173",
|
|
27
|
+
"stop": "55130403aa101b002000110100893e040037dd"
|
|
28
|
+
},
|
|
29
|
+
"telemetry": {
|
|
30
|
+
"_comment": "Telemetry parsing configuration - message types, byte offsets, movement phases",
|
|
31
|
+
"message_types": {
|
|
32
|
+
"_comment": "First 4 bytes of notifications identify message type",
|
|
33
|
+
"stream": "553a0470",
|
|
34
|
+
"rep_summary": "554a04c6",
|
|
35
|
+
"set_summary": "554f0439",
|
|
36
|
+
"status_update": "553404ac"
|
|
37
|
+
},
|
|
38
|
+
"offsets": {
|
|
39
|
+
"_comment": "Byte offsets for parsing telemetry stream messages",
|
|
40
|
+
"sequence": 6,
|
|
41
|
+
"phase": 13,
|
|
42
|
+
"position": 24,
|
|
43
|
+
"force": 26,
|
|
44
|
+
"velocity": 28
|
|
45
|
+
},
|
|
46
|
+
"phases": {
|
|
47
|
+
"_comment": "Movement phase values (byte at offset 13)",
|
|
48
|
+
"idle": 0,
|
|
49
|
+
"concentric": 1,
|
|
50
|
+
"hold": 2,
|
|
51
|
+
"eccentric": 3
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Weight commands (863e register) - 5 to 200 lbs in 5 lb increments",
|
|
3
|
+
"format": {
|
|
4
|
+
"description": "21-byte command structure",
|
|
5
|
+
"length": 21,
|
|
6
|
+
"structure": [
|
|
7
|
+
{ "name": "prefix", "bytes": "0-5", "value": "55130403aa10", "constant": true },
|
|
8
|
+
{ "name": "sequence", "bytes": "6-7", "value": "varies", "encoding": "uint16_le" },
|
|
9
|
+
{ "name": "mode", "bytes": "8-12", "value": "2000110100", "constant": true },
|
|
10
|
+
{ "name": "register", "bytes": "13-14", "value": "863e", "constant": true },
|
|
11
|
+
{ "name": "value", "bytes": "15-16", "value": "weight_in_lbs", "encoding": "uint16_le" },
|
|
12
|
+
{ "name": "checksum", "bytes": "17-19", "value": "varies", "encoding": "3_bytes_hex" },
|
|
13
|
+
{ "name": "padding", "bytes": "20", "value": "00", "constant": true }
|
|
14
|
+
],
|
|
15
|
+
"prefix": "55130403aa10",
|
|
16
|
+
"mode": "2000110100",
|
|
17
|
+
"register": "863e",
|
|
18
|
+
"padding": "00"
|
|
19
|
+
},
|
|
20
|
+
"values": {
|
|
21
|
+
"5": { "seq": "1500", "checksum": "cb3f37", "_full": "55130403aa1015002000110100863e0500cb3f3700" },
|
|
22
|
+
"10": { "seq": "1400", "checksum": "92e941", "_full": "55130403aa1014002000110100863e0a0092e94100" },
|
|
23
|
+
"15": { "seq": "1500", "checksum": "bbc234", "_full": "55130403aa1015002000110100863e0f00bbc23400" },
|
|
24
|
+
"20": { "seq": "1600", "checksum": "314d40", "_full": "55130403aa1016002000110100863e1400314d4000" },
|
|
25
|
+
"25": { "seq": "1700", "checksum": "d8a836", "_full": "55130403aa1017002000110100863e1900d8a83600" },
|
|
26
|
+
"30": { "seq": "1800", "checksum": "9cf934", "_full": "55130403aa1018002000110100863e1e009cf93400" },
|
|
27
|
+
"35": { "seq": "1900", "checksum": "d7aa37", "_full": "55130403aa1019002000110100863e2300d7aa3700" },
|
|
28
|
+
"40": { "seq": "1a00", "checksum": "ccb037", "_full": "55130403aa101a002000110100863e2800ccb03700" },
|
|
29
|
+
"45": { "seq": "1b00", "checksum": "e59b40", "_full": "55130403aa101b002000110100863e2d00e59b4000" },
|
|
30
|
+
"50": { "seq": "1c00", "checksum": "5a2d37", "_full": "55130403aa101c002000110100863e32005a2d3700" },
|
|
31
|
+
"55": { "seq": "1700", "checksum": "fb1112", "_full": "55130403aa1017002000110100863e3700fb111200" },
|
|
32
|
+
"60": { "seq": "1800", "checksum": "1fe937", "_full": "55130403aa1018002000110100863e3c001fe93700" },
|
|
33
|
+
"65": { "seq": "1900", "checksum": "32fc40", "_full": "55130403aa1019002000110100863e410032fc4000" },
|
|
34
|
+
"70": { "seq": "1a00", "checksum": "894f37", "_full": "55130403aa101a002000110100863e4600894f3700" },
|
|
35
|
+
"75": { "seq": "1b00", "checksum": "60aa12", "_full": "55130403aa101b002000110100863e4b0060aa1200" },
|
|
36
|
+
"80": { "seq": "1c00", "checksum": "bf7b43", "_full": "55130403aa101c002000110100863e5000bf7b4300" },
|
|
37
|
+
"85": { "seq": "1d00", "checksum": "965037", "_full": "55130403aa101d002000110100863e550096503700" },
|
|
38
|
+
"90": { "seq": "1e00", "checksum": "ed2d37", "_full": "55130403aa101e002000110100863e5a00ed2d3700" },
|
|
39
|
+
"95": { "seq": "1f00", "checksum": "c40634", "_full": "55130403aa101f002000110100863e5f00c4063400" },
|
|
40
|
+
"100": { "seq": "2000", "checksum": "4ddb12", "_full": "55130403aa1020002000110100863e64004ddb1200" },
|
|
41
|
+
"105": { "seq": "2100", "checksum": "a43e37", "_full": "55130403aa1021002000110100863e6900a43e3700" },
|
|
42
|
+
"110": { "seq": "3000", "checksum": "785740", "_full": "55130403aa1030002000110100863e6e0078574000" },
|
|
43
|
+
"115": { "seq": "3100", "checksum": "00272d", "_full": "55130403aa1031002000110100863e730000272d00" },
|
|
44
|
+
"120": { "seq": "3200", "checksum": "1b3d40", "_full": "55130403aa1032002000110100863e78001b3d4000" },
|
|
45
|
+
"125": { "seq": "3900", "checksum": "ba013f", "_full": "55130403aa1039002000110100863e7d00ba013f00" },
|
|
46
|
+
"130": { "seq": "3a00", "checksum": "c90037", "_full": "55130403aa103a002000110100863e8200c9003700" },
|
|
47
|
+
"135": { "seq": "3b00", "checksum": "e02b34", "_full": "55130403aa103b002000110100863e8700e02b3400" },
|
|
48
|
+
"140": { "seq": "3c00", "checksum": "ae6f12", "_full": "55130403aa103c002000110100863e8c00ae6f1200" },
|
|
49
|
+
"145": { "seq": "3d00", "checksum": "d61f37", "_full": "55130403aa103d002000110100863e9100d61f3700" },
|
|
50
|
+
"150": { "seq": "3e00", "checksum": "6dac2d", "_full": "55130403aa103e002000110100863e96006dac2d00" },
|
|
51
|
+
"155": { "seq": "3f00", "checksum": "844937", "_full": "55130403aa103f002000110100863e9b0084493700" },
|
|
52
|
+
"160": { "seq": "4000", "checksum": "085941", "_full": "55130403aa1040002000110100863ea00008594100" },
|
|
53
|
+
"165": { "seq": "4100", "checksum": "217237", "_full": "55130403aa1041002000110100863ea50021723700" },
|
|
54
|
+
"170": { "seq": "4200", "checksum": "5a0f43", "_full": "55130403aa1042002000110100863eaa005a0f4300" },
|
|
55
|
+
"175": { "seq": "4300", "checksum": "732434", "_full": "55130403aa1043002000110100863eaf0073243400" },
|
|
56
|
+
"180": { "seq": "4400", "checksum": "acf537", "_full": "55130403aa1044002000110100863eb400acf53700" },
|
|
57
|
+
"185": { "seq": "4500", "checksum": "451037", "_full": "55130403aa1045002000110100863eb90045103700" },
|
|
58
|
+
"190": { "seq": "4600", "checksum": "fea312", "_full": "55130403aa1046002000110100863ebe00fea31200" },
|
|
59
|
+
"195": { "seq": "4700", "checksum": "d3b637", "_full": "55130403aa1047002000110100863ec300d3b63700" },
|
|
60
|
+
"200": { "seq": "4800", "checksum": "374e41", "_full": "55130403aa1048002000110100863ec800374e4100" }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Voltra Protocol Module
|
|
4
|
+
*
|
|
5
|
+
* Complete TypeScript implementation of the Voltra BLE protocol.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
__exportStar(require("./constants"), exports);
|
|
23
|
+
__exportStar(require("./commands"), exports);
|
|
24
|
+
__exportStar(require("./telemetry-decoder"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/voltra/protocol/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,6CAA2B;AAC3B,sDAAoC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Telemetry Decoder
|
|
4
|
+
*
|
|
5
|
+
* Low-level protocol decoder for Voltra BLE telemetry notifications.
|
|
6
|
+
* Only handles parsing bytes into typed data - no business logic.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.identifyMessageType = identifyMessageType;
|
|
10
|
+
exports.decodeTelemetryFrame = decodeTelemetryFrame;
|
|
11
|
+
exports.decodeNotification = decodeNotification;
|
|
12
|
+
exports.encodeTelemetryFrame = encodeTelemetryFrame;
|
|
13
|
+
const constants_1 = require("./constants");
|
|
14
|
+
const frame_1 = require("../models/telemetry/frame");
|
|
15
|
+
const utils_1 = require("../../shared/utils");
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Byte Parsing Helpers
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Read a little-endian uint16 from a Uint8Array.
|
|
21
|
+
*/
|
|
22
|
+
function readUint16LE(data, offset) {
|
|
23
|
+
return data[offset] | (data[offset + 1] << 8);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Read a little-endian int16 from a Uint8Array.
|
|
27
|
+
*/
|
|
28
|
+
function readInt16LE(data, offset) {
|
|
29
|
+
const value = readUint16LE(data, offset);
|
|
30
|
+
return value > 0x7fff ? value - 0x10000 : value;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Write a little-endian uint16 to a Uint8Array.
|
|
34
|
+
*/
|
|
35
|
+
function writeUint16LE(data, offset, value) {
|
|
36
|
+
data[offset] = value & 0xff;
|
|
37
|
+
data[offset + 1] = (value >> 8) & 0xff;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Write a little-endian int16 to a Uint8Array.
|
|
41
|
+
*/
|
|
42
|
+
function writeInt16LE(data, offset, value) {
|
|
43
|
+
if (value < 0) {
|
|
44
|
+
value = value + 0x10000;
|
|
45
|
+
}
|
|
46
|
+
writeUint16LE(data, offset, value);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Identify the message type from raw bytes.
|
|
50
|
+
*/
|
|
51
|
+
function identifyMessageType(data) {
|
|
52
|
+
if (data.length < 4)
|
|
53
|
+
return 'unknown';
|
|
54
|
+
const msgType = data.slice(0, 4);
|
|
55
|
+
if ((0, utils_1.bytesEqual)(msgType, constants_1.MessageTypes.TELEMETRY_STREAM)) {
|
|
56
|
+
return 'telemetry_stream';
|
|
57
|
+
}
|
|
58
|
+
else if ((0, utils_1.bytesEqual)(msgType, constants_1.MessageTypes.REP_SUMMARY)) {
|
|
59
|
+
return 'rep_summary';
|
|
60
|
+
}
|
|
61
|
+
else if ((0, utils_1.bytesEqual)(msgType, constants_1.MessageTypes.SET_SUMMARY)) {
|
|
62
|
+
return 'set_summary';
|
|
63
|
+
}
|
|
64
|
+
else if ((0, utils_1.bytesEqual)(msgType, constants_1.MessageTypes.STATUS_UPDATE)) {
|
|
65
|
+
return 'status_update';
|
|
66
|
+
}
|
|
67
|
+
return 'unknown';
|
|
68
|
+
}
|
|
69
|
+
// =============================================================================
|
|
70
|
+
// Decoder
|
|
71
|
+
// =============================================================================
|
|
72
|
+
/**
|
|
73
|
+
* Decode a telemetry stream message into a TelemetryFrame.
|
|
74
|
+
*/
|
|
75
|
+
function decodeTelemetryFrame(data) {
|
|
76
|
+
if (data.length < 30) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// Sequence number
|
|
80
|
+
const sequence = readUint16LE(data, constants_1.TelemetryOffsets.SEQUENCE);
|
|
81
|
+
// Phase
|
|
82
|
+
const phaseByte = data[constants_1.TelemetryOffsets.PHASE];
|
|
83
|
+
let phase;
|
|
84
|
+
if (phaseByte >= 0 && phaseByte <= 3) {
|
|
85
|
+
phase = phaseByte;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
phase = constants_1.MovementPhase.UNKNOWN;
|
|
89
|
+
}
|
|
90
|
+
// Sensor data
|
|
91
|
+
const position = readUint16LE(data, constants_1.TelemetryOffsets.POSITION);
|
|
92
|
+
const force = readInt16LE(data, constants_1.TelemetryOffsets.FORCE);
|
|
93
|
+
const velocity = readUint16LE(data, constants_1.TelemetryOffsets.VELOCITY);
|
|
94
|
+
return (0, frame_1.createFrame)(sequence, phase, position, force, velocity);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Decode a BLE notification.
|
|
98
|
+
* Returns structured data based on message type.
|
|
99
|
+
*/
|
|
100
|
+
function decodeNotification(data) {
|
|
101
|
+
const msgType = identifyMessageType(data);
|
|
102
|
+
switch (msgType) {
|
|
103
|
+
case 'telemetry_stream': {
|
|
104
|
+
const frame = decodeTelemetryFrame(data);
|
|
105
|
+
return frame ? { type: 'frame', frame } : null;
|
|
106
|
+
}
|
|
107
|
+
case 'rep_summary':
|
|
108
|
+
// Device is signaling a rep boundary (end of concentric or eccentric)
|
|
109
|
+
return { type: 'rep_boundary' };
|
|
110
|
+
case 'set_summary':
|
|
111
|
+
// Device is signaling set completion
|
|
112
|
+
return { type: 'set_boundary' };
|
|
113
|
+
case 'status_update':
|
|
114
|
+
return { type: 'status', data };
|
|
115
|
+
default:
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// =============================================================================
|
|
120
|
+
// Encoder (for replay)
|
|
121
|
+
// =============================================================================
|
|
122
|
+
/**
|
|
123
|
+
* Encode a TelemetryFrame into a BLE notification payload.
|
|
124
|
+
* Creates a minimal 30-byte message that can be decoded by decodeTelemetryFrame.
|
|
125
|
+
* Used for replay functionality.
|
|
126
|
+
*/
|
|
127
|
+
function encodeTelemetryFrame(frame) {
|
|
128
|
+
const data = new Uint8Array(30);
|
|
129
|
+
// Message type header (telemetry stream)
|
|
130
|
+
data[0] = 0x55;
|
|
131
|
+
data[1] = 0x3a;
|
|
132
|
+
data[2] = 0x04;
|
|
133
|
+
data[3] = 0x70;
|
|
134
|
+
// Sequence (bytes 6-7)
|
|
135
|
+
writeUint16LE(data, constants_1.TelemetryOffsets.SEQUENCE, frame.sequence);
|
|
136
|
+
// Phase (byte 13)
|
|
137
|
+
data[constants_1.TelemetryOffsets.PHASE] = frame.phase;
|
|
138
|
+
// Position (bytes 24-25)
|
|
139
|
+
writeUint16LE(data, constants_1.TelemetryOffsets.POSITION, frame.position);
|
|
140
|
+
// Force (bytes 26-27, signed)
|
|
141
|
+
writeInt16LE(data, constants_1.TelemetryOffsets.FORCE, frame.force);
|
|
142
|
+
// Velocity (bytes 28-29)
|
|
143
|
+
writeUint16LE(data, constants_1.TelemetryOffsets.VELOCITY, frame.velocity);
|
|
144
|
+
return data;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=telemetry-decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-decoder.js","sourceRoot":"","sources":["../../../../src/voltra/protocol/telemetry-decoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseBLEAdapter
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for all BLE adapters. Provides shared implementation
|
|
5
|
+
* for connection state management and callback registration/notification.
|
|
6
|
+
*
|
|
7
|
+
* Subclasses implement the platform-specific BLE operations:
|
|
8
|
+
* - NativeBLEAdapter: react-native-ble-plx for iOS/Android
|
|
9
|
+
* - WebBLEAdapter: Web Bluetooth API for browsers
|
|
10
|
+
* - NodeBLEAdapter: webbluetooth npm for Node.js
|
|
11
|
+
* - ReplayBLEAdapter: Playback for testing/demos
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Abstract base class implementing shared BLE adapter functionality.
|
|
15
|
+
*
|
|
16
|
+
* Provides:
|
|
17
|
+
* - Connection state management with change notifications
|
|
18
|
+
* - Notification callback registration (supports multiple listeners)
|
|
19
|
+
* - State callback registration (supports multiple listeners)
|
|
20
|
+
* - Protected utilities for subclasses to emit events
|
|
21
|
+
*/
|
|
22
|
+
export class BaseBLEAdapter {
|
|
23
|
+
constructor() {
|
|
24
|
+
/** Current connection state */
|
|
25
|
+
this.connectionState = 'disconnected';
|
|
26
|
+
/** Registered notification callbacks */
|
|
27
|
+
this.notificationCallbacks = [];
|
|
28
|
+
/** Registered connection state callbacks */
|
|
29
|
+
this.stateCallbacks = [];
|
|
30
|
+
}
|
|
31
|
+
// ===========================================================================
|
|
32
|
+
// BLEAdapter interface - implemented
|
|
33
|
+
// ===========================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Get the current connection state.
|
|
36
|
+
*/
|
|
37
|
+
getConnectionState() {
|
|
38
|
+
return this.connectionState;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if currently connected to a device.
|
|
42
|
+
*/
|
|
43
|
+
isConnected() {
|
|
44
|
+
return this.connectionState === 'connected';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Register a callback for notifications from the device.
|
|
48
|
+
* @param callback Function called with notification data
|
|
49
|
+
* @returns Unsubscribe function
|
|
50
|
+
*/
|
|
51
|
+
onNotification(callback) {
|
|
52
|
+
this.notificationCallbacks.push(callback);
|
|
53
|
+
return () => {
|
|
54
|
+
const index = this.notificationCallbacks.indexOf(callback);
|
|
55
|
+
if (index >= 0) {
|
|
56
|
+
this.notificationCallbacks.splice(index, 1);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Register a callback for connection state changes.
|
|
62
|
+
* @param callback Function called when state changes
|
|
63
|
+
* @returns Unsubscribe function
|
|
64
|
+
*/
|
|
65
|
+
onConnectionStateChange(callback) {
|
|
66
|
+
this.stateCallbacks.push(callback);
|
|
67
|
+
return () => {
|
|
68
|
+
const index = this.stateCallbacks.indexOf(callback);
|
|
69
|
+
if (index >= 0) {
|
|
70
|
+
this.stateCallbacks.splice(index, 1);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// ===========================================================================
|
|
75
|
+
// Protected utilities for subclasses
|
|
76
|
+
// ===========================================================================
|
|
77
|
+
/**
|
|
78
|
+
* Set connection state and notify all registered callbacks.
|
|
79
|
+
* Only notifies if state actually changed.
|
|
80
|
+
*
|
|
81
|
+
* @param state New connection state
|
|
82
|
+
*/
|
|
83
|
+
setConnectionState(state) {
|
|
84
|
+
if (this.connectionState !== state) {
|
|
85
|
+
this.connectionState = state;
|
|
86
|
+
for (const callback of this.stateCallbacks) {
|
|
87
|
+
try {
|
|
88
|
+
callback(state);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
console.error('[BaseBLEAdapter] State callback error:', e);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Emit notification data to all registered callbacks.
|
|
98
|
+
*
|
|
99
|
+
* @param data Notification data to emit
|
|
100
|
+
*/
|
|
101
|
+
emitNotification(data) {
|
|
102
|
+
for (const callback of this.notificationCallbacks) {
|
|
103
|
+
try {
|
|
104
|
+
callback(data);
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
console.error('[BaseBLEAdapter] Notification callback error:', e);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/bluetooth/adapters/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH;;;;;;;;GAQG;AACH,MAAM,OAAgB,cAAc;IAApC;QACE,+BAA+B;QACrB,oBAAe,GAAoB,cAAc,CAAC;QAE5D,wCAAwC;QAC9B,0BAAqB,GAA2B,EAAE,CAAC;QAE7D,4CAA4C;QAClC,mBAAc,GAA8B,EAAE,CAAC;IAoH3D,CAAC;IAlHC,8EAA8E;IAC9E,qCAAqC;IACrC,8EAA8E;IAE9E;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,eAAe,KAAK,WAAW,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,QAA8B;QAC3C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,QAAiC;QACvD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IA+BD,8EAA8E;IAC9E,qCAAqC;IACrC,8EAA8E;IAE9E;;;;;OAKG;IACO,kBAAkB,CAAC,KAAsB;QACjD,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;YACnC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC3C,IAAI,CAAC;oBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACO,gBAAgB,CAAC,IAAgB;QACzC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BLE Abstraction Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for BLE communication across platforms:
|
|
5
|
+
* - Native (iOS/Android): react-native-ble-plx
|
|
6
|
+
* - Browser: Web Bluetooth API
|
|
7
|
+
* - Node.js: webbluetooth npm package
|
|
8
|
+
*/
|
|
9
|
+
// Platform adapters
|
|
10
|
+
export { WebBLEAdapter } from './web';
|
|
11
|
+
export { NodeBLEAdapter } from './node';
|
|
12
|
+
export { NativeBLEAdapter } from './native';
|
|
13
|
+
import { WebBLEAdapter } from './web';
|
|
14
|
+
import { NodeBLEAdapter } from './node';
|
|
15
|
+
/**
|
|
16
|
+
* Detect if running in Node.js environment.
|
|
17
|
+
*/
|
|
18
|
+
function isNodeEnvironment() {
|
|
19
|
+
return (typeof process !== 'undefined' && process.versions != null && process.versions.node != null);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Detect if running in browser environment.
|
|
23
|
+
*/
|
|
24
|
+
function isBrowserEnvironment() {
|
|
25
|
+
return (typeof window !== 'undefined' &&
|
|
26
|
+
typeof document !== 'undefined' &&
|
|
27
|
+
typeof navigator !== 'undefined');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a BLE adapter based on the current environment.
|
|
31
|
+
*
|
|
32
|
+
* Environment detection:
|
|
33
|
+
* - Web browser: WebBLEAdapter (Web Bluetooth API)
|
|
34
|
+
* - Node.js: NodeBLEAdapter (webbluetooth package)
|
|
35
|
+
*
|
|
36
|
+
* NOTE: For React Native, import and instantiate NativeBLEAdapter directly.
|
|
37
|
+
* This factory is for web/Node.js environments only.
|
|
38
|
+
*
|
|
39
|
+
* @param config Adapter configuration including BLE service UUIDs
|
|
40
|
+
* @returns BLEAdapter instance appropriate for the current environment
|
|
41
|
+
*/
|
|
42
|
+
export function createBLEAdapter(config) {
|
|
43
|
+
if (isNodeEnvironment() && !isBrowserEnvironment()) {
|
|
44
|
+
return new NodeBLEAdapter({ ble: config.ble });
|
|
45
|
+
}
|
|
46
|
+
if (isBrowserEnvironment()) {
|
|
47
|
+
return new WebBLEAdapter({ ble: config.ble });
|
|
48
|
+
}
|
|
49
|
+
throw new Error('Unknown environment. For React Native, import NativeBLEAdapter directly from @voltras/node-sdk/react-native');
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/bluetooth/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,cAAc,EAA0C,MAAM,QAAQ,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAA4B,MAAM,UAAU,CAAC;AAMtE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAUxC;;GAEG;AACH,SAAS,iBAAiB;IACxB,OAAO,CACL,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAC5F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,OAAO,CACL,OAAO,MAAM,KAAK,WAAW;QAC7B,OAAO,QAAQ,KAAK,WAAW;QAC/B,OAAO,SAAS,KAAK,WAAW,CACjC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA8B;IAC7D,IAAI,iBAAiB,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QACnD,OAAO,IAAI,cAAc,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC3B,OAAO,IAAI,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;AACJ,CAAC"}
|