From 1d780ef139b0e4bde2ff1e040a2436c1fcdad414 Mon Sep 17 00:00:00 2001 From: Cedrik Hoffmann Date: Sun, 12 May 2024 21:47:33 +0200 Subject: [PATCH] reimplement whole project --- .idea/gameboy.iml | 17 - .idea/inspectionProfiles/Project_Default.xml | 6 - .idea/misc.xml | 9 - .idea/modules.xml | 9 - .idea/vcs.xml | 6 - .idea/workspace.xml | 166 -- DMG_ROM.asm | 168 ++ DMG_ROM.bin | Bin 0 -> 256 bytes gameboy-bin/Cargo.lock | 10 +- gameboy-bin/Cargo.toml | 2 +- gameboy-bin/src/main.rs | 25 +- gameboy-lib/Cargo.lock | 140 +- gameboy-lib/Cargo.toml | 9 +- gameboy-lib/src/cpu/cpu.rs | 579 ---- gameboy-lib/src/cpu/instructions.rs | 619 +---- gameboy-lib/src/cpu/mod.rs | 240 +- .../src/cpu/registers/flag_register.rs | 84 +- gameboy-lib/src/cpu/registers/mod.rs | 251 +- gameboy-lib/src/cpu/registers/register.rs | 5 - .../src/cpu/registers/register_8bit.rs | 30 - .../src/cpu/registers/stack_pointer.rs | 45 +- gameboy-lib/src/lib.rs | 30 +- gameboy-lib/src/memory.rs | 252 +- gameboy-web.iml | 12 - gameboy-web/.eslintrc.cjs | 18 - gameboy-web/.gitignore | 24 - gameboy-web/.rsw/rsw.crates | 1 - gameboy-web/.rsw/rsw.err | 0 gameboy-web/.rsw/rsw.info | 3 - gameboy-web/README.md | 30 - gameboy-web/gameboy-wasm/.appveyor.yml | 11 - .../gameboy-wasm/.github/dependabot.yml | 8 - gameboy-web/gameboy-wasm/.gitignore | 6 - gameboy-web/gameboy-wasm/.travis.yml | 69 - gameboy-web/gameboy-wasm/Cargo.toml | 27 - gameboy-web/gameboy-wasm/LICENSE_APACHE | 201 -- gameboy-web/gameboy-wasm/LICENSE_MIT | 25 - gameboy-web/gameboy-wasm/README.md | 84 - gameboy-web/gameboy-wasm/src/lib.rs | 41 - gameboy-web/gameboy-wasm/src/utils.rs | 10 - gameboy-web/gameboy-wasm/tests/web.rs | 13 - gameboy-web/index.html | 13 - gameboy-web/package.json | 40 - gameboy-web/public/vite.svg | 1 - gameboy-web/rsw.toml | 17 - gameboy-web/src/App.tsx | 52 - gameboy-web/src/components/ControlCenter.tsx | 27 - gameboy-web/src/main.tsx | 9 - gameboy-web/src/vite-env.d.ts | 1 - gameboy-web/tsconfig.json | 25 - gameboy-web/tsconfig.node.json | 10 - gameboy-web/vite.config.ts | 11 - gameboy-web/yarn.lock | 2325 ----------------- 53 files changed, 932 insertions(+), 4884 deletions(-) delete mode 100644 .idea/gameboy.iml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml create mode 100644 DMG_ROM.asm create mode 100644 DMG_ROM.bin delete mode 100644 gameboy-lib/src/cpu/cpu.rs delete mode 100644 gameboy-lib/src/cpu/registers/register.rs delete mode 100644 gameboy-lib/src/cpu/registers/register_8bit.rs delete mode 100644 gameboy-web.iml delete mode 100644 gameboy-web/.eslintrc.cjs delete mode 100644 gameboy-web/.gitignore delete mode 100644 gameboy-web/.rsw/rsw.crates delete mode 100644 gameboy-web/.rsw/rsw.err delete mode 100644 gameboy-web/.rsw/rsw.info delete mode 100644 gameboy-web/README.md delete mode 100644 gameboy-web/gameboy-wasm/.appveyor.yml delete mode 100644 gameboy-web/gameboy-wasm/.github/dependabot.yml delete mode 100644 gameboy-web/gameboy-wasm/.gitignore delete mode 100644 gameboy-web/gameboy-wasm/.travis.yml delete mode 100644 gameboy-web/gameboy-wasm/Cargo.toml delete mode 100644 gameboy-web/gameboy-wasm/LICENSE_APACHE delete mode 100644 gameboy-web/gameboy-wasm/LICENSE_MIT delete mode 100644 gameboy-web/gameboy-wasm/README.md delete mode 100644 gameboy-web/gameboy-wasm/src/lib.rs delete mode 100644 gameboy-web/gameboy-wasm/src/utils.rs delete mode 100644 gameboy-web/gameboy-wasm/tests/web.rs delete mode 100644 gameboy-web/index.html delete mode 100644 gameboy-web/package.json delete mode 100644 gameboy-web/public/vite.svg delete mode 100644 gameboy-web/rsw.toml delete mode 100644 gameboy-web/src/App.tsx delete mode 100644 gameboy-web/src/components/ControlCenter.tsx delete mode 100644 gameboy-web/src/main.tsx delete mode 100644 gameboy-web/src/vite-env.d.ts delete mode 100644 gameboy-web/tsconfig.json delete mode 100644 gameboy-web/tsconfig.node.json delete mode 100644 gameboy-web/vite.config.ts delete mode 100644 gameboy-web/yarn.lock diff --git a/.idea/gameboy.iml b/.idea/gameboy.iml deleted file mode 100644 index 81d5aab..0000000 --- a/.idea/gameboy.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 03d9549..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 8faa81f..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a8c3819..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index b2aaec4..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - "associatedIndex": 0 -} - - - - - - - - - - - - - - - - - - - 1703977798818 - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DMG_ROM.asm b/DMG_ROM.asm new file mode 100644 index 0000000..2d0a25f --- /dev/null +++ b/DMG_ROM.asm @@ -0,0 +1,168 @@ + LD SP,$fffe ; $0000 Setup Stack + + XOR A ; $0003 Zero the memory from $8000-$9FFF (VRAM) + LD HL,$9fff ; $0004 +Addr_0007: + LD (HL-),A ; $0007 + BIT 7,H ; $0008 + JR NZ, Addr_0007 ; $000a + + LD HL,$ff26 ; $000c Setup Audio + LD C,$11 ; $000f + LD A,$80 ; $0011 + LD (HL-),A ; $0013 + LD ($FF00+C),A ; $0014 + INC C ; $0015 + LD A,$f3 ; $0016 + LD ($FF00+C),A ; $0018 + LD (HL-),A ; $0019 + LD A,$77 ; $001a + LD (HL),A ; $001c + + LD A,$fc ; $001d Setup BG palette + LD ($FF00+$47),A ; $001f + + LD DE,$0104 ; $0021 Convert and load logo data from cart into Video RAM + LD HL,$8010 ; $0024 +Addr_0027: + LD A,(DE) ; $0027 + CALL $0095 ; $0028 + CALL $0096 ; $002b + INC DE ; $002e + LD A,E ; $002f + CP $34 ; $0030 + JR NZ, Addr_0027 ; $0032 + + LD DE,$00d8 ; $0034 Load 8 additional bytes into Video RAM + LD B,$08 ; $0037 +Addr_0039: + LD A,(DE) ; $0039 + INC DE ; $003a + LD (HL+),A ; $003b + INC HL ; $003c + DEC B ; $003d + JR NZ, Addr_0039 ; $003e + + LD A,$19 ; $0040 Setup background tilemap + LD ($9910),A ; $0042 + LD HL,$992f ; $0045 +Addr_0048: + LD C,$0c ; $0048 +Addr_004A: + DEC A ; $004a + JR Z, Addr_0055 ; $004b + LD (HL-),A ; $004d + DEC C ; $004e + JR NZ, Addr_004A ; $004f + LD L,$0f ; $0051 + JR Addr_0048 ; $0053 + + ; === Scroll logo on screen, and play logo sound=== + +Addr_0055: + LD H,A ; $0055 Initialize scroll count, H=0 + LD A,$64 ; $0056 + LD D,A ; $0058 set loop count, D=$64 + LD ($FF00+$42),A ; $0059 Set vertical scroll register + LD A,$91 ; $005b + LD ($FF00+$40),A ; $005d Turn on LCD, showing Background + INC B ; $005f Set B=1 +Addr_0060: + LD E,$02 ; $0060 +Addr_0062: + LD C,$0c ; $0062 +Addr_0064: + LD A,($FF00+$44) ; $0064 wait for screen frame + CP $90 ; $0066 + JR NZ, Addr_0064 ; $0068 + DEC C ; $006a + JR NZ, Addr_0064 ; $006b + DEC E ; $006d + JR NZ, Addr_0062 ; $006e + + LD C,$13 ; $0070 + INC H ; $0072 increment scroll count + LD A,H ; $0073 + LD E,$83 ; $0074 + CP $62 ; $0076 $62 counts in, play sound #1 + JR Z, Addr_0080 ; $0078 + LD E,$c1 ; $007a + CP $64 ; $007c + JR NZ, Addr_0086 ; $007e $64 counts in, play sound #2 +Addr_0080: + LD A,E ; $0080 play sound + LD ($FF00+C),A ; $0081 + INC C ; $0082 + LD A,$87 ; $0083 + LD ($FF00+C),A ; $0085 +Addr_0086: + LD A,($FF00+$42) ; $0086 + SUB B ; $0088 + LD ($FF00+$42),A ; $0089 scroll logo up if B=1 + DEC D ; $008b + JR NZ, Addr_0060 ; $008c + + DEC B ; $008e set B=0 first time + JR NZ, Addr_00E0 ; $008f ... next time, cause jump to "Nintendo Logo check" + + LD D,$20 ; $0091 use scrolling loop to pause + JR Addr_0060 ; $0093 + + ; ==== Graphic routine ==== + + LD C,A ; $0095 "Double up" all the bits of the graphics data + LD B,$04 ; $0096 and store in Video RAM +Addr_0098: + PUSH BC ; $0098 + RL C ; $0099 + RLA ; $009b + POP BC ; $009c + RL C ; $009d + RLA ; $009f + DEC B ; $00a0 + JR NZ, Addr_0098 ; $00a1 + LD (HL+),A ; $00a3 + INC HL ; $00a4 + LD (HL+),A ; $00a5 + INC HL ; $00a6 + RET ; $00a7 + +Addr_00A8: + ;Nintendo Logo + .DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D + .DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99 + .DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E + +Addr_00D8: + ;More video data + .DB $3C,$42,$B9,$A5,$B9,$A5,$42,$3C + + ; ===== Nintendo logo comparison routine ===== + +Addr_00E0: + LD HL,$0104 ; $00e0 ; point HL to Nintendo logo in cart + LD DE,$00a8 ; $00e3 ; point DE to Nintendo logo in DMG rom + +Addr_00E6: + LD A,(DE) ; $00e6 + INC DE ; $00e7 + CP (HL) ; $00e8 ;compare logo data in cart to DMG rom + JR NZ,$fe ; $00e9 ;if not a match, lock up here + INC HL ; $00eb + LD A,L ; $00ec + CP $34 ; $00ed ;do this for $30 bytes + JR NZ, Addr_00E6 ; $00ef + + LD B,$19 ; $00f1 + LD A,B ; $00f3 +Addr_00F4: + ADD (HL) ; $00f4 + INC HL ; $00f5 + DEC B ; $00f6 + JR NZ, Addr_00F4 ; $00f7 + ADD (HL) ; $00f9 + JR NZ,$fe ; $00fa ; if $19 + bytes from $0134-$014D don't add to $00 + ; ... lock up + + LD A,$01 ; $00fc + LD ($FF00+$50),A ; $00fe ;turn off DMG rom diff --git a/DMG_ROM.bin b/DMG_ROM.bin new file mode 100644 index 0000000000000000000000000000000000000000..afa0ee4792c2ba80afb6b0c1962e249e195e6fc0 GIT binary patch literal 256 zcmV+b0ssCn{{OEb|DQ6;d?5QFCjSl*K7caf3_kPXGCp^AKK$TE5d;At5P%xZl>p6_ z026!uG$8X4*Z>9y8WSQT1t9r88R`(3AupK@3_U0aG7TX4E)N*o0-PxJD zyJur=4(!a`+?k)dxidaILb;{6r9wO*1OXAK02&j%ApRqL{xl%<1{rvUBLyJ)h9Lev G0pL*XS7L7f literal 0 HcmV?d00001 diff --git a/gameboy-bin/Cargo.lock b/gameboy-bin/Cargo.lock index 9d08170..715f701 100644 --- a/gameboy-bin/Cargo.lock +++ b/gameboy-bin/Cargo.lock @@ -2,13 +2,13 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "gameboy" -version = "0.1.0" - [[package]] name = "gameboy-bin" version = "0.1.0" dependencies = [ - "gameboy", + "gameboy-lib", ] + +[[package]] +name = "gameboy-lib" +version = "0.1.0" diff --git a/gameboy-bin/Cargo.toml b/gameboy-bin/Cargo.toml index e1156b0..13a35c6 100644 --- a/gameboy-bin/Cargo.toml +++ b/gameboy-bin/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -gameboy = { path = "../gameboy-lib" } \ No newline at end of file +gameboy-lib = { path = "../gameboy-lib" } diff --git a/gameboy-bin/src/main.rs b/gameboy-bin/src/main.rs index cf05fd7..936f4f5 100644 --- a/gameboy-bin/src/main.rs +++ b/gameboy-bin/src/main.rs @@ -1,25 +1,14 @@ -extern crate gameboy; - -use gameboy::GameBoy; -use gameboy::memory::observer::Event; +extern crate gameboy_lib; +use gameboy_lib::Gameboy; fn main() { + println!("{}", std::env::current_dir().unwrap().display()); let boot_rom = load_boot_rom(); - let mut gameboy: GameBoy = GameBoy::new(); - let mut memory = &mut gameboy.cpu.memory; - - memory.events().subscribe(Event::Write, |subject| { - println!("[MEM] Writing value: 0x{:x}: 0x{:x}", subject.address, subject.value) - }); - - memory.events().subscribe(Event::Read, |subject| { - println!("[MEM] Reading value: 0x{:x}: 0x{:x}", subject.address, subject.value) - }); - - gameboy.start_gameboy(boot_rom); + let mut gameboy: Gameboy = Gameboy::new(boot_rom); + gameboy.start(); } fn load_boot_rom() -> Vec { - return std::fs::read("/mnt/datahub/projects/emulation/gameboy/rom/dmg_boot.bin").expect("Error while reading boot rom") -} \ No newline at end of file + return std::fs::read("./boot_roms/dmg_boot.bin").expect("Error while reading boot rom"); +} diff --git a/gameboy-lib/Cargo.lock b/gameboy-lib/Cargo.lock index 09715de..7fb72de 100644 --- a/gameboy-lib/Cargo.lock +++ b/gameboy-lib/Cargo.lock @@ -3,143 +3,5 @@ version = 3 [[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "gameboy" +name = "gameboy-lib" version = "0.1.0" -dependencies = [ - "serde", - "serde_derive", - "wasm-bindgen", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "proc-macro2" -version = "1.0.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "serde" -version = "1.0.194" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.194" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "syn" -version = "2.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" diff --git a/gameboy-lib/Cargo.toml b/gameboy-lib/Cargo.toml index 6ecc392..ef4c9ee 100644 --- a/gameboy-lib/Cargo.toml +++ b/gameboy-lib/Cargo.toml @@ -1,15 +1,8 @@ [package] -name = "gameboy" +name = "gameboy-lib" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[features] -serialize = ["serde", "serde_derive"] -wasm = ["wasm-bindgen"] - [dependencies] -wasm-bindgen = { version = "0.2.84", optional = true} -serde = { version = "1.0.194", optional = true } -serde_derive = { version = "1.0.194", optional = true } \ No newline at end of file diff --git a/gameboy-lib/src/cpu/cpu.rs b/gameboy-lib/src/cpu/cpu.rs deleted file mode 100644 index cc512a9..0000000 --- a/gameboy-lib/src/cpu/cpu.rs +++ /dev/null @@ -1,579 +0,0 @@ -use serde_derive::Serialize; -use crate::cpu::instructions::{JumpCondition, Target16Bit}; -use crate::cpu::registers::{Register8BitName, Registers}; -use crate::memory::Memory; - -use super::instructions::Target8Bit; -use super::instructions::{Instruction, Source16Bit}; -use super::registers::Register16BitName; - -#[cfg_attr(feature = "serialize", derive(Serialize))] -pub struct CPU { - pub register: Registers, - pub pc: u16, - pub memory: Memory, -} - -impl Default for CPU { - fn default() -> Self { - CPU { - register: Registers::new(), - pc: 0x0, - memory: Memory::default(), - } - } -} - -impl CPU { - pub fn boot(&mut self, boot_rom: Vec) { - println!("[CPU] Starting CPU..."); - self.memory.boot(boot_rom); - } - - pub fn execute(&mut self, instructions: Instruction) -> u16 { - match instructions { - Instruction::ADD(target) => self.match_add(target, false), - Instruction::ADC(target) => self.match_add(target, true), - Instruction::SUB(target) => self.match_sub(target, false), - Instruction::SBC(target) => self.match_sub(target, true), - Instruction::INC(target) => self.match_inc(target), - Instruction::DEC(target) => self.match_dec(target), - Instruction::AND(target) => self.match_and(target), - Instruction::OR(target) => self.match_or(target), - Instruction::XOR(target) => self.match_xor(target), - Instruction::CP(target) => self.match_cp(target), - Instruction::JR(jmp_condition) => self.match_jmp_condition(jmp_condition, true), - Instruction::JP(jmp_condition) => self.match_jmp_condition(jmp_condition, false), - Instruction::JPI => self.jump(true), - Instruction::NOP => self.pc.wrapping_add(1), - Instruction::DEC16(target) => self.match_dec16(target), - Instruction::ADD16(target) => self.match_add16(target), - Instruction::INC16(target) => self.match_inc16(target), - Instruction::BIT(value, target) => self.match_bit(target, value), - Instruction::RES(value, target) => { - println!("[CPU] RES 0x{:x} {:?}", value, target); - return self.pc.wrapping_add(2); - } - Instruction::SET(value, target) => { - println!("[CPU] SET 0x{:x} {:?}", value, target); - return self.pc.wrapping_add(2); - } - Instruction::LD8(target, source) => self.match_8bit_load(&target, &source), - Instruction::LD16(target, source) => { - let value = self.match_16bit_load_source(source); - return self.match_16bit_load(target, value); - } - Instruction::LDD => { - let value = self.register.read_a(); - let address_value = self.register.get_16bit(&Register16BitName::HL); - self.memory.write_byte(address_value, value); - self.match_dec16(Target16Bit::HL); - return self.pc.wrapping_add(1); - } - Instruction::LDC => { - let a_value = self.register.read_a(); - let c_value = self.register.get_8bit(&Register8BitName::C); - self.add_memory_ff00(a_value, c_value); - return self.pc.wrapping_add(1); - } - Instruction::LDHA => { - let a_value = self.register.read_a(); - let n = self.read_next_mem(); - self.add_memory_ff00(a_value, n); - return self.pc.wrapping_add(2); - } - Instruction::PUSH(target) => { - println!("[CPU] PUSH {:?}", target); - return self.pc.wrapping_add(1); - } - Instruction::POP(target) => { - println!("[CPU] POP {:?}", target); - return self.pc.wrapping_add(1); - } - } - } - - fn push(&mut self, value: u16) { - let sp_value = self.register.get_16bit(&Register16BitName::SP).wrapping_sub(1); - self.register.set_16bit(&Register16BitName::SP, sp_value); - self.memory.write_byte(sp_value, ((value & 0xff00) >> 8) as u8); - - let sp_value = self.register.get_16bit(&Register16BitName::SP).wrapping_sub(1); - self.register.set_16bit(&Register16BitName::SP, sp_value); - self.memory.write_byte(sp_value, (value & 0xff) as u8); - } - - fn pop(&mut self) -> u16 { - let lsb = self.memory.read_byte(self.register.get_16bit(&Register16BitName::SP)) as u16; - self.register.set_16bit(&Register16BitName::SP, self.register.get_16bit(&Register16BitName::SP).wrapping_add(1)); - - let msb = self.memory.read_byte(self.register.get_16bit(&Register16BitName::SP)) as u16; - self.register.set_16bit(&Register16BitName::SP, self.register.get_16bit(&Register16BitName::SP).wrapping_add(1)); - return (msb << 8) | lsb; - } - - fn add_memory_ff00(&mut self, register_value: u8, n: u8) { - let address = 0xff00 + (n as u16); - self.memory.write_byte(address, register_value); - } - - fn match_bit(&mut self, target: Target8Bit, value: u8) -> u16 { - match target { - Target8Bit::A | - Target8Bit::B | - Target8Bit::C | - Target8Bit::D | - Target8Bit::E | - Target8Bit::H | - Target8Bit::L => { - let register_value = self.register.get_8bit(target.into()); - self.register.f.zero = (register_value >> value) & 0xf == 0; - self.register.f.subtract = false; - self.register.f.half_carry = true; - return self.pc.wrapping_add(2); - } - Target8Bit::HLI => { - return self.pc.wrapping_add(3); - } - Target8Bit::D8 => panic!("Should not possible") - } - } - - fn match_8bit_load(&mut self, target: &Target8Bit, source: &Target8Bit) -> u16 { - let value = match source { - Target8Bit::A | - Target8Bit::B | - Target8Bit::C | - Target8Bit::D | - Target8Bit::E | - Target8Bit::H | - Target8Bit::L => self.register.get_8bit(source.into()), - Target8Bit::D8 => self.read_next_mem(), - Target8Bit::HLI => self.get_memory_by_hl() - }; - - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => { - self.register.set_8bit(target.into(), value); - } - Target8Bit::D8 => { - self.register.set_8bit(target.into(), value); - } - Target8Bit::HLI => { - let address = self.register.get_16bit(&Register16BitName::HL); - self.memory.write_byte(address, value); - } - }; - - return match source { - Target8Bit::A | - Target8Bit::B | - Target8Bit::C | - Target8Bit::D | - Target8Bit::E | - Target8Bit::H | - Target8Bit::L => self.pc.wrapping_add(1), - Target8Bit::D8 | - Target8Bit::HLI => self.pc.wrapping_add(2), - }; - } - - fn match_16bit_load(&mut self, target: Target16Bit, value: u16) -> u16 { - match target { - Target16Bit::BC | - Target16Bit::DE | - Target16Bit::HL | - Target16Bit::SP => self.register.set_16bit(target.into(), value), - } - - return self.pc.wrapping_add(3); - } - - fn match_16bit_load_source(&self, source: Source16Bit) -> u16 { - match source { - Source16Bit::SP - | Source16Bit::BC - | Source16Bit::DE - | Source16Bit::HL => self.register.get_16bit(source.into()), - Source16Bit::D16 => self.memory.read_next_word(self.pc), - } - } - - fn match_jmp_condition(&mut self, jump_condition: JumpCondition, relative: bool) -> u16 { - let should_jump = match jump_condition { - JumpCondition::NotZero => !self.register.f.zero, - JumpCondition::NotCarry => !self.register.f.carry, - JumpCondition::Zero => self.register.f.zero, - JumpCondition::Carry => self.register.f.carry, - JumpCondition::Always => true, - }; - return if relative { self.jump_relative(should_jump) } else { self.jump(should_jump) }; - } - - fn match_add(&mut self, target: Target8Bit, with_carry: bool) -> u16 { - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => self.exec_add(self.register.get_8bit(target.into()), with_carry), - Target8Bit::D8 => self.exec_add(self.read_next_mem(), with_carry), - Target8Bit::HLI => self.exec_add(self.get_memory_by_hl(), with_carry), - } - } - - fn match_add16(&mut self, target: Target16Bit) -> u16 { - match target { - Target16Bit::BC | - Target16Bit::DE | - Target16Bit::HL | - Target16Bit::SP => { - let register: &Register16BitName = target.into(); - let value = self.register.get_16bit(register); - self.register.set_16bit(register, value); - } - } - return self.pc.wrapping_add(1); - } - - fn match_inc(&mut self, target: Target8Bit) -> u16 { - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => { - let register: &Register8BitName = target.into(); - let register_value = self.register.get_8bit(register); - let value = self.inc(register_value); - self.register.set_8bit(register, value); - return self.pc.wrapping_add(1); - } - Target8Bit::HLI => { - let register_value = self.get_memory_by_hl(); - let value = self.inc(register_value); - self.memory.write_byte(self.register.get_16bit(&Register16BitName::HL), value); - return self.pc.wrapping_add(2); - } - Target8Bit::D8 => panic!("Should not possible"), - } - } - - fn match_dec(&mut self, target: Target8Bit) -> u16 { - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => self.exec_dec(self.register.get_8bit(target.into())), - Target8Bit::D8 => self.exec_dec(self.read_next_mem()), - Target8Bit::HLI => self.exec_dec(self.get_memory_by_hl()), - } - } - - fn match_dec16(&mut self, target: Target16Bit) -> u16 { - match target { - Target16Bit::BC | - Target16Bit::DE | - Target16Bit::HL | - Target16Bit::SP => { - let register: &Register16BitName = target.into(); - let value = self.register.get_16bit(register).wrapping_sub(1); - self.register.set_16bit(register, value) - } - } - return self.pc.wrapping_add(1); - } - - fn match_inc16(&mut self, target: Target16Bit) -> u16 { - match target { - Target16Bit::BC | - Target16Bit::DE | - Target16Bit::HL | - Target16Bit::SP => { - let register: &Register16BitName = target.into(); - let value = self.register.get_16bit(register).wrapping_add(1); - self.register.set_16bit(register, value); - } - } - return self.pc.wrapping_add(1); - } - - fn match_sub(&mut self, target: Target8Bit, with_carry: bool) -> u16 { - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => self.exec_sub(self.register.get_8bit(target.into()), with_carry), - Target8Bit::D8 => self.exec_sub(self.read_next_mem(), with_carry), - Target8Bit::HLI => self.exec_sub(self.get_memory_by_hl(), with_carry), - } - } - - fn match_and(&mut self, target: Target8Bit) -> u16 { - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => self.exec_and(self.register.get_8bit(target.into())), - Target8Bit::D8 => self.exec_and(self.read_next_mem()), - Target8Bit::HLI => self.exec_and(self.get_memory_by_hl()), - } - } - - fn match_or(&mut self, target: Target8Bit) -> u16 { - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => self.exec_or(self.register.get_8bit(target.into())), - Target8Bit::D8 => self.exec_or(self.read_next_mem()), - Target8Bit::HLI => self.exec_or(self.get_memory_by_hl()), - } - } - - fn match_xor(&mut self, target: Target8Bit) -> u16 { - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => self.exec_xor(self.register.get_8bit(target.into())), - Target8Bit::D8 => self.exec_xor(self.read_next_mem()), - Target8Bit::HLI => self.exec_xor(self.get_memory_by_hl()), - } - } - - fn match_cp(&mut self, target: Target8Bit) -> u16 { - match target { - Target8Bit::A - | Target8Bit::B - | Target8Bit::C - | Target8Bit::D - | Target8Bit::E - | Target8Bit::H - | Target8Bit::L => self.exec_compare(self.register.get_8bit(target.into())), - Target8Bit::D8 => self.exec_compare(self.read_next_mem()), - Target8Bit::HLI => self.exec_compare(self.get_memory_by_hl()), - } - } - - fn get_memory_by_hl(&self) -> u8 { - let value = self.register.get_16bit(&Register16BitName::HL); - return self.memory.read_byte(value); - } - - pub fn step(&mut self) { - let mut instruction_byte = self.memory.read_byte(self.pc); - let prefixed = instruction_byte == 0xcb; - if prefixed { - instruction_byte = self.memory.read_byte(self.pc + 1); - } - if instruction_byte != 0 { - println!("[CPU] Next instruction 0x{:x}", instruction_byte); - } - let next_pc = if let Some(instruction) = Instruction::from_byte(instruction_byte, prefixed) - { - self.execute(instruction) - } else { - let description = format!( - "0x{}{:x}", - if prefixed { "cb" } else { "" }, - instruction_byte - ); - panic!("Unknown instruction: {}", description); - }; - - self.pc = next_pc; - } - - fn jump(&self, should_jump: bool) -> u16 { - return if should_jump { - let jmp_address = self.memory.read_next_word(self.pc); - println!("[CPU] Jump to address 0x{:x}", jmp_address); - return jmp_address; - } else { - self.pc.wrapping_add(3) - }; - } - - fn jump_relative(&self, should_jump: bool) -> u16 { - let next_step = self.pc.wrapping_add(2); - return if should_jump { - let offset = self.memory.read_byte(self.pc + 1) as i8; - let jmp_address = if offset >= 0 { - next_step.wrapping_add(offset as u16) - } else { - next_step.wrapping_sub(offset.abs() as u16) - }; - println!("[CPU] Jump to address 0x{:x}", jmp_address); - return jmp_address; - } else { - next_step - }; - } - - fn read_next_mem(&self) -> u8 { - return self.memory.read_byte(self.pc.wrapping_add(1)); - } - - fn exec_add(&mut self, value_from_register: u8, with_carry: bool) -> u16 { - let value = self.add(value_from_register, with_carry); - self.register.write_a(value); - return self.pc.wrapping_add(1); - } - - fn exec_sub(&mut self, value_from_register: u8, with_carry: bool) -> u16 { - let value = self.sub(value_from_register, with_carry); - self.register.write_a(value); - return self.pc.wrapping_add(1); - } - - fn exec_inc(&mut self, value_from_register: u8) -> u16 { - let value = self.inc(value_from_register); - self.register.write_a(value); - return self.pc.wrapping_add(1); - } - - fn exec_dec(&mut self, value_from_register: u8) -> u16 { - let value = self.dec(value_from_register); - self.register.write_a(value); - return self.pc.wrapping_add(1); - } - - fn exec_and(&mut self, value_from_register: u8) -> u16 { - let value = self.and(value_from_register); - self.register.write_a(value); - return self.pc.wrapping_add(1); - } - - fn exec_or(&mut self, value_from_register: u8) -> u16 { - let value = self.or(value_from_register); - self.register.write_a(value); - return self.pc.wrapping_add(1); - } - - fn exec_xor(&mut self, value_from_register: u8) -> u16 { - let value = self.xor(value_from_register); - self.register.write_a(value); - return self.pc.wrapping_add(1); - } - - fn exec_compare(&mut self, value_from_register: u8) -> u16 { - self.compare(value_from_register); - return self.pc.wrapping_add(1); - } - - fn add(&mut self, value: u8, add_carry: bool) -> u8 { - let carry_value = self.get_opt_carry_flag(add_carry); - let (add, frist_did_overflow) = self.register.read_a().overflowing_add(value); - let (new_value, result_did_overflow) = add.overflowing_add(carry_value); - self.register.f.zero = new_value == 0; - self.register.f.subtract = false; - self.register.f.carry = frist_did_overflow || result_did_overflow; - self.register.f.half_carry = - ((self.register.read_a() & 0xf) + (value & 0xf) + carry_value) > 0xf; - return new_value; - } - - fn add_16(&mut self, value: u16) -> u16 { - let (new_value, did_overflow) = self.register.get_16bit(&Register16BitName::HL).overflowing_add(value); - self.register.f.subtract = false; - self.register.f.carry = did_overflow; - self.register.f.half_carry = (self.register.get_16bit(&Register16BitName::HL) & 0xff) + (value & 0xff) > 0xff; - return new_value; - } - - fn sub(&mut self, value: u8, add_carry: bool) -> u8 { - let carry_value = self.get_opt_carry_flag(add_carry); - let (sub, first_did_overflow) = self.register.read_a().overflowing_sub(value); - let (new_value, result_did_overflow) = sub.overflowing_sub(sub); - self.register.f.zero = new_value == 0; - self.register.f.subtract = true; - self.register.f.carry = first_did_overflow || result_did_overflow; - self.register.f.half_carry = (self.register.read_a() & 0xf) < (value & 0xf) + carry_value; - return new_value; - } - - fn inc(&mut self, value: u8) -> u8 { - let new_value = value.wrapping_add(1); - self.register.f.zero = new_value == 0; - self.register.f.subtract = false; - self.register.f.half_carry = value & 0xf == 0xf; - return new_value; - } - - fn dec(&mut self, value: u8) -> u8 { - let new_value = value.wrapping_sub(1); - self.register.f.zero = new_value == 0; - self.register.f.subtract = true; - self.register.f.half_carry = value & 0xf == 0x0; - return new_value; - } - - fn and(&mut self, value: u8) -> u8 { - let new_value = self.register.read_a() & value; - self.register.f.zero = new_value == 0; - self.register.f.subtract = false; - self.register.f.half_carry = true; - self.register.f.carry = false; - return new_value; - } - - fn or(&mut self, value: u8) -> u8 { - let new_value = self.register.read_a() | value; - self.register.f.zero = new_value == 0; - self.register.f.subtract = false; - self.register.f.carry = false; - self.register.f.half_carry = false; - return new_value; - } - - fn xor(&mut self, value: u8) -> u8 { - let new_value = self.register.read_a() ^ value; - self.register.f.zero = new_value == 0; - self.register.f.subtract = false; - self.register.f.carry = false; - self.register.f.half_carry = false; - return new_value; - } - - fn compare(&mut self, value: u8) { - let register_a = self.register.read_a(); - self.register.f.zero = register_a == value; - self.register.f.subtract = true; - self.register.f.half_carry = (register_a & 0xf) < (value & 0xf); - self.register.f.carry = register_a < value; - } - - fn get_opt_carry_flag(&self, add_carry: bool) -> u8 { - if add_carry && self.register.f.carry { - 1 - } else { - 0 - } - } -} diff --git a/gameboy-lib/src/cpu/instructions.rs b/gameboy-lib/src/cpu/instructions.rs index f1c2472..2c253b0 100644 --- a/gameboy-lib/src/cpu/instructions.rs +++ b/gameboy-lib/src/cpu/instructions.rs @@ -1,155 +1,10 @@ -use super::registers::{Register16BitName, Register8BitName}; +use super::registers::Register; -#[derive(Debug)] pub enum Instruction { - NOP, - PUSH(StackTarget), - POP(StackTarget), - // Arithmetic Instructions - ADD(Target8Bit), - ADC(Target8Bit), - SUB(Target8Bit), - SBC(Target8Bit), - INC(Target8Bit), - DEC(Target8Bit), - AND(Target8Bit), - OR(Target8Bit), - XOR(Target8Bit), - CP(Target8Bit), - DEC16(Target16Bit), - ADD16(Target16Bit), - INC16(Target16Bit), - - // Jump Instructions - JP(JumpCondition), - JR(JumpCondition), - JPI, - - // Load Instructions - LD8(Target8Bit, Target8Bit), - LD16(Target16Bit, Source16Bit), - LDD, - LDC, - LDHA, - - // CB Flag - BIT(u8, Target8Bit), - RES(u8, Target8Bit), - SET(u8, Target8Bit), -} - - -#[derive(Debug)] -pub enum StackTarget { - AF, - BC, - DE, - HL, -} - -#[derive(Debug, PartialEq)] -pub enum Target8Bit { - A, - B, - C, - D, - E, - H, - L, - D8, - HLI, -} - -#[derive(Debug)] -pub enum Target16Bit { - BC, - DE, - HL, - SP, -} - -#[derive(Debug, PartialEq, Copy, Clone)] -pub enum Source16Bit { - BC, - DE, - HL, - SP, - D16, -} - -#[derive(Debug)] -pub enum JumpCondition { - NotZero, - NotCarry, - Zero, - Carry, - Always, -} - -impl From<&Target8Bit> for &Register8BitName { - fn from(value: &Target8Bit) -> Self { - match value { - Target8Bit::A => &Register8BitName::A, - Target8Bit::B => &Register8BitName::B, - Target8Bit::C => &Register8BitName::C, - Target8Bit::D => &Register8BitName::D, - Target8Bit::E => &Register8BitName::E, - Target8Bit::H => &Register8BitName::H, - Target8Bit::L => &Register8BitName::L, - Target8Bit::D8 => panic!("Impossible: {:?}", value), - Target8Bit::HLI => panic!("Impossible: {:?}", value), - } - } -} - -impl From for &Register8BitName { - fn from(value: Target8Bit) -> Self { - match value { - Target8Bit::A => &Register8BitName::A, - Target8Bit::B => &Register8BitName::B, - Target8Bit::C => &Register8BitName::C, - Target8Bit::D => &Register8BitName::D, - Target8Bit::E => &Register8BitName::E, - Target8Bit::H => &Register8BitName::H, - Target8Bit::L => &Register8BitName::L, - Target8Bit::D8 => panic!("Impossible: {:?}", value), - Target8Bit::HLI => panic!("Impossible: {:?}", value), - } - } -} - -impl From<&Target16Bit> for &Register16BitName { - fn from(value: &Target16Bit) -> Self { - match value { - Target16Bit::BC => &Register16BitName::BC, - Target16Bit::DE => &Register16BitName::DE, - Target16Bit::HL => &Register16BitName::HL, - Target16Bit::SP => &Register16BitName::SP, - } - } -} - -impl From for &Register16BitName { - fn from(value: Target16Bit) -> Self { - match value { - Target16Bit::BC => &Register16BitName::BC, - Target16Bit::DE => &Register16BitName::DE, - Target16Bit::HL => &Register16BitName::HL, - Target16Bit::SP => &Register16BitName::SP, - } - } -} - -impl From for &Register16BitName { - fn from(value: Source16Bit) -> Self { - match value { - Source16Bit::BC => &Register16BitName::BC, - Source16Bit::DE => &Register16BitName::DE, - Source16Bit::HL => &Register16BitName::HL, - Source16Bit::SP => &Register16BitName::SP, - Source16Bit::D16 => panic!("Impossible: {:?}", value), - } - } + Load(Register), + LoadRegister(Register, Register), + Add(u8), + AddCarried(u8), } impl Instruction { @@ -163,449 +18,37 @@ impl Instruction { fn from_byte_with_prefix(byte: u8) -> Option { match byte { - 0x40 => Some(Instruction::BIT(0, Target8Bit::B)), - 0x41 => Some(Instruction::BIT(0, Target8Bit::C)), - 0x42 => Some(Instruction::BIT(0, Target8Bit::D)), - 0x43 => Some(Instruction::BIT(0, Target8Bit::E)), - 0x44 => Some(Instruction::BIT(0, Target8Bit::H)), - 0x45 => Some(Instruction::BIT(0, Target8Bit::L)), - 0x46 => Some(Instruction::BIT(0, Target8Bit::HLI)), - 0x47 => Some(Instruction::BIT(0, Target8Bit::A)), - - 0x48 => Some(Instruction::BIT(1, Target8Bit::B)), - 0x49 => Some(Instruction::BIT(1, Target8Bit::C)), - 0x4a => Some(Instruction::BIT(1, Target8Bit::D)), - 0x4b => Some(Instruction::BIT(1, Target8Bit::E)), - 0x4c => Some(Instruction::BIT(1, Target8Bit::H)), - 0x4d => Some(Instruction::BIT(1, Target8Bit::L)), - 0x4e => Some(Instruction::BIT(1, Target8Bit::HLI)), - 0x4f => Some(Instruction::BIT(1, Target8Bit::A)), - - 0x50 => Some(Instruction::BIT(2, Target8Bit::B)), - 0x51 => Some(Instruction::BIT(2, Target8Bit::C)), - 0x52 => Some(Instruction::BIT(2, Target8Bit::D)), - 0x53 => Some(Instruction::BIT(2, Target8Bit::E)), - 0x54 => Some(Instruction::BIT(2, Target8Bit::H)), - 0x55 => Some(Instruction::BIT(2, Target8Bit::L)), - 0x56 => Some(Instruction::BIT(2, Target8Bit::HLI)), - 0x57 => Some(Instruction::BIT(2, Target8Bit::A)), - - 0x58 => Some(Instruction::BIT(3, Target8Bit::B)), - 0x59 => Some(Instruction::BIT(3, Target8Bit::C)), - 0x5a => Some(Instruction::BIT(3, Target8Bit::D)), - 0x5b => Some(Instruction::BIT(3, Target8Bit::E)), - 0x5c => Some(Instruction::BIT(3, Target8Bit::H)), - 0x5d => Some(Instruction::BIT(3, Target8Bit::L)), - 0x5e => Some(Instruction::BIT(3, Target8Bit::HLI)), - 0x5f => Some(Instruction::BIT(3, Target8Bit::A)), - - 0x60 => Some(Instruction::BIT(4, Target8Bit::B)), - 0x61 => Some(Instruction::BIT(4, Target8Bit::C)), - 0x62 => Some(Instruction::BIT(4, Target8Bit::D)), - 0x63 => Some(Instruction::BIT(4, Target8Bit::E)), - 0x64 => Some(Instruction::BIT(4, Target8Bit::H)), - 0x65 => Some(Instruction::BIT(4, Target8Bit::L)), - 0x66 => Some(Instruction::BIT(4, Target8Bit::HLI)), - 0x67 => Some(Instruction::BIT(4, Target8Bit::A)), - - 0x68 => Some(Instruction::BIT(5, Target8Bit::B)), - 0x69 => Some(Instruction::BIT(5, Target8Bit::C)), - 0x6a => Some(Instruction::BIT(5, Target8Bit::D)), - 0x6b => Some(Instruction::BIT(5, Target8Bit::E)), - 0x6c => Some(Instruction::BIT(5, Target8Bit::H)), - 0x6d => Some(Instruction::BIT(5, Target8Bit::L)), - 0x6e => Some(Instruction::BIT(5, Target8Bit::HLI)), - 0x6f => Some(Instruction::BIT(5, Target8Bit::A)), - - 0x70 => Some(Instruction::BIT(6, Target8Bit::B)), - 0x71 => Some(Instruction::BIT(6, Target8Bit::C)), - 0x72 => Some(Instruction::BIT(6, Target8Bit::D)), - 0x73 => Some(Instruction::BIT(6, Target8Bit::E)), - 0x74 => Some(Instruction::BIT(6, Target8Bit::H)), - 0x75 => Some(Instruction::BIT(6, Target8Bit::L)), - 0x76 => Some(Instruction::BIT(6, Target8Bit::HLI)), - 0x77 => Some(Instruction::BIT(6, Target8Bit::A)), - - 0x78 => Some(Instruction::BIT(7, Target8Bit::B)), - 0x79 => Some(Instruction::BIT(7, Target8Bit::C)), - 0x7a => Some(Instruction::BIT(7, Target8Bit::D)), - 0x7b => Some(Instruction::BIT(7, Target8Bit::E)), - 0x7c => Some(Instruction::BIT(7, Target8Bit::H)), - 0x7d => Some(Instruction::BIT(7, Target8Bit::L)), - 0x7e => Some(Instruction::BIT(7, Target8Bit::HLI)), - 0x7f => Some(Instruction::BIT(7, Target8Bit::A)), - - 0x80 => Some(Instruction::RES(0, Target8Bit::B)), - 0x81 => Some(Instruction::RES(0, Target8Bit::C)), - 0x82 => Some(Instruction::RES(0, Target8Bit::D)), - 0x83 => Some(Instruction::RES(0, Target8Bit::E)), - 0x84 => Some(Instruction::RES(0, Target8Bit::H)), - 0x85 => Some(Instruction::RES(0, Target8Bit::L)), - 0x86 => Some(Instruction::RES(0, Target8Bit::HLI)), - 0x87 => Some(Instruction::RES(0, Target8Bit::A)), - - 0x88 => Some(Instruction::RES(1, Target8Bit::B)), - 0x89 => Some(Instruction::RES(1, Target8Bit::C)), - 0x8a => Some(Instruction::RES(1, Target8Bit::D)), - 0x8b => Some(Instruction::RES(1, Target8Bit::E)), - 0x8c => Some(Instruction::RES(1, Target8Bit::H)), - 0x8d => Some(Instruction::RES(1, Target8Bit::L)), - 0x8e => Some(Instruction::RES(1, Target8Bit::HLI)), - 0x8f => Some(Instruction::RES(1, Target8Bit::A)), - - 0x90 => Some(Instruction::RES(2, Target8Bit::B)), - 0x91 => Some(Instruction::RES(2, Target8Bit::C)), - 0x92 => Some(Instruction::RES(2, Target8Bit::D)), - 0x93 => Some(Instruction::RES(2, Target8Bit::E)), - 0x94 => Some(Instruction::RES(2, Target8Bit::H)), - 0x95 => Some(Instruction::RES(2, Target8Bit::L)), - 0x96 => Some(Instruction::RES(2, Target8Bit::HLI)), - 0x97 => Some(Instruction::RES(2, Target8Bit::A)), - - 0x98 => Some(Instruction::RES(3, Target8Bit::B)), - 0x99 => Some(Instruction::RES(3, Target8Bit::C)), - 0x9a => Some(Instruction::RES(3, Target8Bit::D)), - 0x9b => Some(Instruction::RES(3, Target8Bit::E)), - 0x9c => Some(Instruction::RES(3, Target8Bit::H)), - 0x9d => Some(Instruction::RES(3, Target8Bit::L)), - 0x9e => Some(Instruction::RES(3, Target8Bit::HLI)), - 0x9f => Some(Instruction::RES(3, Target8Bit::A)), - - 0xa0 => Some(Instruction::RES(4, Target8Bit::B)), - 0xa1 => Some(Instruction::RES(4, Target8Bit::C)), - 0xa2 => Some(Instruction::RES(4, Target8Bit::D)), - 0xa3 => Some(Instruction::RES(4, Target8Bit::E)), - 0xa4 => Some(Instruction::RES(4, Target8Bit::H)), - 0xa5 => Some(Instruction::RES(4, Target8Bit::L)), - 0xa6 => Some(Instruction::RES(4, Target8Bit::HLI)), - 0xa7 => Some(Instruction::RES(4, Target8Bit::A)), - - 0xa8 => Some(Instruction::RES(5, Target8Bit::B)), - 0xa9 => Some(Instruction::RES(5, Target8Bit::C)), - 0xaa => Some(Instruction::RES(5, Target8Bit::D)), - 0xab => Some(Instruction::RES(5, Target8Bit::E)), - 0xac => Some(Instruction::RES(5, Target8Bit::H)), - 0xad => Some(Instruction::RES(5, Target8Bit::L)), - 0xae => Some(Instruction::RES(5, Target8Bit::HLI)), - 0xaf => Some(Instruction::RES(5, Target8Bit::A)), - - 0xb0 => Some(Instruction::RES(6, Target8Bit::B)), - 0xb1 => Some(Instruction::RES(6, Target8Bit::C)), - 0xb2 => Some(Instruction::RES(6, Target8Bit::D)), - 0xb3 => Some(Instruction::RES(6, Target8Bit::E)), - 0xb4 => Some(Instruction::RES(6, Target8Bit::H)), - 0xb5 => Some(Instruction::RES(6, Target8Bit::L)), - 0xb6 => Some(Instruction::RES(6, Target8Bit::HLI)), - 0xb7 => Some(Instruction::RES(6, Target8Bit::A)), - - 0xb8 => Some(Instruction::RES(7, Target8Bit::B)), - 0xb9 => Some(Instruction::RES(7, Target8Bit::C)), - 0xba => Some(Instruction::RES(7, Target8Bit::D)), - 0xbb => Some(Instruction::RES(7, Target8Bit::E)), - 0xbc => Some(Instruction::RES(7, Target8Bit::H)), - 0xbd => Some(Instruction::RES(7, Target8Bit::L)), - 0xbe => Some(Instruction::RES(7, Target8Bit::HLI)), - 0xbf => Some(Instruction::RES(7, Target8Bit::A)), - - 0xc0 => Some(Instruction::SET(0, Target8Bit::B)), - 0xc1 => Some(Instruction::SET(0, Target8Bit::C)), - 0xc2 => Some(Instruction::SET(0, Target8Bit::D)), - 0xc3 => Some(Instruction::SET(0, Target8Bit::E)), - 0xc4 => Some(Instruction::SET(0, Target8Bit::H)), - 0xc5 => Some(Instruction::SET(0, Target8Bit::L)), - 0xc6 => Some(Instruction::SET(0, Target8Bit::HLI)), - 0xc7 => Some(Instruction::SET(0, Target8Bit::A)), - - 0xc8 => Some(Instruction::SET(1, Target8Bit::B)), - 0xc9 => Some(Instruction::SET(1, Target8Bit::C)), - 0xca => Some(Instruction::SET(1, Target8Bit::D)), - 0xcb => Some(Instruction::SET(1, Target8Bit::E)), - 0xcc => Some(Instruction::SET(1, Target8Bit::H)), - 0xcd => Some(Instruction::SET(1, Target8Bit::L)), - 0xce => Some(Instruction::SET(1, Target8Bit::HLI)), - 0xcf => Some(Instruction::SET(1, Target8Bit::A)), - - 0xd0 => Some(Instruction::SET(2, Target8Bit::B)), - 0xd1 => Some(Instruction::SET(2, Target8Bit::C)), - 0xd2 => Some(Instruction::SET(2, Target8Bit::D)), - 0xd3 => Some(Instruction::SET(2, Target8Bit::E)), - 0xd4 => Some(Instruction::SET(2, Target8Bit::H)), - 0xd5 => Some(Instruction::SET(2, Target8Bit::L)), - 0xd6 => Some(Instruction::SET(2, Target8Bit::HLI)), - 0xd7 => Some(Instruction::SET(2, Target8Bit::A)), - - 0xd8 => Some(Instruction::SET(3, Target8Bit::B)), - 0xd9 => Some(Instruction::SET(3, Target8Bit::C)), - 0xda => Some(Instruction::SET(3, Target8Bit::D)), - 0xdb => Some(Instruction::SET(3, Target8Bit::E)), - 0xdc => Some(Instruction::SET(3, Target8Bit::H)), - 0xdd => Some(Instruction::SET(3, Target8Bit::L)), - 0xde => Some(Instruction::SET(3, Target8Bit::HLI)), - 0xdf => Some(Instruction::SET(3, Target8Bit::A)), - - 0xe0 => Some(Instruction::SET(4, Target8Bit::B)), - 0xe1 => Some(Instruction::SET(4, Target8Bit::C)), - 0xe2 => Some(Instruction::SET(4, Target8Bit::D)), - 0xe3 => Some(Instruction::SET(4, Target8Bit::E)), - 0xe4 => Some(Instruction::SET(4, Target8Bit::H)), - 0xe5 => Some(Instruction::SET(4, Target8Bit::L)), - 0xe6 => Some(Instruction::SET(4, Target8Bit::HLI)), - 0xe7 => Some(Instruction::SET(4, Target8Bit::A)), - - 0xe8 => Some(Instruction::SET(5, Target8Bit::B)), - 0xe9 => Some(Instruction::SET(5, Target8Bit::C)), - 0xea => Some(Instruction::SET(5, Target8Bit::D)), - 0xeb => Some(Instruction::SET(5, Target8Bit::E)), - 0xec => Some(Instruction::SET(5, Target8Bit::H)), - 0xed => Some(Instruction::SET(5, Target8Bit::L)), - 0xee => Some(Instruction::SET(5, Target8Bit::HLI)), - 0xef => Some(Instruction::SET(5, Target8Bit::A)), - - 0xf0 => Some(Instruction::SET(6, Target8Bit::B)), - 0xf1 => Some(Instruction::SET(6, Target8Bit::C)), - 0xf2 => Some(Instruction::SET(6, Target8Bit::D)), - 0xf3 => Some(Instruction::SET(6, Target8Bit::E)), - 0xf4 => Some(Instruction::SET(6, Target8Bit::H)), - 0xf5 => Some(Instruction::SET(6, Target8Bit::L)), - 0xf6 => Some(Instruction::SET(6, Target8Bit::HLI)), - 0xf7 => Some(Instruction::SET(6, Target8Bit::A)), - - 0xf8 => Some(Instruction::SET(7, Target8Bit::B)), - 0xf9 => Some(Instruction::SET(7, Target8Bit::C)), - 0xfa => Some(Instruction::SET(7, Target8Bit::D)), - 0xfb => Some(Instruction::SET(7, Target8Bit::E)), - 0xfc => Some(Instruction::SET(7, Target8Bit::H)), - 0xfd => Some(Instruction::SET(7, Target8Bit::L)), - 0xfe => Some(Instruction::SET(7, Target8Bit::HLI)), - 0xff => Some(Instruction::SET(7, Target8Bit::A)), - - _ => { - println!("[INS] Missing byte Instruction 0x{:x} with prefix", byte); - None - } + _ => None, } } fn from_byte_without_prefix(byte: u8) -> Option { match byte { - 0x00 => Some(Instruction::NOP), - - 0x3c => Some(Instruction::INC(Target8Bit::A)), - 0x04 => Some(Instruction::INC(Target8Bit::B)), - 0x0c => Some(Instruction::INC(Target8Bit::C)), - 0x14 => Some(Instruction::INC(Target8Bit::D)), - 0x1c => Some(Instruction::INC(Target8Bit::E)), - 0x24 => Some(Instruction::INC(Target8Bit::H)), - 0x2c => Some(Instruction::INC(Target8Bit::L)), - 0x34 => Some(Instruction::INC(Target8Bit::HLI)), - - 0x87 => Some(Instruction::ADD(Target8Bit::A)), - 0x80 => Some(Instruction::ADD(Target8Bit::B)), - 0x81 => Some(Instruction::ADD(Target8Bit::C)), - 0x82 => Some(Instruction::ADD(Target8Bit::D)), - 0x83 => Some(Instruction::ADD(Target8Bit::E)), - 0x84 => Some(Instruction::ADD(Target8Bit::H)), - 0x85 => Some(Instruction::ADD(Target8Bit::L)), - 0x86 => Some(Instruction::ADD(Target8Bit::HLI)), - 0xc6 => Some(Instruction::ADD(Target8Bit::D8)), - - 0x8f => Some(Instruction::ADC(Target8Bit::A)), - 0x88 => Some(Instruction::ADC(Target8Bit::B)), - 0x89 => Some(Instruction::ADC(Target8Bit::C)), - 0x8A => Some(Instruction::ADC(Target8Bit::D)), - 0x8B => Some(Instruction::ADC(Target8Bit::E)), - 0x8C => Some(Instruction::ADC(Target8Bit::H)), - 0x8D => Some(Instruction::ADC(Target8Bit::L)), - - 0x97 => Some(Instruction::SUB(Target8Bit::A)), - 0x90 => Some(Instruction::SUB(Target8Bit::B)), - 0x91 => Some(Instruction::SUB(Target8Bit::C)), - 0x92 => Some(Instruction::SUB(Target8Bit::D)), - 0x93 => Some(Instruction::SUB(Target8Bit::E)), - 0x94 => Some(Instruction::SUB(Target8Bit::H)), - 0x95 => Some(Instruction::SUB(Target8Bit::L)), - - 0x9f => Some(Instruction::SBC(Target8Bit::A)), - 0x98 => Some(Instruction::SBC(Target8Bit::B)), - 0x99 => Some(Instruction::SBC(Target8Bit::C)), - 0x9a => Some(Instruction::SBC(Target8Bit::D)), - 0x9b => Some(Instruction::SBC(Target8Bit::E)), - 0x9c => Some(Instruction::SBC(Target8Bit::H)), - 0x9d => Some(Instruction::SBC(Target8Bit::L)), - - 0xa7 => Some(Instruction::AND(Target8Bit::A)), - 0xa0 => Some(Instruction::AND(Target8Bit::B)), - 0xa1 => Some(Instruction::AND(Target8Bit::C)), - 0xa2 => Some(Instruction::AND(Target8Bit::D)), - 0xa3 => Some(Instruction::AND(Target8Bit::E)), - 0xa4 => Some(Instruction::AND(Target8Bit::H)), - 0xa6 => Some(Instruction::AND(Target8Bit::HLI)), - 0xe6 => Some(Instruction::AND(Target8Bit::D8)), - - 0xb7 => Some(Instruction::OR(Target8Bit::A)), - 0xb0 => Some(Instruction::OR(Target8Bit::B)), - 0xb1 => Some(Instruction::OR(Target8Bit::C)), - 0xb2 => Some(Instruction::OR(Target8Bit::D)), - 0xb3 => Some(Instruction::OR(Target8Bit::E)), - 0xb4 => Some(Instruction::OR(Target8Bit::H)), - 0xb5 => Some(Instruction::OR(Target8Bit::L)), - 0xb6 => Some(Instruction::OR(Target8Bit::HLI)), - 0xf6 => Some(Instruction::OR(Target8Bit::D8)), - - 0xaf => Some(Instruction::XOR(Target8Bit::A)), - 0xa8 => Some(Instruction::XOR(Target8Bit::B)), - 0xa9 => Some(Instruction::XOR(Target8Bit::C)), - 0xaa => Some(Instruction::XOR(Target8Bit::D)), - 0xab => Some(Instruction::XOR(Target8Bit::E)), - 0xac => Some(Instruction::XOR(Target8Bit::H)), - 0xad => Some(Instruction::XOR(Target8Bit::L)), - 0xae => Some(Instruction::XOR(Target8Bit::HLI)), - 0xee => Some(Instruction::XOR(Target8Bit::D8)), - - 0xbf => Some(Instruction::CP(Target8Bit::A)), - 0xb8 => Some(Instruction::CP(Target8Bit::B)), - 0xb9 => Some(Instruction::CP(Target8Bit::C)), - 0xba => Some(Instruction::CP(Target8Bit::D)), - 0xbb => Some(Instruction::CP(Target8Bit::E)), - 0xbc => Some(Instruction::CP(Target8Bit::H)), - 0xbd => Some(Instruction::CP(Target8Bit::L)), - 0xbe => Some(Instruction::CP(Target8Bit::HLI)), - 0xfe => Some(Instruction::CP(Target8Bit::D8)), - - 0x3d => Some(Instruction::DEC(Target8Bit::A)), - 0x05 => Some(Instruction::DEC(Target8Bit::B)), - 0x0d => Some(Instruction::DEC(Target8Bit::C)), - 0x15 => Some(Instruction::DEC(Target8Bit::D)), - 0x1d => Some(Instruction::DEC(Target8Bit::E)), - 0x25 => Some(Instruction::DEC(Target8Bit::H)), - 0x2d => Some(Instruction::DEC(Target8Bit::L)), - 0x35 => Some(Instruction::DEC(Target8Bit::HLI)), - - 0xc2 => Some(Instruction::JP(JumpCondition::NotZero)), - 0xca => Some(Instruction::JP(JumpCondition::Zero)), - 0xd2 => Some(Instruction::JP(JumpCondition::NotCarry)), - 0xda => Some(Instruction::JP(JumpCondition::Carry)), - - 0x20 => Some(Instruction::JR(JumpCondition::NotZero)), - 0x28 => Some(Instruction::JR(JumpCondition::Zero)), - 0x30 => Some(Instruction::JR(JumpCondition::NotCarry)), - 0x38 => Some(Instruction::JR(JumpCondition::Carry)), - 0x18 => Some(Instruction::JR(JumpCondition::Always)), - - 0xe9 => Some(Instruction::JPI), - - 0x06 => Some(Instruction::LD8(Target8Bit::B, Target8Bit::D8)), - 0x0e => Some(Instruction::LD8(Target8Bit::C, Target8Bit::D8)), - 0x16 => Some(Instruction::LD8(Target8Bit::D, Target8Bit::D8)), - 0x1e => Some(Instruction::LD8(Target8Bit::E, Target8Bit::D8)), - 0x26 => Some(Instruction::LD8(Target8Bit::H, Target8Bit::D8)), - 0x2e => Some(Instruction::LD8(Target8Bit::L, Target8Bit::D8)), - - 0x7f => Some(Instruction::LD8(Target8Bit::A, Target8Bit::A)), - 0x78 => Some(Instruction::LD8(Target8Bit::A, Target8Bit::B)), - 0x79 => Some(Instruction::LD8(Target8Bit::A, Target8Bit::C)), - 0x7a => Some(Instruction::LD8(Target8Bit::A, Target8Bit::D)), - 0x7b => Some(Instruction::LD8(Target8Bit::A, Target8Bit::E)), - 0x7c => Some(Instruction::LD8(Target8Bit::A, Target8Bit::H)), - 0x7d => Some(Instruction::LD8(Target8Bit::A, Target8Bit::L)), - 0x7e => Some(Instruction::LD8(Target8Bit::A, Target8Bit::HLI)), - 0x3e => Some(Instruction::LD8(Target8Bit::A, Target8Bit::D8)), - - 0x40 => Some(Instruction::LD8(Target8Bit::B, Target8Bit::B)), - 0x41 => Some(Instruction::LD8(Target8Bit::B, Target8Bit::C)), - 0x42 => Some(Instruction::LD8(Target8Bit::B, Target8Bit::D)), - 0x43 => Some(Instruction::LD8(Target8Bit::B, Target8Bit::E)), - 0x44 => Some(Instruction::LD8(Target8Bit::B, Target8Bit::H)), - 0x45 => Some(Instruction::LD8(Target8Bit::B, Target8Bit::L)), - 0x46 => Some(Instruction::LD8(Target8Bit::B, Target8Bit::HLI)), - - 0x48 => Some(Instruction::LD8(Target8Bit::C, Target8Bit::B)), - 0x49 => Some(Instruction::LD8(Target8Bit::C, Target8Bit::C)), - 0x4a => Some(Instruction::LD8(Target8Bit::C, Target8Bit::D)), - 0x4b => Some(Instruction::LD8(Target8Bit::C, Target8Bit::E)), - 0x4c => Some(Instruction::LD8(Target8Bit::C, Target8Bit::H)), - 0x4d => Some(Instruction::LD8(Target8Bit::C, Target8Bit::L)), - 0x4e => Some(Instruction::LD8(Target8Bit::C, Target8Bit::HLI)), - - 0x50 => Some(Instruction::LD8(Target8Bit::D, Target8Bit::B)), - 0x51 => Some(Instruction::LD8(Target8Bit::D, Target8Bit::C)), - 0x52 => Some(Instruction::LD8(Target8Bit::D, Target8Bit::D)), - 0x53 => Some(Instruction::LD8(Target8Bit::D, Target8Bit::E)), - 0x54 => Some(Instruction::LD8(Target8Bit::D, Target8Bit::H)), - 0x55 => Some(Instruction::LD8(Target8Bit::D, Target8Bit::L)), - 0x56 => Some(Instruction::LD8(Target8Bit::D, Target8Bit::HLI)), - - 0x58 => Some(Instruction::LD8(Target8Bit::E, Target8Bit::B)), - 0x59 => Some(Instruction::LD8(Target8Bit::E, Target8Bit::C)), - 0x5a => Some(Instruction::LD8(Target8Bit::E, Target8Bit::D)), - 0x5b => Some(Instruction::LD8(Target8Bit::E, Target8Bit::E)), - 0x5c => Some(Instruction::LD8(Target8Bit::E, Target8Bit::H)), - 0x5d => Some(Instruction::LD8(Target8Bit::E, Target8Bit::L)), - 0x5e => Some(Instruction::LD8(Target8Bit::E, Target8Bit::HLI)), - - 0x60 => Some(Instruction::LD8(Target8Bit::H, Target8Bit::B)), - 0x61 => Some(Instruction::LD8(Target8Bit::H, Target8Bit::C)), - 0x62 => Some(Instruction::LD8(Target8Bit::H, Target8Bit::D)), - 0x63 => Some(Instruction::LD8(Target8Bit::H, Target8Bit::E)), - 0x64 => Some(Instruction::LD8(Target8Bit::H, Target8Bit::H)), - 0x65 => Some(Instruction::LD8(Target8Bit::H, Target8Bit::L)), - 0x66 => Some(Instruction::LD8(Target8Bit::H, Target8Bit::HLI)), - - 0x68 => Some(Instruction::LD8(Target8Bit::L, Target8Bit::B)), - 0x69 => Some(Instruction::LD8(Target8Bit::L, Target8Bit::C)), - 0x6a => Some(Instruction::LD8(Target8Bit::L, Target8Bit::D)), - 0x6b => Some(Instruction::LD8(Target8Bit::L, Target8Bit::E)), - 0x6c => Some(Instruction::LD8(Target8Bit::L, Target8Bit::H)), - 0x6d => Some(Instruction::LD8(Target8Bit::L, Target8Bit::L)), - 0x6e => Some(Instruction::LD8(Target8Bit::L, Target8Bit::HLI)), - - 0x70 => Some(Instruction::LD8(Target8Bit::HLI, Target8Bit::B)), - 0x71 => Some(Instruction::LD8(Target8Bit::HLI, Target8Bit::C)), - 0x72 => Some(Instruction::LD8(Target8Bit::HLI, Target8Bit::D)), - 0x73 => Some(Instruction::LD8(Target8Bit::HLI, Target8Bit::E)), - 0x74 => Some(Instruction::LD8(Target8Bit::HLI, Target8Bit::H)), - 0x75 => Some(Instruction::LD8(Target8Bit::HLI, Target8Bit::L)), - 0x36 => Some(Instruction::LD8(Target8Bit::HLI, Target8Bit::D8)), - 0x77 => Some(Instruction::LD8(Target8Bit::HLI, Target8Bit::A)), - - 0x01 => Some(Instruction::LD16(Target16Bit::BC, Source16Bit::D16)), - 0x11 => Some(Instruction::LD16(Target16Bit::DE, Source16Bit::D16)), - 0x21 => Some(Instruction::LD16(Target16Bit::HL, Source16Bit::D16)), - 0x31 => Some(Instruction::LD16(Target16Bit::SP, Source16Bit::D16)), - - 0x0b => Some(Instruction::DEC16(Target16Bit::BC)), - 0x1b => Some(Instruction::DEC16(Target16Bit::DE)), - 0x2b => Some(Instruction::DEC16(Target16Bit::HL)), - 0x3b => Some(Instruction::DEC16(Target16Bit::SP)), - - 0x09 => Some(Instruction::ADD16(Target16Bit::BC)), - 0x19 => Some(Instruction::ADD16(Target16Bit::DE)), - 0x29 => Some(Instruction::ADD16(Target16Bit::HL)), - 0x39 => Some(Instruction::ADD16(Target16Bit::SP)), - - 0x03 => Some(Instruction::INC16(Target16Bit::BC)), - 0x13 => Some(Instruction::INC16(Target16Bit::DE)), - 0x23 => Some(Instruction::INC16(Target16Bit::HL)), - 0x33 => Some(Instruction::INC16(Target16Bit::SP)), - - 0x32 => Some(Instruction::LDD), - 0xe2 => Some(Instruction::LDC), - 0xe0 => Some(Instruction::LDHA), - - 0xf5 => Some(Instruction::PUSH(StackTarget::AF)), - 0xc5 => Some(Instruction::PUSH(StackTarget::BC)), - 0xd5 => Some(Instruction::PUSH(StackTarget::DE)), - 0xe5 => Some(Instruction::PUSH(StackTarget::HL)), - - 0xf1 => Some(Instruction::POP(StackTarget::AF)), - 0xc1 => Some(Instruction::POP(StackTarget::BC)), - 0xd1 => Some(Instruction::POP(StackTarget::DE)), - 0xe1 => Some(Instruction::POP(StackTarget::HL)), - - _ => { - eprintln!("[INS] Missing byte Instruction 0x{:x}", byte); - None - } + 0x3E => Some(Instruction::Load(Register::A)), + 0x06 => Some(Instruction::Load(Register::B)), + 0x0E => Some(Instruction::Load(Register::C)), + 0x16 => Some(Instruction::Load(Register::D)), + 0x1E => Some(Instruction::Load(Register::E)), + 0x26 => Some(Instruction::Load(Register::H)), + 0x2E => Some(Instruction::Load(Register::L)), + 0x7F => Some(Instruction::LoadRegister(Register::A, Register::A)), + 0x78 => Some(Instruction::LoadRegister(Register::A, Register::B)), + 0x79 => Some(Instruction::LoadRegister(Register::A, Register::C)), + 0x7A => Some(Instruction::LoadRegister(Register::A, Register::D)), + 0x7B => Some(Instruction::LoadRegister(Register::A, Register::E)), + 0x7C => Some(Instruction::LoadRegister(Register::A, Register::H)), + 0x7D => Some(Instruction::LoadRegister(Register::A, Register::L)), + 0x47 => Some(Instruction::LoadRegister(Register::B, Register::A)), + 0x40 => Some(Instruction::LoadRegister(Register::B, Register::B)), + 0x41 => Some(Instruction::LoadRegister(Register::B, Register::C)), + 0x42 => Some(Instruction::LoadRegister(Register::B, Register::D)), + 0x43 => Some(Instruction::LoadRegister(Register::B, Register::E)), + 0x44 => Some(Instruction::LoadRegister(Register::B, Register::H)), + 0x45 => Some(Instruction::LoadRegister(Register::B, Register::L)), + 0x4F => Some(Instruction::LoadRegister(Register::C, Register::A)), + 0x48 => Some(Instruction::LoadRegister(Register::C, Register::B)), + 0x49 => Some(Instruction::LoadRegister(Register::C, Register::C)), + _ => None, } } } diff --git a/gameboy-lib/src/cpu/mod.rs b/gameboy-lib/src/cpu/mod.rs index 31c9858..06aaeb4 100644 --- a/gameboy-lib/src/cpu/mod.rs +++ b/gameboy-lib/src/cpu/mod.rs @@ -1,3 +1,239 @@ -pub mod cpu; -pub mod instructions; +use crate::memory::Memory; + +use self::registers::Register; + pub mod registers; +pub mod instructions; + +pub struct Cpu { + pub registers: registers::Registers, + pub pc: u16, + pub memory: Memory, +} + +impl Cpu { + pub fn new() -> Cpu { + Cpu { + registers: registers::Registers::new(), + pc: 0, + memory: Memory::new(), + } + } + + pub fn boot(&mut self, boot_rom: Vec) { + self.pc = 0x100; + self.memory.write_vec(0x100, boot_rom); + } + + pub fn step(&mut self) { + let opcode = self.memory.read(self.pc); + let prefixed = opcode == 0xCB; + let instruction = if prefixed { + self.memory.read(self.pc + 1) + } else { + opcode + }; + + if instruction != 0 { + println!("[CPU] Next instruction 0x{:x}", instruction); + } + } + + fn load(&mut self, register: Register, value: u8) { + self.registers.set(register, value); + } + + fn load_register(&mut self, from: Register, to: Register) { + let value = self.registers.get(from); + self.load(to, value); + } + + fn add(&mut self, value: u8) { + let a = self.registers.a; + let result = a.wrapping_add(value); + self.registers.f.zero = result == 0; + self.registers.f.subtract = false; + self.registers.f.half_carry = (a & 0x0F) + (value & 0x0F) > 0x0F; + self.registers.f.carry = (a as u16) + (value as u16) > 0xFF; + self.registers.a = result; + } + + fn add_carried(&mut self, value: u8) { + let a = self.registers.a; + let carry = if self.registers.f.carry { 1 } else { 0 }; + let result = a.wrapping_add(value).wrapping_add(carry); + self.registers.f.zero = result == 0; + self.registers.f.subtract = false; + self.registers.f.half_carry = (a & 0x0F) + (value & 0x0F) + carry > 0x0F; + self.registers.f.carry = (a as u16) + (value as u16) + (carry as u16) > 0xFF; + self.registers.a = result; + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_load_a() { + let mut cpu = Cpu::new(); + cpu.load(Register::A, 0x01); + assert_eq!(cpu.registers.a, 0x01); + } + + #[test] + fn test_load_b() { + let mut cpu = Cpu::new(); + cpu.load(Register::B, 0x01); + assert_eq!(cpu.registers.b, 0x01); + } + + #[test] + fn test_load_c() { + let mut cpu = Cpu::new(); + cpu.load(Register::C, 0x01); + assert_eq!(cpu.registers.c, 0x01); + } + + #[test] + fn test_load_d() { + let mut cpu = Cpu::new(); + cpu.load(Register::D, 0x01); + assert_eq!(cpu.registers.d, 0x01); + } + + #[test] + fn test_load_e() { + let mut cpu = Cpu::new(); + cpu.load(Register::E, 0x01); + assert_eq!(cpu.registers.e, 0x01); + } + + #[test] + fn test_load_h() { + let mut cpu = Cpu::new(); + cpu.load(Register::H, 0x01); + assert_eq!(cpu.registers.h, 0x01); + } + + #[test] + fn test_load_l() { + let mut cpu = Cpu::new(); + cpu.load(Register::L, 0x01); + assert_eq!(cpu.registers.l, 0x01); + } + + #[test] + fn test_add() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0x10; + cpu.add(0x01); + assert_eq!(cpu.registers.a, 0x11); + assert_eq!(cpu.registers.f.zero, false); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, false); + assert_eq!(cpu.registers.f.carry, false); + } + + #[test] + fn test_add_zero() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0xFF; + cpu.add(0x01); + assert_eq!(cpu.registers.a, 0x00); + assert_eq!(cpu.registers.f.zero, true); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, true); + assert_eq!(cpu.registers.f.carry, true); + } + + #[test] + fn test_add_half_carry() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0x0F; + cpu.add(0x01); + assert_eq!(cpu.registers.a, 0x10); + assert_eq!(cpu.registers.f.zero, false); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, true); + assert_eq!(cpu.registers.f.carry, false); + } + + #[test] + fn test_add_carry() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0xFF; + cpu.add(0x01); + assert_eq!(cpu.registers.a, 0x00); + assert_eq!(cpu.registers.f.zero, true); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, true); + assert_eq!(cpu.registers.f.carry, true); + } + + #[test] + fn test_add_carried() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0x10; + cpu.registers.f.carry = true; + cpu.add_carried(0x01); + assert_eq!(cpu.registers.a, 0x12); + assert_eq!(cpu.registers.f.zero, false); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, false); + assert_eq!(cpu.registers.f.carry, false); + } + + #[test] + fn test_add_carried_zero() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0xFF; + cpu.registers.f.carry = true; + cpu.add_carried(0x01); + assert_eq!(cpu.registers.a, 0x01); + assert_eq!(cpu.registers.f.zero, false); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, true); + assert_eq!(cpu.registers.f.carry, true); + } + + #[test] + fn test_add_carried_half_carry() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0x0F; + cpu.registers.f.carry = true; + cpu.add_carried(0x01); + assert_eq!(cpu.registers.a, 0x11); + assert_eq!(cpu.registers.f.zero, false); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, true); + assert_eq!(cpu.registers.f.carry, false); + } + + #[test] + fn test_add_carried_carry() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0xFF; + cpu.registers.f.carry = true; + cpu.add_carried(0x01); + assert_eq!(cpu.registers.a, 0x01); + assert_eq!(cpu.registers.f.zero, false); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, true); + assert_eq!(cpu.registers.f.carry, true); + } + + #[test] + fn test_add_carried_carry_carry() { + let mut cpu = Cpu::new(); + cpu.registers.a = 0xFF; + cpu.registers.f.carry = true; + cpu.add_carried(0xFF); + assert_eq!(cpu.registers.a, 0xFF); + assert_eq!(cpu.registers.f.zero, false); + assert_eq!(cpu.registers.f.subtract, false); + assert_eq!(cpu.registers.f.half_carry, true); + assert_eq!(cpu.registers.f.carry, true); + } +} diff --git a/gameboy-lib/src/cpu/registers/flag_register.rs b/gameboy-lib/src/cpu/registers/flag_register.rs index 8df3fab..8e8f7fb 100644 --- a/gameboy-lib/src/cpu/registers/flag_register.rs +++ b/gameboy-lib/src/cpu/registers/flag_register.rs @@ -1,12 +1,9 @@ -use serde_derive::Serialize; - -#[derive(Copy, Clone, Debug, PartialEq)] -#[cfg_attr(feature = "serialize", derive(Serialize))] pub struct FlagRegister { pub zero: bool, pub subtract: bool, pub half_carry: bool, pub carry: bool, + pub rest: u8, // The rest of the flag register 4 bits } impl FlagRegister { @@ -15,33 +12,68 @@ impl FlagRegister { zero: false, subtract: false, half_carry: false, - carry: false + carry: false, + rest: 0, } } -} -impl From for u8 { - fn from(value: FlagRegister) -> Self { - (if value.zero { 1 } else { 0 }) << 7 - | (if value.subtract { 1 } else { 0 }) << 6 - | (if value.half_carry { 1 } else { 0 }) << 5 - | (if value.carry { 1 } else { 0 } << 4) + pub fn get(&self) -> u8 { + (if self.zero { 1 } else { 0 }) << 7 + | (if self.subtract { 1 } else { 0 }) << 6 + | (if self.half_carry { 1 } else { 0 }) << 5 + | (if self.carry { 1 } else { 0 } << 4) + | self.rest } -} -impl From for FlagRegister { - fn from(value: u8) -> Self { - let zero = ((value >> 7) & 0b1) != 0; - let subtract = ((value >> 6) & 0b1) != 0; - let half_carry = ((value >> 5) & 0b1) != 0; - let carry = ((value >> 4) & 0b1) != 0; - - return FlagRegister { - zero, - subtract, - half_carry, - carry, - }; + pub fn set(&mut self, value: u8) { + self.zero = ((value >> 7) & 0b1) != 0; + self.subtract = ((value >> 6) & 0b1) != 0; + self.half_carry = ((value >> 5) & 0b1) != 0; + self.carry = ((value >> 4) & 0b1) != 0; + self.rest = value & 0b0000_1111; } } +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get() { + let mut flag_register = FlagRegister::new(); + flag_register.zero = true; + flag_register.subtract = true; + flag_register.half_carry = true; + flag_register.carry = true; + assert_eq!(flag_register.get(), 0b1111_0000); + } + + #[test] + fn test_new() { + let flag_register = FlagRegister::new(); + assert_eq!(flag_register.zero, false); + assert_eq!(flag_register.subtract, false); + assert_eq!(flag_register.half_carry, false); + assert_eq!(flag_register.carry, false); + } + + #[test] + fn test_set_flags() { + let mut flag_register = FlagRegister::new(); + flag_register.set(0b1010_0000); + assert_eq!(flag_register.zero, true); + assert_eq!(flag_register.subtract, false); + assert_eq!(flag_register.half_carry, true); + assert_eq!(flag_register.carry, false); + } + + #[test] + fn test_set() { + let mut flag_register = FlagRegister::new(); + flag_register.set(0b1111_0000); + assert_eq!(flag_register.zero, true); + assert_eq!(flag_register.subtract, true); + assert_eq!(flag_register.half_carry, true); + assert_eq!(flag_register.carry, true); + } +} diff --git a/gameboy-lib/src/cpu/registers/mod.rs b/gameboy-lib/src/cpu/registers/mod.rs index 8d1d804..0997639 100644 --- a/gameboy-lib/src/cpu/registers/mod.rs +++ b/gameboy-lib/src/cpu/registers/mod.rs @@ -1,29 +1,9 @@ -use serde_derive::Serialize; -use super::registers::flag_register::FlagRegister; -use super::registers::register::Register; -use super::registers::register_8bit::Register8Bit; -use super::registers::stack_pointer::StackPointer; +use self::{flag_register::FlagRegister, stack_pointer::StackPointer}; pub(crate) mod flag_register; -mod register; -mod register_8bit; -mod stack_pointer; +pub(crate) mod stack_pointer; -#[derive(Clone)] -#[cfg_attr(feature = "serialize", derive(Serialize))] -pub struct Registers { - a: Register8Bit, - b: Register8Bit, - c: Register8Bit, - d: Register8Bit, - e: Register8Bit, - pub f: FlagRegister, - h: Register8Bit, - l: Register8Bit, - sp: StackPointer, -} - -pub enum Register8BitName { +pub enum Register { A, B, C, @@ -32,9 +12,6 @@ pub enum Register8BitName { F, H, L, -} - -pub enum Register16BitName { AF, BC, DE, @@ -42,120 +19,200 @@ pub enum Register16BitName { SP, } +pub struct Registers { + pub a: u8, + pub b: u8, + pub c: u8, + pub d: u8, + pub e: u8, + pub f: FlagRegister, + pub h: u8, + pub l: u8, + pub sp: StackPointer, +} + impl Registers { pub fn new() -> Registers { Registers { - a: Register8Bit::new("A"), - b: Register8Bit::new("B"), - c: Register8Bit::new("C"), - d: Register8Bit::new("D"), - e: Register8Bit::new("E"), + a: 0, + b: 0, + c: 0, + d: 0, + e: 0, f: FlagRegister::new(), - h: Register8Bit::new("H"), - l: Register8Bit::new("L"), - sp: StackPointer::new("SP"), + h: 0, + l: 0, + sp: StackPointer::new(), } } - pub fn get_8bit(&self, register: &Register8BitName) -> u8 { + pub fn get(&self, register: Register) -> u8 { match register { - Register8BitName::A => self.a.get(), - Register8BitName::B => self.b.get(), - Register8BitName::C => self.c.get(), - Register8BitName::D => self.d.get(), - Register8BitName::E => self.e.get(), - Register8BitName::F => self.f.into(), - Register8BitName::H => self.h.get(), - Register8BitName::L => self.l.get(), + Register::A => self.a, + Register::B => self.b, + Register::C => self.c, + Register::D => self.d, + Register::E => self.e, + Register::F => self.f.get(), + Register::H => self.h, + Register::L => self.l, + _ => panic!("Invalid register"), } } - pub fn get_16bit(&self, registers: &Register16BitName) -> u16 { - match registers { - Register16BitName::AF => self.get_af(), - Register16BitName::BC => self.get_bc(), - Register16BitName::DE => self.get_de(), - Register16BitName::HL => self.get_hl(), - Register16BitName::SP => self.sp.get(), + pub fn get_16(&self, register: Register) -> u16 { + match register { + Register::AF => self.get_af(), + Register::BC => self.get_bc(), + Register::DE => self.get_de(), + Register::HL => self.get_hl(), + Register::SP => self.sp.get(), + _ => panic!("Invalid register"), } } - pub fn set_8bit(&mut self, register: &Register8BitName, value: u8) { + pub fn set(&mut self, register: Register, value: u8) { match register { - Register8BitName::A => self.a.set(value), - Register8BitName::B => self.b.set(value), - Register8BitName::C => self.c.set(value), - Register8BitName::D => self.d.set(value), - Register8BitName::E => self.e.set(value), - Register8BitName::F => self.f = value.into(), - Register8BitName::H => self.h.set(value), - Register8BitName::L => self.l.set(value), + Register::A => self.a = value, + Register::B => self.b = value, + Register::C => self.c = value, + Register::D => self.d = value, + Register::E => self.e = value, + Register::F => self.f.set(value), + Register::H => self.h = value, + Register::L => self.l = value, + Register::BC => self.set_bc((self.b as u16) << 8 | value as u16), + Register::DE => self.set_de((self.d as u16) << 8 | value as u16), + Register::HL => self.set_hl((self.h as u16) << 8 | value as u16), + _ => panic!("Invalid register"), } } - pub fn set_16bit(&mut self, register: &Register16BitName, value: u16) { + pub fn set_16(&mut self, register: Register, value: u16) { match register { - Register16BitName::AF => self.set_af(value), - Register16BitName::BC => self.set_bc(value), - Register16BitName::DE => self.set_de(value), - Register16BitName::HL => self.set_hl(value), - Register16BitName::SP => self.sp.set(value), + Register::AF => self.set_af(value), + Register::BC => self.set_bc(value), + Register::DE => self.set_de(value), + Register::HL => self.set_hl(value), + Register::SP => self.sp.set(value), + _ => panic!("Invalid register"), } } - pub fn write_a(&mut self, value: u8) { - self.a.set(value); - } - - pub fn read_a(&self) -> u8 { - return self.a.get(); - } - fn get_af(&self) -> u16 { - let value = (self.a.get() as u16) << 8 | u8::from(self.f) as u16; - println!("[REG AF] Reading value: 0x{:x}", value); - return value; + (self.a as u16) << 8 | self.f.get() as u16 } fn set_af(&mut self, value: u16) { - println!("[REG AF] Writing value: 0x{:x}", value); - self.a.set(((value & 0xff00) >> 8) as u8); - self.f = FlagRegister::from((value & 0xff) as u8); + self.a = (value >> 8) as u8; + self.f.set(value as u8); } fn get_bc(&self) -> u16 { - let value = (self.b.get() as u16) << 8 | self.c.get() as u16; - println!("[REG BC] Reading value: 0x{:x}", value); - return value; + (self.b as u16) << 8 | self.c as u16 } fn set_bc(&mut self, value: u16) { - println!("[REG BC] Writing value: 0x{:x}", value); - self.b.set(((value & 0xff00) >> 8) as u8); - self.c.set((value & 0xff) as u8); + self.b = (value >> 8) as u8; + self.c = value as u8; } fn get_de(&self) -> u16 { - let value = (self.d.get() as u16) << 8 | self.e.get() as u16; - println!("[REG DE] Reading value: 0x{:x}", value); - return value; + (self.d as u16) << 8 | self.e as u16 } fn set_de(&mut self, value: u16) { - println!("[REG DE] Writing value: 0x{:x}", value); - self.d.set(((value & 0xff00) >> 8) as u8); - self.e.set((value & 0xff) as u8); + self.d = (value >> 8) as u8; + self.e = value as u8; } fn get_hl(&self) -> u16 { - let value = (self.h.get() as u16) << 8 | self.l.get() as u16; - println!("[REG HL] Reading value: 0x{:x}", value); - return value; + (self.h as u16) << 8 | self.l as u16 } fn set_hl(&mut self, value: u16) { - println!("[REG HL] Writing value: 0x{:x}", value); - self.h.set(((value & 0xff00) >> 8) as u8); - self.l.set((value & 0xff) as u8); + self.h = (value >> 8) as u8; + self.l = value as u8; + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn get() { + let mut registers = Registers::new(); + registers.a = 1; + registers.b = 2; + registers.c = 3; + registers.d = 4; + registers.e = 5; + registers.f.set(6); + registers.h = 7; + registers.l = 8; + + assert_eq!(registers.get(Register::A), 1); + assert_eq!(registers.get(Register::B), 2); + assert_eq!(registers.get(Register::C), 3); + assert_eq!(registers.get(Register::D), 4); + assert_eq!(registers.get(Register::E), 5); + assert_eq!(registers.get(Register::F), 6); + assert_eq!(registers.get(Register::H), 7); + assert_eq!(registers.get(Register::L), 8); + } + + #[test] + fn get_16() { + let mut registers = Registers::new(); + registers.set_af(0x0102); + registers.set_bc(0x0304); + registers.set_de(0x0506); + registers.set_hl(0x0708); + registers.sp.set(0x090A); + + assert_eq!(registers.get_16(Register::AF), 0x0102); + assert_eq!(registers.get_16(Register::BC), 0x0304); + assert_eq!(registers.get_16(Register::DE), 0x0506); + assert_eq!(registers.get_16(Register::HL), 0x0708); + assert_eq!(registers.get_16(Register::SP), 0x090A); + } + + #[test] + fn set() { + let mut registers = Registers::new(); + registers.set(Register::A, 1); + registers.set(Register::B, 2); + registers.set(Register::C, 3); + registers.set(Register::D, 4); + registers.set(Register::E, 5); + registers.set(Register::F, 6); + registers.set(Register::H, 7); + registers.set(Register::L, 8); + + assert_eq!(registers.a, 1); + assert_eq!(registers.b, 2); + assert_eq!(registers.c, 3); + assert_eq!(registers.d, 4); + assert_eq!(registers.e, 5); + assert_eq!(registers.f.get(), 6); + assert_eq!(registers.h, 7); + assert_eq!(registers.l, 8); + } + + #[test] + fn set_16() { + let mut registers = Registers::new(); + registers.set_16(Register::AF, 0x0102); + registers.set_16(Register::BC, 0x0304); + registers.set_16(Register::DE, 0x0506); + registers.set_16(Register::HL, 0x0708); + registers.set_16(Register::SP, 0x090A); + + assert_eq!(registers.get_af(), 0x0102); + assert_eq!(registers.get_bc(), 0x0304); + assert_eq!(registers.get_de(), 0x0506); + assert_eq!(registers.get_hl(), 0x0708); + assert_eq!(registers.sp.get(), 0x090A); } } diff --git a/gameboy-lib/src/cpu/registers/register.rs b/gameboy-lib/src/cpu/registers/register.rs deleted file mode 100644 index 72f16c9..0000000 --- a/gameboy-lib/src/cpu/registers/register.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub trait Register { - fn get(&self) -> T; - fn set(&mut self, value: T); -} - diff --git a/gameboy-lib/src/cpu/registers/register_8bit.rs b/gameboy-lib/src/cpu/registers/register_8bit.rs deleted file mode 100644 index cae9a93..0000000 --- a/gameboy-lib/src/cpu/registers/register_8bit.rs +++ /dev/null @@ -1,30 +0,0 @@ -use serde_derive::Serialize; -use super::register::Register; - -#[derive(Clone)] -#[cfg_attr(feature = "serialize", derive(Serialize))] -pub struct Register8Bit { - name: String, - value: u8, -} - -impl Register for Register8Bit { - fn get(&self) -> u8 { - println!("[REG {}] Reading value: 0x{:x}", self.name, self.value); - return self.value; - } - - fn set(&mut self, value: u8) { - println!("[REG {}] Writing value: 0x{:x}", self.name, value); - self.value = value; - } -} - -impl Register8Bit { - pub fn new(name: &str) -> Self { - return Register8Bit { - name: String::from(name), - value: 0x0, - }; - } -} \ No newline at end of file diff --git a/gameboy-lib/src/cpu/registers/stack_pointer.rs b/gameboy-lib/src/cpu/registers/stack_pointer.rs index d5e1011..b3f241d 100644 --- a/gameboy-lib/src/cpu/registers/stack_pointer.rs +++ b/gameboy-lib/src/cpu/registers/stack_pointer.rs @@ -1,32 +1,39 @@ -use serde_derive::Serialize; -use super::Register; -#[derive(Clone)] -#[cfg_attr(feature = "serialize", derive(Serialize))] pub struct StackPointer { - name: String, - value: u16 + pub value: u16, } -impl Register for StackPointer { +impl StackPointer { + pub fn new() -> StackPointer { + StackPointer { + value: 0, + } + } - fn get(&self) -> u16 { - println!("[REG {}] Reading value: 0x{:x}", self.name, self.value); - return self.value; + pub fn get(&self) -> u16 { + self.value } - fn set(&mut self, value: u16) { - println!("[REG {}] Writing value: 0x{:x}", self.name, value); + pub fn set(&mut self, value: u16) { self.value = value; } } -impl StackPointer { +#[cfg(test)] +mod tests { + use super::*; - pub fn new(name: &str) -> Self { - StackPointer { - name: String::from(name), - value: 0x0 - } + #[test] + fn test_get() { + let mut stack_pointer = StackPointer::new(); + stack_pointer.value = 0x1234; + assert_eq!(stack_pointer.get(), 0x1234); } -} \ No newline at end of file + + #[test] + fn test_set() { + let mut stack_pointer = StackPointer::new(); + stack_pointer.set(0x1234); + assert_eq!(stack_pointer.value, 0x1234); + } +} diff --git a/gameboy-lib/src/lib.rs b/gameboy-lib/src/lib.rs index 443c1d4..1dacb6f 100644 --- a/gameboy-lib/src/lib.rs +++ b/gameboy-lib/src/lib.rs @@ -1,26 +1,26 @@ -use crate::cpu::cpu::CPU; - pub mod cpu; pub mod memory; -pub struct GameBoy { - pub cpu: CPU, +pub struct Gameboy { + cpu: cpu::Cpu, boot_rom: Vec, - //game_rom: Vec } -impl GameBoy { - pub fn new() -> Self { - GameBoy { - cpu: CPU::default(), - boot_rom: Vec::new(), +impl Gameboy { + pub fn new(boot_rom: Vec) -> Gameboy { + Gameboy { + cpu: cpu::Cpu::new(), + boot_rom, } } - pub fn start_gameboy(&mut self, boot_rom: Vec) { - self.cpu.boot(boot_rom); - loop { - self.cpu.step(); - } + pub fn start(&mut self) { + println!("Starting Gameboy"); + self.cpu.boot(self.boot_rom.clone()); } } + +#[cfg(test)] +mod tests { + +} diff --git a/gameboy-lib/src/memory.rs b/gameboy-lib/src/memory.rs index 2a403fe..7a6e038 100644 --- a/gameboy-lib/src/memory.rs +++ b/gameboy-lib/src/memory.rs @@ -1,44 +1,246 @@ -use serde_derive::Serialize; +pub const ROM_BANK_0_BEGIN: usize = 0x0000; +pub const ROM_BANK_0_END: usize = 0x3FFF; +pub const ROM_BANK_0_SIZE: usize = ROM_BANK_0_END - ROM_BANK_0_BEGIN + 1; -pub const BOOT_ROM_BEGIN: usize = 0x00; -pub const BOOT_ROM_END: usize = 0xFF; -pub const BOOT_ROM_SIZE: usize = BOOT_ROM_END - BOOT_ROM_BEGIN + 1; +pub const ROM_BANK_N_BEGIN: usize = 0x4000; +pub const ROM_BANK_N_END: usize = 0x7FFF; +pub const ROM_BANK_N_SIZE: usize = ROM_BANK_N_END - ROM_BANK_N_BEGIN + 1; +pub const VRAM_BEGIN: usize = 0x8000; +pub const VRAM_END: usize = 0x9FFF; +pub const VRAM_SIZE: usize = VRAM_END - VRAM_BEGIN + 1; + +pub const EXTERNAL_RAM_BEGIN: usize = 0xA000; +pub const EXTERNAL_RAM_END: usize = 0xBFFF; +pub const EXTERNAL_RAM_SIZE: usize = EXTERNAL_RAM_END - EXTERNAL_RAM_BEGIN + 1; + +pub const WORKING_RAM_BEGIN: usize = 0xC000; +pub const WORKING_RAM_END: usize = 0xDFFF; +pub const WORKING_RAM_SIZE: usize = WORKING_RAM_END - WORKING_RAM_BEGIN + 1; + +pub const ECHO_RAM_BEGIN: usize = 0xE000; +pub const ECHO_RAM_END: usize = 0xFDFF; +pub const ECHO_RAM_SIZE: usize = ECHO_RAM_END - ECHO_RAM_BEGIN + 1; + +pub const OAM_BEGIN: usize = 0xFE00; +pub const OAM_END: usize = 0xFE9F; +pub const OAM_SIZE: usize = OAM_END - OAM_BEGIN + 1; + +pub const UNUSED_BEGIN: usize = 0xFEA0; +pub const UNUSED_END: usize = 0xFEFF; +pub const UNUSED_SIZE: usize = UNUSED_END - UNUSED_BEGIN + 1; + +pub const IO_REGISTERS_BEGIN: usize = 0xFF00; +pub const IO_REGISTERS_END: usize = 0xFF7F; +pub const IO_REGISTERS_SIZE: usize = IO_REGISTERS_END - IO_REGISTERS_BEGIN + 1; + +pub const HIGH_RAM_BEGIN: usize = 0xFF80; +pub const HIGH_RAM_END: usize = 0xFFFE; +pub const HIGH_RAM_SIZE: usize = HIGH_RAM_END - HIGH_RAM_BEGIN + 1; + +pub const INTERRUPT_ENABLE_REGISTER: usize = 0xFFFF; -#[derive(Clone)] -#[cfg_attr(feature = "serialize", derive(Serialize))] pub struct Memory { - pub memory: Vec, + rom_bank_0: [u8; ROM_BANK_0_SIZE], + rom_bank_n: [u8; ROM_BANK_N_SIZE], + vram: [u8; VRAM_SIZE], + external_ram: [u8; EXTERNAL_RAM_SIZE], + working_ram: [u8; WORKING_RAM_SIZE], + echo_ram: [u8; ECHO_RAM_SIZE], + oam: [u8; OAM_SIZE], + unused: [u8; UNUSED_SIZE], + io_registers: [u8; IO_REGISTERS_SIZE], + high_ram: [u8; HIGH_RAM_SIZE], + interrupt_enable_register: u8, } - -impl Default for Memory { - fn default() -> Self { +impl Memory { + pub fn new() -> Memory { Memory { - memory: vec![0; 0xFFFF], + rom_bank_0: [0; ROM_BANK_0_SIZE], + rom_bank_n: [0; ROM_BANK_N_SIZE], + vram: [0; VRAM_SIZE], + external_ram: [0; EXTERNAL_RAM_SIZE], + working_ram: [0; WORKING_RAM_SIZE], + echo_ram: [0; ECHO_RAM_SIZE], + oam: [0; OAM_SIZE], + unused: [0; UNUSED_SIZE], + io_registers: [0; IO_REGISTERS_SIZE], + high_ram: [0; HIGH_RAM_SIZE], + interrupt_enable_register: 0, } } -} -impl Memory { - pub fn boot(&mut self, boot_room: Vec) { - for (idx, value) in boot_room.iter().enumerate() { - self.write_byte(idx as u16, value.clone()); + pub fn read(&self, address: u16) -> u8 { + println!("[MEM] Reading from memory address: 0x{:X}", address); + let address = address as usize; + match address as usize { + ROM_BANK_0_BEGIN..=ROM_BANK_0_END => self.rom_bank_0[address - ROM_BANK_0_BEGIN], + ROM_BANK_N_BEGIN..=ROM_BANK_N_END => self.rom_bank_n[address - ROM_BANK_N_BEGIN], + VRAM_BEGIN..=VRAM_END => self.vram[address - VRAM_BEGIN], + EXTERNAL_RAM_BEGIN..=EXTERNAL_RAM_END => self.external_ram[address - EXTERNAL_RAM_BEGIN], + WORKING_RAM_BEGIN..=WORKING_RAM_END => self.working_ram[address - WORKING_RAM_BEGIN], + ECHO_RAM_BEGIN..=ECHO_RAM_END => self.echo_ram[address - ECHO_RAM_BEGIN], + OAM_BEGIN..=OAM_END => self.oam[address - OAM_BEGIN], + UNUSED_BEGIN..=UNUSED_END => self.unused[address - UNUSED_BEGIN], + IO_REGISTERS_BEGIN..=IO_REGISTERS_END => self.io_registers[address - IO_REGISTERS_BEGIN], + HIGH_RAM_BEGIN..=HIGH_RAM_END => self.high_ram[address - HIGH_RAM_BEGIN], + INTERRUPT_ENABLE_REGISTER => self.interrupt_enable_register, + _ => panic!("Invalid memory address: 0x{:X}", address), + } + } + + pub fn write(&mut self, address: u16, value: u8) { + println!("[MEM] Writing to memory address: 0x{:X} value: 0x{:X}", address, value); + let address = address as usize; + match address { + ROM_BANK_0_BEGIN..=ROM_BANK_0_END => self.rom_bank_0[address - ROM_BANK_0_BEGIN] = value, + ROM_BANK_N_BEGIN..=ROM_BANK_N_END => self.rom_bank_n[address - ROM_BANK_N_BEGIN] = value, + VRAM_BEGIN..=VRAM_END => self.vram[address - VRAM_BEGIN] = value, + EXTERNAL_RAM_BEGIN..=EXTERNAL_RAM_END => self.external_ram[address - EXTERNAL_RAM_BEGIN] = value, + WORKING_RAM_BEGIN..=WORKING_RAM_END => self.working_ram[address - WORKING_RAM_BEGIN] = value, + ECHO_RAM_BEGIN..=ECHO_RAM_END => self.echo_ram[address - ECHO_RAM_BEGIN] = value, + OAM_BEGIN..=OAM_END => self.oam[address - OAM_BEGIN] = value, + UNUSED_BEGIN..=UNUSED_END => self.unused[address - UNUSED_BEGIN] = value, + IO_REGISTERS_BEGIN..=IO_REGISTERS_END => self.io_registers[address - IO_REGISTERS_BEGIN] = value, + HIGH_RAM_BEGIN..=HIGH_RAM_END => self.high_ram[address - HIGH_RAM_BEGIN] = value, + INTERRUPT_ENABLE_REGISTER => self.interrupt_enable_register = value, + _ => panic!("Invalid memory address: 0x{:X}", address), } } - pub fn write_byte(&mut self, address: u16, value: u8) { - // println!("[MEM] Writing memory: address: 0x{:x} value: 0x{:x}", address, value); - self.memory[address as usize] = value; + pub fn write_vec(&mut self, start_address: u16, data: Vec) { + for (i, byte) in data.iter().enumerate() { + self.write(start_address + i as u16, *byte); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_read_byte() { + let memory = Memory::new(); + assert_eq!(memory.read(0x0000), 0); + } + + #[test] + fn test_write_byte() { + let mut memory = Memory::new(); + memory.write(0x0000, 0x01); + assert_eq!(memory.read(0x0000), 0x01); + } + + #[test] + fn test_read_write_boot_rom() { + let mut memory = Memory::new(); + memory.write(0x0000, 0x01); + assert_eq!(memory.read(0x0000), 0x01); + } + + #[test] + fn test_read_write_rom_bank_0() { + let mut memory = Memory::new(); + memory.write(0x0000, 0x01); + assert_eq!(memory.read(0x0000), 0x01); + } + + #[test] + fn test_read_write_rom_bank_n() { + let mut memory = Memory::new(); + memory.write(0x4000, 0x01); + assert_eq!(memory.read(0x4000), 0x01); + } + + #[test] + fn test_read_write_vram() { + let mut memory = Memory::new(); + memory.write(0x8000, 0x01); + assert_eq!(memory.read(0x8000), 0x01); + } + + #[test] + fn test_read_write_external_ram() { + let mut memory = Memory::new(); + memory.write(0xA000, 0x01); + assert_eq!(memory.read(0xA000), 0x01); + } + + #[test] + fn test_read_write_working_ram() { + let mut memory = Memory::new(); + memory.write(0xC000, 0x01); + assert_eq!(memory.read(0xC000), 0x01); + } + + #[test] + fn test_read_write_echo_ram() { + let mut memory = Memory::new(); + memory.write(0xE000, 0x01); + assert_eq!(memory.read(0xE000), 0x01); + } + + #[test] + fn test_read_write_oam() { + let mut memory = Memory::new(); + memory.write(0xFE00, 0x01); + assert_eq!(memory.read(0xFE00), 0x01); + } + + #[test] + fn test_read_write_unused() { + let mut memory = Memory::new(); + memory.write(0xFEA0, 0x01); + assert_eq!(memory.read(0xFEA0), 0x01); + } + + #[test] + fn test_read_write_io_registers() { + let mut memory = Memory::new(); + memory.write(0xFF00, 0x01); + assert_eq!(memory.read(0xFF00), 0x01); + } + + #[test] + fn test_read_write_high_ram() { + let mut memory = Memory::new(); + memory.write(0xFF80, 0x01); + assert_eq!(memory.read(0xFF80), 0x01); } - pub fn read_byte(&self, address: u16) -> u8 { - let mem_value = self.memory[address as usize]; - // println!("[MEM] Reading memory: address: 0x{:x} value: 0x{:x}", address, mem_value); - return mem_value; + #[test] + fn test_read_write_interrupt_enable_register() { + let mut memory = Memory::new(); + memory.write(0xFFFF, 0x01); + assert_eq!(memory.read(0xFFFF), 0x01); } - pub fn read_next_word(&self, pc: u16) -> u16 { - ((self.read_byte(pc + 2) as u16) << 8) | (self.read_byte(pc + 1) as u16) + #[test] + fn test_read_write_multiple() { + let mut memory = Memory::new(); + memory.write(0x0000, 0x01); + memory.write(0x4000, 0x02); + memory.write(0x8000, 0x03); + memory.write(0xA000, 0x04); + memory.write(0xC000, 0x05); + memory.write(0xE000, 0x06); + memory.write(0xFE00, 0x07); + memory.write(0xFEA0, 0x08); + memory.write(0xFF00, 0x09); + memory.write(0xFF80, 0x0A); + memory.write(0xFFFF, 0x0B); + assert_eq!(memory.read(0x0000), 0x01); + assert_eq!(memory.read(0x4000), 0x02); + assert_eq!(memory.read(0x8000), 0x03); + assert_eq!(memory.read(0xA000), 0x04); + assert_eq!(memory.read(0xC000), 0x05); + assert_eq!(memory.read(0xE000), 0x06); + assert_eq!(memory.read(0xFE00), 0x07); + assert_eq!(memory.read(0xFEA0), 0x08); + assert_eq!(memory.read(0xFF00), 0x09); + assert_eq!(memory.read(0xFF80), 0x0A); + assert_eq!(memory.read(0xFFFF), 0x0B); } } diff --git a/gameboy-web.iml b/gameboy-web.iml deleted file mode 100644 index 961c6e2..0000000 --- a/gameboy-web.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/gameboy-web/.eslintrc.cjs b/gameboy-web/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/gameboy-web/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/gameboy-web/.gitignore b/gameboy-web/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/gameboy-web/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/gameboy-web/.rsw/rsw.crates b/gameboy-web/.rsw/rsw.crates deleted file mode 100644 index 786a484..0000000 --- a/gameboy-web/.rsw/rsw.crates +++ /dev/null @@ -1 +0,0 @@ -gameboy-wasm :~> gameboy-wasm/pkg \ No newline at end of file diff --git a/gameboy-web/.rsw/rsw.err b/gameboy-web/.rsw/rsw.err deleted file mode 100644 index e69de29..0000000 diff --git a/gameboy-web/.rsw/rsw.info b/gameboy-web/.rsw/rsw.info deleted file mode 100644 index b334884..0000000 --- a/gameboy-web/.rsw/rsw.info +++ /dev/null @@ -1,3 +0,0 @@ -[RSW::OK] -[RSW::NAME] :~> gameboy-wasm -[RSW::PATH] :~> /mnt/datahub/projects/emulation/gameboy/gameboy-web/./gameboy-wasm/src/lib.rs \ No newline at end of file diff --git a/gameboy-web/README.md b/gameboy-web/README.md deleted file mode 100644 index 0d6babe..0000000 --- a/gameboy-web/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# React + TypeScript + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: - -- Configure the top-level `parserOptions` property like this: - -```js -export default { - // other rules... - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - project: ['./tsconfig.json', './tsconfig.node.json'], - tsconfigRootDir: __dirname, - }, -} -``` - -- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` -- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` -- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/gameboy-web/gameboy-wasm/.appveyor.yml b/gameboy-web/gameboy-wasm/.appveyor.yml deleted file mode 100644 index 50910bd..0000000 --- a/gameboy-web/gameboy-wasm/.appveyor.yml +++ /dev/null @@ -1,11 +0,0 @@ -install: - - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe - - if not defined RUSTFLAGS rustup-init.exe -y --default-host x86_64-pc-windows-msvc --default-toolchain nightly - - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin - - rustc -V - - cargo -V - -build: false - -test_script: - - cargo test --locked diff --git a/gameboy-web/gameboy-wasm/.github/dependabot.yml b/gameboy-web/gameboy-wasm/.github/dependabot.yml deleted file mode 100644 index 7377d37..0000000 --- a/gameboy-web/gameboy-wasm/.github/dependabot.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: 2 -updates: -- package-ecosystem: cargo - directory: "/" - schedule: - interval: daily - time: "08:00" - open-pull-requests-limit: 10 diff --git a/gameboy-web/gameboy-wasm/.gitignore b/gameboy-web/gameboy-wasm/.gitignore deleted file mode 100644 index 4e30131..0000000 --- a/gameboy-web/gameboy-wasm/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/target -**/*.rs.bk -Cargo.lock -bin/ -pkg/ -wasm-pack.log diff --git a/gameboy-web/gameboy-wasm/.travis.yml b/gameboy-web/gameboy-wasm/.travis.yml deleted file mode 100644 index 7a91325..0000000 --- a/gameboy-web/gameboy-wasm/.travis.yml +++ /dev/null @@ -1,69 +0,0 @@ -language: rust -sudo: false - -cache: cargo - -matrix: - include: - - # Builds with wasm-pack. - - rust: beta - env: RUST_BACKTRACE=1 - addons: - firefox: latest - chrome: stable - before_script: - - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) - - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) - - cargo install-update -a - - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f - script: - - cargo generate --git . --name testing - # Having a broken Cargo.toml (in that it has curlies in fields) anywhere - # in any of our parent dirs is problematic. - - mv Cargo.toml Cargo.toml.tmpl - - cd testing - - wasm-pack build - - wasm-pack test --chrome --firefox --headless - - # Builds on nightly. - - rust: nightly - env: RUST_BACKTRACE=1 - before_script: - - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) - - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) - - cargo install-update -a - - rustup target add wasm32-unknown-unknown - script: - - cargo generate --git . --name testing - - mv Cargo.toml Cargo.toml.tmpl - - cd testing - - cargo check - - cargo check --target wasm32-unknown-unknown - - cargo check --no-default-features - - cargo check --target wasm32-unknown-unknown --no-default-features - - cargo check --no-default-features --features console_error_panic_hook - - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook - - cargo check --no-default-features --features "console_error_panic_hook wee_alloc" - - cargo check --target wasm32-unknown-unknown --no-default-features --features "console_error_panic_hook wee_alloc" - - # Builds on beta. - - rust: beta - env: RUST_BACKTRACE=1 - before_script: - - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) - - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) - - cargo install-update -a - - rustup target add wasm32-unknown-unknown - script: - - cargo generate --git . --name testing - - mv Cargo.toml Cargo.toml.tmpl - - cd testing - - cargo check - - cargo check --target wasm32-unknown-unknown - - cargo check --no-default-features - - cargo check --target wasm32-unknown-unknown --no-default-features - - cargo check --no-default-features --features console_error_panic_hook - - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook - # Note: no enabling the `wee_alloc` feature here because it requires - # nightly for now. diff --git a/gameboy-web/gameboy-wasm/Cargo.toml b/gameboy-web/gameboy-wasm/Cargo.toml deleted file mode 100644 index f2818ab..0000000 --- a/gameboy-web/gameboy-wasm/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "gameboy-wasm" -version = "0.1.0" -authors = ["Cedrik Hoffmann "] -edition = "2018" - -[lib] -crate-type = ["cdylib", "rlib"] - -[features] -default = ["console_error_panic_hook"] - -[dependencies] -gameboy = { path = "../../gameboy-lib", features = ["wasm", "serialize"] } -wasm-bindgen = { version = "0.2.84", features = ["serde-serialize"] } -console_error_panic_hook = { version = "0.1.7", optional = true } -log = "0.4.20" -serde = "1.0.194" -serde_derive = "1.0.194" -serde-wasm-bindgen = "0.6.3" - -[dev-dependencies] -wasm-bindgen-test = "0.3.34" - -[profile.release] -# Tell `rustc` to optimize for small code size. -opt-level = "s" diff --git a/gameboy-web/gameboy-wasm/LICENSE_APACHE b/gameboy-web/gameboy-wasm/LICENSE_APACHE deleted file mode 100644 index 11069ed..0000000 --- a/gameboy-web/gameboy-wasm/LICENSE_APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/gameboy-web/gameboy-wasm/LICENSE_MIT b/gameboy-web/gameboy-wasm/LICENSE_MIT deleted file mode 100644 index 3adab75..0000000 --- a/gameboy-web/gameboy-wasm/LICENSE_MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2018 Cedrik Hoffmann - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/gameboy-web/gameboy-wasm/README.md b/gameboy-web/gameboy-wasm/README.md deleted file mode 100644 index 6b68408..0000000 --- a/gameboy-web/gameboy-wasm/README.md +++ /dev/null @@ -1,84 +0,0 @@ -
- -

wasm-pack-template

- - A template for kick starting a Rust and WebAssembly project using wasm-pack. - -

- Build Status -

- -

- Tutorial - | - Chat -

- - Built with 🦀🕸 by The Rust and WebAssembly Working Group -
- -## About - -[**📚 Read this template tutorial! 📚**][template-docs] - -This template is designed for compiling Rust libraries into WebAssembly and -publishing the resulting package to NPM. - -Be sure to check out [other `wasm-pack` tutorials online][tutorials] for other -templates and usages of `wasm-pack`. - -[tutorials]: https://rustwasm.github.io/docs/wasm-pack/tutorials/index.html -[template-docs]: https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html - -## 🚴 Usage - -### 🐑 Use `cargo generate` to Clone this Template - -[Learn more about `cargo generate` here.](https://github.com/ashleygwilliams/cargo-generate) - -``` -cargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project -cd my-project -``` - -### 🛠️ Build with `wasm-pack build` - -``` -wasm-pack build -``` - -### 🔬 Test in Headless Browsers with `wasm-pack test` - -``` -wasm-pack test --headless --firefox -``` - -### 🎁 Publish to NPM with `wasm-pack publish` - -``` -wasm-pack publish -``` - -## 🔋 Batteries Included - -* [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen) for communicating - between WebAssembly and JavaScript. -* [`console_error_panic_hook`](https://github.com/rustwasm/console_error_panic_hook) - for logging panic messages to the developer console. -* `LICENSE-APACHE` and `LICENSE-MIT`: most Rust projects are licensed this way, so these are included for you - -## License - -Licensed under either of - -* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) -* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally -submitted for inclusion in the work by you, as defined in the Apache-2.0 -license, shall be dual licensed as above, without any additional terms or -conditions. diff --git a/gameboy-web/gameboy-wasm/src/lib.rs b/gameboy-web/gameboy-wasm/src/lib.rs deleted file mode 100644 index eb2fcec..0000000 --- a/gameboy-web/gameboy-wasm/src/lib.rs +++ /dev/null @@ -1,41 +0,0 @@ -mod utils; - -use std::ops::Deref; -use serde_derive::Serialize; -use wasm_bindgen::prelude::*; - -#[wasm_bindgen] -extern "C" { - fn alert(s: &str); - #[wasm_bindgen(js_namespace = console)] - fn log(s: &str); -} - -#[wasm_bindgen] -#[derive(Serialize)] -pub struct CPU(gameboy::cpu::cpu::CPU); - -#[wasm_bindgen] -impl CPU { - #[wasm_bindgen(constructor)] - pub fn new() -> CPU { - utils::set_panic_hook(); - let cpu = gameboy::cpu::cpu::CPU::default(); - return CPU(cpu); - } - - pub fn to_json(&self) -> Result { - Ok(serde_wasm_bindgen::to_value(&self)?) - } -} - -#[wasm_bindgen] -pub fn load_boot_rom() -> Vec { - let boot_rom = "31FEFFAF21FF9F32CB7C20FB2126FF0E113E8032E20C3EF3E2323E77773EFCE0471104012110801ACD9500CD9600137BFE3420F311D80006081A1322230520F93E19EA1099212F990E0C3D2808320D20F92E0F18F3673E6457E0423E91E040041E020E0CF044FE9020FA0D20F71D20F20E13247C1E83FE6228061EC1FE6420067BE20C3E87E2F04290E0421520D205204F162018CB4F0604C5CB1117C1CB11170520F522232223C9CEED6666CC0D000B03730083000C000D0008111F8889000EDCCC6EE6DDDDD999BBBB67636E0EECCCDDDC999FBBB9333E3C42B9A5B9A5423C21040111A8001A13BE20FE237DFE3420F506197886230520FB8620FE3E01E050"; - boot_rom.chars() - .collect::>() - .chunks(2) - .map(|c| c.iter().collect::()) - .map(|s| u8::from_str_radix(s.as_str(), 16).unwrap()) - .collect() -} diff --git a/gameboy-web/gameboy-wasm/src/utils.rs b/gameboy-web/gameboy-wasm/src/utils.rs deleted file mode 100644 index b1d7929..0000000 --- a/gameboy-web/gameboy-wasm/src/utils.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub fn set_panic_hook() { - // When the `console_error_panic_hook` feature is enabled, we can call the - // `set_panic_hook` function at least once during initialization, and then - // we will get better error messages if our code ever panics. - // - // For more details see - // https://github.com/rustwasm/console_error_panic_hook#readme - #[cfg(feature = "console_error_panic_hook")] - console_error_panic_hook::set_once(); -} diff --git a/gameboy-web/gameboy-wasm/tests/web.rs b/gameboy-web/gameboy-wasm/tests/web.rs deleted file mode 100644 index de5c1da..0000000 --- a/gameboy-web/gameboy-wasm/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/gameboy-web/index.html b/gameboy-web/index.html deleted file mode 100644 index 0931ec5..0000000 --- a/gameboy-web/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React + TS - - -
- - - diff --git a/gameboy-web/package.json b/gameboy-web/package.json deleted file mode 100644 index a1177ea..0000000 --- a/gameboy-web/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "gameboy-frontend", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "concurrently \"rsw watch\" \"vite\"", - "wasm": "wasm-pack build ./gameboy-wasm --target web", - "build": "rsw build && tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview", - "rsw": "rsw" - }, - "dependencies": { - "@emotion/react": "^11.11.3", - "@emotion/styled": "^11.11.0", - "@fontsource/roboto": "^5.0.8", - "@mui/icons-material": "^5.15.2", - "@mui/material": "^5.15.2", - "@mui/styled-engine-sc": "^6.0.0-alpha.10", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "styled-components": "^6.1.6" - }, - "devDependencies": { - "@types/node": "^20.10.6", - "@types/react": "^18.2.43", - "@types/react-dom": "^18.2.17", - "@typescript-eslint/eslint-plugin": "^6.14.0", - "@typescript-eslint/parser": "^6.14.0", - "@vitejs/plugin-react": "^4.2.1", - "concurrently": "^8.2.2", - "eslint": "^8.55.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.5", - "typescript": "^5.2.2", - "vite": "^5.0.10", - "vite-plugin-rsw": "^2.0.11" - } -} diff --git a/gameboy-web/public/vite.svg b/gameboy-web/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/gameboy-web/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/gameboy-web/rsw.toml b/gameboy-web/rsw.toml deleted file mode 100644 index 8fa67c0..0000000 --- a/gameboy-web/rsw.toml +++ /dev/null @@ -1,17 +0,0 @@ -name = "rsw" -version = "0.1.0" - -#! time interval for file changes to trigger wasm-pack build, default `50` milliseconds -interval = 50 - -#! link -#! npm link @see https://docs.npmjs.com/cli/v8/commands/npm-link -#! yarn link @see https://classic.yarnpkg.com/en/docs/cli/link -#! pnpm link @see https://pnpm.io/cli/link -#! The link command will only be executed if `[[crates]] link = true` -#! cli: `npm` | `yarn` | `pnpm`, default is `npm` -cli = "yarn" - -[[crates]] -name = "gameboy-wasm" -link = true \ No newline at end of file diff --git a/gameboy-web/src/App.tsx b/gameboy-web/src/App.tsx deleted file mode 100644 index b8e223e..0000000 --- a/gameboy-web/src/App.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import {useEffect, useState} from "react"; -import init, {CPU} from "gameboy-wasm"; -import {Box, CircularProgress, Container} from "@mui/material"; -import ControlCenter from "./components/ControlCenter.tsx"; - - -function App() { - const [ready, setReady] = useState(false) - - useEffect(() => { - init().then(() => setReady(true)) - }, []) - - const handlePlay = () => { - const cpu = new CPU(); - const cpuAsJson = cpu.to_json(); - const memory = cpuAsJson.memory; - const register = cpuAsJson.register; - console.log("CPU", cpuAsJson) - console.log("Registers", register) - console.log("Memory", memory) - } - - const LoadingCircle = () => { - return ( - - - - ) - } - - const OnReady = () => { - return ( - <> - - - ) - } - - return ( - - {ready ? : } - - ) -} - -export default App diff --git a/gameboy-web/src/components/ControlCenter.tsx b/gameboy-web/src/components/ControlCenter.tsx deleted file mode 100644 index 30995ed..0000000 --- a/gameboy-web/src/components/ControlCenter.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import {ToggleButton, ToggleButtonGroup} from "@mui/material"; -import {BugReport, PlayArrow, SkipNext} from "@mui/icons-material"; - -export interface ControlCenterProps { - onPlay: () => void -} - -const ControlCenter = (props: ControlCenterProps) => { - return ( - <> - - props.onPlay()}> - - - - - - - - - - - ) -} - -export default ControlCenter \ No newline at end of file diff --git a/gameboy-web/src/main.tsx b/gameboy-web/src/main.tsx deleted file mode 100644 index e63eef4..0000000 --- a/gameboy-web/src/main.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - , -) diff --git a/gameboy-web/src/vite-env.d.ts b/gameboy-web/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/gameboy-web/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/gameboy-web/tsconfig.json b/gameboy-web/tsconfig.json deleted file mode 100644 index a7fc6fb..0000000 --- a/gameboy-web/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/gameboy-web/tsconfig.node.json b/gameboy-web/tsconfig.node.json deleted file mode 100644 index 42872c5..0000000 --- a/gameboy-web/tsconfig.node.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/gameboy-web/vite.config.ts b/gameboy-web/vite.config.ts deleted file mode 100644 index 3b3d961..0000000 --- a/gameboy-web/vite.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {defineConfig} from 'vite' -import react from '@vitejs/plugin-react' -import { ViteRsw } from 'vite-plugin-rsw'; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - ViteRsw(), - react(), - ], -}) diff --git a/gameboy-web/yarn.lock b/gameboy-web/yarn.lock deleted file mode 100644 index 2d6b299..0000000 --- a/gameboy-web/yarn.lock +++ /dev/null @@ -1,2325 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== - -"@babel/core@^7.23.5": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" - integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.7" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== - dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.7.tgz#eb543c36f81da2873e47b76ee032343ac83bba60" - integrity sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" - integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== - -"@babel/plugin-transform-react-jsx-self@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz#ed3e7dadde046cce761a8e3cf003a13d1a7972d9" - integrity sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-jsx-source@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz#03527006bdc8775247a78643c51d4e715fe39a3e" - integrity sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193" - integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" - integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" - integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@emotion/babel-plugin@^11.11.0": - version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" - integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/serialize" "^1.1.2" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.2.0" - -"@emotion/cache@^11.11.0": - version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" - integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== - dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - stylis "4.2.0" - -"@emotion/hash@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" - integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== - -"@emotion/is-prop-valid@1.2.1", "@emotion/is-prop-valid@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/react@^11.11.3": - version "11.11.3" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.3.tgz#96b855dc40a2a55f52a72f518a41db4f69c31a25" - integrity sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/cache" "^11.11.0" - "@emotion/serialize" "^1.1.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.3.tgz#84b77bfcfe3b7bb47d326602f640ccfcacd5ffb0" - integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== - dependencies: - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/unitless" "^0.8.1" - "@emotion/utils" "^1.2.1" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" - integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== - -"@emotion/styled@^11.11.0": - version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" - integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/is-prop-valid" "^1.2.1" - "@emotion/serialize" "^1.1.2" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - -"@emotion/unitless@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== - -"@emotion/unitless@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" - integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== - -"@emotion/utils@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" - integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== - -"@emotion/weak-memoize@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" - integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== - -"@esbuild/aix-ppc64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" - integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== - -"@esbuild/android-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" - integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== - -"@esbuild/android-arm@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" - integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== - -"@esbuild/android-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" - integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== - -"@esbuild/darwin-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" - integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== - -"@esbuild/darwin-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" - integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== - -"@esbuild/freebsd-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" - integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== - -"@esbuild/freebsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" - integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== - -"@esbuild/linux-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" - integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== - -"@esbuild/linux-arm@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" - integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== - -"@esbuild/linux-ia32@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" - integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== - -"@esbuild/linux-loong64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" - integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== - -"@esbuild/linux-mips64el@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" - integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== - -"@esbuild/linux-ppc64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" - integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== - -"@esbuild/linux-riscv64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" - integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== - -"@esbuild/linux-s390x@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" - integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== - -"@esbuild/linux-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" - integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== - -"@esbuild/netbsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" - integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== - -"@esbuild/openbsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" - integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== - -"@esbuild/sunos-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" - integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== - -"@esbuild/win32-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" - integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== - -"@esbuild/win32-ia32@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" - integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== - -"@esbuild/win32-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" - integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== - -"@floating-ui/core@^1.4.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.2.tgz#53a0f7a98c550e63134d504f26804f6b83dbc071" - integrity sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A== - dependencies: - "@floating-ui/utils" "^0.1.3" - -"@floating-ui/dom@^1.5.1": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" - integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== - dependencies: - "@floating-ui/core" "^1.4.2" - "@floating-ui/utils" "^0.1.3" - -"@floating-ui/react-dom@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.4.tgz#b076fafbdfeb881e1d86ae748b7ff95150e9f3ec" - integrity sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ== - dependencies: - "@floating-ui/dom" "^1.5.1" - -"@floating-ui/utils@^0.1.3": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" - integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== - -"@fontsource/roboto@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-5.0.8.tgz#613b477a56f21b5705db1a67e995c033ef317f76" - integrity sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA== - -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== - dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@mui/base@5.0.0-beta.29": - version "5.0.0-beta.29" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.29.tgz#bc50d1dbb825c0546603ea711907a01467be014a" - integrity sha512-OXfUssYrB6ch/xpBVHMKAjThPlI9VyGGKdvQLMXef2j39wXfcxPlUVQlwia/lmE3rxWIGvbwkZsDtNYzLMsDUg== - dependencies: - "@babel/runtime" "^7.23.6" - "@floating-ui/react-dom" "^2.0.4" - "@mui/types" "^7.2.11" - "@mui/utils" "^5.15.2" - "@popperjs/core" "^2.11.8" - clsx "^2.0.0" - prop-types "^15.8.1" - -"@mui/core-downloads-tracker@^5.15.2": - version "5.15.2" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.2.tgz#eaf6f9faf7f8c4ef486693ace1237c6c7f4e3812" - integrity sha512-0vk4ckS2w1F5PmkSXSd7F/QuRlNcPqWTJ8CPl+HQRLTIhJVS/VKEI+3dQufOdKfn2wS+ecnvlvXerbugs+xZ8Q== - -"@mui/icons-material@^5.15.2": - version "5.15.2" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.15.2.tgz#d988bee4f49a9785b847a1672924b0192dcd227b" - integrity sha512-Vs0Z6cd6ieTavMjqPvIJJfwsKaCLdRSErk5LjKdZlBqk7r2SR6roDyhVTQuZOeCzjEFj0qZ4iVPp2DJZRwuYbw== - dependencies: - "@babel/runtime" "^7.23.6" - -"@mui/material@^5.15.2": - version "5.15.2" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.15.2.tgz#a98df5812f22f7af7f68092787297b86f563dbf1" - integrity sha512-JnoIrpNmEHG5uC1IyEdgsnDiaiuCZnUIh7f9oeAr87AvBmNiEJPbo7XrD7kBTFWwp+b97rQ12QdSs9CLhT2n/A== - dependencies: - "@babel/runtime" "^7.23.6" - "@mui/base" "5.0.0-beta.29" - "@mui/core-downloads-tracker" "^5.15.2" - "@mui/system" "^5.15.2" - "@mui/types" "^7.2.11" - "@mui/utils" "^5.15.2" - "@types/react-transition-group" "^4.4.10" - clsx "^2.0.0" - csstype "^3.1.2" - prop-types "^15.8.1" - react-is "^18.2.0" - react-transition-group "^4.4.5" - -"@mui/private-theming@^5.15.2": - version "5.15.2" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.15.2.tgz#8a3f1e6c800dc48d7742cfafea336e765f80085f" - integrity sha512-KlXx5TH1Mw9omSY+Q6rz5TA/P71meSYaAOeopiW8s6o433+fnOxS17rZbmd1RnDZGCo+j24TfCavQuCMBAZnQA== - dependencies: - "@babel/runtime" "^7.23.6" - "@mui/utils" "^5.15.2" - prop-types "^15.8.1" - -"@mui/styled-engine-sc@^6.0.0-alpha.10": - version "6.0.0-alpha.10" - resolved "https://registry.yarnpkg.com/@mui/styled-engine-sc/-/styled-engine-sc-6.0.0-alpha.10.tgz#e55340d7ebe8cc76305bf5b5c9b3727fe70bf500" - integrity sha512-Iz6pbEOCQfDi3nUdXMYuGYE1lPz7C5JHAZa62dRb4WLJZt9ZX1qx4ocTBHqDFbjUHEQub9eNGlyulWEyEekxsA== - dependencies: - "@babel/runtime" "^7.23.6" - csstype "^3.1.2" - hoist-non-react-statics "^3.3.2" - prop-types "^15.8.1" - -"@mui/styled-engine@^5.15.2": - version "5.15.2" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.15.2.tgz#3acf1c56275ccab9fa6028209537c49eec8397b3" - integrity sha512-fYEN3IZzbebeHwAmQHhxwruiOIi8W74709qXg/7tgtHV4byQSmPgnnKsZkg0hFlzjEbcJIRZyZI0qEecgpR2cg== - dependencies: - "@babel/runtime" "^7.23.6" - "@emotion/cache" "^11.11.0" - csstype "^3.1.2" - prop-types "^15.8.1" - -"@mui/system@^5.15.2": - version "5.15.2" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.15.2.tgz#13e618355b973729fbb39bd49dce46a7e88cbe28" - integrity sha512-I7CzLiHDtU/BTobJgSk+wPGGWG95K8lYfdFEnq//wOgSrLDAdOVvl2gleDxJWO+yAbGz4RKEOnR9KuD+xQZH4A== - dependencies: - "@babel/runtime" "^7.23.6" - "@mui/private-theming" "^5.15.2" - "@mui/styled-engine" "^5.15.2" - "@mui/types" "^7.2.11" - "@mui/utils" "^5.15.2" - clsx "^2.0.0" - csstype "^3.1.2" - prop-types "^15.8.1" - -"@mui/types@^7.2.11": - version "7.2.11" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.11.tgz#36b99a88f8010dc716128e568dc05681a69dc7ae" - integrity sha512-KWe/QTEsFFlFSH+qRYf3zoFEj3z67s+qAuSnMMg+gFwbxG7P96Hm6g300inQL1Wy///gSRb8juX7Wafvp93m3w== - -"@mui/utils@^5.15.2": - version "5.15.2" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.15.2.tgz#9c66994cf2a370baee1bd49ae408ab149280f7a6" - integrity sha512-6dGM9/guFKBlFRHA7/mbM+E7wE7CYDy9Ny4JLtD3J+NTyhi8nd8YxlzgAgTaTVqY0BpdQ2zdfB/q6+p2EdGM0w== - dependencies: - "@babel/runtime" "^7.23.6" - "@types/prop-types" "^15.7.11" - prop-types "^15.8.1" - react-is "^18.2.0" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@popperjs/core@^2.11.8": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== - -"@rollup/rollup-android-arm-eabi@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz#ccb02257556bacbc1e756ab9b0b973cea2c7a664" - integrity sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA== - -"@rollup/rollup-android-arm64@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz#21bd0fbafdf442c6a17645b840f6a94556b0e9bb" - integrity sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg== - -"@rollup/rollup-darwin-arm64@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz#9f2e5d5637677f9839dbe1622130d0592179136a" - integrity sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw== - -"@rollup/rollup-darwin-x64@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz#1b06291ff1c41af94d2786cd167188c5bf7caec9" - integrity sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz#147069948bba00f435122f411210624e72638ebf" - integrity sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ== - -"@rollup/rollup-linux-arm64-gnu@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz#3a50f0e7ae6e444d11c61fce12783196454a4efb" - integrity sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg== - -"@rollup/rollup-linux-arm64-musl@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz#82b5e75484d91c25d4e649d018d9523e72d6dac2" - integrity sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g== - -"@rollup/rollup-linux-riscv64-gnu@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz#ca96f2d43a553d73aec736e991c07010561bc7a9" - integrity sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw== - -"@rollup/rollup-linux-x64-gnu@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz#db1cece244ea46706c0e1a522ec19ca0173abc55" - integrity sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw== - -"@rollup/rollup-linux-x64-musl@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz#c15b26b86827f75977bf59ebd41ce5d788713936" - integrity sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg== - -"@rollup/rollup-win32-arm64-msvc@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz#60152948f9fb08e8c50c1555e334ca9f9f1f53aa" - integrity sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA== - -"@rollup/rollup-win32-ia32-msvc@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz#657288cff10311f997d8dbd648590441760ae6d9" - integrity sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ== - -"@rollup/rollup-win32-x64-msvc@4.9.2": - version "4.9.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz#830f3a3fba67f6216a5884368431918029045afe" - integrity sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA== - -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== - dependencies: - "@babel/types" "^7.20.7" - -"@types/json-schema@^7.0.12": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/node@^20.10.6": - version "20.10.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.6.tgz#a3ec84c22965802bf763da55b2394424f22bfbb5" - integrity sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw== - dependencies: - undici-types "~5.26.4" - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - -"@types/prop-types@*", "@types/prop-types@^15.7.11": - version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" - integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== - -"@types/react-dom@^18.2.17": - version "18.2.18" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.18.tgz#16946e6cd43971256d874bc3d0a72074bb8571dd" - integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== - dependencies: - "@types/react" "*" - -"@types/react-transition-group@^4.4.10": - version "4.4.10" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" - integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18.2.43": - version "18.2.46" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.46.tgz#f04d6c528f8f136ea66333bc66abcae46e2680df" - integrity sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== - -"@types/semver@^7.5.0": - version "7.5.6" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" - integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== - -"@types/stylis@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" - integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== - -"@typescript-eslint/eslint-plugin@^6.14.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.16.0.tgz#cc29fbd208ea976de3db7feb07755bba0ce8d8bc" - integrity sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.16.0" - "@typescript-eslint/type-utils" "6.16.0" - "@typescript-eslint/utils" "6.16.0" - "@typescript-eslint/visitor-keys" "6.16.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.4" - natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/parser@^6.14.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.16.0.tgz#36f39f63b126aa25af2ad2df13d9891e9fd5b40c" - integrity sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw== - dependencies: - "@typescript-eslint/scope-manager" "6.16.0" - "@typescript-eslint/types" "6.16.0" - "@typescript-eslint/typescript-estree" "6.16.0" - "@typescript-eslint/visitor-keys" "6.16.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.16.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz#f3e9a00fbc1d0701356359cd56489c54d9e37168" - integrity sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw== - dependencies: - "@typescript-eslint/types" "6.16.0" - "@typescript-eslint/visitor-keys" "6.16.0" - -"@typescript-eslint/type-utils@6.16.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.16.0.tgz#5f21c3e49e540ad132dc87fc99af463c184d5ed1" - integrity sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg== - dependencies: - "@typescript-eslint/typescript-estree" "6.16.0" - "@typescript-eslint/utils" "6.16.0" - debug "^4.3.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/types@6.16.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.16.0.tgz#a3abe0045737d44d8234708d5ed8fef5d59dc91e" - integrity sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ== - -"@typescript-eslint/typescript-estree@6.16.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz#d6e0578e4f593045f0df06c4b3a22bd6f13f2d03" - integrity sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA== - dependencies: - "@typescript-eslint/types" "6.16.0" - "@typescript-eslint/visitor-keys" "6.16.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/utils@6.16.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.16.0.tgz#1c291492d34670f9210d2b7fcf6b402bea3134ae" - integrity sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.16.0" - "@typescript-eslint/types" "6.16.0" - "@typescript-eslint/typescript-estree" "6.16.0" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@6.16.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz#d50da18a05d91318ed3e7e8889bda0edc35f3a10" - integrity sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A== - dependencies: - "@typescript-eslint/types" "6.16.0" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@vitejs/plugin-react@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" - integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== - dependencies: - "@babel/core" "^7.23.5" - "@babel/plugin-transform-react-jsx-self" "^7.23.3" - "@babel/plugin-transform-react-jsx-source" "^7.23.3" - "@types/babel__core" "^7.20.5" - react-refresh "^0.14.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.22.2: - version "4.22.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" - integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== - dependencies: - caniuse-lite "^1.0.30001565" - electron-to-chromium "^1.4.601" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-lite@^1.0.30001565: - version "1.0.30001572" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz#1ccf7dc92d2ee2f92ed3a54e11b7b4a3041acfa0" - integrity sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clsx@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" - integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concurrently@^8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" - integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== - dependencies: - chalk "^4.1.2" - date-fns "^2.30.0" - lodash "^4.17.21" - rxjs "^7.8.1" - shell-quote "^1.8.1" - spawn-command "0.0.2" - supports-color "^8.1.1" - tree-kill "^1.2.2" - yargs "^17.7.2" - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-to-react-native@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -csstype@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -csstype@^3.0.2, csstype@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -date-fns@^2.30.0: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== - dependencies: - "@babel/runtime" "^7.21.0" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -electron-to-chromium@^1.4.601: - version "1.4.616" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz#4bddbc2c76e1e9dbf449ecd5da3d8119826ea4fb" - integrity sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -esbuild@^0.19.3: - version "0.19.11" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" - integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.11" - "@esbuild/android-arm" "0.19.11" - "@esbuild/android-arm64" "0.19.11" - "@esbuild/android-x64" "0.19.11" - "@esbuild/darwin-arm64" "0.19.11" - "@esbuild/darwin-x64" "0.19.11" - "@esbuild/freebsd-arm64" "0.19.11" - "@esbuild/freebsd-x64" "0.19.11" - "@esbuild/linux-arm" "0.19.11" - "@esbuild/linux-arm64" "0.19.11" - "@esbuild/linux-ia32" "0.19.11" - "@esbuild/linux-loong64" "0.19.11" - "@esbuild/linux-mips64el" "0.19.11" - "@esbuild/linux-ppc64" "0.19.11" - "@esbuild/linux-riscv64" "0.19.11" - "@esbuild/linux-s390x" "0.19.11" - "@esbuild/linux-x64" "0.19.11" - "@esbuild/netbsd-x64" "0.19.11" - "@esbuild/openbsd-x64" "0.19.11" - "@esbuild/sunos-x64" "0.19.11" - "@esbuild/win32-arm64" "0.19.11" - "@esbuild/win32-ia32" "0.19.11" - "@esbuild/win32-x64" "0.19.11" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react-refresh@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz#6b9b307bad3feba2244ef64a1a15485ac70a2d0f" - integrity sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w== - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.55.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" - integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== - dependencies: - function-bind "^1.1.2" - -hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanoid@^3.3.6, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -postcss-value-parser@^4.0.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.32: - version "8.4.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prop-types@^15.6.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== - -react-transition-group@^4.4.5: - version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" - integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.19.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup@^4.2.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.2.tgz#19d730219b7ec5f51372c6cf15cfb841990489fe" - integrity sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q== - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.2" - "@rollup/rollup-android-arm64" "4.9.2" - "@rollup/rollup-darwin-arm64" "4.9.2" - "@rollup/rollup-darwin-x64" "4.9.2" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.2" - "@rollup/rollup-linux-arm64-gnu" "4.9.2" - "@rollup/rollup-linux-arm64-musl" "4.9.2" - "@rollup/rollup-linux-riscv64-gnu" "4.9.2" - "@rollup/rollup-linux-x64-gnu" "4.9.2" - "@rollup/rollup-linux-x64-musl" "4.9.2" - "@rollup/rollup-win32-arm64-msvc" "4.9.2" - "@rollup/rollup-win32-ia32-msvc" "4.9.2" - "@rollup/rollup-win32-x64-msvc" "4.9.2" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -shallowequal@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -spawn-command@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" - integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -styled-components@^6.1.6: - version "6.1.6" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.6.tgz#c75c4f994136545b3bcc11608db5363710b78c0e" - integrity sha512-DgTLULSC29xpabJ24bbn1+hulU6vvGFQf4RPwBOJrm8WJFnN42yXpo5voBt3jDSJBa5tBd1L6PqswJjQ0wRKdg== - dependencies: - "@emotion/is-prop-valid" "1.2.1" - "@emotion/unitless" "0.8.0" - "@types/stylis" "4.2.0" - css-to-react-native "3.2.0" - csstype "3.1.2" - postcss "8.4.31" - shallowequal "1.1.0" - stylis "4.3.1" - tslib "2.5.0" - -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - -stylis@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" - integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-api-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" - integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== - -tslib@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tslib@^2.1.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typescript@^5.2.2: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -vite-plugin-rsw@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/vite-plugin-rsw/-/vite-plugin-rsw-2.0.11.tgz#53d6efd674136823f2e994efe47c57109353055d" - integrity sha512-OqbGAtdDfK88gDoxA9wVdGowCmlzLSXEyRvD8CgTu9IP5O7tx8Tg2CtIzKOyOWZtHHZPhtdYiN+5Il6rTZCkzw== - -vite@^5.0.10: - version "5.0.10" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.10.tgz#1e13ef5c3cf5aa4eed81f5df6d107b3c3f1f6356" - integrity sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw== - dependencies: - esbuild "^0.19.3" - postcss "^8.4.32" - rollup "^4.2.0" - optionalDependencies: - fsevents "~2.3.3" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==