ac6502 1.2.0 → 1.4.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/README.md +12 -12
- package/dist/components/CPU.d.ts +162 -0
- package/dist/components/Cart.d.ts +9 -0
- package/dist/components/IO/ACIA.d.ts +76 -0
- package/dist/components/IO/ACIA.js +282 -0
- package/dist/components/IO/ACIA.js.map +1 -0
- package/dist/components/IO/Attachments/Attachment.d.ts +112 -0
- package/dist/components/IO/Attachments/Attachment.js +71 -0
- package/dist/components/IO/Attachments/Attachment.js.map +1 -0
- package/dist/components/IO/Attachments/JoystickAttachment.d.ts +53 -0
- package/dist/components/IO/Attachments/JoystickAttachment.js +90 -0
- package/dist/components/IO/Attachments/JoystickAttachment.js.map +1 -0
- package/dist/components/IO/Attachments/KeyboardEncoderAttachment.d.ts +63 -0
- package/dist/components/IO/Attachments/KeyboardEncoderAttachment.js +489 -0
- package/dist/components/IO/Attachments/KeyboardEncoderAttachment.js.map +1 -0
- package/dist/components/IO/Attachments/KeyboardMatrixAttachment.d.ts +44 -0
- package/dist/components/IO/Attachments/KeyboardMatrixAttachment.js +274 -0
- package/dist/components/IO/Attachments/KeyboardMatrixAttachment.js.map +1 -0
- package/dist/components/IO/Attachments/KeypadAttachment.d.ts +47 -0
- package/dist/components/IO/Attachments/KeypadAttachment.js +141 -0
- package/dist/components/IO/Attachments/KeypadAttachment.js.map +1 -0
- package/dist/components/IO/Attachments/LCDAttachment.d.ts +110 -0
- package/dist/components/IO/Attachments/LCDAttachment.js +716 -0
- package/dist/components/IO/Attachments/LCDAttachment.js.map +1 -0
- package/dist/components/IO/Attachments/SNESAttachment.d.ts +85 -0
- package/dist/components/IO/Attachments/SNESAttachment.js +184 -0
- package/dist/components/IO/Attachments/SNESAttachment.js.map +1 -0
- package/dist/components/IO/DevOutputBoard.d.ts +19 -0
- package/dist/components/IO/DevOutputBoard.js +33 -0
- package/dist/components/IO/DevOutputBoard.js.map +1 -0
- package/dist/components/IO/Empty.d.ts +9 -0
- package/dist/components/IO/Empty.js +5 -7
- package/dist/components/IO/Empty.js.map +1 -1
- package/dist/components/IO/EmptyCard.d.ts +9 -0
- package/dist/components/IO/GPIOAttachments/GPIOAttachment.d.ts +112 -0
- package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.d.ts +53 -0
- package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.d.ts +63 -0
- package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.d.ts +44 -0
- package/dist/components/IO/GPIOAttachments/GPIOKeypadAttachment.d.ts +47 -0
- package/dist/components/IO/GPIOAttachments/GPIOLCDAttachment.d.ts +110 -0
- package/dist/components/IO/GPIOCard.d.ts +105 -0
- package/dist/components/IO/GPIOCard.js.map +1 -1
- package/dist/components/IO/RAMBank.d.ts +37 -0
- package/dist/components/IO/RAMBank.js +63 -0
- package/dist/components/IO/RAMBank.js.map +1 -0
- package/dist/components/IO/RAMCard.d.ts +37 -0
- package/dist/components/IO/RTC.d.ts +107 -0
- package/dist/components/IO/RTC.js +483 -0
- package/dist/components/IO/RTC.js.map +1 -0
- package/dist/components/IO/RTCCard.d.ts +107 -0
- package/dist/components/IO/SerialCard.d.ts +76 -0
- package/dist/components/IO/Sound.d.ts +120 -0
- package/dist/components/IO/Sound.js +622 -0
- package/dist/components/IO/Sound.js.map +1 -0
- package/dist/components/IO/SoundCard.d.ts +120 -0
- package/dist/components/IO/Storage.d.ts +74 -0
- package/dist/components/IO/Storage.js +409 -0
- package/dist/components/IO/Storage.js.map +1 -0
- package/dist/components/IO/StorageCard.d.ts +74 -0
- package/dist/components/IO/Terminal.d.ts +19 -0
- package/dist/components/IO/Terminal.js +33 -0
- package/dist/components/IO/Terminal.js.map +1 -0
- package/dist/components/IO/VIA.d.ts +105 -0
- package/dist/components/IO/VIA.js +597 -0
- package/dist/components/IO/VIA.js.map +1 -0
- package/dist/components/IO/Video.d.ts +141 -0
- package/dist/components/IO/Video.js +630 -0
- package/dist/components/IO/Video.js.map +1 -0
- package/dist/components/IO/VideoCard.d.ts +141 -0
- package/dist/components/IO.d.ts +8 -0
- package/dist/components/Machine.d.ts +62 -0
- package/dist/components/Machine.js +260 -153
- package/dist/components/Machine.js.map +1 -1
- package/dist/components/RAM.d.ts +9 -0
- package/dist/components/ROM.d.ts +9 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +61 -28
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +22 -0
- package/dist/lib.js +47 -0
- package/dist/lib.js.map +1 -0
- package/dist/tests/CPU.test.d.ts +1 -0
- package/dist/tests/Cart.test.d.ts +1 -0
- package/dist/tests/IO/ACIA.test.d.ts +1 -0
- package/dist/tests/IO/ACIA.test.js +423 -0
- package/dist/tests/IO/ACIA.test.js.map +1 -0
- package/dist/tests/IO/Attachments/Attachment.test.d.ts +1 -0
- package/dist/tests/IO/Attachments/Attachment.test.js +339 -0
- package/dist/tests/IO/Attachments/Attachment.test.js.map +1 -0
- package/dist/tests/IO/Attachments/JoystickAttachment.test.d.ts +1 -0
- package/dist/tests/IO/Attachments/JoystickAttachment.test.js +126 -0
- package/dist/tests/IO/Attachments/JoystickAttachment.test.js.map +1 -0
- package/dist/tests/IO/Attachments/KeyboardEncoderAttachment.test.d.ts +1 -0
- package/dist/tests/IO/Attachments/KeyboardEncoderAttachment.test.js +779 -0
- package/dist/tests/IO/Attachments/KeyboardEncoderAttachment.test.js.map +1 -0
- package/dist/tests/IO/Attachments/KeyboardMatrixAttachment.test.d.ts +1 -0
- package/dist/tests/IO/Attachments/KeyboardMatrixAttachment.test.js +355 -0
- package/dist/tests/IO/Attachments/KeyboardMatrixAttachment.test.js.map +1 -0
- package/dist/tests/IO/Attachments/KeypadAttachment.test.d.ts +1 -0
- package/dist/tests/IO/Attachments/KeypadAttachment.test.js +323 -0
- package/dist/tests/IO/Attachments/KeypadAttachment.test.js.map +1 -0
- package/dist/tests/IO/Attachments/LCDAttachment.test.d.ts +1 -0
- package/dist/tests/IO/Attachments/LCDAttachment.test.js +627 -0
- package/dist/tests/IO/Attachments/LCDAttachment.test.js.map +1 -0
- package/dist/tests/IO/Attachments/SNESAttachment.test.d.ts +1 -0
- package/dist/tests/IO/Attachments/SNESAttachment.test.js +331 -0
- package/dist/tests/IO/Attachments/SNESAttachment.test.js.map +1 -0
- package/dist/tests/IO/Empty.test.d.ts +1 -0
- package/dist/tests/IO/Empty.test.js +121 -0
- package/dist/tests/IO/Empty.test.js.map +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.d.ts +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.d.ts +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.d.ts +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.d.ts +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOKeypadAttachment.test.d.ts +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOLCDAttachment.test.d.ts +1 -0
- package/dist/tests/IO/GPIOCard.test.d.ts +1 -0
- package/dist/tests/IO/GPIOCard.test.js.map +1 -1
- package/dist/tests/IO/RAMBank.test.d.ts +1 -0
- package/dist/tests/IO/RAMBank.test.js +229 -0
- package/dist/tests/IO/RAMBank.test.js.map +1 -0
- package/dist/tests/IO/RAMCard.test.d.ts +1 -0
- package/dist/tests/IO/RTC.test.d.ts +1 -0
- package/dist/tests/IO/RTC.test.js +177 -0
- package/dist/tests/IO/RTC.test.js.map +1 -0
- package/dist/tests/IO/RTCCard.test.d.ts +1 -0
- package/dist/tests/IO/SerialCard.test.d.ts +1 -0
- package/dist/tests/IO/Sound.test.d.ts +1 -0
- package/dist/tests/IO/Sound.test.js +528 -0
- package/dist/tests/IO/Sound.test.js.map +1 -0
- package/dist/tests/IO/SoundCard.test.d.ts +1 -0
- package/dist/tests/IO/Storage.test.d.ts +1 -0
- package/dist/tests/IO/Storage.test.js +656 -0
- package/dist/tests/IO/Storage.test.js.map +1 -0
- package/dist/tests/IO/StorageCard.test.d.ts +1 -0
- package/dist/tests/IO/VIA.test.d.ts +1 -0
- package/dist/tests/IO/VIA.test.js +503 -0
- package/dist/tests/IO/VIA.test.js.map +1 -0
- package/dist/tests/IO/Video.test.d.ts +1 -0
- package/dist/tests/IO/Video.test.js +549 -0
- package/dist/tests/IO/Video.test.js.map +1 -0
- package/dist/tests/IO/VideoCard.test.d.ts +1 -0
- package/dist/tests/Machine.test.d.ts +1 -0
- package/dist/tests/Machine.test.js +27 -42
- package/dist/tests/Machine.test.js.map +1 -1
- package/dist/tests/RAM.test.d.ts +1 -0
- package/dist/tests/ROM.test.d.ts +1 -0
- package/package.json +5 -3
- package/src/components/IO/{SerialCard.ts → ACIA.ts} +2 -2
- package/src/components/IO/{GPIOAttachments/GPIOAttachment.ts → Attachments/Attachment.ts} +2 -2
- package/src/components/IO/{GPIOAttachments/GPIOJoystickAttachment.ts → Attachments/JoystickAttachment.ts} +3 -3
- package/src/components/IO/{GPIOAttachments/GPIOKeyboardEncoderAttachment.ts → Attachments/KeyboardEncoderAttachment.ts} +3 -3
- package/src/components/IO/{GPIOAttachments/GPIOKeyboardMatrixAttachment.ts → Attachments/KeyboardMatrixAttachment.ts} +5 -5
- package/src/components/IO/{GPIOAttachments/GPIOKeypadAttachment.ts → Attachments/KeypadAttachment.ts} +3 -3
- package/src/components/IO/{GPIOAttachments/GPIOLCDAttachment.ts → Attachments/LCDAttachment.ts} +7 -7
- package/src/components/IO/{EmptyCard.ts → Empty.ts} +1 -1
- package/src/components/IO/{RAMCard.ts → RAMBank.ts} +8 -8
- package/src/components/IO/{RTCCard.ts → RTC.ts} +1 -1
- package/src/components/IO/{SoundCard.ts → Sound.ts} +2 -2
- package/src/components/IO/{StorageCard.ts → Storage.ts} +70 -73
- package/src/components/IO/Terminal.ts +34 -0
- package/src/components/IO/{GPIOCard.ts → VIA.ts} +64 -64
- package/src/components/IO/{VideoCard.ts → Video.ts} +1 -1
- package/src/components/Machine.ts +286 -160
- package/src/index.ts +65 -35
- package/src/lib.ts +27 -0
- package/src/tests/IO/{SerialCard.test.ts → ACIA.test.ts} +5 -5
- package/src/tests/IO/{GPIOAttachments/GPIOAttachment.test.ts → Attachments/Attachment.test.ts} +12 -12
- package/src/tests/IO/{GPIOAttachments/GPIOJoystickAttachment.test.ts → Attachments/JoystickAttachment.test.ts} +23 -23
- package/src/tests/IO/{GPIOAttachments/GPIOKeyboardEncoderAttachment.test.ts → Attachments/KeyboardEncoderAttachment.test.ts} +4 -4
- package/src/tests/IO/{GPIOAttachments/GPIOKeyboardMatrixAttachment.test.ts → Attachments/KeyboardMatrixAttachment.test.ts} +5 -5
- package/src/tests/IO/{GPIOAttachments/GPIOKeypadAttachment.test.ts → Attachments/KeypadAttachment.test.ts} +38 -38
- package/src/tests/IO/{GPIOAttachments/GPIOLCDAttachment.test.ts → Attachments/LCDAttachment.test.ts} +12 -12
- package/src/tests/IO/Empty.test.ts +143 -0
- package/src/tests/IO/{RAMCard.test.ts → RAMBank.test.ts} +33 -33
- package/src/tests/IO/{RTCCard.test.ts → RTC.test.ts} +6 -6
- package/src/tests/IO/{SoundCard.test.ts → Sound.test.ts} +6 -6
- package/src/tests/IO/{StorageCard.test.ts → Storage.test.ts} +34 -25
- package/src/tests/IO/{GPIOCard.test.ts → VIA.test.ts} +7 -7
- package/src/tests/IO/{VideoCard.test.ts → Video.test.ts} +13 -13
- package/src/tests/Machine.test.ts +31 -38
- package/tsconfig.json +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LCDAttachment.js","sourceRoot":"","sources":["../../../../src/components/IO/Attachments/LCDAttachment.ts"],"names":[],"mappings":";;;AAAA,6CAA6C;AAE7C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,sEAAsE;AAEzD,QAAA,aAAa,GAAoB,IAAI,CAAA;AACrC,QAAA,YAAY,GAAqB,IAAI,CAAA;AACrC,QAAA,kBAAkB,GAAe,IAAI,CAAA;AACrC,QAAA,4BAA4B,GAAK,IAAI,CAAA;AACrC,QAAA,wBAAwB,GAAS,IAAI,CAAA;AACrC,QAAA,eAAe,GAAkB,IAAI,CAAA;AACrC,QAAA,kBAAkB,GAAe,IAAI,CAAA;AACrC,QAAA,sBAAsB,GAAW,IAAI,CAAA;AACrC,QAAA,4BAA4B,GAAK,IAAI,CAAA;AACrC,QAAA,aAAa,GAAoB,IAAI,CAAA;AACrC,QAAA,qBAAqB,GAAY,IAAI,CAAA;AACrC,QAAA,mBAAmB,GAAc,IAAI,CAAA;AACrC,QAAA,gBAAgB,GAAiB,IAAI,CAAA;AACrC,QAAA,0BAA0B,GAAO,IAAI,CAAA;AACrC,QAAA,sBAAsB,GAAW,IAAI,CAAA;AACrC,QAAA,qBAAqB,GAAY,IAAI,CAAA;AAElD,sEAAsE;AAEtE,MAAM,aAAa,GAAI,CAAC,CAAA;AACxB,MAAM,cAAc,GAAG,CAAC,CAAA;AAExB,MAAM,UAAU,GAAgB,GAAG,CAAA;AACnC,MAAM,mBAAmB,GAAO,EAAE,CAAA;AAClC,MAAM,cAAc,GAAY,GAAG,GAAG,mBAAmB,CAAA;AACzD,MAAM,kBAAkB,GAAQ,IAAI,CAAA;AAEpC,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAChC,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAEhC,MAAM,WAAW,GAAG,oCAA4B,GAAG,8BAAsB,CAAA;AAEzE,mDAAmD;AACnD,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAE5C,sEAAsE;AAEtE,MAAM,MAAM,GAAG,IAAI,CAAA,CAAE,QAAQ;AAC7B,MAAM,MAAM,GAAG,IAAI,CAAA,CAAE,QAAQ;AAC7B,MAAM,KAAK,GAAI,IAAI,CAAA,CAAE,QAAQ;AAE7B,sEAAsE;AACtE,oEAAoE;AACpE,yDAAyD;AAEzD,MAAM,QAAQ,GAAqE;IACjF,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,gBAAgB;IAC5C,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,YAAY;IACxC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,UAAU;IACtC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,WAAW;IACvC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,WAAW;IACvC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,MAAM;CACnC,CAAA;AAED,MAAa,aAAc,SAAQ,2BAAc;IAsC/C,YAAY,OAAe,EAAE,EAAE,OAAe,CAAC,EAAE,WAAmB,CAAC;QACnE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAjC7C,kEAAkE;QAE1D,mBAAc,GAAW,oCAA4B,CAAA;QACrD,iBAAY,GAAW,IAAI,CAAA;QAC3B,iBAAY,GAAW,CAAC,CAAA;QAIhC,mCAAmC;QAC3B,UAAK,GAAW,CAAC,CAAA;QAMzB,0DAA0D;QAClD,UAAK,GAAkB,IAAI,CAAA;QAOnC,kEAAkE;QAC1D,qBAAgB,GAAW,CAAC,CAAA;QAC5B,eAAU,GAAY,KAAK,CAAA;QAGnC,kEAAkE;QAC1D,cAAS,GAAW,CAAC,CAAA;QACrB,UAAK,GAAY,KAAK,CAAA;QAkItB,mBAAc,GAAW,CAAC,CAAA;QA7HhC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAEhB,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,mBAAmB,GAAG,aAAa,CAAC,CAAA;QAEhE,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAA;QAE9E,IAAI,CAAC,WAAW,GAAI,IAAI,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAEjE,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,8DAA8D;IAE9D,KAAK;QACH,KAAK,CAAC,KAAK,EAAE,CAAA;QAEb,IAAI,CAAC,cAAc,GAAG,oCAA4B,CAAA;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;QAErB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,QAAQ;QAC9B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QAEjB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;QACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QACvB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAElB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACpB,IAAI,CAAC,YAAY,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,CAAC,YAAoB;QACvB,6BAA6B;QAC7B,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,IAAI,CAAA;QAC7C,IAAI,CAAC,gBAAgB,IAAI,SAAS,CAAA;QAClC,IAAI,IAAI,CAAC,gBAAgB,IAAI,aAAa,CAAC,eAAe,EAAE,CAAC;YAC3D,IAAI,CAAC,gBAAgB,IAAI,aAAa,CAAC,eAAe,CAAA;YACtD,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAA;QACpC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,KAAa,EAAE,GAAW;QACnC,MAAM,WAAW,GAAG,KAAK,GAAG,GAAG,CAAA;QAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QAExB,kEAAkE;QAClE,qEAAqE;QACrE,kEAAkE;QAClE,oEAAoE;QACpE,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,EAAE,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,WAAW,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;IACvB,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,EAAU;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,EAAU;QAC/B,qDAAqD;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAA;QAC5B,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC;YACnB,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC;gBACnB,yBAAyB;gBACzB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;YACxB,CAAC;iBAAM,CAAC;gBACN,wCAAwC;gBACxC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,iEAAiE;IAEzD,QAAQ;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAA;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAA;QAC7B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAA;QAE7B,IAAI,EAAE,EAAE,CAAC;YACP,4CAA4C;YAC5C,OAAM;QACR,CAAC;QAED,8DAA8D;QAC9D,mEAAmE;QACnE,wEAAwE;QACxE,yEAAyE;QACzE,mEAAmE;QACnE,yEAAyE;QACzE,oEAAoE;QACpE,uDAAuD;QACvD,EAAE;QACF,kEAAkE;QAClE,6DAA6D;QAC7D,4DAA4D;QAE5D,kEAAkE;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAA;QAEhC,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAA;IACrB,CAAC;IAIQ,UAAU,CAAC,KAAa,EAAE,GAAW;QAC5C,IAAI,CAAC,cAAc,GAAG,KAAK,GAAG,GAAG,CAAA;IACnC,CAAC;IAED,iEAAiE;IAEjE,WAAW,CAAC,OAAe;QACzB,IAAI,OAAO,GAAG,6BAAqB,EAAE,CAAC;YACpC,uCAAuC;YACvC,IAAI,CAAC,KAAK,GAAG,OAAO,GAAG,IAAI,CAAA;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACnB,CAAC;aAAM,IAAI,OAAO,GAAG,8BAAsB,EAAE,CAAC;YAC5C,uCAAuC;YACvC,IAAI,CAAC,KAAK,GAAG,OAAO,GAAG,IAAI,CAAA;QAC7B,CAAC;aAAM,IAAI,OAAO,GAAG,wBAAgB,EAAE,CAAC;YACtC,kEAAkE;QACpE,CAAC;aAAM,IAAI,OAAO,GAAG,qBAAa,EAAE,CAAC;YACnC,IAAI,OAAO,GAAG,6BAAqB,EAAE,CAAC;gBACpC,uBAAuB;gBACvB,IAAI,OAAO,GAAG,2BAAmB,EAAE,CAAC;oBAClC,EAAE,IAAI,CAAC,YAAY,CAAA;gBACrB,CAAC;qBAAM,CAAC;oBACN,EAAE,IAAI,CAAC,YAAY,CAAA;gBACrB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,IAAI,OAAO,GAAG,2BAAmB,EAAE,CAAC;oBAClC,IAAI,CAAC,cAAc,EAAE,CAAA;gBACvB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,cAAc,EAAE,CAAA;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,GAAG,uBAAe,EAAE,CAAC;YACrC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAA;QAC7B,CAAC;aAAM,IAAI,OAAO,GAAG,0BAAkB,EAAE,CAAC;YACxC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAA;QAC/B,CAAC;aAAM,IAAI,OAAO,GAAG,oBAAY,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;YACd,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;QACvB,CAAC;aAAM,IAAI,OAAO,KAAK,qBAAa,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;YACd,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;YACrB,IAAI,CAAC,cAAc,GAAG,oCAA4B,CAAA;QACpD,CAAC;IACH,CAAC;IAED,iEAAiE;IAEjE,SAAS,CAAC,IAAY;QACpB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,iBAAiB;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,cAAc,CAAA;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAA;YAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;gBACvD,MAAM,IAAI,GAAG,QAAQ,GAAG,aAAa,GAAG,cAAc,GAAG,cAAc,CAAA;gBACvE,+DAA+D;gBAC/D,yDAAyD;gBACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,aAAa,GAAG,CAAC,CAAA;gBACvE,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC5B,IAAI,GAAG,EAAE,CAAC;wBACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAA;oBAClC,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAA;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,iBAAiB;YACjB,IAAI,IAAI,CAAC,KAAK,GAAG,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,cAAc,CAAA;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,CAAA;YACvD,IAAI,IAAI,GAAG,CAAC,CAAA;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,OAAO,GAAG,aAAa,GAAG,CAAC,CAAA;gBACvC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;oBACjE,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;gBAC9C,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChE,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IAC1B,CAAC;IAED,iEAAiE;IAEzD,cAAc;QACpB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACnB,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC3D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACnB,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACnB,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACnB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,sBAAsB;YACtB,IAAI,IAAI,CAAC,cAAc,GAAG,oCAA4B,EAAE,CAAC;gBACvD,IAAI,CAAC,KAAK,EAAE,CAAA;gBACZ,IAAI,IAAI,CAAC,KAAK,IAAI,mBAAmB,GAAG,cAAc,EAAE,CAAC;oBACvD,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;gBAChB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,EAAE,CAAA;gBACZ,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,KAAK,GAAG,mBAAmB,GAAG,cAAc,GAAG,CAAC,CAAA;gBACvD,CAAC;YACH,CAAC;YACD,OAAM;QACR,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,cAAc,GAAG,gCAAwB,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,cAAc,GAAG,oCAA4B,EAAE,CAAC;gBACvD,EAAE,IAAI,CAAC,YAAY,CAAA;YACrB,CAAC;iBAAM,CAAC;gBACN,EAAE,IAAI,CAAC,YAAY,CAAA;YACrB,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,GAAG,oCAA4B,EAAE,CAAC;YACvD,IAAI,CAAC,cAAc,EAAE,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,EAAE,CAAA;QACvB,CAAC;IACH,CAAC;IAED,iEAAiE;IAEjE;;;OAGG;IACK,QAAQ,CAAC,CAAS;QACxB,IAAI,CAAC,GAAG,mBAAmB,EAAE,CAAC;YAC5B,6CAA6C;YAC7C,MAAM,KAAK,GAAG,CAAC,GAAG,aAAa,CAAA;YAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAAC,CAAA;QAC1D,CAAC;QACD,OAAO,QAAQ,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAA;IAC1C,CAAC;IAED,iEAAiE;IAEzD,aAAa,CAAC,GAAW,EAAE,GAAW;QAC5C,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI;YAAE,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;QAEzC,mCAAmC;QACnC,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAA;QAC9B,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,IAAI,CAAC,aAAa,CAAA;QAC9B,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAA;QAEnD,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;QACnC,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,iEAAiE;IAEjE,YAAY;;QACV,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,0BAAkB,CAAC,CAAA;QAE5D,yBAAyB;QACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC9C,IAAI,IAAI,CAAC,YAAY,GAAG,oCAA4B,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,QAAQ,IAAI,CAAC,oCAA4B,CAAA;YAC3C,CAAC;QACH,CAAC;QAED,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACzC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;gBACzC,yCAAyC;gBACzC,MAAM,YAAY,GAAG,GAAG,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,CAAA;gBAC9C,MAAM,YAAY,GAAG,GAAG,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAA;gBAE/C,eAAe;gBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBAC7C,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mCAAI,IAAI,CAAA;gBAE7C,8BAA8B;gBAC9B,MAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAA;gBAE/E,gBAAgB;gBAChB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAEpC,uBAAuB;gBACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvC,MAAM,QAAQ,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAA;wBAE3E,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;4BACzB,SAAQ;wBACV,CAAC;wBAED,+DAA+D;wBAC/D,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;wBAE3C,kBAAkB;wBAClB,IAAI,UAAU,EAAE,CAAC;4BACf,IAAI,CAAC,QAAQ,GAAG,oCAA4B,CAAC;gCACzC,CAAC,CAAC,QAAQ,GAAG,8BAAsB,CAAC,IAAI,CAAC,KAAK,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC;gCACtE,KAAK,GAAG,CAAC,CAAA;4BACX,CAAC;wBACH,CAAC;wBAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAc,CAAA;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iEAAiE;IAEjE,iCAAiC;IACjC,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,4CAA4C;IAC5C,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,4BAA4B;IAC5B,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,+BAA+B;IAC/B,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,wBAAwB;IACxB,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,oDAAoD;IACpD,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,sDAAsD;IACtD,UAAU,CAAC,GAAW;QACpB,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAC3C,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QACjD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,mEAAmE;IACnE,UAAU,CAAC,CAAS,EAAE,CAAS;QAC7B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;QACvC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC5B,CAAC;QACD,OAAO,CAAC,CAAC,CAAA;IACX,CAAC;;AAxdH,sCAydC;AAzbyB,6BAAe,GAAG,GAAG,AAAN,CAAM"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { AttachmentBase } from './Attachment';
|
|
2
|
+
/**
|
|
3
|
+
* SNESAttachment - Emulates two Super Nintendo controllers attached to a VIA GPIO port.
|
|
4
|
+
*
|
|
5
|
+
* Pin mapping (on the attached port):
|
|
6
|
+
* Bit 0 (0x01) — CLK : clock signal driven by the 6502 (output)
|
|
7
|
+
* Bit 1 (0x02) — LATCH : latch signal driven by the 6502 (output)
|
|
8
|
+
* Bit 2 (0x04) — DATA1 : serial data from controller 1 to the 6502 (input)
|
|
9
|
+
* Bit 3 (0x08) — DATA2 : serial data from controller 2 to the 6502 (input)
|
|
10
|
+
*
|
|
11
|
+
* Protocol (SNES / NES shift-register protocol):
|
|
12
|
+
* 1. CPU pulses LATCH high then low — controllers sample their button states
|
|
13
|
+
* and the first bit (bit 0) appears on the DATA lines.
|
|
14
|
+
* 2. Each subsequent falling edge on CLK shifts to the next bit.
|
|
15
|
+
* 3. A total of 16 bits are transmitted per controller (SNES).
|
|
16
|
+
*
|
|
17
|
+
* SNES bit order (bit 0 first):
|
|
18
|
+
* 0=B 1=Y 2=SEL 3=STA 4=UP 5=DN 6=LT 7=RT
|
|
19
|
+
* 8=A 9=X 10=L 11=R 12-15=1 (always high)
|
|
20
|
+
*
|
|
21
|
+
* All data bits are active-low (0 = button pressed, 1 = not pressed).
|
|
22
|
+
*
|
|
23
|
+
* Button state format matches the constants used in index.ts / JoystickAttachment:
|
|
24
|
+
* BUTTON_UP=0x01 BUTTON_DOWN=0x02 BUTTON_LEFT=0x04 BUTTON_RIGHT=0x08
|
|
25
|
+
* BUTTON_A=0x10 BUTTON_B=0x20 BUTTON_SELECT=0x40 BUTTON_START=0x80
|
|
26
|
+
*/
|
|
27
|
+
export declare class SNESAttachment extends AttachmentBase {
|
|
28
|
+
static readonly BUTTON_UP = 1;
|
|
29
|
+
static readonly BUTTON_DOWN = 2;
|
|
30
|
+
static readonly BUTTON_LEFT = 4;
|
|
31
|
+
static readonly BUTTON_RIGHT = 8;
|
|
32
|
+
static readonly BUTTON_A = 16;
|
|
33
|
+
static readonly BUTTON_B = 32;
|
|
34
|
+
static readonly BUTTON_SELECT = 64;
|
|
35
|
+
static readonly BUTTON_START = 128;
|
|
36
|
+
private static readonly PIN_CLK;
|
|
37
|
+
private static readonly PIN_LATCH;
|
|
38
|
+
private static readonly PIN_DATA1;
|
|
39
|
+
private static readonly PIN_DATA2;
|
|
40
|
+
private static readonly SNES_BITS;
|
|
41
|
+
private readonly attachedToPortA;
|
|
42
|
+
private buttonState1;
|
|
43
|
+
private buttonState2;
|
|
44
|
+
private shiftReg1;
|
|
45
|
+
private shiftReg2;
|
|
46
|
+
private bitIndex;
|
|
47
|
+
private prevLatch;
|
|
48
|
+
private prevClk;
|
|
49
|
+
/**
|
|
50
|
+
* @param attachToPortA - true to respond on Port A, false for Port B
|
|
51
|
+
* @param priority - attachment priority (lower = higher priority)
|
|
52
|
+
*/
|
|
53
|
+
constructor(attachToPortA?: boolean, priority?: number);
|
|
54
|
+
reset(): void;
|
|
55
|
+
readPortA(ddr: number, or: number): number;
|
|
56
|
+
readPortB(ddr: number, or: number): number;
|
|
57
|
+
writePortA(value: number, ddr: number): void;
|
|
58
|
+
writePortB(value: number, ddr: number): void;
|
|
59
|
+
/**
|
|
60
|
+
* Update the button state for controller 1 (DATA1 line).
|
|
61
|
+
* @param buttons - Button state byte using BUTTON_x bit masks (1 = pressed)
|
|
62
|
+
*/
|
|
63
|
+
updateController1(buttons: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* Update the button state for controller 2 (DATA2 line).
|
|
66
|
+
* @param buttons - Button state byte using BUTTON_x bit masks (1 = pressed)
|
|
67
|
+
*/
|
|
68
|
+
updateController2(buttons: number): void;
|
|
69
|
+
/**
|
|
70
|
+
* Build a 16-bit SNES shift register from a button-state byte.
|
|
71
|
+
* Bits are active-low (0 = pressed, 1 = not pressed).
|
|
72
|
+
* Bits 12-15 are always 1 (used by the protocol to identify controller type).
|
|
73
|
+
* Y (bit 1), X (bit 9), L (bit 10), R (bit 11) have no mapping and stay 1.
|
|
74
|
+
*/
|
|
75
|
+
private buildShiftRegister;
|
|
76
|
+
/**
|
|
77
|
+
* Detect LATCH / CLK signal transitions and update internal state accordingly.
|
|
78
|
+
*/
|
|
79
|
+
private handleSignals;
|
|
80
|
+
/**
|
|
81
|
+
* Return the port byte with DATA1 and DATA2 reflecting the current shift-register bit.
|
|
82
|
+
* All other bits (CLK, LATCH, and unused bits 4-7) are returned as 1.
|
|
83
|
+
*/
|
|
84
|
+
private currentDataBits;
|
|
85
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SNESAttachment = void 0;
|
|
4
|
+
const Attachment_1 = require("./Attachment");
|
|
5
|
+
/**
|
|
6
|
+
* SNESAttachment - Emulates two Super Nintendo controllers attached to a VIA GPIO port.
|
|
7
|
+
*
|
|
8
|
+
* Pin mapping (on the attached port):
|
|
9
|
+
* Bit 0 (0x01) — CLK : clock signal driven by the 6502 (output)
|
|
10
|
+
* Bit 1 (0x02) — LATCH : latch signal driven by the 6502 (output)
|
|
11
|
+
* Bit 2 (0x04) — DATA1 : serial data from controller 1 to the 6502 (input)
|
|
12
|
+
* Bit 3 (0x08) — DATA2 : serial data from controller 2 to the 6502 (input)
|
|
13
|
+
*
|
|
14
|
+
* Protocol (SNES / NES shift-register protocol):
|
|
15
|
+
* 1. CPU pulses LATCH high then low — controllers sample their button states
|
|
16
|
+
* and the first bit (bit 0) appears on the DATA lines.
|
|
17
|
+
* 2. Each subsequent falling edge on CLK shifts to the next bit.
|
|
18
|
+
* 3. A total of 16 bits are transmitted per controller (SNES).
|
|
19
|
+
*
|
|
20
|
+
* SNES bit order (bit 0 first):
|
|
21
|
+
* 0=B 1=Y 2=SEL 3=STA 4=UP 5=DN 6=LT 7=RT
|
|
22
|
+
* 8=A 9=X 10=L 11=R 12-15=1 (always high)
|
|
23
|
+
*
|
|
24
|
+
* All data bits are active-low (0 = button pressed, 1 = not pressed).
|
|
25
|
+
*
|
|
26
|
+
* Button state format matches the constants used in index.ts / JoystickAttachment:
|
|
27
|
+
* BUTTON_UP=0x01 BUTTON_DOWN=0x02 BUTTON_LEFT=0x04 BUTTON_RIGHT=0x08
|
|
28
|
+
* BUTTON_A=0x10 BUTTON_B=0x20 BUTTON_SELECT=0x40 BUTTON_START=0x80
|
|
29
|
+
*/
|
|
30
|
+
class SNESAttachment extends Attachment_1.AttachmentBase {
|
|
31
|
+
/**
|
|
32
|
+
* @param attachToPortA - true to respond on Port A, false for Port B
|
|
33
|
+
* @param priority - attachment priority (lower = higher priority)
|
|
34
|
+
*/
|
|
35
|
+
constructor(attachToPortA = true, priority = 0) {
|
|
36
|
+
super(priority, false, false, false, false);
|
|
37
|
+
// Raw button states (1-bit-per-button, BUTTON_x masks, as received from the host)
|
|
38
|
+
this.buttonState1 = 0x00;
|
|
39
|
+
this.buttonState2 = 0x00;
|
|
40
|
+
// 16-bit SNES shift registers (active-low: 0=pressed, 1=not pressed)
|
|
41
|
+
this.shiftReg1 = 0xFFFF;
|
|
42
|
+
this.shiftReg2 = 0xFFFF;
|
|
43
|
+
// Index of the bit currently presented on DATA (0..15)
|
|
44
|
+
this.bitIndex = 0;
|
|
45
|
+
// Previous signal levels used to detect rising/falling edges
|
|
46
|
+
this.prevLatch = false;
|
|
47
|
+
this.prevClk = false;
|
|
48
|
+
this.attachedToPortA = attachToPortA;
|
|
49
|
+
}
|
|
50
|
+
reset() {
|
|
51
|
+
super.reset();
|
|
52
|
+
this.buttonState1 = 0x00;
|
|
53
|
+
this.buttonState2 = 0x00;
|
|
54
|
+
this.shiftReg1 = 0xFFFF;
|
|
55
|
+
this.shiftReg2 = 0xFFFF;
|
|
56
|
+
this.bitIndex = 0;
|
|
57
|
+
this.prevLatch = false;
|
|
58
|
+
this.prevClk = false;
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Port reads — supply DATA1 / DATA2 bits to the VIA for the CPU to read
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
readPortA(ddr, or) {
|
|
64
|
+
return this.attachedToPortA ? this.currentDataBits() : 0xFF;
|
|
65
|
+
}
|
|
66
|
+
readPortB(ddr, or) {
|
|
67
|
+
return this.attachedToPortA ? 0xFF : this.currentDataBits();
|
|
68
|
+
}
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// Port writes — monitor CLK and LATCH transitions driven by the CPU
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
writePortA(value, ddr) {
|
|
73
|
+
if (this.attachedToPortA) {
|
|
74
|
+
this.handleSignals(value);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
writePortB(value, ddr) {
|
|
78
|
+
if (!this.attachedToPortA) {
|
|
79
|
+
this.handleSignals(value);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Controller state update API
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
/**
|
|
86
|
+
* Update the button state for controller 1 (DATA1 line).
|
|
87
|
+
* @param buttons - Button state byte using BUTTON_x bit masks (1 = pressed)
|
|
88
|
+
*/
|
|
89
|
+
updateController1(buttons) {
|
|
90
|
+
this.buttonState1 = buttons & 0xFF;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Update the button state for controller 2 (DATA2 line).
|
|
94
|
+
* @param buttons - Button state byte using BUTTON_x bit masks (1 = pressed)
|
|
95
|
+
*/
|
|
96
|
+
updateController2(buttons) {
|
|
97
|
+
this.buttonState2 = buttons & 0xFF;
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// Private helpers
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
/**
|
|
103
|
+
* Build a 16-bit SNES shift register from a button-state byte.
|
|
104
|
+
* Bits are active-low (0 = pressed, 1 = not pressed).
|
|
105
|
+
* Bits 12-15 are always 1 (used by the protocol to identify controller type).
|
|
106
|
+
* Y (bit 1), X (bit 9), L (bit 10), R (bit 11) have no mapping and stay 1.
|
|
107
|
+
*/
|
|
108
|
+
buildShiftRegister(buttons) {
|
|
109
|
+
let data = 0xFFFF; // start with all 1s (no buttons pressed)
|
|
110
|
+
if (buttons & SNESAttachment.BUTTON_B)
|
|
111
|
+
data &= ~(1 << 0); // B
|
|
112
|
+
// bit 1 = Y — unmapped, stays 1
|
|
113
|
+
if (buttons & SNESAttachment.BUTTON_SELECT)
|
|
114
|
+
data &= ~(1 << 2); // SELECT
|
|
115
|
+
if (buttons & SNESAttachment.BUTTON_START)
|
|
116
|
+
data &= ~(1 << 3); // START
|
|
117
|
+
if (buttons & SNESAttachment.BUTTON_UP)
|
|
118
|
+
data &= ~(1 << 4); // UP
|
|
119
|
+
if (buttons & SNESAttachment.BUTTON_DOWN)
|
|
120
|
+
data &= ~(1 << 5); // DOWN
|
|
121
|
+
if (buttons & SNESAttachment.BUTTON_LEFT)
|
|
122
|
+
data &= ~(1 << 6); // LEFT
|
|
123
|
+
if (buttons & SNESAttachment.BUTTON_RIGHT)
|
|
124
|
+
data &= ~(1 << 7); // RIGHT
|
|
125
|
+
if (buttons & SNESAttachment.BUTTON_A)
|
|
126
|
+
data &= ~(1 << 8); // A
|
|
127
|
+
// bits 9=X, 10=L, 11=R — unmapped, stay 1
|
|
128
|
+
// bits 12-15 — always 1 (controller present / protocol identification)
|
|
129
|
+
return data & 0xFFFF;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Detect LATCH / CLK signal transitions and update internal state accordingly.
|
|
133
|
+
*/
|
|
134
|
+
handleSignals(value) {
|
|
135
|
+
const latch = (value & SNESAttachment.PIN_LATCH) !== 0;
|
|
136
|
+
const clk = (value & SNESAttachment.PIN_CLK) !== 0;
|
|
137
|
+
// LATCH rising edge: capture current button states and reset the bit counter
|
|
138
|
+
if (latch && !this.prevLatch) {
|
|
139
|
+
this.shiftReg1 = this.buildShiftRegister(this.buttonState1);
|
|
140
|
+
this.shiftReg2 = this.buildShiftRegister(this.buttonState2);
|
|
141
|
+
this.bitIndex = 0;
|
|
142
|
+
}
|
|
143
|
+
// CLK falling edge: advance to the next bit
|
|
144
|
+
if (!clk && this.prevClk) {
|
|
145
|
+
if (this.bitIndex < SNESAttachment.SNES_BITS - 1) {
|
|
146
|
+
this.bitIndex++;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
this.prevLatch = latch;
|
|
150
|
+
this.prevClk = clk;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Return the port byte with DATA1 and DATA2 reflecting the current shift-register bit.
|
|
154
|
+
* All other bits (CLK, LATCH, and unused bits 4-7) are returned as 1.
|
|
155
|
+
*/
|
|
156
|
+
currentDataBits() {
|
|
157
|
+
const bit1 = (this.shiftReg1 >> this.bitIndex) & 1;
|
|
158
|
+
const bit2 = (this.shiftReg2 >> this.bitIndex) & 1;
|
|
159
|
+
let result = 0xFF;
|
|
160
|
+
if (bit1 === 0)
|
|
161
|
+
result &= ~SNESAttachment.PIN_DATA1;
|
|
162
|
+
if (bit2 === 0)
|
|
163
|
+
result &= ~SNESAttachment.PIN_DATA2;
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.SNESAttachment = SNESAttachment;
|
|
168
|
+
// Button bit masks — identical to the constants in index.ts
|
|
169
|
+
SNESAttachment.BUTTON_UP = 0x01;
|
|
170
|
+
SNESAttachment.BUTTON_DOWN = 0x02;
|
|
171
|
+
SNESAttachment.BUTTON_LEFT = 0x04;
|
|
172
|
+
SNESAttachment.BUTTON_RIGHT = 0x08;
|
|
173
|
+
SNESAttachment.BUTTON_A = 0x10;
|
|
174
|
+
SNESAttachment.BUTTON_B = 0x20;
|
|
175
|
+
SNESAttachment.BUTTON_SELECT = 0x40;
|
|
176
|
+
SNESAttachment.BUTTON_START = 0x80;
|
|
177
|
+
// Pin masks within the VIA port
|
|
178
|
+
SNESAttachment.PIN_CLK = 0x01; // bit 0 — driven by CPU
|
|
179
|
+
SNESAttachment.PIN_LATCH = 0x02; // bit 1 — driven by CPU
|
|
180
|
+
SNESAttachment.PIN_DATA1 = 0x04; // bit 2 — read by CPU (controller 1)
|
|
181
|
+
SNESAttachment.PIN_DATA2 = 0x08; // bit 3 — read by CPU (controller 2)
|
|
182
|
+
// Total number of bits shifted out per SNES controller read cycle
|
|
183
|
+
SNESAttachment.SNES_BITS = 16;
|
|
184
|
+
//# sourceMappingURL=SNESAttachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SNESAttachment.js","sourceRoot":"","sources":["../../../../src/components/IO/Attachments/SNESAttachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IO } from '../IO';
|
|
2
|
+
import { VTAC } from 'vtac-terminal';
|
|
3
|
+
/**
|
|
4
|
+
* DevOutputBoard - Development output board using a VTAC terminal controller
|
|
5
|
+
*
|
|
6
|
+
* Register Map:
|
|
7
|
+
* $00: Data / Status Register
|
|
8
|
+
* Write: sends byte to VTAC for processing
|
|
9
|
+
* Read: always returns 0 (bit 7 is a busy flag on the real device; busy is never set here)
|
|
10
|
+
*/
|
|
11
|
+
export declare class DevOutputBoard implements IO {
|
|
12
|
+
raiseIRQ: () => void;
|
|
13
|
+
raiseNMI: () => void;
|
|
14
|
+
readonly vtac: VTAC;
|
|
15
|
+
read(address: number): number;
|
|
16
|
+
write(address: number, data: number): void;
|
|
17
|
+
tick(frequency: number): void;
|
|
18
|
+
reset(coldStart: boolean): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DevOutputBoard = void 0;
|
|
4
|
+
const vtac_terminal_1 = require("vtac-terminal");
|
|
5
|
+
/**
|
|
6
|
+
* DevOutputBoard - Development output board using a VTAC terminal controller
|
|
7
|
+
*
|
|
8
|
+
* Register Map:
|
|
9
|
+
* $00: Data / Status Register
|
|
10
|
+
* Write: sends byte to VTAC for processing
|
|
11
|
+
* Read: always returns 0 (bit 7 is a busy flag on the real device; busy is never set here)
|
|
12
|
+
*/
|
|
13
|
+
class DevOutputBoard {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.raiseIRQ = () => { };
|
|
16
|
+
this.raiseNMI = () => { };
|
|
17
|
+
this.vtac = new vtac_terminal_1.VTAC();
|
|
18
|
+
}
|
|
19
|
+
read(address) {
|
|
20
|
+
// Status register: bit 7 is busy flag on real device, never busy in emulation
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
write(address, data) {
|
|
24
|
+
const register = address & 0x00;
|
|
25
|
+
if (register === 0x00) {
|
|
26
|
+
this.vtac.parse(data);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
tick(frequency) { }
|
|
30
|
+
reset(coldStart) { }
|
|
31
|
+
}
|
|
32
|
+
exports.DevOutputBoard = DevOutputBoard;
|
|
33
|
+
//# sourceMappingURL=DevOutputBoard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevOutputBoard.js","sourceRoot":"","sources":["../../../src/components/IO/DevOutputBoard.ts"],"names":[],"mappings":";;;AACA,iDAAoC;AAEpC;;;;;;;GAOG;AACH,MAAa,cAAc;IAA3B;QAEE,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QACnB,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QAEV,SAAI,GAAS,IAAI,oBAAI,EAAE,CAAA;IAiBlC,CAAC;IAfC,IAAI,CAAC,OAAe;QAClB,8EAA8E;QAC9E,OAAO,CAAC,CAAA;IACV,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAY;QACjC,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAA;QAC/B,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAiB,IAAS,CAAC;IAChC,KAAK,CAAC,SAAkB,IAAS,CAAC;CAEnC;AAtBD,wCAsBC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IO } from '../IO';
|
|
2
|
+
export declare class Empty implements IO {
|
|
3
|
+
raiseIRQ: () => void;
|
|
4
|
+
raiseNMI: () => void;
|
|
5
|
+
read(address: number): number;
|
|
6
|
+
write(address: number, data: number): void;
|
|
7
|
+
tick(frequency: number): void;
|
|
8
|
+
reset(coldStart: boolean): void;
|
|
9
|
+
}
|
|
@@ -6,14 +6,12 @@ class Empty {
|
|
|
6
6
|
this.raiseIRQ = () => { };
|
|
7
7
|
this.raiseNMI = () => { };
|
|
8
8
|
}
|
|
9
|
-
read(address) {
|
|
10
|
-
|
|
11
|
-
tick() { }
|
|
12
|
-
reset() { }
|
|
13
|
-
description() {
|
|
14
|
-
return Empty.DESCRIPTION;
|
|
9
|
+
read(address) {
|
|
10
|
+
return 0;
|
|
15
11
|
}
|
|
12
|
+
write(address, data) { }
|
|
13
|
+
tick(frequency) { }
|
|
14
|
+
reset(coldStart) { }
|
|
16
15
|
}
|
|
17
16
|
exports.Empty = Empty;
|
|
18
|
-
Empty.DESCRIPTION = { className: 'Empty', title: 'Empty' };
|
|
19
17
|
//# sourceMappingURL=Empty.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Empty.js","sourceRoot":"","sources":["../../../src/components/IO/Empty.ts"],"names":[],"mappings":";;;AAEA,MAAa,KAAK;IAAlB;
|
|
1
|
+
{"version":3,"file":"Empty.js","sourceRoot":"","sources":["../../../src/components/IO/Empty.ts"],"names":[],"mappings":";;;AAEA,MAAa,KAAK;IAAlB;QAEE,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QACnB,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;IAUrB,CAAC;IARC,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,CAAA;IACV,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAY,IAAS,CAAC;IAC7C,IAAI,CAAC,SAAiB,IAAS,CAAC;IAChC,KAAK,CAAC,SAAkB,IAAS,CAAC;CAEnC;AAbD,sBAaC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IO } from '../IO';
|
|
2
|
+
export declare class EmptyCard implements IO {
|
|
3
|
+
raiseIRQ: () => void;
|
|
4
|
+
raiseNMI: () => void;
|
|
5
|
+
read(address: number): number;
|
|
6
|
+
write(address: number, data: number): void;
|
|
7
|
+
tick(frequency: number): void;
|
|
8
|
+
reset(coldStart: boolean): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for devices that can be attached to GPIO ports
|
|
3
|
+
*/
|
|
4
|
+
export interface GPIOAttachment {
|
|
5
|
+
/**
|
|
6
|
+
* Reset the attachment to its initial state
|
|
7
|
+
*/
|
|
8
|
+
reset(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Update the attachment state based on CPU clock ticks
|
|
11
|
+
* @param cpuFrequency - The CPU frequency in Hz
|
|
12
|
+
*/
|
|
13
|
+
tick(cpuFrequency: number): void;
|
|
14
|
+
/**
|
|
15
|
+
* Read data from Port A
|
|
16
|
+
* @param ddr - Data Direction Register value
|
|
17
|
+
* @param or - Output Register value
|
|
18
|
+
* @returns The data to be read from the port
|
|
19
|
+
*/
|
|
20
|
+
readPortA(ddr: number, or: number): number;
|
|
21
|
+
/**
|
|
22
|
+
* Read data from Port B
|
|
23
|
+
* @param ddr - Data Direction Register value
|
|
24
|
+
* @param or - Output Register value
|
|
25
|
+
* @returns The data to be read from the port
|
|
26
|
+
*/
|
|
27
|
+
readPortB(ddr: number, or: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* Write data to Port A
|
|
30
|
+
* @param value - The value being written
|
|
31
|
+
* @param ddr - Data Direction Register value
|
|
32
|
+
*/
|
|
33
|
+
writePortA(value: number, ddr: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Write data to Port B
|
|
36
|
+
* @param value - The value being written
|
|
37
|
+
* @param ddr - Data Direction Register value
|
|
38
|
+
*/
|
|
39
|
+
writePortB(value: number, ddr: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* Check if the attachment is enabled
|
|
42
|
+
* @returns true if enabled, false otherwise
|
|
43
|
+
*/
|
|
44
|
+
isEnabled(): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Get the priority of this attachment (lower values = higher priority)
|
|
47
|
+
* @returns The priority value
|
|
48
|
+
*/
|
|
49
|
+
getPriority(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Clear interrupt flags
|
|
52
|
+
* @param ca1 - Clear CA1 interrupt
|
|
53
|
+
* @param ca2 - Clear CA2 interrupt
|
|
54
|
+
* @param cb1 - Clear CB1 interrupt
|
|
55
|
+
* @param cb2 - Clear CB2 interrupt
|
|
56
|
+
*/
|
|
57
|
+
clearInterrupts(ca1: boolean, ca2: boolean, cb1: boolean, cb2: boolean): void;
|
|
58
|
+
/**
|
|
59
|
+
* Update control line states
|
|
60
|
+
* @param ca1 - CA1 control line state
|
|
61
|
+
* @param ca2 - CA2 control line state
|
|
62
|
+
* @param cb1 - CB1 control line state
|
|
63
|
+
* @param cb2 - CB2 control line state
|
|
64
|
+
*/
|
|
65
|
+
updateControlLines(ca1: boolean, ca2: boolean, cb1: boolean, cb2: boolean): void;
|
|
66
|
+
/**
|
|
67
|
+
* Check if CA1 interrupt is pending
|
|
68
|
+
* @returns true if interrupt is pending
|
|
69
|
+
*/
|
|
70
|
+
hasCA1Interrupt(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Check if CA2 interrupt is pending
|
|
73
|
+
* @returns true if interrupt is pending
|
|
74
|
+
*/
|
|
75
|
+
hasCA2Interrupt(): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Check if CB1 interrupt is pending
|
|
78
|
+
* @returns true if interrupt is pending
|
|
79
|
+
*/
|
|
80
|
+
hasCB1Interrupt(): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Check if CB2 interrupt is pending
|
|
83
|
+
* @returns true if interrupt is pending
|
|
84
|
+
*/
|
|
85
|
+
hasCB2Interrupt(): boolean;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Base abstract class for GPIO attachments with common functionality
|
|
89
|
+
*/
|
|
90
|
+
export declare abstract class GPIOAttachmentBase implements GPIOAttachment {
|
|
91
|
+
protected priority: number;
|
|
92
|
+
protected enabled: boolean;
|
|
93
|
+
protected ca1Interrupt: boolean;
|
|
94
|
+
protected ca2Interrupt: boolean;
|
|
95
|
+
protected cb1Interrupt: boolean;
|
|
96
|
+
protected cb2Interrupt: boolean;
|
|
97
|
+
constructor(priority: number, ca1Interrupt?: boolean, ca2Interrupt?: boolean, cb1Interrupt?: boolean, cb2Interrupt?: boolean);
|
|
98
|
+
reset(): void;
|
|
99
|
+
tick(cpuFrequency: number): void;
|
|
100
|
+
readPortA(ddr: number, or: number): number;
|
|
101
|
+
readPortB(ddr: number, or: number): number;
|
|
102
|
+
writePortA(value: number, ddr: number): void;
|
|
103
|
+
writePortB(value: number, ddr: number): void;
|
|
104
|
+
isEnabled(): boolean;
|
|
105
|
+
getPriority(): number;
|
|
106
|
+
clearInterrupts(ca1: boolean, ca2: boolean, cb1: boolean, cb2: boolean): void;
|
|
107
|
+
updateControlLines(ca1: boolean, ca2: boolean, cb1: boolean, cb2: boolean): void;
|
|
108
|
+
hasCA1Interrupt(): boolean;
|
|
109
|
+
hasCA2Interrupt(): boolean;
|
|
110
|
+
hasCB1Interrupt(): boolean;
|
|
111
|
+
hasCB2Interrupt(): boolean;
|
|
112
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { GPIOAttachmentBase } from './GPIOAttachment';
|
|
2
|
+
/**
|
|
3
|
+
* GPIOJoystickAttachment - Emulates a joystick/gamepad connected to GPIO port
|
|
4
|
+
*
|
|
5
|
+
* Buttons are active-low (0 = pressed, 1 = released)
|
|
6
|
+
* Can be attached to either Port A or Port B
|
|
7
|
+
*/
|
|
8
|
+
export declare class GPIOJoystickAttachment extends GPIOAttachmentBase {
|
|
9
|
+
static readonly BUTTON_UP = 1;
|
|
10
|
+
static readonly BUTTON_DOWN = 2;
|
|
11
|
+
static readonly BUTTON_LEFT = 4;
|
|
12
|
+
static readonly BUTTON_RIGHT = 8;
|
|
13
|
+
static readonly BUTTON_A = 16;
|
|
14
|
+
static readonly BUTTON_B = 32;
|
|
15
|
+
static readonly BUTTON_SELECT = 64;
|
|
16
|
+
static readonly BUTTON_START = 128;
|
|
17
|
+
private buttonState;
|
|
18
|
+
private attachedToPortA;
|
|
19
|
+
constructor(attachToPortA?: boolean, priority?: number);
|
|
20
|
+
reset(): void;
|
|
21
|
+
readPortA(ddr: number, or: number): number;
|
|
22
|
+
readPortB(ddr: number, or: number): number;
|
|
23
|
+
/**
|
|
24
|
+
* Update the joystick button state
|
|
25
|
+
* @param buttons - Button state byte (1 = pressed, 0 = released)
|
|
26
|
+
*/
|
|
27
|
+
updateJoystick(buttons: number): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get the current button state
|
|
30
|
+
* @returns The button state byte
|
|
31
|
+
*/
|
|
32
|
+
getButtonState(): number;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a specific button is pressed
|
|
35
|
+
* @param button - Button bit mask to check
|
|
36
|
+
* @returns true if button is pressed
|
|
37
|
+
*/
|
|
38
|
+
isButtonPressed(button: number): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Press a button (set its bit)
|
|
41
|
+
* @param button - Button bit mask to press
|
|
42
|
+
*/
|
|
43
|
+
pressButton(button: number): void;
|
|
44
|
+
/**
|
|
45
|
+
* Release a button (clear its bit)
|
|
46
|
+
* @param button - Button bit mask to release
|
|
47
|
+
*/
|
|
48
|
+
releaseButton(button: number): void;
|
|
49
|
+
/**
|
|
50
|
+
* Clear all button presses
|
|
51
|
+
*/
|
|
52
|
+
releaseAllButtons(): void;
|
|
53
|
+
}
|