webserial-flasher 1.0.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 +97 -0
- package/dist/autoDetect.d.ts +24 -0
- package/dist/autoDetect.d.ts.map +1 -0
- package/dist/autoDetect.js +66 -0
- package/dist/autoDetect.js.map +1 -0
- package/dist/boards/database.d.ts +17 -0
- package/dist/boards/database.d.ts.map +1 -0
- package/dist/boards/database.js +957 -0
- package/dist/boards/database.js.map +1 -0
- package/dist/core/constants.d.ts +44 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +56 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/errors.d.ts +45 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +92 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/types.d.ts +138 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/avr109/programmer.d.ts +78 -0
- package/dist/protocol/avr109/programmer.d.ts.map +1 -0
- package/dist/protocol/avr109/programmer.js +324 -0
- package/dist/protocol/avr109/programmer.js.map +1 -0
- package/dist/protocol/hexParser.d.ts +12 -0
- package/dist/protocol/hexParser.d.ts.map +1 -0
- package/dist/protocol/hexParser.js +133 -0
- package/dist/protocol/hexParser.js.map +1 -0
- package/dist/protocol/picoboot/constants.d.ts +65 -0
- package/dist/protocol/picoboot/constants.d.ts.map +1 -0
- package/dist/protocol/picoboot/constants.js +80 -0
- package/dist/protocol/picoboot/constants.js.map +1 -0
- package/dist/protocol/picoboot/programmer.d.ts +73 -0
- package/dist/protocol/picoboot/programmer.d.ts.map +1 -0
- package/dist/protocol/picoboot/programmer.js +278 -0
- package/dist/protocol/picoboot/programmer.js.map +1 -0
- package/dist/protocol/picoboot/uf2.d.ts +51 -0
- package/dist/protocol/picoboot/uf2.d.ts.map +1 -0
- package/dist/protocol/picoboot/uf2.js +119 -0
- package/dist/protocol/picoboot/uf2.js.map +1 -0
- package/dist/protocol/receiveData.d.ts +3 -0
- package/dist/protocol/receiveData.d.ts.map +1 -0
- package/dist/protocol/receiveData.js +72 -0
- package/dist/protocol/receiveData.js.map +1 -0
- package/dist/protocol/sendCommand.d.ts +14 -0
- package/dist/protocol/sendCommand.d.ts.map +1 -0
- package/dist/protocol/sendCommand.js +48 -0
- package/dist/protocol/sendCommand.js.map +1 -0
- package/dist/protocol/stk500v2/constants.d.ts +57 -0
- package/dist/protocol/stk500v2/constants.d.ts.map +1 -0
- package/dist/protocol/stk500v2/constants.js +62 -0
- package/dist/protocol/stk500v2/constants.js.map +1 -0
- package/dist/protocol/stk500v2/frame.d.ts +14 -0
- package/dist/protocol/stk500v2/frame.d.ts.map +1 -0
- package/dist/protocol/stk500v2/frame.js +116 -0
- package/dist/protocol/stk500v2/frame.js.map +1 -0
- package/dist/protocol/stk500v2/programmer.d.ts +92 -0
- package/dist/protocol/stk500v2/programmer.d.ts.map +1 -0
- package/dist/protocol/stk500v2/programmer.js +482 -0
- package/dist/protocol/stk500v2/programmer.js.map +1 -0
- package/dist/protocol/updi/constants.d.ts +107 -0
- package/dist/protocol/updi/constants.d.ts.map +1 -0
- package/dist/protocol/updi/constants.js +130 -0
- package/dist/protocol/updi/constants.js.map +1 -0
- package/dist/protocol/updi/link.d.ts +82 -0
- package/dist/protocol/updi/link.d.ts.map +1 -0
- package/dist/protocol/updi/link.js +241 -0
- package/dist/protocol/updi/link.js.map +1 -0
- package/dist/protocol/updi/programmer.d.ts +89 -0
- package/dist/protocol/updi/programmer.d.ts.map +1 -0
- package/dist/protocol/updi/programmer.js +359 -0
- package/dist/protocol/updi/programmer.js.map +1 -0
- package/dist/stk500.d.ts +101 -0
- package/dist/stk500.d.ts.map +1 -0
- package/dist/stk500.js +426 -0
- package/dist/stk500.js.map +1 -0
- package/dist/transport/IPicobootTransport.d.ts +25 -0
- package/dist/transport/IPicobootTransport.d.ts.map +1 -0
- package/dist/transport/IPicobootTransport.js +10 -0
- package/dist/transport/IPicobootTransport.js.map +1 -0
- package/dist/transport/ITransport.d.ts +33 -0
- package/dist/transport/ITransport.d.ts.map +1 -0
- package/dist/transport/ITransport.js +4 -0
- package/dist/transport/ITransport.js.map +1 -0
- package/dist/transport/NodeSerialTransport.d.ts +35 -0
- package/dist/transport/NodeSerialTransport.d.ts.map +1 -0
- package/dist/transport/NodeSerialTransport.js +102 -0
- package/dist/transport/NodeSerialTransport.js.map +1 -0
- package/dist/transport/NodeUSBTransport.d.ts +24 -0
- package/dist/transport/NodeUSBTransport.d.ts.map +1 -0
- package/dist/transport/NodeUSBTransport.js +146 -0
- package/dist/transport/NodeUSBTransport.js.map +1 -0
- package/dist/transport/WebSerialTransport.d.ts +63 -0
- package/dist/transport/WebSerialTransport.d.ts.map +1 -0
- package/dist/transport/WebSerialTransport.js +159 -0
- package/dist/transport/WebSerialTransport.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// UPDI (Unified Program and Debug Interface) protocol constants.
|
|
2
|
+
// Covers tinyAVR 0/1/2 series, megaAVR 0 series (ATmega4809).
|
|
3
|
+
// Reference: AVR® DA/DB Device Series Datasheet (Microchip Technology)
|
|
4
|
+
// Atmel ATtiny1614/16/17 datasheet — UPDI chapter
|
|
5
|
+
// ── Physical layer ───────────────────────────────────────────────────────────
|
|
6
|
+
/** UPDI synchronisation byte — sent before every instruction */
|
|
7
|
+
export const UPDI_SYNC = 0x55;
|
|
8
|
+
/** ACK byte returned by device for write operations */
|
|
9
|
+
export const UPDI_ACK = 0x40;
|
|
10
|
+
// ── Instruction opcodes (bits 7:5) ────────────────────────────────────────────
|
|
11
|
+
/** LDS — Load from Data Space (followed by address + returns data) */
|
|
12
|
+
export const UPDI_LDS = 0x00;
|
|
13
|
+
/** STS — Store to Data Space (followed by address + data) */
|
|
14
|
+
export const UPDI_STS = 0x40;
|
|
15
|
+
/** LD — Load indirect (uses pointer register) */
|
|
16
|
+
export const UPDI_LD = 0x20;
|
|
17
|
+
/** ST — Store indirect (uses pointer register) */
|
|
18
|
+
export const UPDI_ST = 0x60;
|
|
19
|
+
/** LDCS — Load from Control/Status Space */
|
|
20
|
+
export const UPDI_LDCS = 0x80;
|
|
21
|
+
/** STCS — Store to Control/Status Space */
|
|
22
|
+
export const UPDI_STCS = 0xC0;
|
|
23
|
+
/** REPEAT — Repeat the next instruction N+1 times */
|
|
24
|
+
export const UPDI_REPEAT = 0xA0;
|
|
25
|
+
/** KEY — Key broadcast (8 or 16 bytes) */
|
|
26
|
+
export const UPDI_KEY = 0xE0;
|
|
27
|
+
// ── Address/data size operands ────────────────────────────────────────────────
|
|
28
|
+
/** Address operand: 1-byte address */
|
|
29
|
+
export const UPDI_ADDRESS_8 = 0;
|
|
30
|
+
/** Address operand: 2-byte address (default for all AVR NVM access) */
|
|
31
|
+
export const UPDI_ADDRESS_16 = 1;
|
|
32
|
+
/** Address operand: 3-byte address (AVR DA/DB extended addressing) */
|
|
33
|
+
export const UPDI_ADDRESS_24 = 2;
|
|
34
|
+
/** Data operand: 1-byte data */
|
|
35
|
+
export const UPDI_DATA_8 = 0;
|
|
36
|
+
/** Data operand: 2-byte data */
|
|
37
|
+
export const UPDI_DATA_16 = 1;
|
|
38
|
+
// ── Pointer modes (bits 4:2 for LD/ST instructions) ──────────────────────────
|
|
39
|
+
/** Pointer mode: access *(ptr) */
|
|
40
|
+
export const UPDI_PTR = 0;
|
|
41
|
+
/** Pointer mode: access *(ptr++) — post-increment */
|
|
42
|
+
export const UPDI_PTR_INC = 1;
|
|
43
|
+
/** Pointer mode: access *(--ptr) — pre-decrement */
|
|
44
|
+
export const UPDI_PTR_DEC = 2;
|
|
45
|
+
// ── Key sizes (bits 1:0 of KEY instruction) ──────────────────────────────────
|
|
46
|
+
/** 8-byte (64-bit) key */
|
|
47
|
+
export const UPDI_KEY_SIZE_64 = 0;
|
|
48
|
+
/** 16-byte (128-bit) key */
|
|
49
|
+
export const UPDI_KEY_SIZE_128 = 1;
|
|
50
|
+
// ── Control/Status register addresses ────────────────────────────────────────
|
|
51
|
+
export const UPDI_CS_STATUSA = 0x00;
|
|
52
|
+
export const UPDI_CS_STATUSB = 0x01;
|
|
53
|
+
export const UPDI_CS_CTRLA = 0x02;
|
|
54
|
+
export const UPDI_CS_CTRLB = 0x03;
|
|
55
|
+
/** ASI_KEY_STATUS — shows which key is currently active */
|
|
56
|
+
export const UPDI_CS_ASI_KEY_STATUS = 0x07;
|
|
57
|
+
/** ASI_RESET_REQ — write 0x59 to assert reset, 0x00 to deassert */
|
|
58
|
+
export const UPDI_CS_ASI_RESET_REQ = 0x08;
|
|
59
|
+
export const UPDI_CS_ASI_CTRL_A = 0x09;
|
|
60
|
+
export const UPDI_CS_ASI_SYS_CTRLA = 0x0A;
|
|
61
|
+
/** ASI_SYS_STATUS — NVMPROG / LOCKSTATUS / UROWPROG bits */
|
|
62
|
+
export const UPDI_CS_ASI_SYS_STATUS = 0x0B;
|
|
63
|
+
// ── CTRLA bits ───────────────────────────────────────────────────────────────
|
|
64
|
+
/** Guard-time insertion delay (IBDLY) */
|
|
65
|
+
export const UPDI_CTRLA_IBDLY = 0x80;
|
|
66
|
+
/** Guard-time value: 2-cycle inter-byte delay (minimises wait between bytes) */
|
|
67
|
+
export const UPDI_CTRLA_GT_2 = 0x06;
|
|
68
|
+
// ── ASI_KEY_STATUS bits ───────────────────────────────────────────────────────
|
|
69
|
+
export const UPDI_KEY_CHIPERASE = 0x08;
|
|
70
|
+
export const UPDI_KEY_NVMPROG = 0x10;
|
|
71
|
+
export const UPDI_KEY_UROWWRITE = 0x20;
|
|
72
|
+
// ── ASI_SYS_STATUS bits ───────────────────────────────────────────────────────
|
|
73
|
+
export const UPDI_SYS_RSTSYS = 0x20;
|
|
74
|
+
export const UPDI_SYS_INSLEEP = 0x10;
|
|
75
|
+
export const UPDI_SYS_NVMPROG = 0x08;
|
|
76
|
+
export const UPDI_SYS_UROWPROG = 0x04;
|
|
77
|
+
export const UPDI_SYS_LOCKSTATUS = 0x01;
|
|
78
|
+
// ── Reset request byte ────────────────────────────────────────────────────────
|
|
79
|
+
export const UPDI_RESET_REQ_ASSERT = 0x59;
|
|
80
|
+
export const UPDI_RESET_REQ_DEASSERT = 0x00;
|
|
81
|
+
// ── NVM Controller (NVMv0 — tinyAVR 0/1/2, megaAVR 0) ───────────────────────
|
|
82
|
+
export const NVM_BASE = 0x1000;
|
|
83
|
+
export const NVM_CTRLA = 0x1000;
|
|
84
|
+
export const NVM_CTRLB = 0x1001;
|
|
85
|
+
export const NVM_STATUS = 0x1002;
|
|
86
|
+
export const NVM_INTCTRL = 0x1003;
|
|
87
|
+
export const NVM_INTFLAGS = 0x1004;
|
|
88
|
+
export const NVM_DATA = 0x1006;
|
|
89
|
+
export const NVM_ADDR = 0x1008; // 16-bit address register
|
|
90
|
+
// ── NVM status bits ───────────────────────────────────────────────────────────
|
|
91
|
+
/** Flash busy — poll until cleared after write/erase */
|
|
92
|
+
export const NVM_FBUSY = 0x01;
|
|
93
|
+
/** EEPROM busy */
|
|
94
|
+
export const NVM_EEBUSY = 0x02;
|
|
95
|
+
/** Write error */
|
|
96
|
+
export const NVM_WRERR = 0x04;
|
|
97
|
+
// ── NVM commands (write to NVM_CTRLA) ────────────────────────────────────────
|
|
98
|
+
export const NVM_CMD_NOP = 0x00; // No operation (clear previous command)
|
|
99
|
+
export const NVM_CMD_WP = 0x01; // Write page (from buffer)
|
|
100
|
+
export const NVM_CMD_ER = 0x02; // Erase page
|
|
101
|
+
export const NVM_CMD_ERWP = 0x03; // Erase and write page (most common for flash)
|
|
102
|
+
export const NVM_CMD_PBC = 0x04; // Page buffer clear
|
|
103
|
+
export const NVM_CMD_CHER = 0x05; // Chip erase (clears flash + EEPROM + fuses to reset values)
|
|
104
|
+
export const NVM_CMD_EEER = 0x06; // EEPROM only erase
|
|
105
|
+
export const NVM_CMD_WFU = 0x07; // Write fuse
|
|
106
|
+
// ── SIGROW (signature row) ────────────────────────────────────────────────────
|
|
107
|
+
/** Default SIGROW base address — contains 3-byte device ID at offset 0 */
|
|
108
|
+
export const SIGROW_BASE = 0x1100;
|
|
109
|
+
/** EEPROM base address (tinyAVR 0/1/2 and megaAVR 0) */
|
|
110
|
+
export const EEPROM_BASE = 0x1400;
|
|
111
|
+
/** Fuse register base (tinyAVR 0/1/2) */
|
|
112
|
+
export const FUSE_BASE = 0x1280;
|
|
113
|
+
/** Number of fuse registers */
|
|
114
|
+
export const FUSE_COUNT = 6;
|
|
115
|
+
// ── Authentication keys (8 bytes, LSB-first as sent on the wire) ─────────────
|
|
116
|
+
/**
|
|
117
|
+
* NVMProg key — grants access to NVM controller for flash/EEPROM/fuse writes.
|
|
118
|
+
* ASCII: "NVMProg " reversed to [0x20, 0x67, 0x6F, 0x72, 0x50, 0x4D, 0x56, 0x4E]
|
|
119
|
+
*/
|
|
120
|
+
export const UPDI_KEY_NVM_PROG = new Uint8Array([
|
|
121
|
+
0x20, 0x67, 0x6F, 0x72, 0x50, 0x4D, 0x56, 0x4E,
|
|
122
|
+
]);
|
|
123
|
+
/**
|
|
124
|
+
* ChipErase key — grants a single chip erase operation even on a locked device.
|
|
125
|
+
* ASCII: "NVMErase" reversed
|
|
126
|
+
*/
|
|
127
|
+
export const UPDI_KEY_CHIP_ERASE_REQ = new Uint8Array([
|
|
128
|
+
0x65, 0x73, 0x61, 0x72, 0x45, 0x4D, 0x56, 0x4E,
|
|
129
|
+
]);
|
|
130
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/protocol/updi/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { ISTKTransport } from '../../transport/ITransport.js';
|
|
2
|
+
import type { Board, Logger } from '../../core/types.js';
|
|
3
|
+
export declare class UPDILink {
|
|
4
|
+
private readonly transport;
|
|
5
|
+
private readonly board;
|
|
6
|
+
private readonly log;
|
|
7
|
+
constructor(transport: ISTKTransport, board: Board, log: Logger);
|
|
8
|
+
/**
|
|
9
|
+
* Write bytes and discard the echo (TX loopback).
|
|
10
|
+
* After this returns the transport's receive buffer contains only device
|
|
11
|
+
* responses, not echo bytes.
|
|
12
|
+
*/
|
|
13
|
+
send(bytes: number[]): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Receive exactly `count` bytes from the transport.
|
|
16
|
+
* Accumulates chunks until the total reaches `count`, then resolves.
|
|
17
|
+
* Rejects with STK500TimeoutError if the deadline expires.
|
|
18
|
+
*/
|
|
19
|
+
receiveExact(count: number): Promise<Uint8Array>;
|
|
20
|
+
/**
|
|
21
|
+
* Read one byte from a UPDI Control/Status register.
|
|
22
|
+
* LDCS sequence: SYNC + (0x80 | addr) → echo 2 bytes → read 1 byte
|
|
23
|
+
*/
|
|
24
|
+
ldcs(addr: number): Promise<number>;
|
|
25
|
+
/**
|
|
26
|
+
* Write one byte to a UPDI Control/Status register.
|
|
27
|
+
* STCS sequence: SYNC + (0xC0 | addr) + val → echo 3 bytes → read 1 ACK
|
|
28
|
+
*/
|
|
29
|
+
stcs(addr: number, val: number): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Read one byte from a 16-bit data-space address.
|
|
32
|
+
* LDS sequence: SYNC + 0x04 + addrL + addrH → echo 4 bytes → read 1 byte
|
|
33
|
+
*/
|
|
34
|
+
lds(addr: number): Promise<number>;
|
|
35
|
+
/**
|
|
36
|
+
* Write one byte to a 16-bit data-space address.
|
|
37
|
+
* STS sequence:
|
|
38
|
+
* → SYNC + 0x44 + addrL + addrH → echo 4 bytes → read 1 ACK
|
|
39
|
+
* → val → echo 1 byte → read 1 ACK
|
|
40
|
+
*/
|
|
41
|
+
sts(addr: number, val: number): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Load a 16-bit address into the UPDI pointer register.
|
|
44
|
+
* ST(ptr, 16-bit) sequence: SYNC + 0x61 + addrL + addrH → echo 4 bytes → read 1 ACK
|
|
45
|
+
*/
|
|
46
|
+
setPtr(addr: number): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Write a block of bytes to memory using ST ptr++ (with optional REPEAT).
|
|
49
|
+
*
|
|
50
|
+
* For count > 1, a REPEAT instruction is sent first so the device auto-advances
|
|
51
|
+
* the pointer. Each byte requires: send byte → discard echo → read ACK.
|
|
52
|
+
*/
|
|
53
|
+
stPtrInc(data: Uint8Array): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Read a block of bytes using LD ptr++ (with optional REPEAT).
|
|
56
|
+
*
|
|
57
|
+
* For count > 1, a REPEAT is sent first. The device streams back `count`
|
|
58
|
+
* data bytes directly — no echoes for reads.
|
|
59
|
+
*/
|
|
60
|
+
ldPtrInc(count: number): Promise<Uint8Array>;
|
|
61
|
+
/**
|
|
62
|
+
* Broadcast an 8-byte key to unlock NVM or chip-erase operations.
|
|
63
|
+
* KEY sequence: SYNC + 0xE0 + 8 key bytes → echo 10 bytes → no ACK
|
|
64
|
+
*/
|
|
65
|
+
sendKey(key: Uint8Array): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Configure guard time to minimum (2 cycles) for faster communication.
|
|
68
|
+
* Called once after establishing the link.
|
|
69
|
+
*/
|
|
70
|
+
configureGuardTime(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Read a contiguous memory region.
|
|
73
|
+
* Internally uses setPtr + ldPtrInc.
|
|
74
|
+
*/
|
|
75
|
+
readMemory(addr: number, size: number): Promise<Uint8Array>;
|
|
76
|
+
/**
|
|
77
|
+
* Write a contiguous memory region.
|
|
78
|
+
* Internally uses setPtr + stPtrInc.
|
|
79
|
+
*/
|
|
80
|
+
writeMemory(addr: number, data: Uint8Array): Promise<void>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/protocol/updi/link.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAazD,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAFH,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM;IAK9B;;;;OAIG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoChD;;;OAGG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOzC;;;OAGG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;;OAGG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxC;;;;;OAKG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnD;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzC;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB/C;;;;;OAKG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAmBlD;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKjE;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAIjE"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
// UPDI Link Layer — low-level byte I/O over a half-duplex single-wire interface.
|
|
2
|
+
//
|
|
3
|
+
// UPDI uses a single GPIO for both TX and RX (the UPDI pin). When bytes are
|
|
4
|
+
// transmitted, the same bytes are physically looped back to the RX line
|
|
5
|
+
// (half-duplex UART echo). The link layer must:
|
|
6
|
+
//
|
|
7
|
+
// 1. Write bytes to the transport.
|
|
8
|
+
// 2. Read and discard the same N bytes (the TX echo).
|
|
9
|
+
// 3. Then read the actual device response.
|
|
10
|
+
//
|
|
11
|
+
// All public methods handle echo cancellation internally — callers see a clean
|
|
12
|
+
// request/response interface.
|
|
13
|
+
//
|
|
14
|
+
// Reference: Microchip AVR® UPDI Programming Interface Application Note (DS40002312)
|
|
15
|
+
import { UPDI_SYNC, UPDI_ACK, UPDI_LDCS, UPDI_STCS, UPDI_LDS, UPDI_STS, UPDI_LD, UPDI_ST, UPDI_REPEAT, UPDI_KEY, UPDI_ADDRESS_16, UPDI_DATA_8, UPDI_DATA_16, UPDI_PTR, UPDI_PTR_INC, UPDI_KEY_SIZE_64, UPDI_CTRLA_GT_2, UPDI_CS_CTRLA, } from './constants.js';
|
|
16
|
+
import { STK500TimeoutError, STK500ProtocolError } from '../../core/errors.js';
|
|
17
|
+
// Pre-computed instruction byte constants
|
|
18
|
+
const INSTR_LDCS_BASE = UPDI_LDCS; // 0x80
|
|
19
|
+
const INSTR_STCS_BASE = UPDI_STCS; // 0xC0
|
|
20
|
+
const INSTR_LDS_16_8 = UPDI_LDS | (UPDI_ADDRESS_16 << 2) | UPDI_DATA_8; // 0x04
|
|
21
|
+
const INSTR_STS_16_8 = UPDI_STS | (UPDI_ADDRESS_16 << 2) | UPDI_DATA_8; // 0x44
|
|
22
|
+
const INSTR_ST_PTR_16 = UPDI_ST | (UPDI_PTR << 2) | UPDI_DATA_16; // 0x61 (set pointer)
|
|
23
|
+
const INSTR_ST_PTR_INC = UPDI_ST | (UPDI_PTR_INC << 2) | UPDI_DATA_8; // 0x64
|
|
24
|
+
const INSTR_LD_PTR_INC = UPDI_LD | (UPDI_PTR_INC << 2) | UPDI_DATA_8; // 0x24
|
|
25
|
+
const INSTR_REPEAT_8 = UPDI_REPEAT | UPDI_DATA_8; // 0xA0
|
|
26
|
+
const INSTR_KEY_64 = UPDI_KEY | UPDI_KEY_SIZE_64; // 0xE0
|
|
27
|
+
export class UPDILink {
|
|
28
|
+
constructor(transport, board, log) {
|
|
29
|
+
this.transport = transport;
|
|
30
|
+
this.board = board;
|
|
31
|
+
this.log = log;
|
|
32
|
+
}
|
|
33
|
+
// ── Private primitives ────────────────────────────────────────────────────
|
|
34
|
+
/**
|
|
35
|
+
* Write bytes and discard the echo (TX loopback).
|
|
36
|
+
* After this returns the transport's receive buffer contains only device
|
|
37
|
+
* responses, not echo bytes.
|
|
38
|
+
*/
|
|
39
|
+
async send(bytes) {
|
|
40
|
+
const data = new Uint8Array(bytes);
|
|
41
|
+
await this.transport.write(data);
|
|
42
|
+
// Discard echo bytes
|
|
43
|
+
await this.receiveExact(data.length);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Receive exactly `count` bytes from the transport.
|
|
47
|
+
* Accumulates chunks until the total reaches `count`, then resolves.
|
|
48
|
+
* Rejects with STK500TimeoutError if the deadline expires.
|
|
49
|
+
*/
|
|
50
|
+
receiveExact(count) {
|
|
51
|
+
if (count === 0)
|
|
52
|
+
return Promise.resolve(new Uint8Array(0));
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
let settled = false;
|
|
55
|
+
const chunks = [];
|
|
56
|
+
let received = 0;
|
|
57
|
+
const timer = setTimeout(() => {
|
|
58
|
+
if (settled)
|
|
59
|
+
return;
|
|
60
|
+
settled = true;
|
|
61
|
+
this.transport.off('data', onData);
|
|
62
|
+
reject(new STK500TimeoutError(this.board.timeout, `UPDI: waiting for ${count} bytes`));
|
|
63
|
+
}, this.board.timeout);
|
|
64
|
+
const onData = (chunk) => {
|
|
65
|
+
if (settled)
|
|
66
|
+
return;
|
|
67
|
+
chunks.push(chunk.slice());
|
|
68
|
+
received += chunk.length;
|
|
69
|
+
if (received >= count) {
|
|
70
|
+
settled = true;
|
|
71
|
+
clearTimeout(timer);
|
|
72
|
+
this.transport.off('data', onData);
|
|
73
|
+
const buf = new Uint8Array(received);
|
|
74
|
+
let off = 0;
|
|
75
|
+
for (const c of chunks) {
|
|
76
|
+
buf.set(c, off);
|
|
77
|
+
off += c.length;
|
|
78
|
+
}
|
|
79
|
+
resolve(buf.subarray(0, count));
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
this.transport.on('data', onData);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// ── CS register access (LDCS / STCS) ─────────────────────────────────────
|
|
86
|
+
/**
|
|
87
|
+
* Read one byte from a UPDI Control/Status register.
|
|
88
|
+
* LDCS sequence: SYNC + (0x80 | addr) → echo 2 bytes → read 1 byte
|
|
89
|
+
*/
|
|
90
|
+
async ldcs(addr) {
|
|
91
|
+
await this.send([UPDI_SYNC, INSTR_LDCS_BASE | (addr & 0x0F)]);
|
|
92
|
+
const resp = await this.receiveExact(1);
|
|
93
|
+
this.log('debug', `LDCS[0x${addr.toString(16)}] = 0x${resp[0].toString(16).padStart(2, '0')}`);
|
|
94
|
+
return resp[0];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Write one byte to a UPDI Control/Status register.
|
|
98
|
+
* STCS sequence: SYNC + (0xC0 | addr) + val → echo 3 bytes → read 1 ACK
|
|
99
|
+
*/
|
|
100
|
+
async stcs(addr, val) {
|
|
101
|
+
await this.send([UPDI_SYNC, INSTR_STCS_BASE | (addr & 0x0F), val]);
|
|
102
|
+
const ack = await this.receiveExact(1);
|
|
103
|
+
if (ack[0] !== UPDI_ACK) {
|
|
104
|
+
throw new STK500ProtocolError(`UPDI STCS[0x${addr.toString(16)}]: expected ACK 0x40, ` +
|
|
105
|
+
`got 0x${ack[0].toString(16).padStart(2, '0')}`);
|
|
106
|
+
}
|
|
107
|
+
this.log('debug', `STCS[0x${addr.toString(16)}] = 0x${val.toString(16).padStart(2, '0')}`);
|
|
108
|
+
}
|
|
109
|
+
// ── Data-space access (LDS / STS — 16-bit address, 8-bit data) ───────────
|
|
110
|
+
/**
|
|
111
|
+
* Read one byte from a 16-bit data-space address.
|
|
112
|
+
* LDS sequence: SYNC + 0x04 + addrL + addrH → echo 4 bytes → read 1 byte
|
|
113
|
+
*/
|
|
114
|
+
async lds(addr) {
|
|
115
|
+
await this.send([UPDI_SYNC, INSTR_LDS_16_8, addr & 0xFF, (addr >> 8) & 0xFF]);
|
|
116
|
+
const resp = await this.receiveExact(1);
|
|
117
|
+
this.log('debug', `LDS[0x${addr.toString(16).padStart(4, '0')}] = 0x${resp[0].toString(16).padStart(2, '0')}`);
|
|
118
|
+
return resp[0];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Write one byte to a 16-bit data-space address.
|
|
122
|
+
* STS sequence:
|
|
123
|
+
* → SYNC + 0x44 + addrL + addrH → echo 4 bytes → read 1 ACK
|
|
124
|
+
* → val → echo 1 byte → read 1 ACK
|
|
125
|
+
*/
|
|
126
|
+
async sts(addr, val) {
|
|
127
|
+
// Phase 1: send address
|
|
128
|
+
await this.send([UPDI_SYNC, INSTR_STS_16_8, addr & 0xFF, (addr >> 8) & 0xFF]);
|
|
129
|
+
const ack1 = await this.receiveExact(1);
|
|
130
|
+
if (ack1[0] !== UPDI_ACK) {
|
|
131
|
+
throw new STK500ProtocolError(`UPDI STS[0x${addr.toString(16)}] addr ACK: ` +
|
|
132
|
+
`got 0x${ack1[0].toString(16).padStart(2, '0')}`);
|
|
133
|
+
}
|
|
134
|
+
// Phase 2: send data (also echoed!)
|
|
135
|
+
await this.send([val]);
|
|
136
|
+
const ack2 = await this.receiveExact(1);
|
|
137
|
+
if (ack2[0] !== UPDI_ACK) {
|
|
138
|
+
throw new STK500ProtocolError(`UPDI STS[0x${addr.toString(16)}] data ACK: ` +
|
|
139
|
+
`got 0x${ack2[0].toString(16).padStart(2, '0')}`);
|
|
140
|
+
}
|
|
141
|
+
this.log('debug', `STS[0x${addr.toString(16).padStart(4, '0')}] = 0x${val.toString(16).padStart(2, '0')}`);
|
|
142
|
+
}
|
|
143
|
+
// ── Pointer register operations ───────────────────────────────────────────
|
|
144
|
+
/**
|
|
145
|
+
* Load a 16-bit address into the UPDI pointer register.
|
|
146
|
+
* ST(ptr, 16-bit) sequence: SYNC + 0x61 + addrL + addrH → echo 4 bytes → read 1 ACK
|
|
147
|
+
*/
|
|
148
|
+
async setPtr(addr) {
|
|
149
|
+
await this.send([UPDI_SYNC, INSTR_ST_PTR_16, addr & 0xFF, (addr >> 8) & 0xFF]);
|
|
150
|
+
const ack = await this.receiveExact(1);
|
|
151
|
+
if (ack[0] !== UPDI_ACK) {
|
|
152
|
+
throw new STK500ProtocolError(`UPDI SET_PTR(0x${addr.toString(16)}): no ACK ` +
|
|
153
|
+
`(got 0x${ack[0].toString(16).padStart(2, '0')})`);
|
|
154
|
+
}
|
|
155
|
+
this.log('debug', `SET_PTR(0x${addr.toString(16).padStart(4, '0')})`);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Write a block of bytes to memory using ST ptr++ (with optional REPEAT).
|
|
159
|
+
*
|
|
160
|
+
* For count > 1, a REPEAT instruction is sent first so the device auto-advances
|
|
161
|
+
* the pointer. Each byte requires: send byte → discard echo → read ACK.
|
|
162
|
+
*/
|
|
163
|
+
async stPtrInc(data) {
|
|
164
|
+
if (data.length === 0)
|
|
165
|
+
return;
|
|
166
|
+
// Send REPEAT if more than one byte
|
|
167
|
+
if (data.length > 1) {
|
|
168
|
+
await this.send([UPDI_SYNC, INSTR_REPEAT_8, data.length - 1]);
|
|
169
|
+
}
|
|
170
|
+
// Send ST_PTR_INC instruction
|
|
171
|
+
await this.send([UPDI_SYNC, INSTR_ST_PTR_INC]);
|
|
172
|
+
// Send each data byte — each triggers echo + ACK
|
|
173
|
+
for (let i = 0; i < data.length; i++) {
|
|
174
|
+
await this.send([data[i]]);
|
|
175
|
+
const ack = await this.receiveExact(1);
|
|
176
|
+
if (ack[0] !== UPDI_ACK) {
|
|
177
|
+
throw new STK500ProtocolError(`UPDI ST_PTR_INC byte[${i}]: no ACK ` +
|
|
178
|
+
`(got 0x${ack[0].toString(16).padStart(2, '0')})`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
this.log('debug', `ST_PTR_INC(${data.length} bytes)`);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Read a block of bytes using LD ptr++ (with optional REPEAT).
|
|
185
|
+
*
|
|
186
|
+
* For count > 1, a REPEAT is sent first. The device streams back `count`
|
|
187
|
+
* data bytes directly — no echoes for reads.
|
|
188
|
+
*/
|
|
189
|
+
async ldPtrInc(count) {
|
|
190
|
+
if (count === 0)
|
|
191
|
+
return new Uint8Array(0);
|
|
192
|
+
// Send REPEAT if more than one byte
|
|
193
|
+
if (count > 1) {
|
|
194
|
+
await this.send([UPDI_SYNC, INSTR_REPEAT_8, count - 1]);
|
|
195
|
+
}
|
|
196
|
+
// Send LD_PTR_INC instruction
|
|
197
|
+
await this.send([UPDI_SYNC, INSTR_LD_PTR_INC]);
|
|
198
|
+
// Device streams back `count` bytes (no echo for device→host direction)
|
|
199
|
+
const result = await this.receiveExact(count);
|
|
200
|
+
this.log('debug', `LD_PTR_INC(${count} bytes)`);
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
// ── KEY instruction ───────────────────────────────────────────────────────
|
|
204
|
+
/**
|
|
205
|
+
* Broadcast an 8-byte key to unlock NVM or chip-erase operations.
|
|
206
|
+
* KEY sequence: SYNC + 0xE0 + 8 key bytes → echo 10 bytes → no ACK
|
|
207
|
+
*/
|
|
208
|
+
async sendKey(key) {
|
|
209
|
+
if (key.length !== 8) {
|
|
210
|
+
throw new STK500ProtocolError(`UPDI KEY: expected 8-byte key, got ${key.length}`);
|
|
211
|
+
}
|
|
212
|
+
await this.send([UPDI_SYNC, INSTR_KEY_64, ...key]);
|
|
213
|
+
// No ACK for KEY — device just latches the key state
|
|
214
|
+
this.log('debug', `KEY sent (${Array.from(key).map(b => b.toString(16).padStart(2, '0')).join(' ')})`);
|
|
215
|
+
}
|
|
216
|
+
// ── Convenience ───────────────────────────────────────────────────────────
|
|
217
|
+
/**
|
|
218
|
+
* Configure guard time to minimum (2 cycles) for faster communication.
|
|
219
|
+
* Called once after establishing the link.
|
|
220
|
+
*/
|
|
221
|
+
async configureGuardTime() {
|
|
222
|
+
await this.stcs(UPDI_CS_CTRLA, UPDI_CTRLA_GT_2);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Read a contiguous memory region.
|
|
226
|
+
* Internally uses setPtr + ldPtrInc.
|
|
227
|
+
*/
|
|
228
|
+
async readMemory(addr, size) {
|
|
229
|
+
await this.setPtr(addr);
|
|
230
|
+
return this.ldPtrInc(size);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Write a contiguous memory region.
|
|
234
|
+
* Internally uses setPtr + stPtrInc.
|
|
235
|
+
*/
|
|
236
|
+
async writeMemory(addr, data) {
|
|
237
|
+
await this.setPtr(addr);
|
|
238
|
+
await this.stPtrInc(data);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/protocol/updi/link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Board, STK500Options, BootloadProgressCallback } from '../../core/types.js';
|
|
2
|
+
import type { ISTKTransport } from '../../transport/ITransport.js';
|
|
3
|
+
/**
|
|
4
|
+
* Fuse register dump for tinyAVR 0/1/2 and megaAVR 0 series.
|
|
5
|
+
* Note: fuse3 does not exist on these devices. Indices match NVM fuse layout.
|
|
6
|
+
*/
|
|
7
|
+
export interface UPDIFuses {
|
|
8
|
+
fuse0: number;
|
|
9
|
+
fuse1: number;
|
|
10
|
+
fuse2: number;
|
|
11
|
+
/** fuse3 does not exist — index 3 is reserved and returns 0xFF */
|
|
12
|
+
fuse4: number;
|
|
13
|
+
fuse5: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class UPDI {
|
|
16
|
+
private readonly transport;
|
|
17
|
+
private readonly board;
|
|
18
|
+
private readonly link;
|
|
19
|
+
private readonly log;
|
|
20
|
+
private readonly syncAttempts;
|
|
21
|
+
constructor(transport: ISTKTransport, board: Board, opts?: STK500Options);
|
|
22
|
+
/**
|
|
23
|
+
* Send a BREAK condition to reset the UPDI state machine.
|
|
24
|
+
* Requires transport.sendBreak() — throws if not available.
|
|
25
|
+
*/
|
|
26
|
+
sendBreak(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Verify the UPDI link is active by reading STATUSA.
|
|
29
|
+
* Returns the STATUSA value on success, throws STK500SyncError on failure.
|
|
30
|
+
*/
|
|
31
|
+
sync(attempts: number): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Send the NVMProg key and wait until the device acknowledges NVMPROG mode.
|
|
34
|
+
*/
|
|
35
|
+
enterProgMode(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if the device is locked (LOCKSTATUS bit in ASI_SYS_STATUS).
|
|
38
|
+
*/
|
|
39
|
+
isLocked(): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Erase the entire chip (flash + EEPROM + fuses reset to defaults).
|
|
42
|
+
* Must be in NVMPROG mode first — OR use the CHIPERASE key for locked devices.
|
|
43
|
+
*/
|
|
44
|
+
chipErase(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Chip erase using the CHIPERASE key — works even on locked devices.
|
|
47
|
+
* Sends BREAK + key, then waits for erase to complete.
|
|
48
|
+
*/
|
|
49
|
+
chipEraseKey(): Promise<void>;
|
|
50
|
+
/** Wait until NVM_STATUS.FBUSY clears (flash write/erase completed) */
|
|
51
|
+
waitNvmReady(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Read the 3-byte device ID from SIGROW (address 0x1100).
|
|
54
|
+
*/
|
|
55
|
+
getSignature(): Promise<Uint8Array>;
|
|
56
|
+
verifySignature(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Write one page of flash.
|
|
59
|
+
* @param byteAddr Absolute byte address in flash (e.g. 0x8000 for tinyAVR start)
|
|
60
|
+
* @param data Page data (length = board.pageSize)
|
|
61
|
+
*/
|
|
62
|
+
programPage(byteAddr: number, data: Uint8Array): Promise<void>;
|
|
63
|
+
/** Read `size` bytes from flash starting at `byteAddr` */
|
|
64
|
+
readFlash(byteAddr: number, size: number): Promise<Uint8Array>;
|
|
65
|
+
/**
|
|
66
|
+
* Write EEPROM bytes.
|
|
67
|
+
* @param offset Byte offset within EEPROM (0-based)
|
|
68
|
+
* @param data Data to write
|
|
69
|
+
*/
|
|
70
|
+
writeEeprom(offset: number, data: Uint8Array): Promise<void>;
|
|
71
|
+
/** Read `size` EEPROM bytes starting at `offset` */
|
|
72
|
+
readEeprom(offset: number, size: number): Promise<Uint8Array>;
|
|
73
|
+
/**
|
|
74
|
+
* Read all fuse bytes (6 fuses for tinyAVR/megaAVR 0).
|
|
75
|
+
*/
|
|
76
|
+
readFuses(): Promise<UPDIFuses>;
|
|
77
|
+
/**
|
|
78
|
+
* Write a single fuse byte.
|
|
79
|
+
* @param fuseNum 0–5 (fuse register index)
|
|
80
|
+
* @param val New fuse value
|
|
81
|
+
*/
|
|
82
|
+
writeFuse(fuseNum: number, val: number): Promise<void>;
|
|
83
|
+
/** Exit programming mode and reset the device to run user firmware. */
|
|
84
|
+
leaveProgMode(): Promise<void>;
|
|
85
|
+
upload(hexData: string | Uint8Array, progressCallback?: (pct: number) => void): Promise<void>;
|
|
86
|
+
verify(hexData: string | Uint8Array, progressCallback?: (pct: number) => void): Promise<void>;
|
|
87
|
+
bootload(hexData: string | Uint8Array, progressCallback?: BootloadProgressCallback): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=programmer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programmer.d.ts","sourceRoot":"","sources":["../../../src/protocol/updi/programmer.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,wBAAwB,EAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAOnE;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,IAAI;IAMb,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,KAAK,EAC7B,IAAI,GAAE,aAAkB;IAsB1B;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC;;;OAGG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBpC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAOlC;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAQhC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BnC,uEAAuE;IACjE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAYnC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAMnC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAetC;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAapE,0DAA0D;IACpD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMpE;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,oDAAoD;IAC9C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMnE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAYrC;;;;OAIG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,uEAAuE;IACjE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,IAAI,CAAC;IAmCV,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,IAAI,CAAC;IA2BV,QAAQ,CACZ,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,wBAAwB,GAC1C,OAAO,CAAC,IAAI,CAAC;CAsDjB"}
|