From 3626998a331e59648dfe74147a6913025ae74427 Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sun, 10 May 2026 16:27:55 +0200 Subject: [PATCH] ui/phase-20: ship-group inspector actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eight ship-group operations land on the inspector behind a single inline-form panel: split, send, load, unload, modernize, dismantle, transfer, join fleet. Each action either appends a typed command to the local order draft or surfaces a tooltip explaining the disabled state. Partial-ship operations emit an implicit breakShipGroup command before the targeted action so the engine sees a clean (Break, Action) pair on the wire. `pkg/calc.BlockUpgradeCost` migrates from `game/internal/controller/ship_group_upgrade.go` so the calc bridge can wrap a pure pkg/calc formula; the controller now imports it. The bridge surfaces the function as `core.blockUpgradeCost`, which the inspector calls once per ship block to render the modernize cost preview. `GameReport.otherRaces` is decoded from the report's player block (non-extinct, ≠ self) and feeds the transfer-to-race picker. The planet inspector's stationed-ship rows become clickable for own groups so the actions panel is reachable from the standard click flow (the renderer continues to hide on-planet groups). Co-Authored-By: Claude Opus 4.7 --- .../internal/controller/ship_group_upgrade.go | 18 +- .../controller/ship_group_upgrade_test.go | 6 - pkg/calc/ship.go | 11 + pkg/calc/ship_test.go | 34 + ui/PLAN.md | 130 +- ui/core/calc/ship.go | 10 + ui/core/calc/ship_test.go | 25 + ui/docs/calc-bridge.md | 42 +- ui/docs/ship-group-actions.md | 151 +++ ui/frontend/src/api/game-state.ts | 35 + ui/frontend/src/api/synthetic-report.ts | 17 + ui/frontend/src/lib/i18n/locales/en.ts | 56 + ui/frontend/src/lib/i18n/locales/ru.ts | 56 + .../lib/inspectors/planet/ship-groups.svelte | 121 +- .../lib/inspectors/ship-group-sheet.svelte | 45 +- .../src/lib/inspectors/ship-group.svelte | 42 +- .../lib/inspectors/ship-group/actions.svelte | 1154 +++++++++++++++++ .../src/lib/sidebar/inspector-tab.svelte | 25 +- ui/frontend/src/lib/sidebar/order-tab.svelte | 48 + ui/frontend/src/platform/core/index.ts | 17 + ui/frontend/src/platform/core/wasm.ts | 5 + .../src/routes/games/[id]/+layout.svelte | 24 + ui/frontend/src/sync/order-draft.svelte.ts | 69 +- ui/frontend/src/sync/order-load.ts | 157 +++ ui/frontend/src/sync/order-types.ts | 213 ++- ui/frontend/src/sync/submit.ts | 158 +++ ui/frontend/static/core.wasm | Bin 1034403 -> 1036971 bytes ui/frontend/tests/e2e/ship-group-send.spec.ts | 254 ++++ ui/frontend/tests/galaxy-client.test.ts | 1 + .../tests/helpers/empty-ship-groups.ts | 2 + .../inspector-ship-group-actions.test.ts | 264 ++++ ...ector-ship-group-dismantle-confirm.test.ts | 201 +++ ...nspector-ship-group-modernize-cost.test.ts | 204 +++ .../tests/sync-order-types-ship-group.test.ts | 244 ++++ .../tests/sync-submit-ship-group.test.ts | 266 ++++ ui/wasm/main.go | 17 + 36 files changed, 4033 insertions(+), 89 deletions(-) create mode 100644 pkg/calc/ship_test.go create mode 100644 ui/docs/ship-group-actions.md create mode 100644 ui/frontend/src/lib/inspectors/ship-group/actions.svelte create mode 100644 ui/frontend/tests/e2e/ship-group-send.spec.ts create mode 100644 ui/frontend/tests/inspector-ship-group-actions.test.ts create mode 100644 ui/frontend/tests/inspector-ship-group-dismantle-confirm.test.ts create mode 100644 ui/frontend/tests/inspector-ship-group-modernize-cost.test.ts create mode 100644 ui/frontend/tests/sync-order-types-ship-group.test.ts create mode 100644 ui/frontend/tests/sync-submit-ship-group.test.ts diff --git a/game/internal/controller/ship_group_upgrade.go b/game/internal/controller/ship_group_upgrade.go index 3dda566..0ec3593 100644 --- a/game/internal/controller/ship_group_upgrade.go +++ b/game/internal/controller/ship_group_upgrade.go @@ -5,6 +5,7 @@ import ( "slices" "strings" + "galaxy/calc" e "galaxy/error" "galaxy/game/internal/model/game" @@ -156,26 +157,19 @@ func (uc UpgradeCalc) UpgradeMaxShips(resources float64) uint { return uint(math.Floor(resources / uc.UpgradeCost(1))) } -func BlockUpgradeCost(blockMass, currentBlockTech, targetBlockTech float64) float64 { - if blockMass == 0 || targetBlockTech <= currentBlockTech { - return 0 - } - return (1 - currentBlockTech/targetBlockTech) * 10 * blockMass -} - func GroupUpgradeCost(sg *game.ShipGroup, st game.ShipType, drive, weapons, shields, cargo float64) UpgradeCalc { uc := &UpgradeCalc{Cost: make(map[game.Tech]float64)} if drive > 0 { - uc.Cost[game.TechDrive] = BlockUpgradeCost(st.DriveBlockMass(), sg.TechLevel(game.TechDrive).F(), drive) + uc.Cost[game.TechDrive] = calc.BlockUpgradeCost(st.DriveBlockMass(), sg.TechLevel(game.TechDrive).F(), drive) } if weapons > 0 { - uc.Cost[game.TechWeapons] = BlockUpgradeCost(st.WeaponsBlockMass(), sg.TechLevel(game.TechWeapons).F(), weapons) + uc.Cost[game.TechWeapons] = calc.BlockUpgradeCost(st.WeaponsBlockMass(), sg.TechLevel(game.TechWeapons).F(), weapons) } if shields > 0 { - uc.Cost[game.TechShields] = BlockUpgradeCost(st.ShieldsBlockMass(), sg.TechLevel(game.TechShields).F(), shields) + uc.Cost[game.TechShields] = calc.BlockUpgradeCost(st.ShieldsBlockMass(), sg.TechLevel(game.TechShields).F(), shields) } if cargo > 0 { - uc.Cost[game.TechCargo] = BlockUpgradeCost(st.CargoBlockMass(), sg.TechLevel(game.TechCargo).F(), cargo) + uc.Cost[game.TechCargo] = calc.BlockUpgradeCost(st.CargoBlockMass(), sg.TechLevel(game.TechCargo).F(), cargo) } return *uc } @@ -218,7 +212,7 @@ func UpgradeGroupPreference(sg game.ShipGroup, st game.ShipType, tech game.Tech, ti = len(su.UpgradeTech) - 1 } su.UpgradeTech[ti].Level = game.F(v) - su.UpgradeTech[ti].Cost = game.F(BlockUpgradeCost(st.BlockMass(tech), sg.TechLevel(tech).F(), v) * float64(sg.Number)) + su.UpgradeTech[ti].Cost = game.F(calc.BlockUpgradeCost(st.BlockMass(tech), sg.TechLevel(tech).F(), v) * float64(sg.Number)) sg.StateUpgrade = &su return sg diff --git a/game/internal/controller/ship_group_upgrade_test.go b/game/internal/controller/ship_group_upgrade_test.go index 393abdf..df885fc 100644 --- a/game/internal/controller/ship_group_upgrade_test.go +++ b/game/internal/controller/ship_group_upgrade_test.go @@ -13,12 +13,6 @@ import ( "github.com/stretchr/testify/assert" ) -func TestBlockUpgradeCost(t *testing.T) { - assert.Equal(t, 00.0, controller.BlockUpgradeCost(1, 1.0, 1.0)) - assert.Equal(t, 25.0, controller.BlockUpgradeCost(5, 1.0, 2.0)) - assert.Equal(t, 50.0, controller.BlockUpgradeCost(10, 1.0, 2.0)) -} - func TestGroupUpgradeCost(t *testing.T) { sg := &g.ShipGroup{ Tech: map[g.Tech]g.Float{ diff --git a/pkg/calc/ship.go b/pkg/calc/ship.go index 0b96271..b0919f3 100644 --- a/pkg/calc/ship.go +++ b/pkg/calc/ship.go @@ -52,6 +52,17 @@ func WeaponsBlockMass(weapons float64, armament uint) (float64, bool) { return float64(armament+1) * (weapons / 2), true } +// Стоимость модернизации одного блока корабля - +// доля недостающего технологического уровня (1 - currentBlockTech/targetBlockTech), +// умноженная на массу блока и нормирующий коэффициент 10. +// Возвращает 0, если масса блока равна нулю или целевой уровень не выше текущего. +func BlockUpgradeCost(blockMass, currentBlockTech, targetBlockTech float64) float64 { + if blockMass == 0 || targetBlockTech <= currentBlockTech { + return 0 + } + return (1 - currentBlockTech/targetBlockTech) * 10 * blockMass +} + func DestructionProbability( attackingWeapons, attackingWeaponsTech, diff --git a/pkg/calc/ship_test.go b/pkg/calc/ship_test.go new file mode 100644 index 0000000..09b0ba1 --- /dev/null +++ b/pkg/calc/ship_test.go @@ -0,0 +1,34 @@ +package calc_test + +import ( + "math" + "testing" + + "galaxy/calc" +) + +func TestBlockUpgradeCost(t *testing.T) { + cases := []struct { + name string + blockMass float64 + currentTech float64 + targetTech float64 + want float64 + }{ + {"zero block mass returns zero", 0, 1.0, 2.0, 0}, + {"target equal to current returns zero", 5, 2.0, 2.0, 0}, + {"target below current returns zero", 5, 2.0, 1.0, 0}, + {"doubling tech on mass 5 costs 25", 5, 1.0, 2.0, 25}, + {"doubling tech on mass 10 costs 50", 10, 1.0, 2.0, 50}, + {"partial step from 2.0 to 2.5 on mass 5", 5, 2.0, 2.5, 10}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + got := calc.BlockUpgradeCost(tc.blockMass, tc.currentTech, tc.targetTech) + if math.Abs(got-tc.want) > 1e-9 { + t.Errorf("BlockUpgradeCost(%v, %v, %v) = %v, want %v", + tc.blockMass, tc.currentTech, tc.targetTech, got, tc.want) + } + }) + } +} diff --git a/ui/PLAN.md b/ui/PLAN.md index 295578d..7fe2776 100644 --- a/ui/PLAN.md +++ b/ui/PLAN.md @@ -2135,27 +2135,63 @@ Targeted tests: - Playwright e2e: click each variant from a seeded game, assert all expected fields render. -## Phase 20. Inspector — Ship Group Actions +## ~~Phase 20. Inspector — Ship Group Actions~~ -Status: pending. +Status: done. Goal: enable group operations from the inspector: split, send, load, unload, modernize, dismantle, transfer to race, add to fleet. Artifacts: -- action buttons in `ui/frontend/src/lib/inspectors/ship-group.svelte` - with disabled-state and tooltip when local validation rejects -- `ui/frontend/src/sync/order-types.ts` extends with `SplitGroup`, - `SendGroup`, `LoadCargo`, `UnloadCargo`, `Modernize`, `Dismantle`, - `TransferToRace`, `AssignToFleet` command variants -- `Send` action picks destination through a planet picker filtered by - the group's reach (uses `pkg/calc/` reach function via Core; the - player's tech levels are already on `GameReport.localPlayer*` from - Phase 18, no extra plumbing needed) -- `Modernize` cost preview using `pkg/calc/` formula via Core -- confirmation dialog for `Dismantle` over a foreign planet with - colonists onboard (special-case from [`rules.txt`](../game/rules.txt): colonists die) +- action panel `ui/frontend/src/lib/inspectors/ship-group/actions.svelte` + mounted by the read-only inspector for the local variant; eight + inline forms (one per action) with disabled-button tooltips that + mirror the engine's pre-conditions + (`controller/ship_group*.go`) +- `ui/frontend/src/sync/order-types.ts` extends with eight new + command variants — `breakShipGroup`, `sendShipGroup`, + `loadShipGroup`, `unloadShipGroup`, `upgradeShipGroup`, + `dismantleShipGroup`, `transferShipGroup`, `joinFleetShipGroup` — + plus `ShipGroupCargo` and `ShipGroupUpgradeTech` literal types +- `sync/submit.ts` and `sync/order-load.ts` round-trip every new + variant against the existing FBS classes in + `proto/galaxy/fbs/order/`; the `id` field on each ship-group + payload carries the *target* group UUID (the source group, or + the freshly-minted `newGroupId` when an implicit split precedes + the action) +- `Send` action picks destination through a planet picker filtered + by the group's reach (`localPlayerDrive * 40`, computed inline + via the existing `torusShortestDelta` from + `cargo-routes.svelte`); the player's tech levels are already on + `GameReport.localPlayer*` from Phase 18, no extra plumbing + needed +- `Modernize` cost preview through `core.blockUpgradeCost` + (Phase 20 bridge), summed over the four ship-class blocks for + the targeted ship count; preview hides when `Core` is not yet + booted or the form is invalid (see + `ui/docs/ship-group-actions.md` for the formula breakdown) +- two-step inline confirmation for `Dismantle` over a foreign + planet with colonists onboard (engine reference + `controller/ship_group.go:177-179` — `UnloadColonists` is not + called over a foreign planet, so the cargo is lost) +- `pkg/calc/ship.go.BlockUpgradeCost` (migrated from + `game/internal/controller/ship_group_upgrade.go`) — the bridge + rule says `ui/core/calc/` only wraps `pkg/calc/` formulas, so + the function moved upstream and the controller now imports it +- `GameReport.otherRaces: string[]` populated by the report + decoder from `report.player[]` (non-extinct, ≠ self) — used by + the transfer-to-race picker; Phase 22's Races View reuses the + same field +- planet inspector's stationed-ship rows + (`lib/inspectors/planet/ship-groups.svelte`) become clickable + for own groups, pivoting the `SelectionStore` to the matching + `shipGroup.local` ref so the actions panel is reachable from + the standard click flow (the map deliberately hides on-planet + groups, so this is the on-planet entry point) +- topic doc `ui/docs/ship-group-actions.md` covers the action + surface, disabled-state rules, implicit-split pattern, and the + modernize cost preview formula Dependencies: Phases 18, 19. @@ -2171,10 +2207,61 @@ Acceptance criteria: Targeted tests: -- Vitest unit tests for action enablement logic per action; -- Vitest component tests for the dismantle-with-colonists confirmation; -- Playwright e2e for at least one complete flow (send a group between - two planets) against a local stack. +- `pkg/calc/ship_test.go.TestBlockUpgradeCost` — formula coverage + on the migrated function; +- `ui/core/calc/ship_test.go.TestBlockUpgradeCostParity` — bridge + parity against `pkg/calc/`; +- Vitest: + - `tests/inspector-ship-group-actions.test.ts` — disabled-state + rules per action and the implicit-split pattern; + - `tests/inspector-ship-group-dismantle-confirm.test.ts` — + two-step confirm over foreign-COL groups; + - `tests/inspector-ship-group-modernize-cost.test.ts` — + preview formula matches `BlockUpgradeCost` × ship count and + hides when `Core` is null; + - `tests/sync-order-types-ship-group.test.ts` — + `validateCommand` for each new variant; + - `tests/sync-submit-ship-group.test.ts` — encoder/decoder + round-trip per new variant; +- Playwright `tests/e2e/ship-group-send.spec.ts` — synthetic + report with a 3-ship group on Earth and a reachable Mars, + drives the planet inspector → ship-group inspector pivot, then + Send 2 of 3 with map-pick destination, asserts both Break and + Send land in the order draft via the order tab. + +Decisions during stage: + +1. **`BlockUpgradeCost` migration**. The pre-existing copy in + `game/internal/controller/ship_group_upgrade.go` moved to + `pkg/calc/ship.go`; the controller's `GroupUpgradeCost` and + `UpgradeGroupPreference` now call `calc.BlockUpgradeCost`. + The unit test moved from `controller/ship_group_upgrade_test.go` + to `pkg/calc/ship_test.go`. +2. **`GameReport.otherRaces`** field added to + `ui/frontend/src/api/game-state.ts`; the synthetic-report + decoder populates it the same way (`api/synthetic-report.ts`). + Phase 22's Races View can read this directly without a fresh + plumbing pass — the Phase 22 stage text below is updated to + reflect that. +3. **Stationed-ship rows are clickable**. The Phase 19 stationed- + ship subsection on the planet inspector becomes interactive + for own groups (Phase 21+ table view stays a separate target). + The map renderer continues to hide on-planet groups — this is + the cheaper navigational fix. +4. **Inline forms, no modal**. Every action opens an inline + editor under the buttons row, matching the Phase 14 rename and + Phase 16 cargo-route patterns. Send reuses + `MAP_PICK_CONTEXT_KEY` (Phase 16's renderer service) for the + destination picker. Foreign-COL Dismantle uses a two-step + inline confirm (button label flips to "confirm — colonists + die") rather than a separate modal component. +5. **Implicit split for Send/Load/Unload/Modernize/Dismantle/ + Transfer**. The number-of-ships input defaults to the group's + full count; when the player picks a smaller M, the inspector + prepends `breakShipGroup(id, newId, M)` and routes the action + at `newId`. JoinFleet and Split do not get a counter (JoinFleet + is whole-group atomically per the engine; Split *is* the break + command). ## Phase 21. Sciences — CRUD List + Designer @@ -2226,7 +2313,12 @@ Artifacts: - `ui/frontend/src/routes/games/[id]/table/races/+page.svelte` table with one row per race, including name, tech levels, total population, total production, planet count, war-or-peace from this - race's perspective, votes received + race's perspective, votes received. The race list itself is read + from `GameReport.otherRaces` (introduced in Phase 20 for the + ship-group transfer-to-race picker); the table view widens the + per-race shape (tech / population / production / planet count / + votes / relation) by walking `report.player[]` directly when those + fields are needed - per-row toggle for declaring war or peace (adds `SetDiplomaticStance` command) - voting control: a single slot for `give my votes to ` (adds diff --git a/ui/core/calc/ship.go b/ui/core/calc/ship.go index d1bf5e8..1a446c9 100644 --- a/ui/core/calc/ship.go +++ b/ui/core/calc/ship.go @@ -55,3 +55,13 @@ func CargoCapacity(cargo, cargoTech float64) float64 { func CarryingMass(load, cargoTech float64) float64 { return calc.CarryingMass(load, cargoTech) } + +// BlockUpgradeCost wraps `calc.BlockUpgradeCost` (`pkg/calc/ship.go`): +// production cost of upgrading a single ship block from currentBlockTech +// to targetBlockTech. Returns 0 when blockMass is zero or the target is +// not above the current level. Used by the ship-group inspector's +// modernize cost preview, with each of the four blocks (drive, weapons, +// shields, cargo) priced through a separate call. +func BlockUpgradeCost(blockMass, currentBlockTech, targetBlockTech float64) float64 { + return calc.BlockUpgradeCost(blockMass, currentBlockTech, targetBlockTech) +} diff --git a/ui/core/calc/ship_test.go b/ui/core/calc/ship_test.go index de6f3c1..529802f 100644 --- a/ui/core/calc/ship_test.go +++ b/ui/core/calc/ship_test.go @@ -171,6 +171,31 @@ func TestCarryingMassParity(t *testing.T) { } } +func TestBlockUpgradeCostParity(t *testing.T) { + t.Parallel() + cases := []struct { + name string + blockMass float64 + currentTech float64 + targetTech float64 + }{ + {"zero_block_mass", 0, 1, 2}, + {"target_equal_to_current", 5, 2, 2}, + {"target_below_current", 5, 2, 1}, + {"doubling_tech_on_mass_5", 5, 1, 2}, + {"partial_step_2_to_2_5", 5, 2, 2.5}, + {"high_tech_to_higher_tech", 12, 4, 6}, + } + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + t.Parallel() + want := source.BlockUpgradeCost(c.blockMass, c.currentTech, c.targetTech) + got := bridge.BlockUpgradeCost(c.blockMass, c.currentTech, c.targetTech) + assert.Equal(t, want, got) + }) + } +} + // TestDesignerPreviewComposition exercises the exact composition the // ship-class designer performs: empty mass, full-load mass via // CarryingMass(CargoCapacity), max speed at empty, and range at full diff --git a/ui/docs/calc-bridge.md b/ui/docs/calc-bridge.md index 15446a2..6d88ebb 100644 --- a/ui/docs/calc-bridge.md +++ b/ui/docs/calc-bridge.md @@ -9,30 +9,33 @@ Go → WASM → TypeScript bridge mounted under `ui/core/calc/` and a matching TS adapter in `ui/frontend/src/platform/core/`. Phase 18 lands the **ship-math slice** of the bridge — everything -the ship-class designer needs to render its preview pane. Other -slices (production forecast, science research, ship build progress) -remain deferred to dedicated future phases. This document is the -running audit trail of what is live, what is missing, and how each -function maps to its `pkg/calc/` source. +the ship-class designer needs to render its preview pane. Phase 20 +extends it with `BlockUpgradeCost` so the ship-group inspector can +preview modernize cost. Other slices (production forecast, science +research, ship build progress) remain deferred to dedicated future +phases. This document is the running audit trail of what is live, +what is missing, and how each function maps to its `pkg/calc/` +source. -## Live bridge surface (Phase 18) +## Live bridge surface The Go module `galaxy/core/calc` (`ui/core/calc/ship.go`) exposes -seven thin wrappers around `pkg/calc/ship.go`. Each is a one-line -passthrough — the bridge contains zero math. The same seven names -appear on the JS-side `globalThis.galaxyCore` (registered in +thin wrappers around `pkg/calc/ship.go`. Each is a one-line +passthrough — the bridge contains zero math. The same names appear +on the JS-side `globalThis.galaxyCore` (registered in `ui/wasm/main.go`) and on the typed `Core` interface (`ui/frontend/src/platform/core/index.ts`). -| Bridge function | `pkg/calc/` source | JS return shape | Used by | -| ------------------ | --------------------------------------------------- | --------------- | -------------------------------- | -| `driveEffective` | `calc.DriveEffective(drive, driveTech)` | `number` | designer preview (`Speed` input) | -| `emptyMass` | `calc.EmptyMass(drive, weapons, armament, …)` | `number\|null` | designer preview (mass row) | -| `weaponsBlockMass` | `calc.WeaponsBlockMass(weapons, armament)` | `number\|null` | reserved for future stages | -| `fullMass` | `calc.FullMass(emptyMass, carryingMass)` | `number` | designer preview (full-load row) | -| `speed` | `calc.Speed(driveEffective, fullMass)` | `number` | designer preview (speed + range) | -| `cargoCapacity` | `calc.CargoCapacity(cargo, cargoTech)` | `number` | designer preview (cargo row) | -| `carryingMass` | `calc.CarryingMass(load, cargoTech)` | `number` | designer preview (full-load mass)| +| Bridge function | `pkg/calc/` source | JS return shape | Used by | +| ------------------- | -------------------------------------------------------- | --------------- | ---------------------------------------- | +| `driveEffective` | `calc.DriveEffective(drive, driveTech)` | `number` | designer preview (`Speed` input) | +| `emptyMass` | `calc.EmptyMass(drive, weapons, armament, …)` | `number\|null` | designer preview (mass row) | +| `weaponsBlockMass` | `calc.WeaponsBlockMass(weapons, armament)` | `number\|null` | designer preview, modernize cost preview | +| `fullMass` | `calc.FullMass(emptyMass, carryingMass)` | `number` | designer preview (full-load row) | +| `speed` | `calc.Speed(driveEffective, fullMass)` | `number` | designer preview (speed + range) | +| `cargoCapacity` | `calc.CargoCapacity(cargo, cargoTech)` | `number` | designer preview (cargo row) | +| `carryingMass` | `calc.CarryingMass(load, cargoTech)` | `number` | designer preview (full-load mass) | +| `blockUpgradeCost` | `calc.BlockUpgradeCost(blockMass, currentTech, target)` | `number` | ship-group inspector modernize preview | `number|null` returns mirror the Go `(float64, bool)` signature: the upstream validator rejects weapons/armament pairings with one zero @@ -64,6 +67,8 @@ waivers below for the rationale on each deferral. | `ShipProductionCost(shipEmptyMass float64) float64` | Production units required per unit of ship empty mass (×10). | | `PlanetProduceShipMass(L, Mat, Res float64) float64` | Ship mass produced per turn given free production `L`, material stockpile `Mat`, resources `Res`.| | `DriveEffective`, `Speed`, `EmptyMass`, `FullMass`, … | Ship-level derivations (`pkg/calc/ship.go`). | +| `BlockUpgradeCost(blockMass, currentTech, target)` | Production cost of upgrading a single ship block (Phase 20 migrated this from `controller`). | +| `FligthDistance(driveTech)`, `VisibilityDistance(...)` | Race-level reach formulas (`pkg/calc/race.go`). | | `ValidateShipTypeValues`, `CheckShipTypeValueDWSC` | Ship-design validators (`pkg/calc/validator.go`). | Nothing else lives in `pkg/calc/` today. Production-side formulas @@ -79,6 +84,7 @@ whether the underlying Go function exists. | UI feature | Go formula | In `pkg/calc/`? | Surfaced to TS? | | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | :-------------: | :-------------: | | Ship-class designer preview (Phase 18) | `EmptyMass`, `FullMass`, `Speed`, `DriveEffective`, `CargoCapacity`, `CarryingMass`, `WeaponsBlockMass` (`pkg/calc/ship.go`) | yes | yes | +| Ship-group modernize cost preview (Phase 20) | `BlockUpgradeCost` (`pkg/calc/ship.go`, migrated from `game/internal/controller/ship_group_upgrade.go`) | yes | yes | | Free production potential (`freeIndustry`) | `Planet.ProductionCapacity` → `industry*0.75 + population*0.25` (`game/internal/model/game/planet.go`) | no | no | | Industry production output per turn | `Planet.ProduceIndustry(freeProduction)` (`planet.go`); `freeProduction/5` modulo material constraint | no | no | | Materials production output per turn | `Planet.ProduceMaterial(freeProduction)` (`planet.go`); `freeProduction * resources` | no | no | diff --git a/ui/docs/ship-group-actions.md b/ui/docs/ship-group-actions.md new file mode 100644 index 0000000..eb5cf98 --- /dev/null +++ b/ui/docs/ship-group-actions.md @@ -0,0 +1,151 @@ +# Ship-group inspector actions + +Phase 20 turns the read-only ship-group inspector +(`ui/frontend/src/lib/inspectors/ship-group.svelte`) into an +interactive command source for the player's own groups in orbit. +This document is the running spec for the actions panel +(`ui/frontend/src/lib/inspectors/ship-group/actions.svelte`): +which actions exist, what gates each one, how partial-ship +operations split a group on the fly, and what the modernize cost +preview shows. + +## Reaching a group + +The map renderer hides on-planet ship groups to avoid crowding +the canvas. The player reaches an own on-planet group through the +planet inspector's **stationed ship groups** subsection: clicking +a row pivots the `SelectionStore` to the matching +`shipGroup.local` ref, the sidebar swaps from the planet +inspector to the ship-group inspector, and the actions panel +mounts. In-flight (in-space) groups appear as map primitives and +can be selected by clicking the rendered point. + +## Action surface + +| Action | Implicit-split? | Partial input | FBS payload | Engine reference | +| ----------- | :-------------: | ------------- | ---------------------------- | ----------------------------------------------------- | +| Split | — | ships count | `CommandShipGroupBreak` | `controller/ship_group.go.breakGroup` | +| Send | yes | ships count + destination | `CommandShipGroupSend` | `controller/ship_group_send.go.shipGroupSend` | +| Load | yes | ships count + cargo + quantity | `CommandShipGroupLoad` | `controller/ship_group.go.shipGroupLoad` | +| Unload | yes | ships count + quantity | `CommandShipGroupUnload` | `controller/ship_group.go.shipGroupUnload` | +| Modernize | yes | ships count + tech + level | `CommandShipGroupUpgrade` | `controller/ship_group_upgrade.go.shipGroupUpgrade` | +| Dismantle | yes | ships count + foreign-COL confirm | `CommandShipGroupDismantle` | `controller/ship_group.go.shipGroupDismantle` | +| Transfer | yes | ships count + acceptor race | `CommandShipGroupTransfer` | `controller/ship_group.go.shipGroupTransfer` | +| Join Fleet | — | fleet name (existing or new) | `CommandShipGroupJoinFleet` | `controller/fleet.go.ShipGroupJoinFleet` | + +"Implicit-split" means the inspector accepts a number of ships +`M < N` and emits a `CommandShipGroupBreak(id, newId, M)` command +*before* the action command, then targets the action at the +freshly-minted `newId`. The FBS schema only carries a per-ship +`quantity` on `CommandShipGroupBreak`; every other ship-group +command applies to the whole group, so the implicit-split +pattern is the only way to act on a subset without forcing the +player to pre-split manually. Acceptance criteria: "splitting a +group of N into K and N-K results in two valid commands" — that +is exactly the (Break, Action) pair this pipeline emits. + +Split and Join Fleet do not accept a partial ship count: Split +*is* the break operation; Join Fleet attaches the whole group +atomically (the engine handles a partial detach by issuing Split +first, which the player drives explicitly). + +## Disabled-state rules + +The inspector mirrors the engine's pre-conditions per command +(see the references column above) and surfaces each as a +disabled-button tooltip. Any state other than `In_Orbit` disables +every action with `ships are busy ({state})`. Per-action gates: + +- **Send**: requires the ship class to have a non-zero drive + block (`controller/ship_group_send.go:32`); the picker + pre-filters destinations by reach + (`localPlayerDrive * 40`), so a valid pick is always within + range. With no reachable planet, the action is disabled with + the "no planets in drive range" tooltip. +- **Load**: requires the orbit planet to be owned by the player + or unowned (`controller/ship_group.go:215`) and the ship class + to have a cargo block (`shipGroupLoad:220`). The dropdown is + pinned to the existing cargo type when the group is already + partially loaded (the engine refuses cargo-type changes at + `shipGroupLoad:223`). +- **Unload**: requires non-empty cargo. Colonists (`COL`) over a + foreign planet are blocked (`shipGroupUnload:283`), with the + matching tooltip in the disabled state. +- **Modernize**: requires the orbit planet to be own/unowned + (`shipGroupUpgrade:29`) and at least one block whose race tech + exceeds the group tech (otherwise nothing can be upgraded). +- **Dismantle**: always available in orbit. When the orbit is + over a foreign planet AND the group carries colonists, the + inline form replaces the normal "confirm" with "confirm — + colonists die"; the player has to click twice to commit + (engine reference `shipGroupDismantle:177-179` — over a + foreign planet, `UnloadColonists` is not called and the + cargo is lost). +- **Transfer**: requires at least one non-extinct race other + than the local player (sourced from + `GameReport.otherRaces`). +- **Join Fleet**: existing-fleet picker is restricted to fleets + in the same orbit (`fleet.go:135-137`); creating a new fleet + always works. + +## Modernize cost preview + +The form's preview line calls +`core.blockUpgradeCost({ blockMass, currentTech, targetTech })` +once per ship block (drive, weapons, shields, cargo) and sums +the per-ship totals before multiplying by the targeted ship +count. Block masses come from the player's +`ShipClassSummary` for the group's class: + +- Drive / shields / cargo block mass = the corresponding ship- + class field (raw value). +- Weapons block mass = `core.weaponsBlockMass({ weapons, + armament })` (Phase 18 bridge); returns null on the invalid + weapons/armament pairing, in which case the row contributes + zero. + +For `tech === "ALL"` every block whose mass is non-zero +contributes against the player's race tech as the target. For +per-block tech (`DRIVE` / `WEAPONS` / `SHIELDS` / `CARGO`) only +the chosen block contributes, with `level` as the target. + +The preview hides when the form is invalid (`tech !== "ALL"` +with non-positive `level`) or when `Core` has not yet booted — +the bridge call is the only source of truth, so we surface +"preview unavailable" rather than fall back to a JS +re-implementation that could drift from the engine. + +## Wire shape + +Every emitted command carries: + +- `id` — client-minted UUID (`crypto.randomUUID()`), used by the + order draft for status tracking; mirrored as + `CommandItem.cmdId` on the wire. +- `groupId` — the source ship-group's UUID (or `newGroupId` when + the action is the second half of an implicit split). On the + wire it is the `id` field of every ship-group payload type. + +Per-action additional fields are documented on the +`OrderCommand` union in +`ui/frontend/src/sync/order-types.ts` next to the JSDoc for each +variant. + +## Decisions baked into Phase 20 + +- **`BlockUpgradeCost` migrated to `pkg/calc`**. The cost + formula previously lived in + `game/internal/controller/ship_group_upgrade.go`. To keep the + `ui/core/calc` bridge a wrapper around pure `pkg/calc/` + formulas, the function moved to `pkg/calc/ship.go` and the + controller now imports it (`controller/ship_group_upgrade.go`). +- **`GameReport.otherRaces`**. The transfer-to-race picker reads + from a new `GameReport.otherRaces: string[]` field, populated + by walking `report.player[]` and excluding the local race plus + every `extinct` entry. Phase 22 (Races View) reuses the same + field. +- **Stationed-ship rows are clickable**. The map deliberately + hides on-planet groups; the planet inspector's stationed-ship + rows now pivot the selection to the corresponding ship-group + variant so the actions panel is reachable from the standard + click flow. diff --git a/ui/frontend/src/api/game-state.ts b/ui/frontend/src/api/game-state.ts index 3078bc1..2475840 100644 --- a/ui/frontend/src/api/game-state.ts +++ b/ui/frontend/src/api/game-state.ts @@ -272,6 +272,18 @@ export interface GameReport { incomingShipGroups: ReportIncomingShipGroup[]; unidentifiedShipGroups: ReportUnidentifiedShipGroup[]; localFleets: ReportLocalFleet[]; + /** + * otherRaces lists the names of every non-extinct race other than + * the local player, sorted alphabetically. Drawn from the + * `report.player[]` block in the FBS report (each `Player` row + * carries an `extinct` flag). The ship-group inspector consumes + * this list for the "transfer to race" picker; Phase 22's Races + * View reuses the same field so the read shape is stable across + * stages. Empty when the report has no `player` block (boot + * state, history-mode snapshots) or when the local player is the + * only non-extinct race. + */ + otherRaces: string[]; } export async function fetchGameReport( @@ -405,6 +417,7 @@ function decodeReport(report: Report): GameReport { const raceName = report.race() ?? ""; const routes = decodeReportRoutes(report); const localTech = findLocalPlayerTech(report, raceName); + const otherRaces = collectOtherRaces(report, raceName); const localShipGroups = decodeLocalShipGroups(report); const otherShipGroups = decodeOtherShipGroups(report); const incomingShipGroups = decodeIncomingShipGroups(report); @@ -429,6 +442,7 @@ function decodeReport(report: Report): GameReport { incomingShipGroups, unidentifiedShipGroups, localFleets, + otherRaces, }; } @@ -705,6 +719,27 @@ function findLocalPlayerTech( return { drive: 0, weapons: 0, shields: 0, cargo: 0 }; } +/** + * collectOtherRaces walks the `report.player[]` block and returns + * the alphabetically-sorted names of every non-extinct race other + * than the local player. Used by `GameReport.otherRaces` to back the + * ship-group inspector's transfer-to-race picker (Phase 20) and the + * Races View list (Phase 22). + */ +function collectOtherRaces(report: Report, raceName: string): string[] { + const out: string[] = []; + for (let i = 0; i < report.playerLength(); i++) { + const player = report.player(i); + if (player === null) continue; + if (player.extinct()) continue; + const name = player.name() ?? ""; + if (name === "" || name === raceName) continue; + out.push(name); + } + out.sort((a, b) => a.localeCompare(b)); + return out; +} + /** * uuidToHiLo splits the canonical 36-character UUID string * (`xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`) into the two big-endian diff --git a/ui/frontend/src/api/synthetic-report.ts b/ui/frontend/src/api/synthetic-report.ts index a3b6915..d9e3398 100644 --- a/ui/frontend/src/api/synthetic-report.ts +++ b/ui/frontend/src/api/synthetic-report.ts @@ -102,6 +102,7 @@ interface SyntheticPlayer { weapons: number; shields: number; cargo: number; + extinct?: boolean; } interface SyntheticShipGroup { @@ -269,9 +270,25 @@ function decodeSyntheticReport(json: unknown): GameReport { incomingShipGroups, unidentifiedShipGroups, localFleets, + otherRaces: collectOtherRacesFromSynthetic(root, race), }; } +function collectOtherRacesFromSynthetic( + root: SyntheticReportRoot, + raceName: string, +): string[] { + const out: string[] = []; + for (const player of root.player ?? []) { + if (player.extinct === true) continue; + const name = typeof player.name === "string" ? player.name : ""; + if (name === "" || name === raceName) continue; + out.push(name); + } + out.sort((a, b) => a.localeCompare(b)); + return out; +} + function toShipGroupTech(raw: Record | undefined): ShipGroupTech { const out: ShipGroupTech = { drive: 0, weapons: 0, shields: 0, cargo: 0 }; if (raw === undefined || raw === null) return out; diff --git a/ui/frontend/src/lib/i18n/locales/en.ts b/ui/frontend/src/lib/i18n/locales/en.ts index 8c37f75..df699b8 100644 --- a/ui/frontend/src/lib/i18n/locales/en.ts +++ b/ui/frontend/src/lib/i18n/locales/en.ts @@ -194,6 +194,14 @@ const en = { "game.sidebar.order.label.cargo_route_remove": "remove {loadType} route from planet {source}", "game.sidebar.order.label.ship_class_create": "design ship class {name}", "game.sidebar.order.label.ship_class_remove": "remove ship class {name}", + "game.sidebar.order.label.ship_group_break": "split group {group} → {quantity} ships into new group", + "game.sidebar.order.label.ship_group_send": "send group {group} → planet {destination}", + "game.sidebar.order.label.ship_group_load": "load {cargo} × {quantity} onto group {group}", + "game.sidebar.order.label.ship_group_unload": "unload × {quantity} from group {group}", + "game.sidebar.order.label.ship_group_upgrade": "modernize group {group} {tech} → {level}", + "game.sidebar.order.label.ship_group_dismantle": "dismantle group {group}", + "game.sidebar.order.label.ship_group_transfer": "transfer group {group} → {acceptor}", + "game.sidebar.order.label.ship_group_join_fleet": "assign group {group} → fleet {fleet}", "game.table.ship_classes.title": "ship classes", "game.table.ship_classes.column.name": "name", "game.table.ship_classes.column.drive": "drive", @@ -276,6 +284,54 @@ const en = { "game.inspector.ship_group.fleet.none": "—", "game.inspector.ship_group.unidentified_no_data": "no data — only the radar blip is known", + "game.inspector.ship_group.action.split": "split", + "game.inspector.ship_group.action.send": "send", + "game.inspector.ship_group.action.load": "load", + "game.inspector.ship_group.action.unload": "unload", + "game.inspector.ship_group.action.modernize": "modernize", + "game.inspector.ship_group.action.dismantle": "dismantle", + "game.inspector.ship_group.action.transfer": "transfer", + "game.inspector.ship_group.action.join_fleet": "join fleet", + "game.inspector.ship_group.action.confirm": "confirm", + "game.inspector.ship_group.action.cancel": "cancel", + "game.inspector.ship_group.action.confirm_destroy": "confirm — colonists die", + "game.inspector.ship_group.action.disabled.not_in_orbit": "ships are busy ({state}); only orbiting groups accept actions", + "game.inspector.ship_group.action.disabled.no_reach": "no planets are within drive range", + "game.inspector.ship_group.action.disabled.no_drive": "this ship class has no drive block", + "game.inspector.ship_group.action.disabled.no_cargo_block": "this ship class has no cargo block", + "game.inspector.ship_group.action.disabled.no_planet": "the orbit planet is not visible", + "game.inspector.ship_group.action.disabled.foreign_planet": "this action is only available on your own or unowned planets", + "game.inspector.ship_group.action.disabled.empty_cargo": "the group is empty", + "game.inspector.ship_group.action.disabled.foreign_unload_col": "colonists cannot be unloaded over a foreign planet", + "game.inspector.ship_group.action.disabled.no_headroom": "the group's tech is already at your race level", + "game.inspector.ship_group.action.disabled.no_planet_stock": "the planet has no available stock of this cargo", + "game.inspector.ship_group.action.disabled.full_load": "the group is fully loaded", + "game.inspector.ship_group.action.disabled.no_other_races": "no other non-extinct races to transfer to", + "game.inspector.ship_group.action.disabled.unknown_class": "the ship class is missing from the report", + "game.inspector.ship_group.action.field.ships": "ships ({max} total)", + "game.inspector.ship_group.action.field.cargo": "cargo type", + "game.inspector.ship_group.action.field.quantity": "quantity", + "game.inspector.ship_group.action.field.level": "tech level", + "game.inspector.ship_group.action.field.tech": "tech", + "game.inspector.ship_group.action.field.acceptor": "acceptor", + "game.inspector.ship_group.action.field.fleet": "fleet name", + "game.inspector.ship_group.action.field.destination": "destination planet", + "game.inspector.ship_group.action.tech.all": "all blocks", + "game.inspector.ship_group.action.tech.drive": "drive", + "game.inspector.ship_group.action.tech.weapons": "weapons", + "game.inspector.ship_group.action.tech.shields": "shields", + "game.inspector.ship_group.action.tech.cargo": "cargo", + "game.inspector.ship_group.action.send.pick_prompt": "click a planet on the map (Esc to cancel)", + "game.inspector.ship_group.action.send.no_destination": "no destination chosen", + "game.inspector.ship_group.action.modernize.cost": "estimated cost: {cost}", + "game.inspector.ship_group.action.modernize.cost_unavailable": "cost preview unavailable", + "game.inspector.ship_group.action.dismantle.warning": "the group is over a foreign planet with colonists aboard — they will die", + "game.inspector.ship_group.action.fleet.create_new": "+ new fleet", + "game.inspector.ship_group.action.invalid.ship_count": "ships must be in the range 1…{max}", + "game.inspector.ship_group.action.invalid.quantity": "quantity must be greater than zero", + "game.inspector.ship_group.action.invalid.level": "level must be in ({current}, {max}]", + "game.inspector.ship_group.action.invalid.fleet_name": "fleet name does not match the entity-name rules", + "game.inspector.planet.ship_groups.title": "stationed ship groups", "game.inspector.planet.ship_groups.row.count": "{count} ships", "game.inspector.planet.ship_groups.row.mass": "mass {mass}", diff --git a/ui/frontend/src/lib/i18n/locales/ru.ts b/ui/frontend/src/lib/i18n/locales/ru.ts index 2f2512d..4f91cb8 100644 --- a/ui/frontend/src/lib/i18n/locales/ru.ts +++ b/ui/frontend/src/lib/i18n/locales/ru.ts @@ -195,6 +195,14 @@ const ru: Record = { "game.sidebar.order.label.cargo_route_remove": "удалить маршрут {loadType} с планеты {source}", "game.sidebar.order.label.ship_class_create": "сконструировать класс корабля {name}", "game.sidebar.order.label.ship_class_remove": "удалить класс корабля {name}", + "game.sidebar.order.label.ship_group_break": "разделить группу {group} → новая группа из {quantity} кораблей", + "game.sidebar.order.label.ship_group_send": "отправить группу {group} → планета {destination}", + "game.sidebar.order.label.ship_group_load": "загрузить {cargo} × {quantity} в группу {group}", + "game.sidebar.order.label.ship_group_unload": "выгрузить × {quantity} из группы {group}", + "game.sidebar.order.label.ship_group_upgrade": "модернизация группы {group} {tech} → {level}", + "game.sidebar.order.label.ship_group_dismantle": "разобрать группу {group}", + "game.sidebar.order.label.ship_group_transfer": "передать группу {group} → {acceptor}", + "game.sidebar.order.label.ship_group_join_fleet": "включить группу {group} → флот {fleet}", "game.table.ship_classes.title": "классы кораблей", "game.table.ship_classes.column.name": "название", "game.table.ship_classes.column.drive": "двигатель", @@ -277,6 +285,54 @@ const ru: Record = { "game.inspector.ship_group.fleet.none": "—", "game.inspector.ship_group.unidentified_no_data": "данных нет — известны только координаты", + "game.inspector.ship_group.action.split": "разделить", + "game.inspector.ship_group.action.send": "отправить", + "game.inspector.ship_group.action.load": "загрузить", + "game.inspector.ship_group.action.unload": "выгрузить", + "game.inspector.ship_group.action.modernize": "модернизировать", + "game.inspector.ship_group.action.dismantle": "разобрать", + "game.inspector.ship_group.action.transfer": "передать", + "game.inspector.ship_group.action.join_fleet": "во флот", + "game.inspector.ship_group.action.confirm": "подтвердить", + "game.inspector.ship_group.action.cancel": "отмена", + "game.inspector.ship_group.action.confirm_destroy": "подтвердить — колонисты погибнут", + "game.inspector.ship_group.action.disabled.not_in_orbit": "корабли заняты ({state}); действия доступны только на орбите", + "game.inspector.ship_group.action.disabled.no_reach": "в радиусе двигателей нет планет", + "game.inspector.ship_group.action.disabled.no_drive": "у класса корабля нет блока двигателей", + "game.inspector.ship_group.action.disabled.no_cargo_block": "у класса корабля нет грузового отсека", + "game.inspector.ship_group.action.disabled.no_planet": "планета орбиты не видна", + "game.inspector.ship_group.action.disabled.foreign_planet": "действие доступно только над вашей или ничейной планетой", + "game.inspector.ship_group.action.disabled.empty_cargo": "трюм пуст", + "game.inspector.ship_group.action.disabled.foreign_unload_col": "колонистов нельзя высадить на чужой планете", + "game.inspector.ship_group.action.disabled.no_headroom": "технологии группы уже на вашем расовом уровне", + "game.inspector.ship_group.action.disabled.no_planet_stock": "на планете нет такого ресурса", + "game.inspector.ship_group.action.disabled.full_load": "трюм полностью заполнен", + "game.inspector.ship_group.action.disabled.no_other_races": "нет других нерасправленных рас для передачи", + "game.inspector.ship_group.action.disabled.unknown_class": "класс корабля не найден в отчёте", + "game.inspector.ship_group.action.field.ships": "кораблей (всего {max})", + "game.inspector.ship_group.action.field.cargo": "тип груза", + "game.inspector.ship_group.action.field.quantity": "количество", + "game.inspector.ship_group.action.field.level": "уровень технологии", + "game.inspector.ship_group.action.field.tech": "технология", + "game.inspector.ship_group.action.field.acceptor": "получатель", + "game.inspector.ship_group.action.field.fleet": "имя флота", + "game.inspector.ship_group.action.field.destination": "планета назначения", + "game.inspector.ship_group.action.tech.all": "все блоки", + "game.inspector.ship_group.action.tech.drive": "двигатели", + "game.inspector.ship_group.action.tech.weapons": "оружие", + "game.inspector.ship_group.action.tech.shields": "защита", + "game.inspector.ship_group.action.tech.cargo": "груз", + "game.inspector.ship_group.action.send.pick_prompt": "выберите планету на карте (Esc — отмена)", + "game.inspector.ship_group.action.send.no_destination": "планета не выбрана", + "game.inspector.ship_group.action.modernize.cost": "ожидаемая стоимость: {cost}", + "game.inspector.ship_group.action.modernize.cost_unavailable": "предпросмотр недоступен", + "game.inspector.ship_group.action.dismantle.warning": "группа над чужой планетой везёт колонистов — они погибнут", + "game.inspector.ship_group.action.fleet.create_new": "+ новый флот", + "game.inspector.ship_group.action.invalid.ship_count": "число кораблей должно быть в диапазоне 1…{max}", + "game.inspector.ship_group.action.invalid.quantity": "количество должно быть больше нуля", + "game.inspector.ship_group.action.invalid.level": "уровень должен быть в ({current}, {max}]", + "game.inspector.ship_group.action.invalid.fleet_name": "имя флота не соответствует правилам имён сущностей", + "game.inspector.planet.ship_groups.title": "корабли на орбите", "game.inspector.planet.ship_groups.row.count": "{count} кораблей", "game.inspector.planet.ship_groups.row.mass": "масса {mass}", diff --git a/ui/frontend/src/lib/inspectors/planet/ship-groups.svelte b/ui/frontend/src/lib/inspectors/planet/ship-groups.svelte index e5131c5..fe5270b 100644 --- a/ui/frontend/src/lib/inspectors/planet/ship-groups.svelte +++ b/ui/frontend/src/lib/inspectors/planet/ship-groups.svelte @@ -1,29 +1,37 @@ {#if stationedRows.length > 0} @@ -83,20 +106,45 @@ deep-link into that table with a `(planet, race)` filter pre-applied.
    {#each stationedRows as row (row.key)}
  • - - {row.race} - - {row.class} - - {i18n.t("game.inspector.planet.ship_groups.row.count", { - count: String(row.count), - })} - - - {i18n.t("game.inspector.planet.ship_groups.row.mass", { - mass: formatNumber(row.mass), - })} - + {#if row.selectable && row.groupId !== null} + {@const groupId = row.groupId} + + {:else} + + {row.race} + + {row.class} + + {i18n.t("game.inspector.planet.ship_groups.row.count", { + count: String(row.count), + })} + + + {i18n.t("game.inspector.planet.ship_groups.row.mass", { + mass: formatNumber(row.mass), + })} + + {/if}
  • {/each}
@@ -125,11 +173,30 @@ deep-link into that table with a `(planet, race)` filter pre-applied. gap: 0.2rem; } .row { + display: block; + font-size: 0.85rem; + font-variant-numeric: tabular-nums; + } + .row > span, + .row > .select { display: grid; grid-template-columns: 1fr 1fr auto auto; gap: 0.5rem; - font-size: 0.85rem; - font-variant-numeric: tabular-nums; + } + .select { + width: 100%; + font: inherit; + text-align: left; + background: transparent; + color: inherit; + border: 1px solid transparent; + border-radius: 3px; + padding: 0.15rem 0.3rem; + cursor: pointer; + } + .select:hover { + border-color: #2a3150; + background: #0d1224; } .race { font-weight: 600; diff --git a/ui/frontend/src/lib/inspectors/ship-group-sheet.svelte b/ui/frontend/src/lib/inspectors/ship-group-sheet.svelte index 314785c..26e1509 100644 --- a/ui/frontend/src/lib/inspectors/ship-group-sheet.svelte +++ b/ui/frontend/src/lib/inspectors/ship-group-sheet.svelte @@ -6,17 +6,44 @@ mounted by the in-game shell layout only while the active tool is `map` so it does not stack on top of the calc / order overlays. --> {#if selection !== null && onMap} @@ -34,7 +61,19 @@ mounted by the in-game shell layout only while the active tool is > ✕ - + {/if} diff --git a/ui/frontend/src/lib/inspectors/ship-group.svelte b/ui/frontend/src/lib/inspectors/ship-group.svelte index dc2d40a..8c5a440 100644 --- a/ui/frontend/src/lib/inspectors/ship-group.svelte +++ b/ui/frontend/src/lib/inspectors/ship-group.svelte @@ -12,12 +12,15 @@ variant — for Phase 19 the inspector is intentionally read-only. + +
+
+ + + + + + + + +
+ + {#if openForm === "split"} +
{ e.preventDefault(); void confirmSplit(); }}> + +
+ + +
+
+ {/if} + + {#if openForm === "send"} +
{ e.preventDefault(); void confirmSend(); }}> + +
+ {i18n.t("game.inspector.ship_group.action.field.destination")} + + {#if sendDestination !== null} + {planets.find((p) => p.number === sendDestination)?.name ?? `#${sendDestination}`} + {:else} + {i18n.t("game.inspector.ship_group.action.send.no_destination")} + {/if} + + +
+
+ + +
+
+ {/if} + + {#if openForm === "load"} +
{ e.preventDefault(); void confirmLoad(); }}> + + + +
+ + +
+
+ {/if} + + {#if openForm === "unload"} +
{ e.preventDefault(); void confirmUnload(); }}> + + +
+ + +
+
+ {/if} + + {#if openForm === "modernize"} +
{ e.preventDefault(); void confirmModernize(); }}> + + + {#if modernizeTech !== "ALL"} + + {/if} +

+ {#if modernizeCostPreview === null} + {i18n.t("game.inspector.ship_group.action.modernize.cost_unavailable")} + {:else} + {i18n.t("game.inspector.ship_group.action.modernize.cost", { + cost: formatNumber(modernizeCostPreview), + })} + {/if} +

+
+ + +
+
+ {/if} + + {#if openForm === "dismantle"} +
{ e.preventDefault(); void confirmDismantle(); }}> + + {#if !ownPlanet && !uninhabitedPlanet && carryingColonists} +

+ {i18n.t("game.inspector.ship_group.action.dismantle.warning")} +

+ {/if} +
+ + +
+
+ {/if} + + {#if openForm === "transfer"} +
{ e.preventDefault(); void confirmTransfer(); }}> + + +
+ + +
+
+ {/if} + + {#if openForm === "joinFleet"} +
{ e.preventDefault(); void confirmJoinFleet(); }}> + {#if fleetsOnSamePlanet.length > 0} + + {#if joinFleetMode === "existing"} + + {/if} + {/if} + + {#if joinFleetMode === "new"} + + {/if} +
+ + +
+
+ {/if} + + {#if disabledStateTooltip() !== null && openForm === null} +

+ {disabledStateTooltip()} +

+ {/if} +
+ + diff --git a/ui/frontend/src/lib/sidebar/inspector-tab.svelte b/ui/frontend/src/lib/sidebar/inspector-tab.svelte index 50be659..031f382 100644 --- a/ui/frontend/src/lib/sidebar/inspector-tab.svelte +++ b/ui/frontend/src/lib/sidebar/inspector-tab.svelte @@ -89,12 +89,23 @@ from the Phase 10 stub. const localPlayerDrive = $derived( renderedReport?.report?.localPlayerDrive ?? 0, ); + const localPlayerWeapons = $derived( + renderedReport?.report?.localPlayerWeapons ?? 0, + ); + const localPlayerShields = $derived( + renderedReport?.report?.localPlayerShields ?? 0, + ); + const localPlayerCargo = $derived( + renderedReport?.report?.localPlayerCargo ?? 0, + ); const localShipGroups = $derived( renderedReport?.report?.localShipGroups ?? [], ); const otherShipGroups = $derived( renderedReport?.report?.otherShipGroups ?? [], ); + const localFleets = $derived(renderedReport?.report?.localFleets ?? []); + const otherRaces = $derived(renderedReport?.report?.otherRaces ?? []); const localRace = $derived(renderedReport?.report?.race ?? ""); @@ -113,7 +124,19 @@ from the Phase 10 stub. {localRace} /> {:else if selectedShipGroup !== null} - + {:else}

{i18n.t("game.sidebar.tab.inspector")}

{i18n.t("game.sidebar.empty.inspector")}

diff --git a/ui/frontend/src/lib/sidebar/order-tab.svelte b/ui/frontend/src/lib/sidebar/order-tab.svelte index 7442ba4..f2fa213 100644 --- a/ui/frontend/src/lib/sidebar/order-tab.svelte +++ b/ui/frontend/src/lib/sidebar/order-tab.svelte @@ -77,9 +77,57 @@ Tests exercise the tab through `__galaxyDebug.seedOrderDraft` return i18n.t("game.sidebar.order.label.ship_class_remove", { name: cmd.name, }); + case "breakShipGroup": + return i18n.t("game.sidebar.order.label.ship_group_break", { + group: shortGroupId(cmd.groupId), + quantity: String(cmd.quantity), + }); + case "sendShipGroup": + return i18n.t("game.sidebar.order.label.ship_group_send", { + group: shortGroupId(cmd.groupId), + destination: String(cmd.destinationPlanetNumber), + }); + case "loadShipGroup": + return i18n.t("game.sidebar.order.label.ship_group_load", { + group: shortGroupId(cmd.groupId), + cargo: cmd.cargo, + quantity: String(cmd.quantity), + }); + case "unloadShipGroup": + return i18n.t("game.sidebar.order.label.ship_group_unload", { + group: shortGroupId(cmd.groupId), + quantity: String(cmd.quantity), + }); + case "upgradeShipGroup": + return i18n.t("game.sidebar.order.label.ship_group_upgrade", { + group: shortGroupId(cmd.groupId), + tech: cmd.tech, + level: String(cmd.level), + }); + case "dismantleShipGroup": + return i18n.t("game.sidebar.order.label.ship_group_dismantle", { + group: shortGroupId(cmd.groupId), + }); + case "transferShipGroup": + return i18n.t("game.sidebar.order.label.ship_group_transfer", { + group: shortGroupId(cmd.groupId), + acceptor: cmd.acceptor, + }); + case "joinFleetShipGroup": + return i18n.t("game.sidebar.order.label.ship_group_join_fleet", { + group: shortGroupId(cmd.groupId), + fleet: cmd.name, + }); } } + // Short identifier for the order-tab so the human-readable label + // stays glanceable; the full UUID is still in the underlying + // command and visible in the inspector overlay. + function shortGroupId(uuid: string): string { + return uuid.length > 8 ? uuid.slice(0, 8) : uuid; + } + function statusOf(cmd: OrderCommand): CommandStatus { return draft?.statuses[cmd.id] ?? "draft"; } diff --git a/ui/frontend/src/platform/core/index.ts b/ui/frontend/src/platform/core/index.ts index 669cacb..c604b5c 100644 --- a/ui/frontend/src/platform/core/index.ts +++ b/ui/frontend/src/platform/core/index.ts @@ -73,6 +73,12 @@ export interface CarryingMassInput { cargoTech: number; } +export interface BlockUpgradeCostInput { + blockMass: number; + currentTech: number; + targetTech: number; +} + export interface Core { /** * signRequest returns the canonical signing input bytes for a v1 @@ -157,6 +163,17 @@ export interface Core { * cargoCapacity. */ carryingMass(input: CarryingMassInput): number; + + /** + * blockUpgradeCost wraps `pkg/calc/ship.go.BlockUpgradeCost`: + * production cost of moving one ship block from currentTech to + * targetTech, scaled by the block mass and a constant 10. Returns + * 0 when blockMass is zero or targetTech is not above currentTech. + * Phase 20's ship-group inspector calls this once per block + * (drive, weapons, shields, cargo) to render the modernize cost + * preview. + */ + blockUpgradeCost(input: BlockUpgradeCostInput): number; } export type CoreLoader = () => Promise; diff --git a/ui/frontend/src/platform/core/wasm.ts b/ui/frontend/src/platform/core/wasm.ts index ab88fc6..499bb26 100644 --- a/ui/frontend/src/platform/core/wasm.ts +++ b/ui/frontend/src/platform/core/wasm.ts @@ -9,6 +9,7 @@ // served from `static/core.wasm`. import type { + BlockUpgradeCostInput, CargoCapacityInput, CarryingMassInput, Core, @@ -50,6 +51,7 @@ interface GalaxyCoreBridge { speed(input: SpeedInput): number; cargoCapacity(input: CargoCapacityInput): number; carryingMass(input: CarryingMassInput): number; + blockUpgradeCost(input: BlockUpgradeCostInput): number; } interface BridgeRequestFields { @@ -210,6 +212,9 @@ export function adaptBridge(bridge: GalaxyCoreBridge): Core { carryingMass(input: CarryingMassInput): number { return bridge.carryingMass(input); }, + blockUpgradeCost(input: BlockUpgradeCostInput): number { + return bridge.blockUpgradeCost(input); + }, }; } diff --git a/ui/frontend/src/routes/games/[id]/+layout.svelte b/ui/frontend/src/routes/games/[id]/+layout.svelte index 1c84ef4..32cfe5e 100644 --- a/ui/frontend/src/routes/games/[id]/+layout.svelte +++ b/ui/frontend/src/routes/games/[id]/+layout.svelte @@ -180,12 +180,27 @@ fresh. const inspectorLocalDrive = $derived( renderedReport.report?.localPlayerDrive ?? 0, ); + const inspectorLocalWeapons = $derived( + renderedReport.report?.localPlayerWeapons ?? 0, + ); + const inspectorLocalShields = $derived( + renderedReport.report?.localPlayerShields ?? 0, + ); + const inspectorLocalCargo = $derived( + renderedReport.report?.localPlayerCargo ?? 0, + ); const inspectorLocalShipGroups = $derived( renderedReport.report?.localShipGroups ?? [], ); const inspectorOtherShipGroups = $derived( renderedReport.report?.otherShipGroups ?? [], ); + const inspectorLocalFleets = $derived( + renderedReport.report?.localFleets ?? [], + ); + const inspectorOtherRaces = $derived( + renderedReport.report?.otherRaces ?? [], + ); const inspectorLocalRace = $derived(renderedReport.report?.race ?? ""); // Reveal the inspector whenever a new planet selection lands. @@ -340,6 +355,15 @@ fresh. selection.clear()} /> diff --git a/ui/frontend/src/sync/order-draft.svelte.ts b/ui/frontend/src/sync/order-draft.svelte.ts index c9aa874..5f81bb1 100644 --- a/ui/frontend/src/sync/order-draft.svelte.ts +++ b/ui/frontend/src/sync/order-draft.svelte.ts @@ -24,7 +24,12 @@ import type { Cache } from "../platform/store/index"; import type { GalaxyClient } from "../api/galaxy-client"; import { fetchOrder } from "./order-load"; -import type { CommandStatus, OrderCommand } from "./order-types"; +import { + isShipGroupCargo, + isShipGroupUpgradeTech, + type CommandStatus, + type OrderCommand, +} from "./order-types"; import { submitOrder } from "./submit"; import { validateEntityName } from "$lib/util/entity-name"; import { validateShipClass } from "$lib/util/ship-class-validation"; @@ -513,6 +518,68 @@ function validateCommand(cmd: OrderCommand): CommandStatus { // active production / ship groups. Local validation only // guards the name shape. return validateEntityName(cmd.name).ok ? "valid" : "invalid"; + case "breakShipGroup": + // Engine rule (`controller/ship_group.go.breakGroup`): + // quantity must be at least 1 and strictly less than the + // source group size. We do not know the source size here + // (it lives on the report), so the inspector enforces the + // upper bound before emitting; locally we only refuse the + // degenerate cases — non-positive `quantity`, missing or + // equal UUIDs. + if (cmd.quantity <= 0) return "invalid"; + if (!isUuid(cmd.groupId) || !isUuid(cmd.newGroupId)) return "invalid"; + if (cmd.groupId === cmd.newGroupId) return "invalid"; + return "valid"; + case "sendShipGroup": + // Reach is enforced by the picker before the command lands + // in the draft. Locally we only refuse a degenerate + // destination (the engine uses planet number `0` as the + // "no planet" sentinel; FBS encodes as `int64`, so any + // strictly-positive number is wire-valid). + if (cmd.destinationPlanetNumber <= 0) return "invalid"; + if (!isUuid(cmd.groupId)) return "invalid"; + return "valid"; + case "loadShipGroup": + // Cargo type and quantity are pre-checked by the inspector + // against the planet stock and the group's free capacity; + // local validation only guards the wire-valid shape. + if (!isShipGroupCargo(cmd.cargo)) return "invalid"; + if (cmd.quantity <= 0) return "invalid"; + if (!isUuid(cmd.groupId)) return "invalid"; + return "valid"; + case "unloadShipGroup": + if (cmd.quantity <= 0) return "invalid"; + if (!isUuid(cmd.groupId)) return "invalid"; + return "valid"; + case "upgradeShipGroup": + // Engine rule + // (`controller/ship_group_upgrade.go.shipGroupUpgrade:56`): + // `tech === "ALL"` requires `level === 0`; per-block tech + // requires a strictly positive level. The inspector also + // caps the level to the player's race tech, but the + // engine re-validates server-side. + if (!isShipGroupUpgradeTech(cmd.tech)) return "invalid"; + if (cmd.tech === "ALL") { + if (cmd.level !== 0) return "invalid"; + } else if (cmd.level <= 0) { + return "invalid"; + } + if (!isUuid(cmd.groupId)) return "invalid"; + return "valid"; + case "dismantleShipGroup": + return isUuid(cmd.groupId) ? "valid" : "invalid"; + case "transferShipGroup": + // `acceptor` is a race name; race names follow the same + // entity-name rules as planet/fleet names. The inspector + // restricts the picker to `GameReport.otherRaces`, so a + // locally-valid name is always a real race. + if (!validateEntityName(cmd.acceptor).ok) return "invalid"; + if (!isUuid(cmd.groupId)) return "invalid"; + return "valid"; + case "joinFleetShipGroup": + if (!validateEntityName(cmd.name).ok) return "invalid"; + if (!isUuid(cmd.groupId)) return "invalid"; + return "valid"; case "placeholder": // Phase 12 placeholder entries are content-free and never // transition out of `draft` — they are not submittable. diff --git a/ui/frontend/src/sync/order-load.ts b/ui/frontend/src/sync/order-load.ts index 067d428..b258d29 100644 --- a/ui/frontend/src/sync/order-load.ts +++ b/ui/frontend/src/sync/order-load.ts @@ -18,8 +18,18 @@ import { CommandPlanetRouteSet, CommandShipClassCreate, CommandShipClassRemove, + CommandShipGroupBreak, + CommandShipGroupDismantle, + CommandShipGroupJoinFleet, + CommandShipGroupLoad, + CommandShipGroupSend, + CommandShipGroupTransfer, + CommandShipGroupUnload, + CommandShipGroupUpgrade, PlanetProduction, PlanetRouteLoadType, + ShipGroupCargo, + ShipGroupUpgradeTech, UserGamesOrderGet, UserGamesOrderGetResponse, } from "../proto/galaxy/fbs/order"; @@ -27,6 +37,8 @@ import type { CargoLoadType, OrderCommand, ProductionType, + ShipGroupCargo as ShipGroupCargoLiteral, + ShipGroupUpgradeTech as ShipGroupUpgradeTechLiteral, } from "./order-types"; const MESSAGE_TYPE = "user.games.order.get"; @@ -222,6 +234,102 @@ function decodeCommand(item: CommandItemView): OrderCommand | null { name: inner.name() ?? "", }; } + case CommandPayload.CommandShipGroupBreak: { + const inner = new CommandShipGroupBreak(); + item.payload(inner); + return { + kind: "breakShipGroup", + id, + groupId: inner.id() ?? "", + newGroupId: inner.newId() ?? "", + quantity: Number(inner.quantity()), + }; + } + case CommandPayload.CommandShipGroupSend: { + const inner = new CommandShipGroupSend(); + item.payload(inner); + return { + kind: "sendShipGroup", + id, + groupId: inner.id() ?? "", + destinationPlanetNumber: Number(inner.destination()), + }; + } + case CommandPayload.CommandShipGroupLoad: { + const inner = new CommandShipGroupLoad(); + item.payload(inner); + const cargo = shipGroupCargoFromFBS(inner.cargo()); + if (cargo === null) { + console.warn( + `fetchOrder: skipping CommandShipGroupLoad with unknown cargo enum (${inner.cargo()})`, + ); + return null; + } + return { + kind: "loadShipGroup", + id, + groupId: inner.id() ?? "", + cargo, + quantity: inner.quantity(), + }; + } + case CommandPayload.CommandShipGroupUnload: { + const inner = new CommandShipGroupUnload(); + item.payload(inner); + return { + kind: "unloadShipGroup", + id, + groupId: inner.id() ?? "", + quantity: inner.quantity(), + }; + } + case CommandPayload.CommandShipGroupUpgrade: { + const inner = new CommandShipGroupUpgrade(); + item.payload(inner); + const tech = shipGroupUpgradeTechFromFBS(inner.tech()); + if (tech === null) { + console.warn( + `fetchOrder: skipping CommandShipGroupUpgrade with unknown tech enum (${inner.tech()})`, + ); + return null; + } + return { + kind: "upgradeShipGroup", + id, + groupId: inner.id() ?? "", + tech, + level: inner.level(), + }; + } + case CommandPayload.CommandShipGroupDismantle: { + const inner = new CommandShipGroupDismantle(); + item.payload(inner); + return { + kind: "dismantleShipGroup", + id, + groupId: inner.id() ?? "", + }; + } + case CommandPayload.CommandShipGroupTransfer: { + const inner = new CommandShipGroupTransfer(); + item.payload(inner); + return { + kind: "transferShipGroup", + id, + groupId: inner.id() ?? "", + acceptor: inner.acceptor() ?? "", + }; + } + case CommandPayload.CommandShipGroupJoinFleet: { + const inner = new CommandShipGroupJoinFleet(); + item.payload(inner); + return { + kind: "joinFleetShipGroup", + id, + groupId: inner.id() ?? "", + name: inner.name() ?? "", + }; + } default: console.warn( `fetchOrder: skipping unknown command kind (payloadType=${payloadType})`, @@ -288,6 +396,55 @@ export function cargoLoadTypeFromFBS( } } +/** + * shipGroupCargoFromFBS reverses `shipGroupCargoToFBS` from + * `submit.ts`. `ShipGroupCargo.UNKNOWN` and any out-of-band value + * yield `null` so the caller drops the entry rather than + * fabricating a synthetic cargo type. + */ +export function shipGroupCargoFromFBS( + value: ShipGroupCargo, +): ShipGroupCargoLiteral | null { + switch (value) { + case ShipGroupCargo.COL: + return "COL"; + case ShipGroupCargo.CAP: + return "CAP"; + case ShipGroupCargo.MAT: + return "MAT"; + case ShipGroupCargo.UNKNOWN: + return null; + default: + return null; + } +} + +/** + * shipGroupUpgradeTechFromFBS reverses `shipGroupUpgradeTechToFBS` + * from `submit.ts`. `ShipGroupUpgradeTech.UNKNOWN` and any + * out-of-band value yield `null`. + */ +export function shipGroupUpgradeTechFromFBS( + value: ShipGroupUpgradeTech, +): ShipGroupUpgradeTechLiteral | null { + switch (value) { + case ShipGroupUpgradeTech.ALL: + return "ALL"; + case ShipGroupUpgradeTech.DRIVE: + return "DRIVE"; + case ShipGroupUpgradeTech.WEAPONS: + return "WEAPONS"; + case ShipGroupUpgradeTech.SHIELDS: + return "SHIELDS"; + case ShipGroupUpgradeTech.CARGO: + return "CARGO"; + case ShipGroupUpgradeTech.UNKNOWN: + return null; + default: + return null; + } +} + function decodeError( payload: Uint8Array, resultCode: string, diff --git a/ui/frontend/src/sync/order-types.ts b/ui/frontend/src/sync/order-types.ts index 2086a29..7fdc37d 100644 --- a/ui/frontend/src/sync/order-types.ts +++ b/ui/frontend/src/sync/order-types.ts @@ -166,6 +166,209 @@ export interface RemoveShipClassCommand { readonly name: string; } +/** + * ShipGroupCargo mirrors the engine `ShipGroupCargo` enum + * (`pkg/schema/fbs/order.fbs`). Three values: colonists, capital + * (industry crates), and materials. Empty (`EMP`) is a route-level + * concept (`PlanetRouteLoadType`) and is not a valid cargo type for a + * ship-group load command — the FBS enum deliberately omits it. + */ +export type ShipGroupCargo = "COL" | "CAP" | "MAT"; + +/** + * SHIP_GROUP_CARGO_VALUES is the canonical tuple of `ShipGroupCargo` + * literals. Used by validators and the FBS converters in + * `submit.ts` and `order-load.ts` to narrow incoming strings. + */ +export const SHIP_GROUP_CARGO_VALUES = [ + "COL", + "CAP", + "MAT", +] as const satisfies readonly ShipGroupCargo[]; + +/** + * isShipGroupCargo narrows an arbitrary string to the + * `ShipGroupCargo` union. + */ +export function isShipGroupCargo(value: string): value is ShipGroupCargo { + return (SHIP_GROUP_CARGO_VALUES as readonly string[]).includes(value); +} + +/** + * ShipGroupUpgradeTech mirrors the engine `ShipGroupUpgradeTech` + * enum (`pkg/schema/fbs/order.fbs`): `ALL` upgrades every applicable + * block to the player's current race tech (level argument must be 0 + * — see `controller/ship_group_upgrade.go:56`); the four per-block + * values upgrade exactly that block to the requested level. + */ +export type ShipGroupUpgradeTech = + | "ALL" + | "DRIVE" + | "WEAPONS" + | "SHIELDS" + | "CARGO"; + +/** + * SHIP_GROUP_UPGRADE_TECH_VALUES is the canonical tuple of + * `ShipGroupUpgradeTech` literals. The order matches the FBS enum. + */ +export const SHIP_GROUP_UPGRADE_TECH_VALUES = [ + "ALL", + "DRIVE", + "WEAPONS", + "SHIELDS", + "CARGO", +] as const satisfies readonly ShipGroupUpgradeTech[]; + +/** + * isShipGroupUpgradeTech narrows an arbitrary string to the + * `ShipGroupUpgradeTech` union. + */ +export function isShipGroupUpgradeTech( + value: string, +): value is ShipGroupUpgradeTech { + return (SHIP_GROUP_UPGRADE_TECH_VALUES as readonly string[]).includes(value); +} + +/** + * BreakShipGroupCommand splits a player-owned ship group into two: + * the original keeps `originalCount - quantity` ships and a new group + * with `newGroupId` carries `quantity`. Used both as a stand-alone + * action and as the implicit prelude to Send / Load / Unload / + * Modernize / Dismantle / Transfer when the player picks fewer than + * all ships. Engine rules (`controller/ship_group.go.breakGroup`): + * source group must be `StateInOrbit`, `quantity` must be in `[1, + * originalCount - 1]` for a real split. The new group carries a + * proportional slice of the cargo and starts unattached to any fleet. + */ +export interface BreakShipGroupCommand { + readonly kind: "breakShipGroup"; + readonly id: string; + readonly groupId: string; + readonly newGroupId: string; + readonly quantity: number; +} + +/** + * SendShipGroupCommand launches a player-owned ship group toward a + * destination planet. Engine rules + * (`controller/ship_group_send.go.shipGroupSend`): group must be + * `StateInOrbit`; ship class must have a non-zero drive block; the + * destination must be within the player's current + * `FlightDistance() = localPlayerDrive * 40` (torus-aware). + * The picker filters the planet list before emitting, so a draft + * entry that survives validation is always reachable at submit time. + */ +export interface SendShipGroupCommand { + readonly kind: "sendShipGroup"; + readonly id: string; + readonly groupId: string; + readonly destinationPlanetNumber: number; +} + +/** + * LoadShipGroupCommand loads cargo of one of the three ship-group + * cargo types onto a player-owned group. Engine rules + * (`controller/ship_group.go.shipGroupLoad`): group must be + * `StateInOrbit`; planet must be owned by the player or unowned; + * ship class must have a non-zero cargo block; the existing cargo + * type (if any) must equal `cargo`; `quantity` is bounded by the + * planet's stock and the group's free capacity. The inspector + * pre-checks each of these so a draft entry is always wire-valid. + */ +export interface LoadShipGroupCommand { + readonly kind: "loadShipGroup"; + readonly id: string; + readonly groupId: string; + readonly cargo: ShipGroupCargo; + readonly quantity: number; +} + +/** + * UnloadShipGroupCommand drops cargo from a player-owned group at + * its current orbit. Engine rules + * (`controller/ship_group.go.shipGroupUnload`): group must be + * `StateInOrbit`; ship class must have a non-zero cargo block; group + * must currently carry cargo. Colonists (`COL`) cannot be unloaded + * over a foreign planet — the inspector disables the action with a + * tooltip in that case. The cargo type is implicit (whatever the + * group is carrying); only `quantity` is sent on the wire. + */ +export interface UnloadShipGroupCommand { + readonly kind: "unloadShipGroup"; + readonly id: string; + readonly groupId: string; + readonly quantity: number; +} + +/** + * UpgradeShipGroupCommand schedules a tech upgrade for a player- + * owned group at its current orbit. Engine rules + * (`controller/ship_group_upgrade.go.shipGroupUpgrade`): group must + * be `StateInOrbit`; the planet must be owned by the player or + * unowned; for per-block techs the requested `level` must be in + * `(group.tech, race.tech]`; for `tech === "ALL"` the `level` must + * be 0 (the engine fans the upgrade out to every block whose mass is + * non-zero). The inspector renders a live cost preview through + * `core.blockUpgradeCost` to make the production cost visible before + * the player commits. + */ +export interface UpgradeShipGroupCommand { + readonly kind: "upgradeShipGroup"; + readonly id: string; + readonly groupId: string; + readonly tech: ShipGroupUpgradeTech; + readonly level: number; +} + +/** + * DismantleShipGroupCommand deconstructs a player-owned group at its + * current orbit, returning the empty mass to the planet's materials + * stockpile. Engine rules (`controller/ship_group.go.shipGroupDismantle`): + * group must be `StateInOrbit`; over a foreign planet, colonists + * (`COL`) on board are *lost* — the inspector surfaces an explicit + * two-step confirmation in that case before adding the command to + * the draft. + */ +export interface DismantleShipGroupCommand { + readonly kind: "dismantleShipGroup"; + readonly id: string; + readonly groupId: string; +} + +/** + * TransferShipGroupCommand hands a player-owned group to another + * race. Engine rules (`controller/ship_group.go.shipGroupTransfer`): + * acceptor must be a different, non-extinct race; group must not + * already be in `StateTransfer`. The inspector restricts the + * acceptor picker to `GameReport.otherRaces` (non-extinct ≠ self), + * so a draft entry always names a real race. + */ +export interface TransferShipGroupCommand { + readonly kind: "transferShipGroup"; + readonly id: string; + readonly groupId: string; + readonly acceptor: string; +} + +/** + * JoinFleetShipGroupCommand attaches a player-owned group to a fleet + * (creating it on the fly if no fleet by that name exists). Engine + * rules (`controller/fleet.go.ShipGroupJoinFleet`): group must be + * `StateInOrbit`; the target fleet, when it already exists, must + * sit in the same orbit as the group; `name` must pass + * `validateEntityName`. Because the engine handles the whole-group + * attach atomically (no per-ship counter), this command does not + * support implicit-split — the inspector exposes Split as a + * separate explicit action when partial detachment is desired. + */ +export interface JoinFleetShipGroupCommand { + readonly kind: "joinFleetShipGroup"; + readonly id: string; + readonly groupId: string; + readonly name: string; +} + /** * OrderCommand is the discriminated union of every command shape the * local order draft can hold. The `kind` field is the discriminator; @@ -179,7 +382,15 @@ export type OrderCommand = | SetCargoRouteCommand | RemoveCargoRouteCommand | CreateShipClassCommand - | RemoveShipClassCommand; + | RemoveShipClassCommand + | BreakShipGroupCommand + | SendShipGroupCommand + | LoadShipGroupCommand + | UnloadShipGroupCommand + | UpgradeShipGroupCommand + | DismantleShipGroupCommand + | TransferShipGroupCommand + | JoinFleetShipGroupCommand; /** * PRODUCTION_TYPE_VALUES is the canonical tuple of `ProductionType` diff --git a/ui/frontend/src/sync/submit.ts b/ui/frontend/src/sync/submit.ts index d402cb6..9e46e21 100644 --- a/ui/frontend/src/sync/submit.ts +++ b/ui/frontend/src/sync/submit.ts @@ -33,8 +33,18 @@ import { CommandPlanetRouteSet, CommandShipClassCreate, CommandShipClassRemove, + CommandShipGroupBreak, + CommandShipGroupDismantle, + CommandShipGroupJoinFleet, + CommandShipGroupLoad, + CommandShipGroupSend, + CommandShipGroupTransfer, + CommandShipGroupUnload, + CommandShipGroupUpgrade, PlanetProduction, PlanetRouteLoadType, + ShipGroupCargo, + ShipGroupUpgradeTech, UserGamesOrder, UserGamesOrderResponse, } from "../proto/galaxy/fbs/order"; @@ -42,6 +52,8 @@ import type { CargoLoadType, OrderCommand, ProductionType, + ShipGroupCargo as ShipGroupCargoLiteral, + ShipGroupUpgradeTech as ShipGroupUpgradeTechLiteral, } from "./order-types"; const MESSAGE_TYPE = "user.games.order"; @@ -222,6 +234,109 @@ function encodeCommandPayload( payloadOffset: offset, }; } + case "breakShipGroup": { + const idOffset = builder.createString(cmd.groupId); + const newIdOffset = builder.createString(cmd.newGroupId); + CommandShipGroupBreak.startCommandShipGroupBreak(builder); + CommandShipGroupBreak.addId(builder, idOffset); + CommandShipGroupBreak.addNewId(builder, newIdOffset); + CommandShipGroupBreak.addQuantity(builder, BigInt(cmd.quantity)); + const offset = CommandShipGroupBreak.endCommandShipGroupBreak(builder); + return { + payloadType: CommandPayload.CommandShipGroupBreak, + payloadOffset: offset, + }; + } + case "sendShipGroup": { + const idOffset = builder.createString(cmd.groupId); + const offset = CommandShipGroupSend.createCommandShipGroupSend( + builder, + idOffset, + BigInt(cmd.destinationPlanetNumber), + ); + return { + payloadType: CommandPayload.CommandShipGroupSend, + payloadOffset: offset, + }; + } + case "loadShipGroup": { + const idOffset = builder.createString(cmd.groupId); + CommandShipGroupLoad.startCommandShipGroupLoad(builder); + CommandShipGroupLoad.addId(builder, idOffset); + CommandShipGroupLoad.addCargo(builder, shipGroupCargoToFBS(cmd.cargo)); + CommandShipGroupLoad.addQuantity(builder, cmd.quantity); + const offset = CommandShipGroupLoad.endCommandShipGroupLoad(builder); + return { + payloadType: CommandPayload.CommandShipGroupLoad, + payloadOffset: offset, + }; + } + case "unloadShipGroup": { + const idOffset = builder.createString(cmd.groupId); + const offset = CommandShipGroupUnload.createCommandShipGroupUnload( + builder, + idOffset, + cmd.quantity, + ); + return { + payloadType: CommandPayload.CommandShipGroupUnload, + payloadOffset: offset, + }; + } + case "upgradeShipGroup": { + const idOffset = builder.createString(cmd.groupId); + CommandShipGroupUpgrade.startCommandShipGroupUpgrade(builder); + CommandShipGroupUpgrade.addId(builder, idOffset); + CommandShipGroupUpgrade.addTech( + builder, + shipGroupUpgradeTechToFBS(cmd.tech), + ); + CommandShipGroupUpgrade.addLevel(builder, cmd.level); + const offset = CommandShipGroupUpgrade.endCommandShipGroupUpgrade(builder); + return { + payloadType: CommandPayload.CommandShipGroupUpgrade, + payloadOffset: offset, + }; + } + case "dismantleShipGroup": { + const idOffset = builder.createString(cmd.groupId); + const offset = + CommandShipGroupDismantle.createCommandShipGroupDismantle( + builder, + idOffset, + ); + return { + payloadType: CommandPayload.CommandShipGroupDismantle, + payloadOffset: offset, + }; + } + case "transferShipGroup": { + const idOffset = builder.createString(cmd.groupId); + const acceptorOffset = builder.createString(cmd.acceptor); + const offset = CommandShipGroupTransfer.createCommandShipGroupTransfer( + builder, + idOffset, + acceptorOffset, + ); + return { + payloadType: CommandPayload.CommandShipGroupTransfer, + payloadOffset: offset, + }; + } + case "joinFleetShipGroup": { + const idOffset = builder.createString(cmd.groupId); + const nameOffset = builder.createString(cmd.name); + const offset = + CommandShipGroupJoinFleet.createCommandShipGroupJoinFleet( + builder, + idOffset, + nameOffset, + ); + return { + payloadType: CommandPayload.CommandShipGroupJoinFleet, + payloadOffset: offset, + }; + } case "placeholder": throw new SubmitError( "invalid_request", @@ -277,6 +392,49 @@ export function cargoLoadTypeToFBS(value: CargoLoadType): PlanetRouteLoadType { } } +/** + * shipGroupCargoToFBS converts the wire-stable `ShipGroupCargo` + * literal to the FlatBuffers enum value. Mirrors the engine + * `ShipGroupCargo` enum (`pkg/schema/fbs/order.fbs`). The FBS enum + * carries an `UNKNOWN` zero value as the default; the encoder always + * emits one of the three real values. + */ +export function shipGroupCargoToFBS( + value: ShipGroupCargoLiteral, +): ShipGroupCargo { + switch (value) { + case "COL": + return ShipGroupCargo.COL; + case "CAP": + return ShipGroupCargo.CAP; + case "MAT": + return ShipGroupCargo.MAT; + } +} + +/** + * shipGroupUpgradeTechToFBS converts the wire-stable + * `ShipGroupUpgradeTech` literal to the FlatBuffers enum value. + * Mirrors the engine `ShipGroupUpgradeTech` enum + * (`pkg/schema/fbs/order.fbs`). + */ +export function shipGroupUpgradeTechToFBS( + value: ShipGroupUpgradeTechLiteral, +): ShipGroupUpgradeTech { + switch (value) { + case "ALL": + return ShipGroupUpgradeTech.ALL; + case "DRIVE": + return ShipGroupUpgradeTech.DRIVE; + case "WEAPONS": + return ShipGroupUpgradeTech.WEAPONS; + case "SHIELDS": + return ShipGroupUpgradeTech.SHIELDS; + case "CARGO": + return ShipGroupUpgradeTech.CARGO; + } +} + function decodeOrderResponse( payload: Uint8Array, commands: OrderCommand[], diff --git a/ui/frontend/static/core.wasm b/ui/frontend/static/core.wasm index 0755a91ca82bb3cc6cf9fccf6d1f826ac1473648..95ed1a15ec84d62ead8e1206ddbf9912cda1d38c 100644 GIT binary patch delta 264288 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 R5|Z4e#kG($ z1&tIHYxB0KsH;(7lCEiqii%}Lg^FoKM*9D}bJ?MFe?5Pm=giD`&*#0I_q^vaGkb=O zANK!XS$}7kB)uo*Zm~&Lro_v!Vsf(5RqmAjt|(8LJ9)Ce#egR!&Ybzw6GE;SICrvk zxk9u~nf2uCCuhx{CA=pF8P`*U_o-mw0<|EI3bgAf!b&kD7Fg@>vY=(Vk8r6Yn1SSNu5fM2BnHZNP?W!k`1&=1Lw+VjxwO_ zwx-P-LQCdggTlmSAt*#asZtP-(!#B>q{xm8d61kYrP&#-M#yP)!7fdAlqu%|l0wcy z1jN{)9d0E!uuFU7r`yGbU_l6RX#B~t-2$0**+FFv0i_{SxMfn{YXRc<<4SGVx!{}= zWL4n!Zl~5ME4M3SI(BO z&YEnAzVmG_Q$!EZ3iCd`s~O8yzPu};X~u~l2U0r;p||O! zo|53m1SL~xxT{5E^&V@o&4JbpK@16w`pPXG2He5I>ME(tQv&RPj_N&Io*QUop_)m} z;P{&3%A13liM5r=xB;~GV1QmBKTjvn~CANNOX*Gj)qEQ z*^mt}I!Wvy&UCQk0J}&$BZiKH7m9}t@j53EwYhOm5vWDO{`6AGz3cDo&6r2|endMI zhK)?|7KWg(_o$O%kmo~~0zU=uuA{{!K~_hw7B$N4W7>vL?0DXw*a_k1*0LBSV@yW~ z`e@9fUO^N>O&(YY?{9fvZXijMv@nX@a_57R7e>a67#qjD`b56yB8x?AZOMGd;f0Y| zM;|UGn={6>fU1IVk9iBJn%2i^pz88t7mPq7{WarvHP##lDd-dubqWi=*j&6_37q&= zV}|^Rk3z~n6X!tB?8h%QE~*)ysC+azT3P-?B^6F;58#SPmu`mqtQI#9FK)>aLXrct zv4^lTmCjSMeDUX|Zuysq)Ty>j``dt#dv-ny6?H?P|q))`^~Ny zoD3q2rBPq2BwEgjEV@zEf@u&i@cHdt0pvK#i~U6u4tntc$XWT~RYN5WMeo1#3C4io z|8t<|?fpk*5yoG@sx~Ek#r*eBr;w zy%*AttHZs_e_kWryQMHA*lQtOb(6O-`Jc-JInq>Dh7VYD3VdtGWdd zN|izzsx3vtICxsbY)>S$6+`sa1ghq^I$#53w~N%QwUt3OOdkR{nx=0lgfMDLYvGtG z+Q|KwSbK;z2vTB~C3mJ)QM(>lT!pwj71%x(!-fse?&?7FR-YAWb*bIn8aF-el@0@;s6d zw)`}@->=K(ielYyWqfXYR2^I-IoR|RSVc>YtH+f$a@%&Vq#A&tt~^9_ea0Ne5Gc%% zdm_ljysI?HSf$k+-||DQA}4BgrNE~J+L$Fe3e+)+s+_a(E}Q2h`awHsa7rLe%#|mV zpH|*GxmqLk(ug&bOBK`9`om+Wa51wzoh&%c?+$X%Jm9Fph3fKSxS&O*qhfc^otfx2 z8LTJD%XaHcUyX9rVU@d;_g1xN>qfo?seBvFlk**-){B`@kC)fW4iW3g>Q%A9gsnsJ zYT`qONm16-nyr;yNmbe?k-2U>Tb7ER$vb*Le_(nsaz;%ZU^e$ zhKHzz6Q~j?TWP=A4=B_Nss<=mnYz09qc=$k^MYysD%h?yZkUe?4#Ne3j+>anz07rB zE>g~|ZqAC88>?eg`|Ck-DoJbnm}c`bX6y}elqiq*14Vj4nE<(!+%?V9Z!#gu3(5wl zT(>{U$Nps-WJl!9_D6e}bHVJrF95!ByE5{F#N?YyYT}hz z1XT5QWvM?@tQX}3s%E?LB@o6P%;XsIad{G&FKLxQ`ueUr#Tb6iYfuhR<8L2C3->C0Ocw@KlBrh z&Ap%+fC^k%I5zh&dBsNA5pi>Ulf2AzU@lTV`H<{C{GlF>pgEO`ANsN1?q$qyQ#jtT z)(^}_qLvOafrI$Gu%pRS&r4REdFzd0b$m{fQ z1isRx*w^_9$JSn{ML<=%lt=xc+IUe;plV#od+Yp!V_Pq(1gJXQ!nQsZzFRCiLT;{J zs+ZXf=6anu)rWaCn1l3iysbzNN8mG*kww&;vy1d_1T9lpTI8ptZt*Ir1PHgb{y-hP zplX0}mB96W!m*eM~+Ell30dc$(|vWv&Brk+Nt#*`L2&4@c0P%AWOp z?C;`b%-Bca__se$S1%|NAh*(MgP(A`)eFi7s9d-IRv-H_H^~mm&F$6A%bW{lkIvlf z-^}Xjq73Dj?rswtrMOb(yRAf``L1}MHs84gT3!_H)8{)k%GLR`=lWB69Mzn8fH%(=>uP0eBdrA^2{)%Gzh=`p&(uhtF zuQn(nRN^e1SOVg)Y~`(w{50;Tf>((fuxzE`qokCZEGaWlI)N94OE#@?hjRNqH2J0D}hcw8V{JLI-s(YLC&O`gY!!h zRS%TsaG)BUU+Ry6y=&iM|KWMiWY72%p7dz!2YuN;(%92|Tf4&K&jf$Q5skmXm*44M z{Z}S?HrR{5*4V%DW#6o`E02E?n@XJ{7wB3YeaIKRRYNNUpEOm6i2{I~iu;o!#N63W z^gsly>hwFCDGrl1Yd9xpxyl`z3HPW@D*>%Q`QK(g4Rq8r-VIcdQo7ks6dp5C zcA?~KO$e%oo&w~{l#;DU$-w@5a6hG4M5rR5GL=95p{h)j6Q~NM$F`*On`E6fQ6)gt z-_UAz+NXAoS_GBVaTEI)lidyW>R0fn4)?`peA%yp9Zwe0eXDZT>jXtboOdr_E$cl$-Uvz{yv^OXYyBqzd`3e=gXf7eiVPIEZZKdwoWzBPQ|%B zNd(ceJvNvcqXxv9SCzW$&50V}(x7#q<|v(9D)e5RSPx>RGRu{ea+6DcG;PZG3|(P~ zvdPu_<{P+zj$l~d!Y4d0oBWmF z&r&AtRHJCoPCW`iEKv$HqFX1{fS9M8)rdECYN1&Nq9<2ru}cljJ9cUO^`I6gkM8ml zg@2f;Gd@S?uTWO*@)Hq%ny^g3ij-5k{6s{(iOL2lOKDc>2lbbU$_1)Kd8pKnVb@Gl z0U7qbvZB;aME`BViU^jcRF?X&zrln#0V`5scl(LLe@s*fP>WY-VepS{JN|)o#3<)G z$Xz$t-C%d>?ALwS|IyfQ8YFL+{N>=U()n-r@-KG!jlvA3E*EKp@_;=vU$Z`g`K)NO zbavk;Tx9ZBfFRSjazYGv6THMX34wAiWvwL&?pK`-ghIuPsEC=q*A zXs5k;7=r3nhVS(g6R(-NGrpjiJj)+yiHXVtsz^EL50z=6vVqE0g57>JzHXv&Rn!o- zpD298L=^yaeuMJ5+fNj}X~K#CtK6uRyZuCAmI-sJIs^9kiNd8OssyN#VyzvQ`nKZ* zw4<3wn&Gy%Udalam(Kvz4JMf=s5E7-4xC#bo~-u-GM zpVgstAbLJgZfMY?PxbHwb+OX#Q$NA-u4z<8c@TbV@{&IkH&K~D6)U^^p>j=BHc%DH zHGilTCMp-GY^8UZAG_W&Q3a}93;dzpH&I0@%2nnk)bmV~6R4}(l|Rdx-@K4qX~IeX zD|Tt^yVAFPmTcDA*Jr9*WwN`$eqLu^<;$K8cFE67op17&gFmlCQ=jk4uYjLcf2oz)!@tmD5Y#fI;}?F~XRWC^;{b-&-O8*l{ERW{Ojsshg~~>M!ir2( zHc(Z2lwbV`TW`X00n1d{mHUap4JN7psIAI0f2fTnstBkIWt~4%v59g5RjmA2?q`VH zWTHxdI`7t+ag%Q|UO_X4-5doUne1+`7wyy7Kk{YI*h0^CZ@!!P*yJw%wMej1?_$Cr9^0=-q4@TD5E z8DDCFSOa4Hr%J(>Y9Q{_p>?1ZDrYq4bsbs{VojNnbkI-SZ8wd|_>z{J;|}@>VwZ`^ z1giEkCC{I*5)+mUm{U1<&`;d$Fj2WcWhwC$eo#A2Q~^+KWo(5X!*-ddBB1KOP;x8$ z)UwosIRPtFzOC>Rp1Vy{2~aiVT72yGZJ?a3>g|Z{AhpM2cZ0p)fX2SZmpvEk{>I3? zCVx5jD|P<8zWncl-_IE7HrYL3U;L$}-tEg?0QOjfm+u(4&*ZNJf2k6ANDa8Ihx8}} zF-sY#5$EW{8W6WCZ)?Pl59wnhh*bxb!-v$+yr@I#K`l_i4*O}v&rQ`C2T}71W%yw~ zt@wor%LHt(^5$Vbfm3dxvVn3cU;0ydz(nN&Rr8e+?D3=WOA}TA7=D52@uTvfi7Eoh ztt|2Qsbz(UaspL*NcqC!XQuwjgp~l6dsu77uYB8a+cv*paL8nLgFVZmu^;kf-wAeq zk9-cB{N>;;)A){FXVkPZsHD)L1#2OHtO1ehO|5^`ElKZu?_iHsg&*;#4P_vbPzV_2_-^pDo>cGT%anCDcAg|JZZuT09&l| zI_5{^DHBx$lv8=`m>-o@Cdvs^)i;Xkn4j=GZNf?b%lTGopwqq$7W|tTx#_V6WHNt9{u|>el-XlIKkRO7J_C z%ipL07x}FgTh$;|RVrP-Rby-9w_0r0fSRd1^{onhTPN13{2yt=Lppywh&3mai{JW* zuOCg_8DG&@)Zw_F#{S7fWdc>M%sB3+v1?3JHc(ejDjSdcQTek8%LQz!^0Pl-znG{3 zpsG(P?JE5U`_+UM0fry@RQj>M)Ex?Fy5wlA9O zZm@4Xqp@G~W#6r_-xP(HO#X847oOGlFZuF+3VuAe^j#^`nd~00SLp0@zU*IsogP^E zt|Tv;{FUIZ*ZD8|@*e^}J@-`DNqvw6x=gX3R0A>Xq`s0Q5!K3slWNSS>(Dw-oysZ= zx<`lBgIIM=Idjra^ZsEPm2rr|Gx3z4=Ka$|Wdc>IJmL>kZ=$kQ)O)A=1o2-cDi^4$ z-zz6i`7!L82`d1sSc$9hBkXSzRRmPsd1Y*spW&~;ggF7r`$22@1|Qd}ubZj>P=8@} z3>WI_rV66a>!xypQicolC&Q(O^jA)mps25$Jcoi(wX2mS_$?9M+?YR4{6{mR1lVe% zawYL}QVK-;`%Tn!6IBCL!w<^1)6J7_g55A-b%1SE-aDOiGb%$=pHq^`dL*ZE!k@}T zCMx4FRQ{yIpYfyeWfPVOSh4cp89yptF;Uq-Wh(EUNlL%T{KY0J7pRJ>T9YgmeIB6x z2rouEZeoAcWG?`F_U{_|tG?`ifj!1in(pi5*G&E*@R#cRule#X-9amso768c*_~iN zud^@lWzPkBDA<+FXJdn?5lX18%8|24tW>Ex+ccPHZqTm&sYF&c2eET?Qx#YaVu>=M znt-!)ng_H(%ANvBnUhCK|`ei~w_X=F7}i4VvBakj>MZAe7VV90QL%&w3p{DC*C=O()o?6o>O_hsJ<_9%+CHQ(#;26Tb4?|TZP>hHDCa#ID~IZvb(=k;g< zDM#tA(jL=k9?)`?g(_{OPOAj1NZEbfPdltMO{@mWvrhTveDj+}w^b&r2C%C|O5Y#+ zw0*t_s{?GS^1=^^X?aJCUjpDl9hx(Zi^aH5N8|>N@go3Gv>yQ&7g@@;KO_g$LtFt! z8Sngv3Du+6f5a>cS`lbPN`H+wUMD(1ELRq4#8o=61jGVm_m7w;Jw9W1p=LJ8bE~Wk zKVsJMMSWgYTg<896_Ct-R|v7RxMr-(zB1CF7mo^g3xq3Zt!+ zj;=k#LhQ(J6p7dm<0xa;5QCht^P>P;V6Z;~TT;a7s-^072yMG+h=bX(n6X)vHA}W= zyMXMB_LCGrD4nY$aA%0q^*saFX@Ln+dHG^e8z&)Hs+cLJVE0Bba;ajrm>g(l?W7Db zS=Ll3pI=N(M>*yjJGOzv*ad0_8(4ALN+NJB(a(7}JF*I)HkYn)8>y9OUdHC2+I))x zTU=~8%ptWj_7*@k_S3NG*!Y%=7n0bJt8Hz7vM}3vrp&q&+r~{gU}7C3b4!s+73-O1 zZVmIAyZ%z@(ErQaG7RKuV7p+N^svQ-o9o4!W z9@CDjx>T!Shw{fod&++(3(|a}T!*rfe<^Eoxn-MbvKEzfs|u@Bh2^@!5>w$*mm4WO zap^x5sv8_>2tR-s zG$A1f%?%D}5Y`Ee%{Y9erPARyYvKY5xh&X|DrV>w%<)EC+|~a(;&P}Ch`3z+{2wk- zH#?wB-ng0&R{1Y0HeYS2L|m~ZOdu=rR4b-waX;2;#I>u9yfFESz14qcQg<`J3!f{q ze~%AMo6*ScIls4T=_FfG)4}SnpsE|GsY~;!JNbJfb%U?|XRxVz8c?xee&m*Qomy4aOH-EWRkrhwM#|d%{-4U!oeNOb;m?FnTVrLT|7_XPqbrLeWfiJ2 zyQa+MRkq^KM#_T!u#fx?M<(l0U5s!F)xs&+8`at{mZCziW2(Snx7a>ljuhT$H;bj1 zsD=U9AZ}=OXqy(WGu+nE(UP;4Ec#Iy8`SLhsl2+ilt%OOR0EuAByDtdv?BR;zKTs} z*%=uPH!wImY6~p*Ay8={DSU-FTKQO{?qaY_b+lF%<=qjFy=`(&4DKRr2e#p)j`1Qq zn0#$4c96bst*zKx-%%IVL(JB8)JcwPZ5ObBCGVbwIb!V^rOQ7*iuJ3v#9jZBv8v@Z zHsq0pHI_jXTcVhz?qwF!ARn6xvF&#*&UHBBR9T2DV_avS&lPK9?I%Esx?xL zjwoD*B2{PoTFc!jVwgxfKta7bnXh4NhFHIrFSFo-3@t_WuvoKpc_gkU$jrt+5ZNfP zx)Gt71cIj#VHpw1y@UXMU1GyTx0f(cbbn~b3*e_^He4(%R0(MoHi8xMYzrI1vgp)= zU$d~sScU7M0QRB8a$Glp*b?u~VXSps*&*yX5e3$87UtbQiruhSUFiEq5mxjy0^TKp zU0^vp$;J*CyJoSSnqRiD_MNmnqO?`Czu>UVqaB;f*j$Pz)t3b^*mFu`J|vRe4pECE z*|&x$sN|EP*bI<8QS7Wi#yW@Zh-M36VXqh#z=mltmy8YTuu#%>SxXe9SczaKY3Pt- zF+^{4yNKQ8l3@pylGt2pmq&nz4}t*8-)O=zyMRYsL&abNGHi{by{6hX7vO+IyD%_C z#x7oPsvB*uR`NSzS%0!m+bJ*ci)+Mz+!M=wFpLg{(R-V+6R69II5uCbT+40oEIRw!Q;#eH-?g_rn*EOx@DeFO?O@Sf=u`9oXb1Sl{9?3k`H`Ml+iozc@I_AL__P zvm(B!BS!cPeyAfkoDc8BzGPLdxX!FnG`^;R?cJGZ6W8^wY@Ldfn87D!OX8~K`}7A7*WFdgx*Hp~@Cu zvV}gvR(RVaShHsHIQEuB1XKZC7CdDBJg$si1?_?&?LHJ9#u?@<=W_w2>t;3D>;(JmN6_^y}P zaWE;bsIl$}Ud*2K`UV@{7eH~wtE@=0U}(1oDrsZld3b*@kPpwq(1p&Cm&y9T+R9AC zID9+d4YWlg`7SAoy#lLUOO`UZu}kq&cvtS*tSJp_&Ue_oUM2(`x8|_tnf!hA83KeC+V8oH@5{#nlEpl-9@Wz~(z zV>voZj;ok6i&ra!=&oGW5A?rsVX@I?VzJJnj`+rV>?!Kw*9zDnuYVBvy-@be8g`$I zveb3#J+DBjMnw_(1o{`QXEzM}L|(Fi^+!8@v4P!zQ@}>_mmJsK8(BB8gFZsScvMf_ zJdZ(88-iztR1sJ{)-Vgm$FQF=+!e=@-<`2GNHM9OZjLX%vE4_>zL7 z!qsA1qt*+DUC(W2x3Gv(ZLos9W6+SL{1X@ZJ#KN4WqJyIoq|5ZFw<_ehhh03J2Ls6 z67~Ue^T&6v2W=*228J}S9@v2xE9I7*>`k1O?PNpYx2m1E)2wnO?PAYUopVcBAO&E- zZnli6AC1UdM;$;=7CM^p(R*1O#LwJo20wXXoSQ8`1AXIW-mimDAROJt?gTk@KU*D0 z9m#@k)f{;T6EZ$Mk<72|XXgyBW9V?5{gfq<1=q{iQ>?q@=M=c!jkr?f?dc-0rI4QeWtvxVKU*u0w-MzS$K z60eBQZK&(eK?%vh=pB`s&k;Da%;7od+E&im!72Rg0d-W0{gOGo!HZFehP9&ySrWe6 z@BzQ_6}uai?sJG`(CD)J5Ms%wCOPHCVVdAwGdzG9bPP+p^a$Gy`ZHg%>s~rdelH$l zNeOi)gKPuM#~FHfm2I;)%J|k}uoL57Er2v0hJM5F85h_5Z`eGqAX?>I`Ic=IQILOv zWqAvzAKi8e@sPv!onkjI;q0rzLaVya6>*xa^1?8iyIf~jSK|Mbb1v!=fA##bjAb#W|R)TbrK`SvT#8z;G+ag-Mj%cUOqpoiP z#63*_$w?F!8zN~Pn9^L_kEd#vUw@GIO%jWYB9eMBNn8f0t_-{QhS%@Z@G&Xk35=`! zVjFR>+M`PjP>&AhqZYF6O5Lz_u9I!Wm%S|UV42cRY(+E5n;pa#SxM3fUC8@&5@|?Y*a=QDZj|uovPkRD0gfWAL*tW1uAQAl z3_nG#?p?)260HtGLXy#!>C-Veu1~v*@6~i6gzf zpbl8<5NCs)aHsfEpyBTb&{q!;x!ADAb^A~;lzesfaEunlstX^pu|sIu2=NP)aqDO? z2?5e}v>GQPMvGGe=~GVS?^w9|5Y|gW&#|$t4r4@f&1eJn{0GD*$lenVibuUBVGMC? ze@N^n(E=$ZY$8QX`ai~ujv~<+4?ozwPbQ7T|5z~g<1**Rfwc$<9lBh+whD%qQzB| zA^uH96~2OKjWv-ln2@*+N(pQPpZco!HNkJs6z6$uMf8xZyIvQcr?T6!#9zG*p|P<2 z+u}8}SLcIR z2*Xl30};k+SBP8tBO78F}I_%;}o3 zQe2M~GwYY-X`-e5?afbbfRabbS*qfGJ zgExp5y!EAm{+q;)$>2*Liygci5(KyYM7+0I$*v&VWh@Vj$0VAa)F=7UPsGcH2ATvi zH{+(LvXn<{5syIL`7NUPojHoA&fCNoQZ&FNK1l0}yb{qZrn?V@OsD5Ocy!|^*RN$< zd-Q7yt}FHH09;q=*LV=`sL`+K%VKrW*BKR>{19Ac>er#T&epCwB!?lB zs~3dhxzC?^gymO1N{6_&?ON z(_V3VsNo_62fuhwq#MjTE5r)iU`BieQ~_W5l{f|9t6zynLkuwa|HuikJyYG>*VXGJ z!p<03@GZwU_;boBaUEmjJp8oyh*-CS&o~WCxohcZad!~J-t&{VfEBpPeiBn@SiMjq zzJoK*_(gmK+NyrR&}A&m6Yo<(K>Zc3&cd~Ss4dXPerPSzEN9x-w(kLc1w>__1U)I*;43H*ydqHFm(TO3)m132? z2u5G}B}$sr1On(GW2zX6Cl=m&=$X+H?xFdLXbH2bYhSeVL1VYOW;c<7D9RVaN`t*_ z!9o#k;a@eCenruaIH^rz9{zK@v>f#GW>QBloyN262@>6Q{gxm-;-!-_9&9e%LONba zlJ8M)4I!SlS%SC*MlHS$v37w<|DI2V152KVV=P<9St5atwKng5AN&{69?{lkk2UgfG z+$ue$8VDQyW#F&3N>Sd(!cAWZ`77i$X}Gv!HUDP>%$a{1%-PQ)dcckYnxD?~kRG=j zTaEV)d_+h1a6(T&PV;L$4Tl-V@QB`;ouOoBQ@*ITG=R(wQ_Xgr?k$az0&{dz)A~sR zVd`uBbW>r?zfAqJpR~gpK6n;12bS*cFAWoyi+tHbQY=qSlkTF->f4ZcDNTxEd9Jt9 zqz4!tFaGF|?nHlTcPCyNX7d?$N{_1UfEdz&Sy^kZQ+L9VM$biI7wE7(Al+}t#A9*G zyCbFf;w812X7ZT>rB-ya;(S<|+E|v+_WZ~gX%?>=C57`PgQRa830(l8)9;oZ_6m*T z=kAs!h&gMxtp_~**kEY_d!O$eEWOB<@;*bP7cGZKJ-^-)&OSOsIzW0?4V9+&)r&ej z&OP@^fjr|Lsk)I~ng(VKLuGOxEfAH7<7bCSk3v`$g^_PvPzMxqSA zun%~{2*1JdgMlG3Qz7L1jg{>(cH_sOQXnf&R8rGEdPGCv$Il^W9q-2}{- zAgQqOU-Gc9s^7YfDo@|`!+;oZ4 z^zi&lsT;DJW=i)2FgyQiuCz{NstIL+ldpdUZ>635t7oLnk=YP6E{q9uovL+g~U|8?^$VYJE}pA4XSb8D>7l`C?AHRTX zY#j_;5U3g3{T?Q~0AuU!;~h6k?M0j)+AMVfOXg;&rC5I--?SMcrIpuimJ-+;Zrvia zMPZjM$O(Md7Ie=GVf>>l(n#E%+}I-ZkEE&$v!f~_m@o?GY}bgb(%)ES-p7Y+mp*GF z#6#T})Xxn7)t7uW0OwISPtx<__}wn)mY`fco6TQzN#lbBh$eLXNPgZWJ>2^KCuh&= z<(NBn;`4&AAM|;8IhpXCz=W}==uDnoBDKIeCBFo%;N}NQq?W^bjYa?={lSTTuTB+w4p|74F8%4E?QI*q~45Zq2AI5}c z$WPFXiUUnTBEH@CGNBUZneb&5(lI2$PSdeA;3#&1ZKHw%kdcurNP&1Ow$2jbm^kV+ z$JH4kD1uPPPwkWv5|h-7Ahf{w5<-RKd~Iby0N#u7s9n-Cn4DkRCG|`{zupoO_CJ&a z1F-~W2wl7Zv<*Y)S`gj>EgZK_phd#lLLTxVrnEA`uKPFbJkd6T7G~lWZ?uFA-wRr_ zmnH~t0`FTY^>ds@VVE4G34RJ^D~u=xEdtkMm`*DIEt1?3|8Hy=-&rcbZOBRYE z0C^whFubt*NM|WRo^)5>jQSLU9<~eDktVH-zr7n>JcEC_TY6AD|1nS8Bi+Z!_)~kN z(X7z*=^p7AV~csN8=x{*g&T{5$Z_KkZAi&5i&C2F+5OV-COrqtWx@m`Y8Bk+Rh_ql zoa?AHQ46$ax{#0K900PALII+5Y%X71DXogKKf{E+NX;OSQswim?kA-EO(L&mqA6cz zYDj=C#PPsOQs++HK^o~LJC3{)5OQon<&Coh83+0Tq^ZbII={>{>5_CZCUWp9CQL$l z03b@!Tq9(8yc}7w24RRqqY5RbYp+#4E=LxuV?rrXJJ2X?b*&4NKVVT~)}tawO(C38 z!^f_15poZkEpG=CN{}du5LG37O$)hed<`h_PA1F(l~PVA6H;+b<#pTT1XrM49w$dF z*u#Vzr0po6RJq?Zzm})Rx+U%(w(4DDszS1K~-Rh5ZerwMcybbw zRuch}Oz(m6jL0&Os*w_bq?GB}Hc;LrMrMD*1%@TR+Czykz8(DXl ze>Plh6&X{*gf2+bt0>Lm*M`gEZHqxFKxzt7Q+%14KY6db+}7o1jLt~9j0zq;LT+W7 z14m;29?qR*GnVh1WRP~MJ6;LH3O{~UMHXCMPuZ`$h=Ev zFQi2vQ*yf=yyZfyam+wb9+F{KA^&Tt+|srcBvq9ARfzJ4{FZ5Qn=ZAWS|zWn%-5_T z@$Q5x5Yv!w1IIX&bw>(^E{uv>`J!p^*oZ7pR9U%8tRcgTc+E7qf6poq>yc>ck`Og0 zO85m&t>Emgox37dyY9tN5Nxu}oR?`0adhC1Jt=of9|PhXB+Y2YWfaAv-bkhFOCaYW z>D68Fx-}%OSptT=q-HH}EJ9J4$ytWtyVIJErjbVQfL`lm#k#_aLm~aeq{m`hi2I$} zrppl#R*P;~&KuT{maTZF>2g9ucZ28#vGYhicDmd)Vx~c?2l2K{{uYRR3qiyqa-(7Q zy=e_;wV}rbbdC+faU8kfAsokT7>{EWVD(6buioUBr^`+I+5!yMWLZO&hIT+!bBJcG zGlB^Rk%-n8Wn+=!e1S3;D`kp zFlrN419A5pe(%$A|A<0^=v-k98SUnIPs{i86~c66)_c~FB`guy#ztj#X2NesMC*XE z!AQn9IFGlSE06A*ZAi#_-x@Nt*hhdMGhqZ02`EKbB@(S*DAk4W&2!~jBZP3nhCFM? zbBX-QT=}Vp3@>pdnk$b#{S2C`*dUgGIJ%s_|BQT3Z)=3kp0kP?7P-bX5V|no{_dIq z-3_FhkRy4Ed2)hnf`4d?Pl`CJH4;R*D2zeU`|7c^){sXQ1;4^uT$b8$#{#*1L@`QL9VP3m zA(PAb3k&22Z80&T&;^N>fHs;M&n=KAN9BOxM55IdrP>%i_IY`~ZCVpiSd64Ad6l<+ z0WzvUQ3cm*M1QDn!k4`ux9J%Z3&}{DvmMT2YeX?L}2_61$#CShq>qK4Y_o<$t?vl!o!589 z(QWWlpy0WxX1rs%JUb#SL6=mq9d?c58`9;rwgn*OAZa}f4@l0X%ZU+A16t~WQ!039 z2Aoo35U+xGo6PS7v57qq;|!9vC~=gQSVMjmdG>FTov+HkqGd743XtdqgVH$H(F{3| z^~!6G?t!E`bH^@gh&{1qA`|)~4#9DF;s_iuasyI}q|ehAcJZi}<&+3pl3ta(Qfo+` z4*af{t>F(B`2{0$)cWEsTVz1EO+MaUTnPywMj3F{doqLrZR7?N(+ zH+y;YD{`mKcsVK9k@VIqa9cy7)2xqJnedqPF&w*~Ozk73DCst5mYI&Lgz61{ zV4`wwys#0A(v5%NC$YP#%B&RYX#WK`aBY&#`3gd=(>hgF($KQ+<2+Rq}0$ z;ad><4B!c`!SvyhYeQ+*8G*%(WSk=}BAj~dODR`gsEm5no`)PUM~0Y8uhD{>5C!BNDfli$d~O1l!ot4Mli zT}4rRm-VC3CC0BGkE7fkgA$T4C>=w2LF_LGn2WLXICeqVFthwCl*d^+(r9J91IKYF zT3{B}qc}RF=rb63sOSWa5t#&-h5MGAZ{USO?p_LiZ#9T+B6`~MUzW=F8v+jK8TXMI^aYRKj9+kNHTW`rv*gOWf>No_~-on}2aWsB1lD-W3=8QFD96xdyuf}5Ek$Vj*LQxr# z?#8mSG)e`20taC!0D3Kw-UPKMi)Z1thch89{1F@*P!`w4JGrjl@4X{;?l~BgNl3cO z&R1hf>(X&*M z8>+hU&N*_MhAH*18+JQ{K{!qnrl@rgx`{#}k{-! z&>gaoW zg#k!8V5C&)x;0-O9~hN8Koqtj8IC$OfPb)7ek{^DP!w7r88>7Tc+@&s>0Jy`Ig;Lv zUK>r|24LXM2P2a%0r)Fq9FY?Axirh&8=iQZhq;gJ@9c$2)s5jPBABt2}L zxj`Ybh%pGUf#;~gtHNX<+>Rfx2&wARxskxm^x_3!G4KA7+|8B)k`qa*xTBaq_mMnc zQXMFv!@c#+dM^k!Wt~=ZV#52KuHYzi{zh%aR=}to&I!b_h%{uirh_5)`|&apZXgkD zB+6zYwZS!|k**dWV_#J)(ep-NL4ag<|LO=n^Aq`cWbsJ2AE_tslww>jZkC%$k;g{k zo)JlV3Lpq}{=qg`iCi!S4UVL>7PGubo^?b>8-0jKtV=6|{48|*# zppb0=1EqmjIN@0f3I-$1#5E<)gRY;q%i&Vwu(6mHko0@z8Yj2zl>0^&g5*Y;1uUhJ zuKRbw()5Z)Fc2W=outMU6cWEe+9BD6JuUXM!0H2KG2^`DIVC>jtx%SRq#Nl*d6PV; z6#Tfa0DYQSRzqdmgn?2vl+6P@dz=_#D9+|rcgy|h7ecq~ksk=F*%=hVFc4+$3JQ6i zPuL@;a`zs2G;{Kpz4G$FV-g-Q*6ilaz4BdwwK6iEJ+5neR}JD;C7`I$j;pPDsv^t+h%AaT!r*S-dMs+j&r8N*|zpWnjUOSGeME492J^gHBk7)+UeF7H4HV>SOSC zfVfN;dkv-SNmBDEyc}$73jZ6Y2e+Ux*xS!Sy5`%fxMXiXjeOt)92!!QT}H)$3vpP9 z+OT&hYxO{~`q%7__d$$E7Yj%7n=!dCx`(DV_-Qfm?%?r1+vy_$X-LMi=mVa+H?X6A~xWas36_} z!e|&Qh70m4TnB%EgOrJS1TgtyA}qy0NJXT`!W7spGc8*Cy-g2QOsl5>rCN6c&Bc~V zS|EsbfxL$(tEDlhf1oJd4@x;v-g#U~M{HQEG@Yq`MooVC1+tnX;T@Mnjo4FUFdqDA zd6qv6oj`2b4*38ZOd9YrisNa533Td`P-l{1bOH9D4#MM)+*PtDAJ;ao7^+hNj`kc33s>FNl zr+Q@?#tc`D!L+5<>(H;VnjK~vVth;(u6!@6uSUzPokDtoOV`w><4 z*IwBgyp%s;9`e(2s4iuO zzUivIiRiWJpY?vyF`lmuwzR+hzVWzz#z)^gAAR!;`C`7R?^((Rd}qjCpvwQjD}OTY z8)#{N`*9Mz$Vc?cBszfBA!;}-R#^uap>6$%cwXX>vL&I%{#S9m)QA5ql|RYg&sO&%a7^^vg7lu$$E zMNxQF9q_PW%?8z)X|#f-KdZv`S}m;~-t#-4TYN-qHAOu=5f$B*1X0wF#r$OabV}S# z`G5t6=n_@*cV5vaN#;k~5ol>WbR3zz&qw}#Q@&c+Pur8ccMW;?xfI5MQ30xTx?`u`wF0Z^BBYAYNrPbsZtfjJR+ z`DwGi9HjgiBQNF8CO4lwLbiWx=sKtB8c2&)`m=WBdBK*>>GNIz>n}d4el=CSdljN; zYrJm0LKDG-(|TUYSG(3lBh+QB>t0d^mO4ZAWmWahUe$|9=MO{-;zL6$?T41rAbZWn zh`&uE)V63yNkDzV5w&V3xULF)oR;kLXFWqQe&-o+7W?=+o`ixxMgl|BL0%mYtc)ZQ zf#q+-YkzD`p|O+*VtyD63BhbA2%#Me9idEBa?Vf^_7Djcd6#fY3{PuniAvw}FbGY2 zHN`g4q&l!ETM6SeO{xdu7`c!Lx(nkO`H%>@51TP^V(3uAmPE~#OuA8^zpy<}&A$t^ z+&c4P@@H#bBii^H(Uws&HZmf$krAqk+i5zd89Hy#bfyMtDxvcgo)LzqxgSe7?1=Jl z@NJDW(of*T9*rCvOAhX-I#{bVwqpunFLq9Mj9%^DnhCENCiKxvIOa8BDpd1M;g(zP zJ&6fa9N=rjz(z*gnheAsl@MBJNF1z5yf4J4)CH2$pGVp($>|^V!}Ta%nfEo4sRsOL zcHP^a&*P_E;u!XuPLQ-Na6h{MLg;=&>w}us@4Z^LlBQuQHAw9WLtziUH^P#5hx8hX zCiogLQL9I_A@K=K;ys~8J)(&15yq3FED1x;V;wBc^p!EIQAN}ipRJjB-4HrQ6S~bS z^h!@2X0x=O@h1iP^S<(4Xe3V!bnJ@vIz|ojmwaRFe_8`4Vo+B5ak{1vUm4NUklbZvOt{*HZU6d$s{>noeMU4 z2^MWKC}uPpgl;x${0KI71i?c_(#ZL-)(n;8GW-R;NssdAFYF{)xmq>8Esu!Cpx2K= zx1^EX*J*9IqmkX`|Axq&jqG;Pc)P2S-G35Gsh360Uq^`DTJv6nRY5df?A2Tu8i2bY znt0rl4-`V%gD`-vi?+07_wvKhmj3C}srbuAHmUJ*(5ryuKR`BBG_px;&955SG@cNL zSc2Z(a=yC8ILv5KLC&>kiwuvK5RgBGSdOqLiU5KHYQ6t!77HPvgJGr`rpL5;Oi|5t z#ULbJBzr$ILn4?vgDpY)^*Bq@^!mOiJL6lIvyJManqKWSUCdX9+jHLGR?1h0TWp>7 z#)TTH-)o(3v0>K_nq6ziE{cL5DGCyWKyMg4N=_+$uBms zL~4Dt&ey)nT4TBmWmhz1XGj_E8fzJv{?9bX{KvPV*Bc2^r3u zby#SCXf|8laU*N_UdXHUw1}vuz^}zxng`mRgc0?=6`Q_|8X;UXr#RJ= z2vrfaG|N{b%;q&k)J%!gOnCsRR8yig)$wFx9BUgTZFEz#P@Q%kdR zheo1rrEu&heyN8(%cn;gVkfb!P7w1q)PvAjGy+PW=DLXLDy7z_&8@0q1GhHO>LP^Q zAWdymsy5B3j&BifNo>9PM@Z}=k~4+;uX_R4SNsLPkP5WY4>0L3a`TUT0-%w%zkt#~ zs=cAXSd9(fOFWgXMH!5G!*&{SfiD1SgR@_ne81H*-|Q6y)$ zs4gBSd|Qpo_(noiw@+x~c6DBuDAH{V8L!{3J}#<#evqMMlBOkre(_6xVLw+x@WYLo zfv;?4iA-0;&u%3Cj(1Smr$lqH)`Nz^Icl?#J}LhcjXF<@^oWfJ`qF8x+7?8xHQW!#X{dor#G^y2U(RNn$vrGvT9KytG*_y zUKXSOZPhDUguHAR@v3IT>-6@4{=)8sYW{tK<<=;B8%TVsu@Ss&qQ%}+ZM1hZzCa9U z>R;Gx{INt!v$$4xU?tBC?*zKo8wYy!$MU3fo}FlkNq>$?yN1*BC{D&9lJX954lchS z;6~}$p?HL76<-ErI4JTEaVak8xgc9BJ^nqyQH~)8UtE3p~Bs}m!tjKF5A?5&_M1do(lf)RBUubfXizRCe-N34u z&5}(}RURibfl?GbtUX6!7fMl7iFS1TI}7g&)~G%>1QMZ#98KpmIZTfE;e;S;LP0uy z1uw+>kivu=q$XCj#)KHwB*?ayk1@!7MkRJRE{5(<=_W*OE!$&gT|r)x+smmjw5Cuq zo#ieu9wXCT?j@-9bR-|_(`;)Xn{S9J{a78I0?HOyt-uJf@qi@K%1nF67=8hoBYwjn z>N*ZDla!CeXgXWvLNSIqGxcP-2=6p#KBKWm-XzLGc-sUpb;IG0I*?{tqUmgvXINtF zV4~)dXIg}qwDePg@E~CFEQ>5eJ%OwB#4z2`L_N#XEHT-*pLl^FPh!y#^%|}k$kOqa zX!R^VWQj>KbUzA6_!>YW*5MGf1&8Tmb(t7VXREwJv-&s+R%6Do`Lt)7dV+ zA;)w?$9xtA@>^)?_pAsas=k7zjzCktOeN{La&XKqSi!$Vxm7aai{hw|6yL3dcNtkY zLXLV5h*#-4Lyo4iO`b2uENT$6$ao$qX!P4dau&)~&Boqj<8(RvFsKp7aEPkLp&LmF zvP9z?D0Gqkfu%gnZb^zNr5gM$N7Fe~{!Nat^Esf8e4FT(GW(-jomL1?_~Qf z5^`9M(`@Ht`zAT+D5$GR#(6nfJT@FpISoxj?_^5gpkXkE#ZFyuC~v!#NXbc zUhk#r1nv4Gy1va4HJO6ZLz#XSb(f+nY{GL9<4JcXJf9B>)}C~WCFrL;5D@G^dp)`-DDf^Zaz9~Mkm!MXwM ziQh8{|Btrs0FSCl-@oV1Im0BGOhTARxny8M0;EtwLJ0|7dW+J#bQJ^@MMW8Gtb!t< za4kqIh^rzf7O-JiySpli6%g#`+Oe{V|Mxxj-ps%*E4#n_&-0w*J>Tiy`OZ1tsTZX; z>&}En8jT=6Pzc|X9q!;@Y%yiy9wRS*>E$1avNaq z0$_GU!DRp|&xDKzWXQtK)_SCgJcY_e0uxFjKipAWZlS7-?&+$C)*{jSLVb+?0`)w*jZ@;AVak0E{O&`i->xXb22w z{v05*#^9K;_AEqz*lLGA+Cz#65L-1{Tpw8?Kx{?uNBgiufY=H===vxW0b*<41FnxU z5s1@bWq5fyK?I1c_mH?wcf1G?TSL8!%n$)$tA$6HD+0t;2QMQFMS$2!^9XSfAhr%6 zDIMu$B0y}t`2fnVDOZUAEJm7gGvfPufG};R%Magy0AX4mH&x%S0YWPue^^+b6aiwZ z#7)$fE&{}sz#r`+A_BzL_iiqHO+?`P2hiB9zk;H@v=9Me>mP3EeM3cn*m}_;j1mE2 ztIEsA6cHe{vOL0U5g@jjdKo!g1c2MSvFTDN;zdTm*>I zy4@;_``FWs4-h8gC}^ZLhtN?{f3a7#1NUMP0U@1GbTPFsZWfw}U}3J|89i3YeCfg5xW5GDfqjI?i2WY$@OJ^{kC z<*wgAmjGc}1JB+qK$!Lt>f|4YE2TC-=xe}Xt_Er0l$d&Jqg~xf<<7imkT5#HAx%i- z!b34ZQL1&ep0d?sO?l+L`E7Q7F99r+mD8PJ(YHD+*b~Wv1Xf{2MzDahf8^ zo~;&x1rD#U!_!b0k*m<_(}+)h!Kfv&c@V+DvGckDes@oqFk+KlhT9M9>0^T*K_d_c zhodyHr`iGT*W`ZebidG4-SdCR1PU_WN4OuErJOWKs1Slaa&CY?qkRz@kwf4Bjo6ix z1C3)^!P=#Bz`2yzrN^3hql}wyj2H$_VIDUCDTHfc^_H*>bdF%C96gpV5**-+MmuNV z(ku)fNlgmnSe#Jvbtt3J7w|UvXVdbhP1zJtGdOH z$6Bu*OqL5t+_D{9@mi!c>jzwIbg(3DaRzJr3dqM4g&rdVh0)G0P{Q@*_A>Px5RwH5GzF@nl!_@ zA8Ucy(@G)lKgs^4ohlv^ybbyxbP1E~W9;-HL@3?KhanX=W&j zJekyy!=cS!b}^tRHqyf~G#kayB4lV!_N)pue^fuDzY>0!{@PArWtt(ZF{}F?S`Za?Sob?%{jX#B64mxvPBonMUtR@SSs9Y zA9DSOQjcihlp0MmnW^@J9aXp9_4RgGW|H#q$6{r7>ZDo>`@>w-$NBGMLFbjSuyrFM z6(NpNZfh&Kdyu`avuYPV11%vBWdb`(uLgbt^Bl6a-7yHnf0hYhv`>XV<{ORK@^nLK zXxLYFQQ71F2YiF*--PJV923%l^YkOuRH^XrKaBrqG6J<7o5~_HDbG1ZX`8Lnt5kDy zTq?Tn{+Q*0U&^-=IY=))nn2dGN+#Ow5%P!!9|Ah9(vQ=&epsz~tMrVB)69LF{4&Gt z&`UiV--$Y+5$6dXdqvS+&wb7lw3Ks&PFx_^)Qxt(4aFrn7!f+mYe;)FI=qo-7*na{ zaXI6bjs^#$`fEGzeSzn{ub>0?d(44qx zWN+xBYO-xaK_eQt>CS~)U;CFnD!;{K=p{5F%XM2$x9`ENEGNx7V2{~dk5iQ`OE75C zh_l=@pY!~l<)m2S~+V*ico8g;DwF*+9#FN=%KG#uQi`EQ)wYEXsNp=uaQgSqI z<6x>uGE-xtX#Z%86wXlpIby@qJu%dW-fZf2*#V=u){ao6@v2qhgh3;}qP`%y>bNzI zU57qi9?%*X^&a^>Gg6>4_%$##Y=RLm1xv>#1T*QC)1uq5=7>(02W$0pf=b((y^do38&S)B<$TJx!Lv0`*8U{kQ zK_GQugGS-=Ze-Q>;S6r4FOkD{pghos^OJMvSjt}vrNQM&K_wz*r9HHtipF)N-l;3K zTnp7*4vy|bc9vybeMqk@dGe=QRq%+2{ibigU*4|x~g@g zHNQg=-Z&SIQ*;H^lx1{w*NA3lLgj!A=lCwva8^$_Ye#f*FnJ*QI{2;OTbuP)i$#1< zLt)T}C&f$1f@uGxs<*WNiM8;gPC87*0hqNDUOiT0s%Y&w&V$a>+Vk`bFm)BDBlwGx z+CvZw@v4LIJiQ^FbvlT`opGeeUywVxe@1fY`NvS39K>`L9;O?SF}mg*-KY(h>CqWi z@xQAS^#(o<-l+1ja0k&uA@xxfPHQvL=Uc`eDH~Mt*>-Pns)5+ba?KP>53}Y`2VT*OzURex#H+$k> zmDl`p$SRHK;=88=EA@Thq?hcv&}t0a@Rea~ux}Ww@;g5|3YLqKecg2+=6J^APpv(9pg`%#pQT6$!hC!1W<9H;xGBpQxB~x5T_1b|2=h<_Is>(QLYQF7y1-Ei=*f5wi z-?Kg@ka{xgjK>#azAG<zwOm z_I@3p{I+xL^N&}zc56Hz6HOT3YMrS8qu@^$dNo-%WV;vaW^#JSepp}c3E#KS8Y{CW zouDSwZhv8@;R>dyYsO0j#?Juqt5GGFAwhT2mG(TE6|@_}cdaC>z8bkd88uV< z$ub-k;UWZQ5+6YaC^=%TcJ_FcKl778!hmnb*LwIm`UE(s^i+#PrS4^-={m&Ot06>gNd$1r70WKFMOJddDU!$7Gxn~!y%?9s)xCaP%- zyP&dY#DFo7O3`(Yy<(!uP5C?Ofuen)y?LU_DN0D`7m(7jRw%I$M^@nH6LB2Q^=XGD zspyfj@h+gb%ef7PqAq-*$+E7(SPUpfadiya)g%=D2^9Wy#dNdu|o7{p61VUd!$NC8YWM(LHB9=^1oiZHFMa^=w7p+3K{RsV@3Ylmft%46t zZWH}(wi{bJZn_%A`-mqURnw@%r6VJ`pnpCAbkx9iFQdEEY>YO>xb0*lv>6fhXOe+X z*ClvzfXRf7AVy;2W;l`mcSX?-w09%=Ag~*<6-t91kZrd)ge;-;jo=V`rk|;I5oA_=eD10oS#CLvi`vD0n?;|2$bW zo1Tj?1_cbgjyyOVHL98LZ^-8fcVPsekz;+LASt>2KQAzhrOYNL)02CkmxjSM^Z_iA z4Ooi2U0q2#tpz{E?Zs16uMUTh0*!A>QWiCK@->QeS(A+uR$vL|_; z%}0A3YD`n}NR6?6Wj6g5uxeymR!;00lveiB9$1gEg@&v~SxRUW+CQGCvU}}7Pe~&y ze2gMxC$g$juh7=-VAW|=Fi=V;hVhoU(5^#T!`c^LvQtyy$3rS<D`2x%$vM+L!uChgR4kn`z!GE3`5|sMoUXEy_N*U4FU4OB zj2`*%M7+_BPFlp!(Y$(sFi5EV8~*4G{E7f!?Lkx=tI6yn2}jO9$LTT6Dunt1-4hA5 zAA7#4C1LGE&sU9{7^jCXqi(S7k}&NfjLw^o6JJ9~Sh$th!Y}v){!}ytkFl!O5WN#+ z0<*=Rmbe|YjE;Wa$&n01&xdF;b6BMx3X#z;Gdk!8P_QfbuQ1AXWEGPtG$2;26#9y%RDsu4axTs9dBgg+y#5gG^-FhEIIWMeFF*Klk` zZbZ3;qm!3W>O>l%^Wu&ce@!Y|B2{>85HAMbz5(AzQFGr1Nj8~qxiDU*YY7~8qAExT z?gr)D131u$QHLu!4l6=|GAAnRCN!BEfj@L)4O(JjhHqSx(3sO;nG5pSo&0zz`7c+N~UG`&j?Y^oxr6nvJXi~Zb8RX)3VG9G3{ z)`BY}Vc7?$fV3>OG15c&eZmJVfI}fQ%Bt;Jew*!nk?-HkVsLlc9 zTLO0yM!p6KW}8u6K)n=H64HjdtW#BjaO73+O0iVk!0?sub=4(Xr_WaBh+qsdMV|Si zGPd=zlhj1f>v&2jC88BFaxFZQkY;~~%LJe{!i5*W+CRndlJZon4)qj-wJD1od!(sI zu`fMEwU58|iKF313I*Y)RCHh48=#}djy7@ObFgThzY0)z8d!q0J+g$p(79!Yh4BNS z3=Qe&R6IF($P3mWfD@eXlO79%dV$rQU=J9fH!(s0=2HuKYq%ROGxY8NVRVBJ92QhP z?GbZSdFNk73F9)5A}#TH$6A#1YU#U4|D#KA6`Yd$+>H#)KG)tp2RA#CRUyaeU#mh< zszOCzmCTG%6{;poR)wNeh4ftLXqwQdDEP%RBE@L%z@yHZje_?}0i`5hoQ07o$kGq6 zXU|pf_#QBWCS}d1@FBX|S9;he{00=w^j`oTMIS}Yc(Ge~SWx}VtygSuUg33dGAd$T z#}Z{9;C6iDF%Y>O-~EV5!*J-N_CI4*l}b*BCVMbHRN=~`h$VWIm=TP_V>{bERmI}1 zk%%V(D;VAgorMuq^HxTme-q0F7&FlKawS6dNI|3OMU;~!w1IuP=t{lE!A9iPGlfBu z(TKi9Hdmq?oXsd4XpAmcWEefLIbMHe@hueQtt6~MKwftBH`bcRbQhLwYeV@>S~>vtdHeeV#96XVi|l}V2=`%1gv zd`MO|G}rbpzOWAe8UpAA5p7NV23EcPk;}A)!LsY%>S9*kC`Pwm>RIA9%Q5Rj95wIo-lez>} z=Ezsg45hAv^$ZNQKHV$Et{Mhd!}Aoe`GnmF4Syu>TIgH$d8es@4zJw^O=m_YG>xvQ zh{u7k?ii)zEKY`F#}UpXG$K!L7RJ+??N?7zZB$x&L}>d?SF8P75Z#t*?RBTCm>b_` zcj0YuCqBZX#dk9V!_Y3OdPGt6yL}veO z+{=*fWe?fMpNY7iM!p{%W-mQc-5noWIQ|Gr#J)ryDq_0r=<_y>=_mFEsTJCLq_RL5G{H&=mB^;ZJ2;!77p&AN zPgspYJm9nxqwYoMjvph1a7OC362rI>-C($?=>z6+L5zWLC>jQ zLv4X-|Kx}G4?pPTcYlurkO*|Gz|3Wsd3!mX3_jCDmid^Uls(8_wY~6c745@pI=LLu z9=c_7j1-Y#_MbzBz?ubXb^{KsL+*o>6TQe?bS+qnT8)%&IKk}g?Xy*^&kEMadipKk zh}1Ytza>WJR#0O||$8~fxFyZRjURD3cNR+_A!kBUahidN2^ zRaTJJ)cav&7nqgK-4r8m)76G?Cx9nev8@OigC=a;Szh znN`|vJSD9S*vkM_3@}}cA3{76vxS0pAf}l;=K;ocWBkr6rH_Ic^iV<%gBE4u#sCs% zm-hSbnY9g!Mz3_l>Nrf+C4y~5gt=SiT8zk@kSm(3p6nS#HYy?RT8zl6>+xDJOjeej z(9zMwF$04}RyN5-WYT6lZv>O|6lZfHn;Qxaj&UVD>owMmQ%#>~_#pJqto`)tP`}qy zu8w5klw%wP;)E;f)zh#$kV9F@YT%q!Ow6r9Mq~y2(`4z+J?F7;2ybpgH{bYBKt6}k1-ZqWBzZk|p@B&-b3BsK5CJ6l{!i*GVk3Fz# zqh*xHn_2cNV#BQL1jJEb%zXG2(^!|VR>Sp$Ls(RDT!+9K`yGin)`oaY>`YikIM(qK z3}X*nn`yhz`FzOK90OA#*t5oqjE>iVz~3Zcw_O6wb4wHGIxy-sGkNgN;b}+pXOsP3 z!Mg6ioj6s^>Hi9bcf9uxa?XyiAm8QSd*25AUI({BPd zeiSjW+f)VSWoPt$UCU!d{(ghn9)@i(w36c!rw7aw^k zx}s}}!$wQjZ0)cEi6yI0ngdVgpqS2{`N{AVIUgevjhe^u3q4XfI9XF^yARpdikLC} z(;mX0X;LU+H{Xc=tr(ITOWbf&me>zbXfNGKHb(TG1GNvPNt$T%A~;8*dTVZrFpmki zmhdvDPcAm9mZExTnx~^~QM#|t89F%jCBm4F3O@t&Yu4y=#${Er_pL@8vrJJ?wFePb za-pXDg`S|DY!c__^v>0Z=UmNFpW|Si_9BgqsyJpmG(~-bq%w$|6Ci?emh*vdv? zR1L!@LQ^y(DQg;MvuH(HW6Y-DIZ&U3FB+>Ws3RIcQG6Q3D@HxGXsRYZLC@1Q)YLH= zjsbIuPSk!|LmMxep(jU?w3D%x154?3Ah8$shC01s7r-jy6;zr zy)MLzCUU86ZDH0bFpF5T9FF1^_`Xe#^ELOweitVp8yx$qu%7{qT;1;Y_qWH5x`POR zosO%r7$d+Z&}P(M1*@;}Mc8%k@v^qp9FGj9TnP7f<2pdi{pfLZw{wrSr@jVz+j?=R zIRxuFs3NsRJLgHetSS`5}Xjw4g6lwENERZH7tCgZBCsx}N=|8=^P z8?pfQr2dclJ!+NqswZRWWlBlM!7XsOBxG+|uEyl2XJCa7xl)f6b((jSA$tgKuD*DwPwcbhMUR0j$b2*D?s;?US~ER zyhRi2doEY4#$0O(gGTK#eM2@O%U96SkptY27hz5436=X{)dk+8OHt!TOYg`$Li0?-yuC< z&0Mnr8!p2c=Aa&fIg3@F95EahXb->ZF}d%!G;FwfDGmanQKOs+?RN-~>Pj8uRO)M9 znvT7uw3}PWW3;<5Evvs_U%Nu358kv4`%N&JuloX$$AbdrJVvoPuu;Y-~PdSY!Q^>bJg;#`y69ZvwTk4Gtc_Ijn)v4m4!N8HnO9N}v0XaegA zK{4?h!AV1T|IgrOuJ{ada;+JLPSf<95W}AC^oQ-4mvc3ajYg9VWicB@;dib2;vas& ze<1i}h>5#CjD0KI5r*Q$n6W_-xgBJhP$lyqvUP?ujuqQOu2T7No%JVKjIKIYPcmqB zYbN+4^BU{BAMh!r9n;zS3%O$q9Ej}Egr3)2bXU8dPek;5BBJMYL@OB43pyfQwig+Z zz5gnek$okYNfY|St&{h9vQE-hL4~chTdz`wvY+_^vm2Pu8?Kinz3HXr)v9S+SKAw! zRW<8C)}?&Mx$ib@@1L9xfqKg>{UHA|nUDIq48;&b6Ka-Rk&Y!i3A0c*=nCVEJ5(gL zqU1@H5#v&NsNrB;ChoU}BJ`cphGJ8y#U{qx+fXKpnxiG7om0Cy%k3TfAf_d_Mxdo6 z&n~+L5~gbe0Lne7(_O=t}>ZD-7QoqX>@p0ZMH5mUbL>5MJKN#5(pe8{p;nIY>Qeii#=CeJ zB5k1kIKm!qgk4Kenp12o1VN3Hcxv>&u#qro0=gl~y7y4!G@%_@%#cHIpiA5nYB>ALs=Z+N5eVYzIU~Xw&_aAeUCv?$AQ|8O=K^pbE((B zs!R1Yxs|#F)|vLN2$Q4p`ys>Vp)V9;q_NR&?0^x z7!x=2(p2a^-5{=`VBJqxpex}4^2_MI5$zEwZT<4*Qt+N8^stV3j_$v;{6EatxymZ) zbfrGbN=@B{Of_as9@VMjv3)&4*u9_K;5t=dZuyg4bDhc=GU_2{MKGe7)A#8U^cow- z=RwBWBxPa+=8H5qR+QQfVvtzaAKbYT2iqFiH(!Todhbi^ZP%&%N}at+b+c&y{-?;m zrQ+k`umPdT0-p`CKQYL&0EUd;Rsxpbf_o~2rn9$ReJUaz8^wVZ9& z?V@J(Ah$PrR(B6IOJV0OROmT9nTYAqx73U{-`;S&YM*}>x;CgiM(A!)ko6i;IHv;A zbu}j;%j^T!Ls%Lwx0~L8GX>`@M?8;k6q@k2H0G zyXgY=n>rY^@VfTE#?Y@Ac3s$RI?rJ}Xm->6K)$T9PQkJ?cWvD37!u}@^8nW0Y zh+wDkA+E4@d_2oAUV>95ohFEsPLtsDE{N#-mJfxF028`k8Ky|0>zsP*ENQ&kK^Rr@ zL8J+tk>u%&I4wqC@8#HvarADp?$uMVNDG7Ov8<1jWk`u9b3%IUB4q=tnlp}dAFO>p zM5Y|;Q?TmvyX#)(5Ujdq@1d=IhhiO$W6E)iId%F_Oks4R>#KXCo@_n+^P$TX@T5r|QJ>2ycC46M8g2hu!GRq#}0k6fopvp!noTSjY(@{xzEejGbLO@g{b=n~ir%pL8hAw3GTPp3yIA1cqXn2wbZ#(zoCQO>wTX*Ru+7u?Hx&E9+E5XQDWtsTyo!iX824~WS~3PB@&y_yO;8_*aMx8dcGguKsMl5Wp$NlXeT#a% z%?%h-XfmJm^&fLK%I@$=)UEFd1rjDw<>M0efWarA@b;QpRSz}y8_2)C>sHmeAA$XWG%+6b{x)yE$*RkcrT9kDr8W~OKkUQ)w9zp$n;d<4yhnA&7&WN}cWG$1X zQ+FLs!SwI1PAtB<&KS68LW@mj@ai#=vAl^`9KCh1uE6;L-4!o(YHt$!=qNAJQR+cs z_Ih_1U1Fxr4mcx5p!01Q43cVf(_X`%$r!D-znu+X4$m2*x#46?y8{6TCNV|nBsoEp6HKCx0dMY-k zE>k)pO`77zmDfWA1Kmx?SZ|X&F1q z>6WxGoa@L}K{kye=CY3xv)2f`d|L<+&4Li_jIRrX0&J%BXU>%wn&1n^c3zr7c5 zV}g38hT8948t%Od9=0SrY}QZ*yEozY9zr8xoCeO>i~p<&#BBSfKVvSocY!cyvMeD+ z9DoeGLpi7sr=NQ^o}Yv%3F(aqnGUvu;G8iCD|R@b%U+k$C>$E8zf>ai0!5NbH-u)AxJr?9N?2dLd>9L+ zg=Zr|{(=_(?46C6ak=958@;2y(Kpa^7u#t*L zXT#z-^i4{DpZs;{#aCf4b`!=;JaiJp>p*c`m2WpG&!Fwp`K||UcfxlfqlWOIlRP5PMMoy8jM5rA zexJ%|?$tFCE%9oZ_~&OJG-#Z}Gwnz2Q*B56(gR<|bn};gSpJSFd-#H?&R*u>*|U4x zuNHRmo~dGTL$e$~BKE|L*b^|~i+yfiihk|MRrU|}t2RS-W1iU!bhs3H%lfPx z?Kz^OT@AHQdqDM#zcc|#r4uKw$|luGeZ)tpl0>f)G)j(NVi-4KqQb0ut%CSfv=Fu# z;`1@&xqgaQV@zSou{%Bp)qgEq=AviO1v?wk{eQT%%ZsDuZ$Vs{Mscu{(>`^)*J2)2 zoCAuRA6&`+C4b`*D6F4(iB~Z3ieunvedixYbpHSJb{N01g43ss|G`0kZ9y9OAA{li z+KSFoE|bfjbPVYotrmr`j*)qf7cr4EXg6+;OSb3Qo3^T0@A~RInw$=Km^%xD3L$lJlQxls?qeUa<`)d>YwzZBrLbz8G3d?*=-_|6VfmCGN`@ zOLAiAM#*XR6%S#h&AW_Ep7E7NS4_&5b?2R_{+%#>WU+$nWJ&NW+tpsPnO1C`8YO#U{oU!+lj7Ag+PxRF}`Z3 zGN|+z69(NSjG<0)qAm@dX;fBfYs6I_#)vT$mBv&C=LPWT#*NPOUPXOb1L3ndXgD}` z!`*nmgW`v7yY8Nc@gf0?YT`?sortZ~RA_etF{-I7MwgtKs%aNtfeXgpNTGPx0kdCy zSVd-YCgE>HoioO{pudqWUh}HAm?+jA-@%F+jo)&EReD(OX!tD#)jJvvjB)znPyNR% zFTxljjOE%x9#OgB*3kaB0Z2}gjwOYw?Q^P*FZAa{P1EiXAgdKiNjWO>$%RconJRtB04w#LDU_tTv zpFAd~$CRmC!MCt}0pQt(!H*)tdI{+~hjj3AnIzV8nW2peaEqq`J^K4}y3&-y!Ovki z4ggOgMl0-g+f}4&`Y%|zFcE9OD0)1K`Ihq@S7(xrxXWqJ->$3^*UoTw;VY7aCBw$n zD|#j4fL%4P_`}h7tYNY)KW=$)f#6M0>Q%yDK`HwO>r@=6`u%;oY9amrD0 zk^T7NIB40$ZvR+=W-UqwU`TN@S27ZdCQcYxavFl1@~F;q$t1h!6RNwYwI@G;XCePk zhp2x=BKfh3#4!5r=1{tTm_yA$=X)OpZL;i$XEpy1b0|mh^gxlpQMJgOLp6pa;;FIj z+YebTZhpH(MQ?>_t_me93WIq^BH415z<^jLxrq}8i zw6`SA*9%ed>!JxE(&B8{z1Q#M$7k&PXvV#jv<7ujE~N>gaG}A#`guYb8_dL4Q%rMXpcL> z;l4khL(Z%nxeI#>`thMmN$AiU*4~0;I8AOS2@UK$|BI@-joEpNoqwqID(HqfL`Ys` zU;C_TRsTxNOV6s7N4yfV<~fy}etjC=eCzBqf^+P`=hTd&F0b60ScRycd$GNEb1&li z;Kyw)XFLW?wh-ACPl)tOWpvaJhO^p-&C^vlkU|&C-?@+{2f%WH+W_na&#Mb&-q{1! zcVNUFcq|(}^@%Xo(*EvuK)FLa?!&eiw^zkR=g!Nb6M?rl2WIrr#QhGP=YhmFeV?UV zT>|{D;A1^GGwrXQS9xPzhPZGP&zj=tchS1f+*{is8l2-&&1h>>+J|pZ+(WlTalQd@ zU==iIdC(PMOEa<-PY~2v^@_UP+zF2B3}{~tuI0Yb(EudT6;}AvcM&5 zyWwkGiian5`+S6qi%?)`qxmijgf=aKs>ZOHQ5!8!dk9CXN4S-hAAR){7e;ZG@i6%*_NzSafkBHzD+OuBw(&zoKs6gY3*+%IsiXkjPHxPK4HZz`?-1 z`Pevs5hpqeW?Ua|aDo2#$258@(BA}^t|2EOVy1>Gz!Q;A2E}ezWVd}?WmhBylaJW3 z;)%N7 zrkucKO?n}UC1r~dSX`)I+7K5u3CzQ_I>x;Ut3TCqO@o9WMArDWsh065Z~Omx5_}lZ ztL=iF*k0}dZzsMCL1YJPjdU0_6~`u>dJENI2eAxJeBz-3|M?5D2RPQI7h=;pn=v>| z?`^_Nqo~{L0u#==*6ZXkMISLZ>EfDx@iZ^WJDKp@Jq>v~#; zru;tQNN&ph!tc z-Zxav)Z_-dSx5FCH{d^LzxJ3n)!*V;xYq?&q+@F zXJk2l)keF|J8Hi9OAq_OchsbGZ`qd28)_H4i!CFp##X(nnwh&-*^}N?Rpnekb(vGY z3`+0bGAMEKP<;MG`$dLdJJJ5?U6q~31;Hgy4e8HYwXJFqb3gA>g48 zI=JHEdZo9dkv(>oDje~C$D|r4MgjAG0%az;P6SrITu|`T$1(6S!OF1x>Mj-Sy%NKu zJK4iKIbc-D0#Mv(Pw~&_Uh8YVnvBhXYkjS@V@^ie?RKm3E`L~$_0y8%xgn+s_6@sL zvBA77ocIh|BTC@pMxmZU15979+f{Zg3huz7Kk+G*21OuXAEKW zrM!levy&-ybN9)epJsege90@lyls zZu?Zs{}UMZ(;9pFK2;cA4D8Js7N+Y_#Z~6+-G`%Yx1l8!v4iGeskcVqJsB80xLg>* z67AB_&N(D;BdrCzGA`ER0Ey9S%inNz}XX7P_WnbA8>5jxl?Yy}E`!AgMNQBv+;Q4euP;RR=46%9_< z&;JRo=M&=L#A*2dFBd&GzOQoUe!_V02oo1!2WVb|uJGc)@dS*4`yge3%xD-)AB+V%?A}hgTQ* zVn6eNYHfagkNy1z>J)R=7W>2xRZeu*7UA5&swqFY_gKSNfVx4YcHE95F!$N3KU61~ zn@?Kv(P0~{PsP#nI@Y>+Xu2S@My$lcr3fl2g(NN#P)=QCcsl4usxZQtHR07aXP*@c zR>o7#%YgVyf+Q}w6s2>cxc!uW8wc<3^Jle2xF-Qbosh&uORxj(#_>7mN6kjz0fxs< zUHH(0AFDe=yc7!-o6sK2Et0TkI1Z}0F}=lRa)eG+U!cN$aOE%f8Nl%fMg7{uCJBQ)UY!T&NDmIjWgTd9e7qfD+Ivt&v!xpozJ<5f3tlJ* zYrlIEFPA|7!xMdkY2qq;!W2=eSpi|6{i({Ykx)hg4bm()+yn=IR)EmQkAgP641czn zM({!W|9Jy4ftlTmzV*uG-sbj>Pu1D+Jm@xDLgUMKUVlgI9a;b`?Fc_SI{|!5o$!CK zwC3Yl-b?${jQWW`6Tf@V)^4AnAC6B)+ocKSUpxbL2`7GosQxc9` zbF=#ZXG17sPh;DJgtQ=bti~XSIW7=v2^>5Tmhl+4AiH{bY$@z`m2LKLVO$4@$M#0p z1z%zw?lgpIR>nj)7Sff!w1(^4D8~l~(@rXI?GploY0q_X?GpopX)$OmIt!BmglTQ2 zxc12b!ZZVFr*@wbAWZwLIqm2}%@YH}tt+{YFirV(HN@eRu;2AP4X+~(#{`sw)?6(& zrz_w4^zt*N!aBm~@G=EnNNDmkhGbMF7UaO6`Jj>zTmnkqO@PY)zK0<5^qqe7RL>3h z>?t0cgBz!B8}UCeeG|qbq~j{#)A-L{@NWRg^Et=Ee>I=$AdX={ro=mb!X?agTet52 zN=-3Gbw~AXLcTyupM4C=_D3jqJgqf>B#GiiNF|hHEx&-}NxMnWT(b>%p zs801gG}7QBsV5&$8{*w(ICCG;yy1h`8$N(bN5aqb&<}z6wC#VgCsscN`lp?lswt@W zu#cHr^}Q-CYXn7k8lavN1a$u*a*4miEWrtIAQwV^CWHZHu{@a}2pU zLhv4;q6Wd6a)jW`|3Q`i|JwFTR0_8JPD1|YU{=QbFF8E_z5lCGK*z3&r9YuI{YOmDRbV_szbgy|K(_;A(FI5d)r8lZB-FFv^1Jio$Fh$|6TQ>*6a zI1ct<@wvFV0b`D=hLZ>$hrg#HK6dg4P*3a)!Q6#)@IzzvG3iAtY;r1kMi>z2M-1x@ z3yt{&5{VmP{E`n1gGP)IvF{f_d7h%j*+Up|L}vY23NcIT?Oan6XYzQ=)~+tK+1k%D<+^A9K3rh7o*lLo?-v}AWknAp}R68g5zuFOiaqgZF8>Z zm{}sj=sz0zIi^(3tn(_&#%Rp8K6)QeGv3gjjW^rUI%GVoI=1%Ox)|0G3clOj0#~Dd zpHor#q)hA>jN>AMF}|5!_{b9dLb$GY!|3o7&hUKfr0c8O3%=2qDW>LZ#e+-<<0l9# ze!m}K-vc3qopRcd zl44F`u?o7_1;45GCLTB$@tZm=?t`jfPS-A+Z<^O#2Q{sL`m6a2sro@2^I5I5QdKse z)lGp%x6GHc2Yy${{3}_cC${Ea^>M5~i>HOr6A^ggF%5N0WA^cJ=9W@Dkte>OqMChZ zFIWIQ%bcJyk`EQk98YL;IO%D7<{?!)m5s>!yI}4r$06vK<79$mF_#4sa@*!GbObH9$ABD&5Tb`KcDXtpkudmG62v z=&Ey2xft%7-+_Bcw?x~U3gJWD8fI6~vLR|XP&WsqbEKkpp?&Y~s);#ap}pgGytVP+ z^H7exCbbtWg2ud1=x-VIyA#p#z&!}8$a2lB3k8`~t{HiuW~9+!(Tl=}InwH{YYUds znAZp&`Cbv80tMe8X!}=)HfJwA)atk@o(G|sCO8#Sg#el@wl0-^&%#{e>}2wxYhW!b z9fqBQV*yUOxU`3s5nuhNKh{iF(oLF0HP0h1-89bblr9KK;e&?r!TTk68?7jZl^g_$51)&L{|)^CG~wX6Z}8zJeU8|9RB;0 z_#eW;m9Cpv!flnl`c~QD#=i>ViKKiqzgAK41c(<8zbFm~I3n{|$3$QtVh5W>_0?uugpyRy}sN)z)8Oz2p?Qw*Tf8Jmi!+-7pUMFbufk z`G$6Y9rPHT7{t$s?lO&Qp&N^SF<_)jlj$eToT6%d5s-a{_6A#JkkUqFR*7S|MbuXk2F)r4Z?m~ z`KOI}#G{=lB(Zabai?heNN@K5#!ff@x6vm*`uf^ld$H@#*C&bFENzK|GyHAiXm0w* zMuuO;?W_I%1@U*Ax)b_geo3rPTAG<@U$+&;HK=$qQxX>52+Ut_1He(%dtZW+yWV@3 z4-o6UJ3;za>%C|qU(vU{w1GeO$fF1r17qe}i2unm-*VD1^X-cNIxl?yl4rh-hyQry z8~=l?On1Ajol$tdm-1r($*a}4B8sf()oRTJoHqck!wMSkVXM`_AK@{1$-glQgtB@E zI35i6^WsO@)INb;v8g=)|8?A!g8@)~9L9*UTh-g)IEcox1c%_e z?Pt(4xHRaiQ32w#2hpJCATBw$X@EF*CM;<<;FR7Yki5}w`Aj>O>JJb81#=}mTZu*U z_Zd2_Kyh>(hAl=LXczj+Ox#>!gq@9|nZRx{)}$j=jqN3={+t1Sf+y}RCU!NV{QM)w zXWSedg`P;S)&z~B(qGUpoFgW~I7A#7-9AK@G7_G+cH3)Bnm-aBf=*TkPl+}_=`>7r zjz7!6X@9*Lw~HB5KS@|fM(~%mv&wZCAqms|>~U#KfUwPpJrL+3v+b)boh|@a66;gg zDx>WFld$ZZS+=^g7ydV_eHJH*+Iz7q&VIr_U*5ZF>-IE%IPnec z2AGBO8{9#EcIZ{i6uHAi+QVsEWx9Wvm^?KFqYnCP5dV*#l|C*NqT^j`z>s3#=x-nU z%aH#A^XA!GcVzglQKPS#ji-Aub!rPFR!jeIQR0Z{e^x^<4AcLgkC^^H8u1r4_l_B` zeBLnwV(ngFI-y zVd<)_Z~b|M`rDz0Ul6h{KzdXCXr^4lL3*X%LHZ(%oHUMQ(ddZ!8IGW=AKVH%Y~%M} zj=wPeA}W7{8~6TWsQY7DEc=`(I!E>OdGp;y`tye;j#UW0zc29(73WGIWwX6e@*uL~ zRg||tNtS19eLB}aUc`UIUZx%$#!5nc*Fj$A{9Bi{9^K@Y2%0aQS(6xa7ceg9_33`3H`^kKN^2fqXU5P!5yRm?zwVvxGVQnd-Q`>Klgtc;y zs}-%4gtaeVJy^TnC<$vF|D z)E^t-9o&`9!QJ{3yV5zaTYpqnI!ASDy(7BPIig#CHdpd&uKl;DzaZ!xzD371MBQ;=e*v*yTxa`B+$j`cXQ+2nsZ`7(~HMtN(Jnn;#<8F*-LpHf}>#-^wV7OLTNR_m0?0`y-`O z5-I&**ZxP%Ti*n@>_N!C)4cUfoK{BtWuuf<(tPA5`=*$GwdiSgEIiM~WjD`I$KSzyFfcR9~k2 zs7KP$CMeD^mz%lH?H#Rx-iu}{ikypcrYO4~%L}F`*)rLFt;jz+K4F1#j1F8Z`Q`&h z86fs_4q{K|ApRA8I936d&PUkgrjzyR!?S*@Id6>57uIVBnTIztduMb1g!ny489W0T zKeZSnUc4%SmCwKuSn*Aua3>G0I4p??cgaPdc$s}3@mzsU0j}vijy}Iz9!W$B=Kio{b3Vyr{UXQRBv4#I<8BES!{NHfX{e*BUtg=_4 zG5*uzA%j;z6WDN~d%GrG5(Yb`?~O|kj7L`Y zHh13yG4v4>F6`itbO1yC)$oPUL4T0^O{_WipjsMoGyeGSnDh)Bj*{+agS1Dy%mpQ3 z+BKd%ED2k;s@S@@*xyUWFNGS!d8OGw5~e+QGfpF*2QsHf!ouFb`~?RCRA7e*y<}+f z9XMPAJ7(j*V;5rwVK92)es|)QYZToGAFg6`z4mzcu8!~&t9aq9aMlU%Ohg@mrTb0I z1AZ{Xbah&rL~erL=GfLzE=8xCNqvj8>A^%C2(>6O|;kj^FL^ zduIblY)$CudYKlG#MWZW{Bk$Z@4zfH$5?dX; z%)Xu>iLLwHyv5CrGbAn6nj76P6`7LQde_UyhnbStTJOdBWu_#y_)TY>jL}dMTZ@Og zglI!aY?Wb>q*JFwNo>vXSRZI4iLIqxGCdnfV(X`C-5_5#lEhY1ha-4X<{ynDEmn5S^&-NO*lObC ztU*{3TVYSs!eL2lz3i1Y5|+f)L+#u+vcr-RwBeBAg*xK*OUgNMNwz_4wKJvqo*c$K2Ycwp0tz{lZnuH~>^_ItxreR5J<>@%$ zkj7Y8(qhf_grp!WiLE;9O6i(t7M8@;Ay3c>!;;wg&8wQCuq3t$J&|Z0mc-T#9!FY) zC9&1ZOQmI4_Ual3mHA*ZNie+3Nov4HpjMMNsF~?xEo13Fb&x1%ueLbgROW*fOtk30=dI*jmxaB~*tcvDJ93OQ;D;;AOM#6|7r z*7wzSfP9nz5#u3+fuCUB(e4Qa@R+Lh$OaJv~~&IBa+zKUgi?|M=&W8I zk;GQe^Knf?5?k?>C%ay5j7VZ@y_dCHBa+y9caiJk&WI$ohGN-N$9hjh5?c+t@;)4q z#MS_h@MJ_1TRGRbL0*VRVk_U3)wsDMB5ASinD2UdHzJ9xC0-;SL?p5GxYsLw20pV_ zT({H>vN~H5ThEregd4LZu~q)QTUWPdOJZwAE7!-CY)KrqzFOu|9?F))R?E-aFfU|F zVyk~|*T<{blGy5r<#)}1-Pw}Z8gsSl{+HAfO#A6@1W8s-qjDs%HQHnR#2iU% zeN*EGIW0#5V*HXKB)05kF2T%|#8zL;0FESqTuF=d#M>@g8|F%4>kW^sO>-r&^}AQRR=JYc zDqrlzT9GS>tpcwwqjDv&^;b`dCgnp4%pXXeW1rf?+L<`wVMTuE$g^O$xP2xQt8 zFC&-cN@D8`uPxq)oUtwT>g#4?L#`yY-tr>7J6950H|}#w_eicJwpxb~M2{qY$(6KN zr+H!ink$K|ZC*|6L`GN><;~q>cB8z&)2?@4D&6@+7e} z@K!fSX`UPyhs6qcln!~4*lOX0>5(Uit?q5zFaz==vDL;C#o>99*!rxu>tjrwB(`p7 z>=GvDNn&eFg-e*3CyA}{%hCRH=1iTfTN;ic@<(=Sf%$Yn~Uz zuq3h7)FU*oB(XJfw3|$(C5f$Py_S||Nn-0aFCzt({H>Y2qZ;#tP6ORg?JP-bJ>peH zl_iO-m7eVNuq3hdu5O=bo_#GzY&G;6-!MxOTMv6eG1`*E)^p3;R3=%H*t*w^BW}*H zBrVntp4`l}B(Zgg7s&!k5?h_UWENSH*qSEYSTD3Bu{F{w@nx1Iw%(iP`dDj8VynXQ zvEGuzaVzLCV5238t=Y5OFk3B2Y(4AA{C4n>GXKss|Btr!fRm!w+K0P)YI|lQad)Aa zS!P&3mL-FP1ti0gS;>MRK|l}?MS`FMVn9(56!uz;5aPqaMh`rWEw*25JV$V169`zKlccrO`W2hPy;ydkvFx+~I z*lRy9u*j*Wh`shEjC@#JLn&Wi5?@?T5qk|xT5)4Lv3I0l5J*WqMeKcTBxR3!irD)R ztw-8xX+1^k-FjJIF{GX%_C7L7%jkNF*tM4$Jw?K6VRZdz^%Sx9lgZ8OdWzV) z&2+#E>nUPykBRrZdWzV)3LA$cAs5wC#9mEPh&R_$#NOFhb`Tf0*HdSI;D6i=jo_$p z^mIK%?0sk&^$YbBv8PN)@2sbYy|yMl@7Ghr-d@95pVd>u-q3iElyB-OV((LoYQrU6ql(xoY#q2bA*zVI+jSwL5p;_x65g$*;dGBGVy{c@z)z2;BK9U4i=N00 zEiN}j)GMlpy{K`~JF1Aijx&QW`XH&m-oqwkeWMB(jo_;#fs=kwMeNNos%&Xg5qtS2 zzx|_%*gMr&42UXX@3?D%Fa|~yvDeh-K7*o)*xPCSX|x*sE()*@;m_?9DZSoDx;U-V9UllcI{)J7#+N z$x%h@{mrzRDN#l2tuU=-YE-S5#%5F9*qj#yCNv2MHR94rm4>9QAO;nGEII4 z+9I3$<_3Y6)1r#l8)XV$CJNCn>y6DRe>cT=dQ=g6buSA%%|`x!y*@^DofB2WUU!rF zxlu*zeQQ|njHn{^-Zcz84?Mx9_JU~xXGRsV_hL{+N$0GnBH=x25;8xkh`rBD+dDg| zh`kYggOn|ZDq`;&6Y9dKBKEc!)pZfX1Xb5AwF57U(OiMO<;Kf7QAM2eUN!~2B&vwL zZjAyzOQVX|+io^a?_~Fsg{XyN#lDQB)CoceD#!TpU%zUN2Ld zE72HPn_UbWU4jzfx68eSO#?rdMisF)%9O||a0yFfpDBRLqKeqN(lGSpQAO;XZCK)p zs3P{B93BL^I;x1hBR>cI+?8lpz+NLMX3Cm1QANUQW8%Fks))U9hOe$hb&{{9H3&kz zCaQ?NcTI_`1*5Sp~oZ=ni8y#p)(>`gTVaA#Bzd;8}GF7ApdVy};JaW|v{T{JKS za8FbbdrOQWdoN0ritPI+Cq1mX4~b`?eRE9^>J~I;VDC(m)~!)R?4=t$b+bGmdL^4z{NvRMeOx4lIG#4N|Nw4n|LcAC>ietQ;Ls76|whKyC9H9 z(IEqS0|y2c+oFot>u18)9#zC%OOy7;qKeq-Xp;IkdO0RF+z9PYWcm|P1p-4NBRHRo zDq=6g@a9vfJ@V#*mj&_eh$>?5fL2;8=V|m|)L9-fHStVT5ql>XMfO?95h}8orssGr z+EBw~u-m8c^2zA-KO zRn#Y2bgn7a*P@Ep>tj;C6KuoOA2g}oh1z23PmTu}ejODI?EPpoklj&5?4xiLlTjW!)@)0iUm z9=|AX(IKXYz2|Gngl60&BMZ)XX)I?LDh`sOKz@kopBK96K7WE4hv3K68 zz(u11MeHp$N$p;sh`k>h2QK;+C}OWEwh{=#mK7-Cq}R--Lo*8$u{X;&8C_oyd%Ryu z{7kQ}h`nAT0*mwND`Ibm>9#MbuZX>BlL8l4)K|pbi+ux&`|2xVue)~PT28aL>h32- zL6wQ09XJ{lSH#|kE`h}J|*BKBTf z8n}2fu86(0$7zeCb2zR@c!x|4k4-3IueBTanVV3=-dK~=a}tW!JI}DqB?(3BZ8LRo zX+jZuUz$KyB^0qY%dpL52}PXrc3l)ib9q7$d)@K^iz^a}*t^3-vpS)Oz0rnku1qLm zFFPD~S(8x2-Ww+ES0xm&ceP=gs}qXYTdk7{Rpy$6BH`r*MdGYYC}MA*VTx-LirDLW zaS)B4P{f{ZTwIq>#9n>FHtQ0K*qdP3=K6#p_NE!Oxgnu|p~^Hdd~;($5qlr@4WhXz zp@_Y)#>LGjc)Iv_Pr%XT2}SI6HC3}dp@_Y64AX2#C}OXxvDgR~wD?|lgsRLf2}Q!| z842ROHKB;Tj%@>r+Y*Y{YiIcC_Jkt#K3W>M*pyJj-UBE&X*Zh_irC9Bvht3EBK8KG zs<|_v2D>$2Gsh(Uu7sL%c14e|?tVM@s~xNyeHc~5-UP?C+FD5NR+J>Lcc!t}l2F7g zzk;)$TEWFH4Qyhs$vN1#4nNL63mxKm+yEhaK9-?LfRkS2%jFFfal>nJDp%SLw#BC7 zKQ6WTPmXi*lh?vkwsK;9Q69lAixrIm=wRmq7J4QBUo}+3-r&xG#es&3*n1Z%aN=Ti zBSq{*&EngVMvB<$d2`_9=SGUyTV~WjyRoB|`J>0Xr?tGhap0(CV@2$JWYpU_jTNyM zHBGIcv5NW!#=9+&mxB3ZIWDWQBDU&8m{0B=QNvQVEWU^>I_K`Rt&VWf^4IygRPDvK zOtdlpr2LHa`Y@^3s@4jk<`*{zo~ah%?Us&Eav zzwczXdoui)-WJ9X&9*RNvn`C+Y#k#uTf~U-;5WD@q3G*`C70~MzG*E8kg+zFQ?c0z zySxA07R4eIf=X?{s(Kfi>~A~&S?rmrZWSHP^>*S9Y=v_N^2Uv-ci#FZor2A)4`7&L5_WABd>gRI;B&wxEoP@1<2O6ni1RPfn^KvU zG{k=|;soX{(0^Cq+@AIq6)xLge?%~q$2-=bE!4A$KCkPyp5zuKKdEV39k7Y+e-O=o zh~->v#WROU7>j2WJ%!MNLOg5l)3&t%Zrp5}hkbM@VmlVZQxE^+Np9V`tKgb9E3qhk z8Ij_dPJWHaC}mzIKj&%vI(H;qV^bVU>UMZ5Ld$0s{;(l*;eWj!v~s7rZAp8HTJ_F3 zek)E}Afj+lAFXfBIA$oP@EH^l9fwD1!5N5ZF#uemKy+ zP@r6te4!jw{}P8c?W+We?bQO$!08nG8i72(Zuw+*e_N|tKhtO3{zk{ydFOG@HCbjtGC~g(4{y& zNo8giVWLiyg|_GJuyOo}#FX_AEPnXb-#gW<-(E_j7h}}12(&u=fEa1)U7?!jBJ9?6 z7?dVz`>Xx-r@HYfADBD;nm;+lP`;${oB`p#9BZiCBzT{v2><1n!%-|U$T@|4Mffkr z9+KOPgF1@vkLMuDE<^_?0n}B5axb_OEsLBRSYx~gSlplsI;>dPkH$Kt2#W{yfpw#@ zkEaE$8!5t~GRPVp#|+v2h-q${(#NuFt6$Iy{0DjSZv}z>+B7h%zFw;6CIlJ?*Rsc! z2MH)rgmR2SrI*>&w6#iCgvFD(BlwK6^Dvxao>hh-ES}X9IJ0c09k|X^gvC#GfOVs? zSA)!{MvAb=pEBKTmt0d)DSiH`A8vX(+$?pp@IdERbvOBcFFZ<4L8@verMC?>$Y-AW z2`;ZdL~cY8%4ORZBl64-I$*0WU!*I-vTX+}IqDNWP7xOKa8Y<^+2Vb=K*CEEVe$FB zVZEj7Vf2+Or|=dWW4Id|Z>5HzH6 z;WFcZ*Wlew2ennsemvO;K}J^|&WyzFLPTD(%hmZ(_FfBiJq>s{q#qmWThV^!Q$ z45&OTSGhAjOLoS~4Q)K9;J2LVcBwqM!~Ug;riYU|v)14c;#v$9EZj!H*VBep_QXYb z8T#-g?JfV6neM2{qg%8xN4JR0(Jf*e-71~swyHb{M7!dO3un2roTPn2C1*CR4*YmT zb08Yt|0M@XrOA<$xYdI9Q-vR9@Nu;b#QS~@E(rK1$y@xZR z$O4Z7{4Z)mLewWm-u@W!xD`$!Wr6FB_GB)lW?|J_R;jTy-2g@$$K8ZT!T;v&FWY+c zABYy(@6`xVlnwvz892G}3CQPy2!8*0!OGnJ?o)P^{P*t;J5*63B-*IebT{H@jtd}| zk!7jc?uHij=MnwkV9*Ts<-wr&e>fQQ^gOpiw)vP-4#z6Kd!~C<@<+t?-a`^!i!wli1*LGeOnmH5gBG>WdVEvUsNQ^p>?p|$2o+<7|S-sEAXtySF2q^ z$RQrZu4c<8cdFNw%l506mi7L{k^|W_vQ=;YhO^wd*^5W&BNyp8YVk;a$60QZKi>2H z5QD~b2~Xgex-P-bnU9mWRc}XlmG1t}zYXSJJm1||MORsLEj~H{eK8%`X=2ur>Y#MLG`Fe_5oBIP~W)bD|01Q$^_gP+?ma;)OlaR>TcU@h@wNuBLnO;;+Nx z=?VV458y>oHOo=N-lkQ7#m9~!F8=2%C?`kC&YY|J2o}45-2yj1=j-&;sPc_;zt%!`YXeh$xNF8Kzv^n+qH*4qtAf&(K|i17 zf4R^d?q0Xcwq~^SyDf4j4NXli+^`NR)Xitu)`%S_r>hj9cMwwxkhGSQX)EG}C8?@F zfd5i#{((hqeQed`y|gXo2Z1@~*lPY6e&J%bVe!xoLD}rK74bP&ZnLe|5R!d0Pq9=T zhE$xn*iG79TjuH;QCW0V$HwMEWVEk3el{N>qkVV3#S*to>q=Q8I_F24g%yQ7wt=JtM;$`HTTB{*YQ>sQMR zP@8rF{s#9U;PwA6qt2CGQNvNI=+xGgysWv!~EYi|7ipbY=OQ-6b3_Q1n_&!PUz%iKceyI=g( zmtp*qg@*cPI!)+&%ldVj#9d^AgLp)o4E9$N?!f3&IR6ATGf3*@)O6Vw$j_d$^lVlz ztr(U-fBn=iz8u%eRB6nAu0dDU*T4H7?QgY_Z}UCc#gIQ4R?+h@+@pP1ve0xJa3WV1 z>!PZ~+Vy{?*^Gx@mh0)iFV}~!aNn?*YIz?5}ke>%q*DfX99PuqvO4`YW7n}_?-gz2d+8`UYYyr zexG|ke~sJuKX-7e*Wk*5*684Z3tfw1{sS1&w4Q?@jbX#3z-BV?%66&Y%|Ilacb1S1 z+gF6Ia={}qGRVs*N`DETfel!zlV7&h%|DHrxZ$=+9U5MDV3PNNXLK-BrhB08V~|vM z@6fo6BhlSZHq-T>v~q4eL(i=j`T40XdYS+FTK9VA?sR|lwQd9Fsq~69*Semay$KUX z9PnoF%cK>L`0gg#PWY#+!vrBeg=r=TFRC(cd`*>U;CnEOW=iA{V4i;M_E=% zP#gI(3oXF%vD_-FJbZ16g1E}5_@XN3;UhbeLBM7*cLm0cG@(}d(#|E*EbDSKolq;e z!}C;-10aa;8p91MxB76~q6vlh+Rl5Y66amg-&k9@$50bAp(a(F2~Oro=z{Yk~#P=7?tKJG~rB0hpw&mXwn&GNL8Ui?K5SlX4JUzT;h zdF$P>q{$3M6RLb}CtOnjfo!veuSw!V8L1+w@>R-FH(_Kp z2YNzNCS;rR`-aV7+L5q5FtwC>Ccjs49C*SVwN|sgV{t#EXrG;)CjJfkQDI0urK=+V%+oWB} z9-n-J%O<^GLybcG-c6fHu%U`7HdoSSL(mV4%{vU=j6z{kbW##+mR&FjGgKuuLsH-- zTY~Nz7@xk7AU@N599uvA8#}2 zpKe*h_oBzF$Mzn7=zYLy0#8D(;nWf-aAM;Fm>o21)cRdqb_Nq#8yY-tBK)Ua2o|}P z!C9r}?!kqEI@+}Id&WU;f(hLn;@kc^jpMsXrY{7^E0{xfGnS04ATMh|lFMirzkqzY zm4EIXZgd2{yBc~_mf|Q=LLGR0q*XGywQbRa-e7okXGw_QxHx-LzUk5zb9te61b$lt z$9pAvBmDh$xOFmaL%C)zio_o7?^nCit$z~z$=#GQV$rR^a>5x_>FXb1u02gkQPPmXUScl z7om=-mp=^D^R*WKxbj7uFTT+)i1`AQbmU^&qOpge zgmAZi=XHYp0%9mF!FoI8nCYEF>c;xSu~-gIzPqp0s*p=`N>QVV9kWiVwqSa7w@txn$TDVABYISdE#uWFkdQ) zcq(!$_py7hPXi`2m#%E>V{RY+s{7pBCL(P5NF_)}eRPCRAu^g!k03&S=Y4K|v()VD z$_FfK+fjTJ0EH6hbAK2R`8Bt=4QqBpHfdDTITHD&ANi$Q+<5;_e#2MrU{s#Ae|I(9 z2+q4P1=pn@g{R6BE_(u_MwJkV;I<;TlA}<-XjCgHKs%3@;Hy?rEaI~@KTT|vJiHdG znJ}sZ0v!bj|Cw9e`u)hms;e+=!$+X{1sdQjlM%{aEtura_wj{l7*(PR7Jfyt6S`#llXS4J2IL3Gg<|bs$z`?Vmx6*L8l8H z9auna#&0(4R4ij4baiVr@bR!yjnl23!#}2YwXCf_p}OnV9kK-Uy~MCfi`7awct;%c z5C?BnabSgWcTT~_jHmd|-|rU7E%tUDDHbd0vMfX|s-i<@K8#uVG0?ABzIF{onArw` zi(_*;-zLny#g>bc-(rzlv3G9>dZg~LSJwrwN35@bJ!3CHo1)@qCws-VJrv;Hv4U*@ z>=P^85Wv2%hYai&i(DVrmc~xIDS-WB2@~3Y*f$0ajO{at7!-TU*ba{UWZ;n4hKI53 zSW+=GcFy`Bv|+KDCg8HzNCQudUH(|$V0dgD{E4>_u}4gLM#je79N3PEJ$6d~N5?)h z(T#~6Z?Z8qR%*gMDH&UAf*2Qj!dQ=weQAO?Id=a8L1+_V9~w9@R{VHidrB;)B7l=( zpO`#PPF2SgE9)av%Xwg>?C!Q)bv=h8K8%c}+?=$n-&kio>?ufp_KM$C<975}lF{z5 z*(N}2DuPpmR$eN&CUU#!{2 zAT_128%@#mk8Lo44Tz0Mnji*(83Mf-e4j1rBr{@_xCdnh0Cby;Fom?z$fs=75by61vkc9 zIj>K~XMY$3RvMNCX~~M!^6z=XJ-5o*_AJV5Hp9M9If52h_Fy0!@HHjEvgScUbnl_duUwc^yX3CorkI%*S^k@Y@# z6dp7emQ64TDzFL5!U4ND^=-nkg#phvahtGgX}~y6!X_-cBB)uXflZh!YZ-8pQ)m;G zofYtr)6ga?`!bN9P9vMJtcl5CW1FyyU0FwDJ?PcSE;R{kViT6#X);t~6P6Vkx~UDA zw95RTFLR1*!ma?^8%eI*Wx3USX=P?`$ zdgv-M7x4<=nIh|vVoY7sfMzdK7uE26$4CNS%YsEcjujQBF6waVV(50aSLH;N9+CU& zx4Tn%ZGYOfG7wSPIDEgb0oV^}Qq>jmt1z)cH9+ZYA!&0;VwXUGz=Rf`#g3$Nn%@`S z+nFjO;l-lC2`m&9qY$k_epyJ9^)kn_AE+FTW?rUeD@M0;sa}Znm=M5MVyj2n7Wc{8 zyJGiX+$#>=%&G3b^cbdA2V)+oWZw#GK7nzo2dO~#8t2W!e2QCLE4`Otd`A=VQ_eKj zIEkluMjOr!vu$cX)774RdUB1+oDNpqf;U81Z&T27?Ad?A*&@# zK4hE6x=2fE%qmK2!%9jpacR|=yg1XAmM5X*Jq+M1eCc!$U%Th53v`SWt!v(c4 zXPW>4W;LoiOxpHE69^duH@ z5FhSe_N4o^^H6Jl>QnAZ$$M8~cPLC~N|pEo%Wyd~h53tfoD-TQ*-N#gxWFkodu>og zG;Ve(9E~L$H(OW02XI0Ynyj6b%E(X%9p7YeS32xB+ggI;B7bS+9mhkOz@(Lin1%j7 zEwn7*)KZe^H!Q-`n16VOdrtB}2mu6OkH$iImwsk>}HLao@su)XWXKb zFNd_Fanp5*DTp+-N?$#OS@Jw71-tyfSbUNNCNwa_vg@CAPB0lTkYvW(YdHmo*COQx zl^}}NmcQW{w~mA7_GjD+oHmZ%<5{=BImPiO@p-G`FX!_$$KSx`n2^7N&&eTwFP}p~ zzWp4YmxlZVpVx%^9(>|_;UqqbmA{-Jir~BHdq(r=9Jue*wvu zo9^$R_2P7YFP|T!`}T`??o0O*d>%~qd+-_0@F(%vG{axc=Uo~820kCk@OSXJA;aIx z=fOF{|*3#Uc@ZXyI5&rLj12%Fy z9S$SpZ;t;epO57D-|<;c&9C+fo=vLxt@vzH z%`d|uefQ>r`7x;OjN9fpZ_YJ!)o{)`CM7UAIs;S8vZ$a*1*R=`D|O$e~iyH zHT@6yyrHK5Pd+cM>DPY^&--fn-T6GOmOly4%YS1*}49HK2Of|b9Ui*eXie<&xdmTVY}RdS`YtX zTi1aLrGt6r4BL9=41f79Hx}poU0N}vbjI6($Vrn=&-YAgitV_+`cLd~8V>mjcdtlxuCg-pSF1z?RopZO4wklx z1_B3*T1CZUQY%bDAyB!~g8HY~PD%VH>sYnmin&L=w1dRS-; z)}o3IeCTiA?G8;2INnB=8kFtZPvM(PFj#JK{9w5$_8|JTj20k=@5RDWed&Y$e7ULQ zRg^DHXc#>OleU8O^z1rJf2Y|nQrSEo9yJRRLJO=y3J(f0ocX_c;gKgslqK+0;> zeqogRLCR{?ekLX(U0TIS{f`qOKw|BoSMj& zJXW)riF{eds;RLoWYx2olKc@+_d|_sPCi*}pYa^)Mb0;Jt-lu3V49G!B}+PJCGqrI zb{$Sa%376@aN5XXRajo;cku_k?pe)_Y6(~zLQ&YAJ z1j^Elwv`a(i!Ix`t!-uLMnjf+U@J>EQ)eYn>~UGU(Jo}^Mnlnmrb%te(#;G)tMrP5 zW1Y)+1Q!4ECtzR$la{U-Dr22qx=BlCX-WyE>7|=nu&DoL1IOa`3)3=kIy8aH2bAR> ze%rm)IliHP`5uU|l7{}he9mg<@8t80hW__>f|skmB}TXOun@3>>$bJc&*#*lL#+`W4A+a(gMd z1b@o=ID9x~VQ}`i>JIwU_gW%W^kFz|3r0jT(?W`KWjMWD#oM3n)&1-Js`6fuQf zy2t+WoLb{g?`T_%(h&&ve@uP~A4h_*s}276Cfy<19t$VqH<0X*?U-bm9kMNxI&tp* zuxt16-~P}&Ia%_)ZQ+lhrIk-bCrN`*8^h>7?`9ojXdub-B9PKi4rGv4>5R|ymp?@& z&O~=a6KW}bJ4@}g6o0GXPx_;l^q286$e&OWp)R++g^n`5BMrDacS$YIco(}OaF{97 zJ=ZGvbsx5_!-P&`D7Fq!u=a8my~JNGfp1w8jz3L!j$}8eV?-BcRfL)dmq<(_=q>RZ zS!3o)Nl3o<)^cLHNHiz&%z25nchGi@_)9U5KIY|}jv2JWWwu2V8dfEFf-UPe2!nrJ z7~J;@CYdvq1?*7I1{`W--dPx|3?|ggfY~FkUw0MC5+#iJz11kv-bk=rJ@&~^XkwU4 zRIPFv9>F~$aG=^*^*Dv37J#Tuh4k3RZtjT-KS90G8mDL%2WM54Rn{8Hh=kS7CM+|% z3X`i?^R(1!pGu;8P=?;iZcR*~q17g!15S#9R z*mMWPraK@u-2rjX9SpHZnC^hsbO*$yJ0LdQ0kP>0h)s7uobT`4i)(3&^rw}P{=mh< zKg5EvU1UTqUyHDX=0Ln;q!z`*yMeF%2%G>+8T(RzjVz?Sk%GkSAyD>0MgkZ6r+$jd zOHw0{tlvGdn}z#6AwTi(pF&VT1bP=oM2k zdgExpGur}}o$2y8oMnbZ!6Z1pg6_)D4J>M6Ta%IufO}s|00na}Wh8FSqMK%zB!xvm zBg`I&?ONJm{)QF>_iPPpD`?veJHud6u-wG*A#EYEXi;#53HKOnyTBtXlD+zvfD`PR z7IlYog-!BR6LK%H?v2B=uqnQ@8+(&Ka_C#1xg#2#mSLL%Q-8@E*ZD&}cehUNHyb+~ zVVq7Ep|#o&MmTE)?C$ARna4St_-cjd7lWGz{E6B{NMpesL zuu*S{R&jR1gSUWe90XuBgf&xqU>MQq5D}xo0D>|=MPS-w9$HVQeDuTXA5Ib7MbDB?cM0w8DbU85FLvWXVev?7a2{AJ%@OVbc=Bu%7g6|NMlxw2_x{YC_8u52mXC0yA`pfF`?fx?t+ z1PW7jPBCQ{u@$D&@be_OQe)vt4TURZ`&nGLvYBvY>G540t2Wd#v+J-17?UQmW{3=V zIylZMrvS^WNjm+E&D>9htvfZDiS%nhvcYR|P=j>KI%s$C@BG$H3a9n&?pSR8k&!`F zuD?rHrEK6eZ!4>FKHgU0xHHHEBLbgC1E0dDd{gP`mEZeXNngYBlbXGU-Cc!u_^Q%d zL%gXH*?M|AF^FtwRbPBl>1%VPFEr(E(ZA4S2K|B*l;FIKB*s{o!OGX_<+erRoS5PW zjb$k2oG1;IeUVd_Rcn<@ych?CVItS0d}u5_BG-ryj=y6dJU4<=#pTZP9bUl{iofF{Q`(yD+E?#aXn zztX?;bFAagVo^Qe@(#!2_BR-}D8#}PRl_YJ)MZ(eDocSGgYNe){sEU=cJtT$;I_`C zAUuR!b9o5aE!Be1^*{c>?cwz6?>9Jz>OHx?Kk=Y@i8E$^|Mfw)wNrDTA3Nl>|(H)*VFxatj(cu}1(ggh_O-_0hiNZR_5lw&+#x9qlNT({%zr_Pu zq~r*h?tqjcNoSFyzkNR@{8%hPTBYt#$7)Ogyx)qH*Zdhra`?|(p}DosgWy&~<*pFn zH3(rbCU*skC7m0LS?~e*OAwR0LSm{5zl=$f8N2Y7ZN=4>vYkHE?|j&u?tDMYzxA-& zcxr2~7mXWbOj^m+SQHjF${4NE7AHE^X5F@&@)2-P)FjI&%PldP(- z@Qbs&l3z5$O;4Q6sIn)wNtR{bitp>yh1AFxo+ERGOIsh-F_L2#rYWz*RV)hm@%5F>coALRdRiCxR1vyr#`=7Q5|; zzBtQn9xH(hv277MI3ozHl~s1{OntuE?yLyQoa%hJ12;T!0;42%0>mGT zGwTI7*Xp&#vZ=|LMQ-W59aCY>Eac5<8BebP*A0c&3SWl}e_8M0Up`*Uk2sMSIc~`z zbU)StEXDuiCbHF9P~nojQ1|y%_gDXfQ2{5GoK7;aBpiAIoj2KRTEP3>M{&;VVqN{WJ7T0Hb|ty3$}u62#gn0$;S9uBe855M!`|{ z?(!7M%kS~C+aaF`vs+8TWCl={MX|$X_0Mj7Z`4n=Ri`GxzOZJmJ1Q(|9_U`r11$Al z_!+B!SB%9RC1SPPWY)YK)@)@s?)$=LmPO-?K7#z%c@0r?8pqk|IAf)4OOc!;kR6aS zM#{VNozaeU7{W&qnmrNi1IFnSViNneeFTjGDR%mhJf(jw=zp+G`Y`huiyzek31=7! zJ$_FC-juR-b)gRsD1|O_mAcS}{h`nYRUmf$%E$UgesRY;Cyez+{OWeDG9B}JeciU! zH-mC?9@+iM2T?y)y7MH*f^4tsuaSWzpCnn_7rn`!uX0 z1ccQ#Itl%4mB?QE4wKg3`5z&&q(tW048Gj~#3p)*rsp7*P`QNUO0Zo|-G(_b2s}G1 z>zo;DK(naqnD7OQ$}SMdqO$7?WKr31fh;OJK{&lJa z)0sS|v9vF{oB03l;<8E}!vSa-`|~QH3mzjf#s0kOkG2(W%&Z)cn7+XroBh4Oy-=j= z9|W#tRt^#-WN+6O!aSu1Pj;*(S{<;(-Lg8tuYyl zi&8Ku%OhX`8Yj&TNpZUyv zo*jrh3w7?K+l3waAmH<0302{OaTt?VNz{@9mbGMUMYupS%48<2{}i|vJ`pnG-5_0> z3o`xzG8J1!?h|NMmFdW63o@0&j53g^#9O7crZ`r!D)HZQK4v0eaNVdK_H-h~NFwIK zrzAqij4wb|DUehG;;G21mQB@2drWn#n-QtVuqB<)5@GD$q!#)op47Eq|JKIx_uJu` zc8hDBaPIJ@kf#@Fq6Uu@&g=#^?}P3&7vM{RbpSsA^n4t;?($O|i$W?CjY9an0~;3g zUf7OJ4`QA7F~qe$!wDz!*`yVf!zBBX6kMHxYg6!s6x@)4n+VacR-$3SINMliwlpk_ zJG1F)D6Hgc7amWtWSl1jvlN}j1hUSYCj_!UoyQ3i!_i`#cP>Xql^8>}9}28S2cHTo zr?8dIIDiuE7nQ*56v}H$Tktv)pi<=+AHgK1LBV z?9lMJpivKEd;fNx-yJTJ?avIt_&%>gI}-+clss`UmOWvdj#c zla%j6tgI4&*RX~<3;dDQ(na8>tPAdFO9YhH&@P^?lMauMD@qFBzRybe8IGH+P_s~7n7Gf@A_ z;X*j%fd(BiUNIa(?t0mTdP`o17oHFNBCN=ug^q<00HtH7eC_c#X%FL64>7}IL=h1| zQr*x_xp0Zl8GR9lsEalDI-_tZXi+MKwo3OP@G&~@wDQ&HDOca>znc**7$RYcPR}@$ z4pZoi%_hu766TvGNKKA;HPAU5^Q|!dHw*nfnc?$mE=Ob|O=SI0;{E)0GsE?}NnCj* z{XtwpXBWQ7;hYPHC*xN?Worj>8OkZ8;8{!>{dC(Zs4 zy3iTDcLt$1m(b4uDTSlSA3=)t+=6c&9cMiCoe-}LlBwK9aip#{s&_}tUImK zcLkl+!)(oZwu8B}g|_}3G#qJtGNfJ7A?bU^wH8(ikM%n9e$ z49$R_7Ib2DI#_^N=>mUDPPlNAD2+8lY0SSG>|zHS<3ww!^)KqnUx?yLNgPkLE34D+ zlW=#F|3OZ;QO&$Uv>F(DwP;9o>zn*q)xw2IE}Ym`id`Gok9M`jYZ&4+8ovU$Zm-pN zNq6AuG~SMxdmN5qp4zN{G`BAnoZk*Tw0(olQg7lLHGZ@lZf+9XW-g1P+^!>@zrb+P zzE(V2B^!RTtPQ{UuT~4kPxvp@luj$4h^~0hFRqRpa#F~is8b+#Y88B16+EX3KC22| zR0W?a*s^L(2m9(-7qf#5Epil;A^uu5$Hs?`rrXv-$9Pf0N=01u$pvCz*`F!G%tdGt zC&IPeOA!{bN${6775|?56vM0a5jl}q4jNk$JkQbky}7nr}Suko)}6kU2e zlEV`nKY@dg%gY zt`R<^vz}LIzNstX#(MovSjH)6hnDd^3Q^U;9^@^!r-&Bwt1pV=yot>G18*YM**Bi$ zUs*F;FS+`3yn8AX$vJ?GN1-Yrb)hDBDljjItk%FwmmvqZ7bR~UdTm{LIR-X~?M6lD z(zCKA!u4NFTPwsMsH-uWkz*--~DJ7GoRGV~>Tofh`AFGQ{x=(%KShSd5y+D`l47`!j1tUvR3#_bp zu%U=hrXYJgDxT*YuJM2o|GCk z*}nA-@D?0(n+l@syXQLAH71Dfr`Z+_4j@zsqEnS1Iw6Rp38Rz!0Fq?2or~)E2I)gG zobo~77aDs~)i5Si31gDI4%75j>3FP$VCJQ=hxi^^6^;FDhz|O1Ha*0%LS70|vf(|; zELm;$UyLy=3yi(~5{$r>obPwf4cAYKD@QWh?oIfT3~T!M>X_K-4c4@k6u|LaKp(`E zik&7Yv`X_Yb*wc=m1L&IQmp#HpwoGO8j^GoT(dUpB9epe1}Tv>Wx-mdcY-}H!X50D zSz38Nu1&h%|1LKiYb_4Hro)UAcH@%=kOB5S3IwaP&E<~uN|lm$1f}rEcE3wrIMz|T z?Uo$p9{3E=!`P2=GQiH`Vz$OIBW6D?!IiAUJiW})lBn8uwYB`-@(3pe5=e_3|{^uq~SHuaxP z`?g|P1~!Rh7&y!tF%FW0MrGQaeuU_vaR%5FgLZ4mx=sO=&mO}Wp6UUdu^My!-Z{zU zg}M2n#0}JY&$Im3^22qS-m@1wq+xK?Z{j9MXuFrLncJ^&tbZV>QmaG0#3^vUdYy2i zWC3QARco^G;014Bk{$)G+OV((ZvTp*Xck@--D>>8Wi=eD?q=+~K;rGqcC}uYAb^Wt+3O*Is{nf3fhmjnaDtRrZcWV5 zS=}CkSAUfkt`RGOi5xtu$_a2XI?QrWEqGZvxR?zxaXyb=3HgyMP;Lyn(oz#x8V`INxS7T;Zc2h^tch>vp@+tGn9>t8E@N(bYut&R`)Ry@IUAty2TXKd zjiVL7{WY$}a0Y3-gKp+&{K#X#X9A;7$ybbcn0`^p$cAgI7}+R|uVW4dYuuCeoiyG; zze6?7V8mlIb{X+W8o$AaM{3-S;ZM?d6Z|G4Cu`ytrf6z_SsfEJzWa9I6E%K`0Zq~P z7TTYp@l=+?G>tD}LQm89Aj3Ib+^X>#jNo>S`!j;g8t=IixKQIS?($pL$Lz%mpF`86#?D{KQS`(#&i5k5 z?@?6pWF7X!~Et2S+s)mU~IN5kdO1wudYP|NW$2h#>t{zYu}>i?$ab z`A=}9<&FfU0mpF~cjibYttC}jIZ>2$JhdvTFcc_xdo7E`9vK?^1pE#O zLopn}psdmI*>Y5#yf4_zQ?g1GWz3BZFq?i z%01ndf^XLzt~nNf1uLT82+;Su3n2;zr$G$K(7+Q_wCggwTX+=j67sI=ouFli&>$&O zcwPSni*D6TRh8+GM`$%_!ZxQU2?ckKfD{l6o?Mw(s#dLf2cPGjx< z1<;QoSxzgV^%x{uk3r5D26wo3Zz|N+uR4C{SPkxTIB3V+xOQSl6xyb-$jqyUbY6Zx z#?2^WGevq3HFPlUPiPme4^{fSc405?931q7V5@X;ADrA5_wU8K)B1h{zBrfKd3xN! zDG#J7?Of{CR>?n64>V~5<~6KjA;Fr32BcVMm}VhPLhv`f`NLR=*Y#955Zq{fl-O$wR6wl`p}9(<$p)v(K!9IfH{Clo8&*x zKHSW?>d}h5?ZaV6lSlopJ3u(R{HWigV|c66eVhM&N6^!@`E@&mZ*f*`^PlJxuIpUC z&40HOR$@Op-nM8WW28>B<{(&W4jM|02#iZNIgYGPbpg7uK#}Nr6O9z;$zm(zIYFQl z`FMd+b*Bh?HOUTml3=O1DFUV9rV5m5m?ltaVY)!6gwq5{9n2IcJ-$AREq&^FVk> zuM{Y~1d6J!*V9F#e@bjc zq2D1;^nY1HkBj=RSJp+de^wkoA4hk;Q?QIW9uO!h_!|O61J`$Givs?(*oywWN1&+R z?+WZrZhTMR7u3T)5GX47hXO?-|5%_XY21!!)BRnN;WKjPu6dV_!d4^%`R{&d~T63%!ZPuQ8X+0(%Y%n`?YC zOQoa6&(Te1jelhVx@tTT6`hQnpoya#y>-`kIg`^v<0%ZNug0xey!|vD$prP%cs~== zTX0-@k257Jq6FU}P{#fD36x>~7J(Qiqy4=iSjNe(YHLRMsla^3_?f`^j8JbJdzSHi zPuu)Mbek0jMN+6S7?A(TZjGC;o=#TSD#{)PD;tZ@?tI#S~j z;!YZW&4L`O@nHHrN#jNIJ5=LAO!6>|ZE{x|jUQu$^cS3r%dp`#$)d~&>=M` zfiEyty&-2M+wmdE_$Le_xE7@=*}J+9`)bDDNaMR0zgGM5FQt83ZGVt>ypBJAE{T(c zh_7PP+b7|l!#wF#(kK`jW>|HPt|xD(>z<_uZU-9+?$C$P2;_+py`6+GQqN2 z@>PrVkgJ{C`Iwyv#X|_IH0;ms8IIeN{Ixxy(44=$;+dXdFYF9`tm5PT;oY`#%j5n7 z12McA^khZ-LE*Qs@?3GaEPT4-T<~r?ObJr$--GVi{aOEt(cwgcd*NiT9`2--cY|h6jq#62%FYcC$gt#7>FgOib73K#TBOz%i`V z^)t|-lT6YyKU^qU#SBf?2Q7-hT%om=-C1MN>bhtw%3fEcxkOaB6Z8vF^15j(T3&aJ zMYrprv8d%e^*CCTyI$H}w7cFKi+a~bW6|&WYAgy~KaGzQEvZx!(p&e}Si0*0Is(!C z25NihJqBqk@^G-mqW%rhShVk<8jCJCOk>dn%QO~c@I-_UEh%5r!QuLaD1jq17A

YBA8s(gs37DG?tEWqQ=rQ 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 + clearSession?(): Promise; + setDeviceSessionId(id: string): Promise; +} + +declare global { + interface Window { + __galaxyDebug?: DebugSurface; + } +} + +const SYNTHETIC_FIXTURE = { + turn: 1, + mapWidth: 200, + mapHeight: 200, + mapPlanets: 2, + race: "Earthlings", + player: [ + { + name: "Earthlings", + drive: 5, + weapons: 0, + shields: 0, + cargo: 1, + population: 1000, + industry: 1000, + planets: 1, + relation: "-", + votes: 0, + extinct: false, + }, + { + name: "Aliens", + drive: 4, + weapons: 2, + shields: 1, + cargo: 1, + population: 800, + industry: 800, + planets: 1, + relation: "-", + votes: 0, + extinct: false, + }, + ], + localPlanet: [ + { + number: 1, + name: "Earth", + x: 100, + y: 100, + size: 1000, + population: 1000, + industry: 1000, + resources: 10, + production: "Capital", + capital: 0, + material: 0, + colonists: 100, + freeIndustry: 1000, + }, + ], + otherPlanet: [ + { + number: 2, + name: "Mars", + x: 110, + y: 100, + size: 800, + population: 800, + industry: 800, + resources: 8, + production: "Capital", + capital: 0, + material: 0, + colonists: 80, + freeIndustry: 800, + owner: "Aliens", + }, + ], + uninhabitedPlanet: [], + unidentifiedPlanet: [], + localShipClass: [ + { + name: "Frontier", + drive: 5, + armament: 0, + weapons: 0, + shields: 0, + cargo: 1, + mass: 12, + }, + ], + localGroup: [ + { + id: "11111111-2222-3333-4444-555555555555", + number: 3, + class: "Frontier", + tech: { drive: 5, weapons: 0, shields: 0, cargo: 1 }, + cargo: "-", + load: 0, + destination: 1, + speed: 25, + mass: 12, + state: "In_Orbit", + }, + ], + otherGroup: [], + incomingGroup: [], + unidentifiedGroup: [], + localFleet: [], +}; + +async function bootSession(page: Page): Promise { + await page.goto("/__debug/store"); + await expect(page.getByTestId("debug-store-ready")).toBeVisible(); + await page.waitForFunction( + () => window.__galaxyDebug?.ready === true, + ); + await page.evaluate(async () => { + const debug = window.__galaxyDebug!; + await debug.loadSession(); + await debug.setDeviceSessionId("phase-20-send-session"); + }); + void SESSION_ID; +} + +async function loadSyntheticGame(page: Page): Promise { + await page.goto("/lobby"); + await expect(page.getByTestId("lobby-synthetic-section")).toBeVisible(); + const file = page.getByTestId("lobby-synthetic-file"); + await file.setInputFiles({ + name: "phase20.json", + mimeType: "application/json", + buffer: Buffer.from(JSON.stringify(SYNTHETIC_FIXTURE)), + }); + await page.waitForURL(/\/games\/synthetic-[^/]+\/map$/, { + timeout: 10_000, + }); + await expect(page.getByTestId("active-view-map")).toHaveAttribute( + "data-status", + "ready", + ); +} + +// projectWorldToScreen returns the pixel coordinates of a world-space +// point (x, y) relative to the document, using the renderer's +// debug-surface camera snapshot. Waits for the renderer to register +// its debug providers (the in-game shell calls +// `installRendererDebugSurface` on mount, then the providers attach +// when `mountRenderer` resolves) so the spec is robust against the +// async Pixi boot. +async function projectWorldToScreen( + page: Page, + x: number, + y: number, +): Promise<{ x: number; y: number }> { + await page.waitForFunction(() => { + const dbg = window.__galaxyDebug as unknown as + | { getMapCamera(): unknown } + | undefined; + if (dbg === undefined) return false; + return dbg.getMapCamera() !== null; + }); + return page.evaluate(({ wx, wy }) => { + const debug = window.__galaxyDebug as unknown as { + getMapCamera(): { + camera: { centerX: number; centerY: number; scale: number }; + viewport: { widthPx: number; heightPx: number }; + canvasOrigin: { x: number; y: number }; + } | null; + }; + const cam = debug.getMapCamera(); + if (cam === null) throw new Error("camera unavailable"); + const sx = cam.canvasOrigin.x + cam.viewport.widthPx / 2 + + (wx - cam.camera.centerX) * cam.camera.scale; + const sy = cam.canvasOrigin.y + cam.viewport.heightPx / 2 + + (wy - cam.camera.centerY) * cam.camera.scale; + return { x: sx, y: sy }; + }, { wx: x, wy: y }); +} + +test("send 2 of 3 ships emits implicit Break + Send into the order draft", async ({ + page, +}, testInfo) => { + test.skip( + testInfo.project.name.startsWith("chromium-mobile"), + "phase 20 spec covers desktop layout; mobile inherits the same store", + ); + + await bootSession(page); + await loadSyntheticGame(page); + + // On-planet ship groups are *not* rendered as map primitives (the + // renderer hides them to avoid crowding); the player navigates to + // them through the planet inspector's stationed-ship row, which + // pivots the SelectionStore to the ship-group variant. + const earthScreen = await projectWorldToScreen(page, 100, 100); + await page.mouse.click(earthScreen.x, earthScreen.y); + + const sidebar = page.getByTestId("sidebar-tool-inspector"); + await expect(sidebar.getByTestId("inspector-planet-name")).toHaveText("Earth"); + await sidebar + .getByTestId("inspector-planet-ship-groups-select") + .first() + .click(); + await expect( + sidebar.getByTestId("inspector-ship-group-class"), + ).toHaveText("Frontier"); + + // Open Send. + await sidebar.getByTestId("inspector-ship-group-action-send").click(); + const sendShips = sidebar.getByTestId("inspector-ship-group-form-send-ships"); + await sendShips.fill("2"); + + // Pick Mars on the map. + await sidebar.getByTestId("inspector-ship-group-form-send-pick").click(); + const marsScreen = await projectWorldToScreen(page, 110, 100); + await page.mouse.click(marsScreen.x, marsScreen.y); + await expect( + sidebar.getByTestId("inspector-ship-group-form-send-destination"), + ).toContainText("Mars"); + + // Confirm. + await sidebar.getByTestId("inspector-ship-group-form-send-confirm").click(); + + // Verify the order tab carries both commands in submission order. + await page.getByTestId("sidebar-tab-order").click(); + const orderTool = page.getByTestId("sidebar-tool-order"); + await expect(orderTool.getByTestId("order-command-label-0")).toContainText( + "split group", + ); + await expect(orderTool.getByTestId("order-command-label-1")).toContainText( + "send group", + ); +}); diff --git a/ui/frontend/tests/galaxy-client.test.ts b/ui/frontend/tests/galaxy-client.test.ts index edf9e49..718e6be 100644 --- a/ui/frontend/tests/galaxy-client.test.ts +++ b/ui/frontend/tests/galaxy-client.test.ts @@ -217,5 +217,6 @@ function mockCore(opts: MockCoreOptions): Core & { speed: () => 0, cargoCapacity: () => 0, carryingMass: () => 0, + blockUpgradeCost: () => 0, }; } diff --git a/ui/frontend/tests/helpers/empty-ship-groups.ts b/ui/frontend/tests/helpers/empty-ship-groups.ts index aeaf15d..acea40d 100644 --- a/ui/frontend/tests/helpers/empty-ship-groups.ts +++ b/ui/frontend/tests/helpers/empty-ship-groups.ts @@ -18,10 +18,12 @@ export const EMPTY_SHIP_GROUPS: { incomingShipGroups: ReportIncomingShipGroup[]; unidentifiedShipGroups: ReportUnidentifiedShipGroup[]; localFleets: ReportLocalFleet[]; + otherRaces: string[]; } = { localShipGroups: [], otherShipGroups: [], incomingShipGroups: [], unidentifiedShipGroups: [], localFleets: [], + otherRaces: [], }; diff --git a/ui/frontend/tests/inspector-ship-group-actions.test.ts b/ui/frontend/tests/inspector-ship-group-actions.test.ts new file mode 100644 index 0000000..95bc07c --- /dev/null +++ b/ui/frontend/tests/inspector-ship-group-actions.test.ts @@ -0,0 +1,264 @@ +// Vitest coverage for Phase 20's ship-group action panel. Exercises +// the disabled-with-tooltip rules per action, the implicit-split +// pattern (an action targeting fewer ships than the group holds +// emits a `breakShipGroup` command before the action), and the +// happy-path commits of every variant. The dismantle confirmation +// for foreign-COL groups lives in its own file +// (`inspector-ship-group-dismantle-confirm.test.ts`); the modernize +// cost preview lives in `inspector-ship-group-modernize-cost.test.ts`. + +import "@testing-library/jest-dom/vitest"; +import "fake-indexeddb/auto"; +import { fireEvent, render, waitFor } from "@testing-library/svelte"; +import { afterEach, beforeEach, describe, expect, test } from "vitest"; + +import { i18n } from "../src/lib/i18n/index.svelte"; +import type { + ReportLocalFleet, + ReportLocalShipGroup, + ReportPlanet, + ShipClassSummary, +} from "../src/api/game-state"; +import ShipGroup, { + type ShipGroupSelection, +} from "../src/lib/inspectors/ship-group.svelte"; +import { + ORDER_DRAFT_CONTEXT_KEY, + OrderDraftStore, +} from "../src/sync/order-draft.svelte"; +import { IDBCache } from "../src/platform/store/idb-cache"; +import { openGalaxyDB, type GalaxyDB } from "../src/platform/store/idb"; +import type { Cache } from "../src/platform/store/index"; +import type { IDBPDatabase } from "idb"; + +const GAME_ID = "11111111-2222-3333-4444-555555555555"; + +let db: IDBPDatabase; +let dbName: string; +let cache: Cache; +let draft: OrderDraftStore; + +const PLANETS: ReportPlanet[] = [ + planet({ number: 17, name: "Castle", x: 100, y: 100, kind: "local" }), + planet({ number: 99, name: "Outpost", x: 110, y: 110, kind: "other", owner: "Foreign" }), + planet({ number: 33, name: "Reach", x: 150, y: 150, kind: "uninhabited" }), +]; + +const SHIP_CLASS_FRONTIER: ShipClassSummary = { + name: "Frontier", + drive: 5, + armament: 0, + weapons: 0, + shields: 0, + cargo: 1, +}; + +beforeEach(async () => { + dbName = `galaxy-ship-group-actions-${crypto.randomUUID()}`; + db = await openGalaxyDB(dbName); + cache = new IDBCache(db); + draft = new OrderDraftStore(); + await draft.init({ cache, gameId: GAME_ID }); + i18n.resetForTests("en"); +}); + +afterEach(async () => { + draft.dispose(); + db.close(); + await new Promise((resolve) => { + const req = indexedDB.deleteDatabase(dbName); + req.onsuccess = () => resolve(); + req.onerror = () => resolve(); + req.onblocked = () => resolve(); + }); +}); + +function planet( + overrides: Partial & Pick, +): ReportPlanet { + return { + owner: null, + size: 1000, + resources: 5, + industryStockpile: 100, + materialsStockpile: 100, + industry: 100, + population: 100, + colonists: 100, + production: null, + freeIndustry: 100, + ...overrides, + }; +} + +function localGroup( + overrides: Partial = {}, +): ReportLocalShipGroup { + return { + id: "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + count: 3, + class: "Frontier", + tech: { drive: 1, weapons: 0, shields: 0, cargo: 1 }, + cargo: "NONE", + load: 0, + destination: 17, + origin: null, + range: null, + speed: 0, + mass: 12, + state: "In_Orbit", + fleet: null, + ...overrides, + }; +} + +function mount( + group: ReportLocalShipGroup, + options: { + otherRaces?: string[]; + localFleets?: ReportLocalFleet[]; + localPlayerDrive?: number; + } = {}, +) { + const selection: ShipGroupSelection = { variant: "local", group }; + const context = new Map([ + [ORDER_DRAFT_CONTEXT_KEY, draft], + ]); + return render(ShipGroup, { + props: { + selection, + planets: PLANETS, + localShipClass: [SHIP_CLASS_FRONTIER], + localFleets: options.localFleets ?? [], + otherRaces: options.otherRaces ?? ["Aliens"], + mapWidth: 1000, + mapHeight: 1000, + localPlayerDrive: options.localPlayerDrive ?? 5, + localPlayerWeapons: 1, + localPlayerShields: 1, + localPlayerCargo: 2, + }, + context, + }); +} + +describe("ship-group inspector — action enablement", () => { + test("non-orbit groups disable every action with the busy tooltip", () => { + const ui = mount(localGroup({ state: "In_Space" })); + for (const id of [ + "inspector-ship-group-action-split", + "inspector-ship-group-action-send", + "inspector-ship-group-action-load", + "inspector-ship-group-action-unload", + "inspector-ship-group-action-modernize", + "inspector-ship-group-action-dismantle", + "inspector-ship-group-action-transfer", + "inspector-ship-group-action-join-fleet", + ]) { + const button = ui.getByTestId(id); + expect(button).toBeDisabled(); + expect(button.getAttribute("title")).toMatch(/ships are busy/i); + } + }); + + test("send is disabled when no planet is in drive range", () => { + const ui = mount(localGroup({ destination: 17 }), { localPlayerDrive: 0 }); + const button = ui.getByTestId("inspector-ship-group-action-send"); + expect(button).toBeDisabled(); + expect(button.getAttribute("title")).toMatch(/no planets are within drive range/i); + }); + + test("transfer is disabled when there are no other races", () => { + const ui = mount(localGroup(), { otherRaces: [] }); + const button = ui.getByTestId("inspector-ship-group-action-transfer"); + expect(button).toBeDisabled(); + expect(button.getAttribute("title")).toMatch(/no other non-extinct races/i); + }); + + test("unload is disabled when the group carries no cargo", () => { + const ui = mount(localGroup({ cargo: "NONE", load: 0 })); + const button = ui.getByTestId("inspector-ship-group-action-unload"); + expect(button).toBeDisabled(); + expect(button.getAttribute("title")).toMatch(/empty/i); + }); + + test("unload of colonists is blocked over a foreign planet", () => { + const ui = mount(localGroup({ destination: 99, cargo: "COL", load: 1.5 })); + const button = ui.getByTestId("inspector-ship-group-action-unload"); + expect(button).toBeDisabled(); + expect(button.getAttribute("title")).toMatch(/colonists cannot be unloaded over a foreign planet/i); + }); + + test("load is blocked over a foreign planet", () => { + const ui = mount(localGroup({ destination: 99 })); + const button = ui.getByTestId("inspector-ship-group-action-load"); + expect(button).toBeDisabled(); + expect(button.getAttribute("title")).toMatch(/own or unowned planets/i); + }); +}); + +describe("ship-group inspector — implicit split + action", () => { + test("split with K=1 of 3 emits a single breakShipGroup", async () => { + const ui = mount(localGroup({ count: 3 })); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-split")); + const input = ui.getByTestId("inspector-ship-group-form-split-ships") as HTMLInputElement; + await fireEvent.input(input, { target: { value: "1" } }); + await fireEvent.click(ui.getByTestId("inspector-ship-group-form-split-confirm")); + await waitFor(() => expect(draft.commands).toHaveLength(1)); + const cmd = draft.commands[0]!; + expect(cmd.kind).toBe("breakShipGroup"); + if (cmd.kind !== "breakShipGroup") return; + expect(cmd.groupId).toBe("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + expect(cmd.quantity).toBe(1); + }); + + test("dismantle on the whole group emits a single dismantleShipGroup", async () => { + const ui = mount(localGroup({ count: 2 })); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-dismantle")); + await fireEvent.click(ui.getByTestId("inspector-ship-group-form-dismantle-confirm")); + await waitFor(() => expect(draft.commands).toHaveLength(1)); + const cmd = draft.commands[0]!; + expect(cmd.kind).toBe("dismantleShipGroup"); + if (cmd.kind !== "dismantleShipGroup") return; + expect(cmd.groupId).toBe("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + }); + + test("dismantle on a subset emits implicit Break + Dismantle on the new group", async () => { + const ui = mount(localGroup({ count: 3 })); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-dismantle")); + const input = ui.getByTestId("inspector-ship-group-form-dismantle-ships") as HTMLInputElement; + await fireEvent.input(input, { target: { value: "2" } }); + await fireEvent.click(ui.getByTestId("inspector-ship-group-form-dismantle-confirm")); + await waitFor(() => expect(draft.commands).toHaveLength(2)); + const [breakCmd, action] = draft.commands; + if (breakCmd?.kind !== "breakShipGroup") throw new Error("expected break first"); + if (action?.kind !== "dismantleShipGroup") throw new Error("expected dismantle second"); + expect(breakCmd.groupId).toBe("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + expect(breakCmd.quantity).toBe(2); + expect(action.groupId).toBe(breakCmd.newGroupId); + }); + + test("transfer to the only available race emits a transferShipGroup", async () => { + const ui = mount(localGroup(), { otherRaces: ["Aliens"] }); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-transfer")); + await fireEvent.click(ui.getByTestId("inspector-ship-group-form-transfer-confirm")); + await waitFor(() => expect(draft.commands).toHaveLength(1)); + const cmd = draft.commands[0]!; + if (cmd.kind !== "transferShipGroup") throw new Error("wrong kind"); + expect(cmd.acceptor).toBe("Aliens"); + expect(cmd.groupId).toBe("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + }); + + test("join fleet with a fresh name emits joinFleetShipGroup", async () => { + const ui = mount(localGroup()); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-join-fleet")); + const input = ui.getByTestId("inspector-ship-group-form-join-fleet-new") as HTMLInputElement; + await fireEvent.input(input, { target: { value: "Vanguard" } }); + await fireEvent.click(ui.getByTestId("inspector-ship-group-form-join-fleet-confirm")); + await waitFor(() => expect(draft.commands).toHaveLength(1)); + const cmd = draft.commands[0]!; + if (cmd.kind !== "joinFleetShipGroup") throw new Error("wrong kind"); + expect(cmd.name).toBe("Vanguard"); + expect(cmd.groupId).toBe("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + }); +}); diff --git a/ui/frontend/tests/inspector-ship-group-dismantle-confirm.test.ts b/ui/frontend/tests/inspector-ship-group-dismantle-confirm.test.ts new file mode 100644 index 0000000..71c1618 --- /dev/null +++ b/ui/frontend/tests/inspector-ship-group-dismantle-confirm.test.ts @@ -0,0 +1,201 @@ +// Vitest coverage for the Phase 20 dismantle confirmation. The +// inspector requires an explicit second click ("colonists die") when +// the player tries to dismantle a colonist-laden group over a +// foreign planet — engine rule reference: +// `controller/ship_group.go.shipGroupDismantle:177-179` (over a +// foreign planet, `UnloadColonists` is not called and the cargo is +// lost). + +import "@testing-library/jest-dom/vitest"; +import "fake-indexeddb/auto"; +import { fireEvent, render, waitFor } from "@testing-library/svelte"; +import { afterEach, beforeEach, describe, expect, test } from "vitest"; + +import { i18n } from "../src/lib/i18n/index.svelte"; +import type { + ReportLocalShipGroup, + ReportPlanet, + ShipClassSummary, +} from "../src/api/game-state"; +import ShipGroup, { + type ShipGroupSelection, +} from "../src/lib/inspectors/ship-group.svelte"; +import { + ORDER_DRAFT_CONTEXT_KEY, + OrderDraftStore, +} from "../src/sync/order-draft.svelte"; +import { IDBCache } from "../src/platform/store/idb-cache"; +import { openGalaxyDB, type GalaxyDB } from "../src/platform/store/idb"; +import type { Cache } from "../src/platform/store/index"; +import type { IDBPDatabase } from "idb"; + +const GAME_ID = "11111111-2222-3333-4444-555555555555"; + +let db: IDBPDatabase; +let dbName: string; +let cache: Cache; +let draft: OrderDraftStore; + +const PLANETS: ReportPlanet[] = [ + { + number: 99, + name: "Outpost", + x: 100, + y: 100, + kind: "other", + owner: "Foreign", + size: 500, + resources: 5, + industryStockpile: 0, + materialsStockpile: 0, + industry: 500, + population: 500, + colonists: 100, + production: "Capital", + freeIndustry: 500, + }, + { + number: 17, + name: "Castle", + x: 50, + y: 50, + kind: "local", + owner: null, + size: 1000, + resources: 5, + industryStockpile: 0, + materialsStockpile: 0, + industry: 1000, + population: 1000, + colonists: 100, + production: "Capital", + freeIndustry: 1000, + }, +]; + +const SHIP_CLASS_FRONTIER: ShipClassSummary = { + name: "Frontier", + drive: 5, + armament: 0, + weapons: 0, + shields: 0, + cargo: 1, +}; + +beforeEach(async () => { + dbName = `galaxy-ship-group-dismantle-${crypto.randomUUID()}`; + db = await openGalaxyDB(dbName); + cache = new IDBCache(db); + draft = new OrderDraftStore(); + await draft.init({ cache, gameId: GAME_ID }); + i18n.resetForTests("en"); +}); + +afterEach(async () => { + draft.dispose(); + db.close(); + await new Promise((resolve) => { + const req = indexedDB.deleteDatabase(dbName); + req.onsuccess = () => resolve(); + req.onerror = () => resolve(); + req.onblocked = () => resolve(); + }); +}); + +function group( + overrides: Partial = {}, +): ReportLocalShipGroup { + return { + id: "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", + count: 2, + class: "Frontier", + tech: { drive: 1, weapons: 0, shields: 0, cargo: 1 }, + cargo: "COL", + load: 1.5, + destination: 99, + origin: null, + range: null, + speed: 0, + mass: 12, + state: "In_Orbit", + fleet: null, + ...overrides, + }; +} + +function mount(g: ReportLocalShipGroup) { + const selection: ShipGroupSelection = { variant: "local", group: g }; + const context = new Map([ + [ORDER_DRAFT_CONTEXT_KEY, draft], + ]); + return render(ShipGroup, { + props: { + selection, + planets: PLANETS, + localShipClass: [SHIP_CLASS_FRONTIER], + localFleets: [], + otherRaces: ["Aliens"], + mapWidth: 1000, + mapHeight: 1000, + localPlayerDrive: 5, + localPlayerWeapons: 1, + localPlayerShields: 1, + localPlayerCargo: 2, + }, + context, + }); +} + +describe("ship-group inspector — dismantle confirmation", () => { + test("first click on dismantle of foreign-COL group shows the warning and adds nothing", async () => { + const ui = mount(group()); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-dismantle")); + expect( + ui.getByTestId("inspector-ship-group-form-dismantle-warning"), + ).toBeInTheDocument(); + const confirm = ui.getByTestId( + "inspector-ship-group-form-dismantle-confirm", + ); + expect(confirm).toHaveTextContent(/colonists die/i); + await fireEvent.click(confirm); + expect(draft.commands).toHaveLength(0); + }); + + test("second click on the colonists-die confirm emits dismantleShipGroup", async () => { + const ui = mount(group()); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-dismantle")); + const confirm = ui.getByTestId( + "inspector-ship-group-form-dismantle-confirm", + ); + await fireEvent.click(confirm); + await fireEvent.click(confirm); + await waitFor(() => expect(draft.commands).toHaveLength(1)); + const cmd = draft.commands[0]!; + expect(cmd.kind).toBe("dismantleShipGroup"); + }); + + test("dismantle over own planet skips the warning even with COL aboard", async () => { + const ui = mount(group({ destination: 17 })); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-dismantle")); + expect( + ui.queryByTestId("inspector-ship-group-form-dismantle-warning"), + ).toBeNull(); + await fireEvent.click( + ui.getByTestId("inspector-ship-group-form-dismantle-confirm"), + ); + await waitFor(() => expect(draft.commands).toHaveLength(1)); + expect(draft.commands[0]!.kind).toBe("dismantleShipGroup"); + }); + + test("dismantle over foreign planet without colonists skips the warning", async () => { + const ui = mount(group({ cargo: "NONE", load: 0 })); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-dismantle")); + expect( + ui.queryByTestId("inspector-ship-group-form-dismantle-warning"), + ).toBeNull(); + await fireEvent.click( + ui.getByTestId("inspector-ship-group-form-dismantle-confirm"), + ); + await waitFor(() => expect(draft.commands).toHaveLength(1)); + }); +}); diff --git a/ui/frontend/tests/inspector-ship-group-modernize-cost.test.ts b/ui/frontend/tests/inspector-ship-group-modernize-cost.test.ts new file mode 100644 index 0000000..b4c5807 --- /dev/null +++ b/ui/frontend/tests/inspector-ship-group-modernize-cost.test.ts @@ -0,0 +1,204 @@ +// Vitest coverage for the Phase 20 modernize cost preview. The +// preview line in the inspector calls `core.blockUpgradeCost` once +// per ship block and multiplies the per-ship total by the number of +// targeted ships. The preview hides when `Core` is unavailable; when +// `tech === "ALL"` the targets are the player's race tech levels; +// otherwise only the picked block contributes to the cost. + +import "@testing-library/jest-dom/vitest"; +import "fake-indexeddb/auto"; +import { fireEvent, render } from "@testing-library/svelte"; +import { afterEach, beforeEach, describe, expect, test } from "vitest"; + +import { i18n } from "../src/lib/i18n/index.svelte"; +import type { + ReportLocalShipGroup, + ReportPlanet, + ShipClassSummary, +} from "../src/api/game-state"; +import ShipGroup, { + type ShipGroupSelection, +} from "../src/lib/inspectors/ship-group.svelte"; +import { + ORDER_DRAFT_CONTEXT_KEY, + OrderDraftStore, +} from "../src/sync/order-draft.svelte"; +import { CORE_CONTEXT_KEY, CoreHolder } from "../src/lib/core-context.svelte"; +import type { Core } from "../src/platform/core/index"; +import { IDBCache } from "../src/platform/store/idb-cache"; +import { openGalaxyDB, type GalaxyDB } from "../src/platform/store/idb"; +import type { Cache } from "../src/platform/store/index"; +import type { IDBPDatabase } from "idb"; + +const GAME_ID = "11111111-2222-3333-4444-555555555555"; + +let db: IDBPDatabase; +let dbName: string; +let cache: Cache; +let draft: OrderDraftStore; + +const PLANETS: ReportPlanet[] = [ + { + number: 17, + name: "Castle", + x: 100, + y: 100, + kind: "local", + owner: null, + size: 1000, + resources: 5, + industryStockpile: 0, + materialsStockpile: 0, + industry: 1000, + population: 1000, + colonists: 0, + production: "Capital", + freeIndustry: 1000, + }, +]; + +const SHIP_CLASS_CRUISER: ShipClassSummary = { + name: "Cruiser", + drive: 5, + armament: 0, + weapons: 0, + shields: 5, + cargo: 5, +}; + +beforeEach(async () => { + dbName = `galaxy-ship-group-modernize-${crypto.randomUUID()}`; + db = await openGalaxyDB(dbName); + cache = new IDBCache(db); + draft = new OrderDraftStore(); + await draft.init({ cache, gameId: GAME_ID }); + i18n.resetForTests("en"); +}); + +afterEach(async () => { + draft.dispose(); + db.close(); + await new Promise((resolve) => { + const req = indexedDB.deleteDatabase(dbName); + req.onsuccess = () => resolve(); + req.onerror = () => resolve(); + req.onblocked = () => resolve(); + }); +}); + +function group( + overrides: Partial = {}, +): ReportLocalShipGroup { + return { + id: "cccccccc-cccc-cccc-cccc-cccccccccccc", + count: 4, + class: "Cruiser", + tech: { drive: 1, weapons: 0, shields: 1, cargo: 1 }, + cargo: "NONE", + load: 0, + destination: 17, + origin: null, + range: null, + speed: 0, + mass: 25, + state: "In_Orbit", + fleet: null, + ...overrides, + }; +} + +// stubCore mirrors `pkg/calc/ship.go.BlockUpgradeCost` exactly so the +// preview line shows the same number the WASM bridge would produce. +// The other Core methods are no-ops because the modernize preview +// only consults `weaponsBlockMass` (returns null when armament is +// zero) and `blockUpgradeCost`. +function stubCore(): Core { + return { + signRequest: () => new Uint8Array(), + verifyResponse: () => true, + verifyEvent: () => true, + verifyPayloadHash: () => true, + driveEffective: ({ drive, driveTech }) => drive * driveTech, + emptyMass: () => 0, + weaponsBlockMass: ({ weapons, armament }) => { + if ((armament === 0 && weapons !== 0) || (armament !== 0 && weapons === 0)) { + return null; + } + return (armament + 1) * (weapons / 2); + }, + fullMass: ({ emptyMass, carryingMass }) => emptyMass + carryingMass, + speed: () => 0, + cargoCapacity: () => 0, + carryingMass: () => 0, + blockUpgradeCost: ({ blockMass, currentTech, targetTech }) => { + if (blockMass === 0 || targetTech <= currentTech) return 0; + return (1 - currentTech / targetTech) * 10 * blockMass; + }, + }; +} + +function mount( + g: ReportLocalShipGroup, + options: { core?: Core | null } = {}, +) { + const selection: ShipGroupSelection = { variant: "local", group: g }; + const holder = new CoreHolder(); + if (options.core !== undefined) holder.set(options.core); + const context = new Map([ + [ORDER_DRAFT_CONTEXT_KEY, draft], + [CORE_CONTEXT_KEY, holder], + ]); + return render(ShipGroup, { + props: { + selection, + planets: PLANETS, + localShipClass: [SHIP_CLASS_CRUISER], + localFleets: [], + otherRaces: [], + mapWidth: 1000, + mapHeight: 1000, + localPlayerDrive: 2, + localPlayerWeapons: 2, + localPlayerShields: 2, + localPlayerCargo: 2, + }, + context, + }); +} + +describe("ship-group inspector — modernize cost preview", () => { + test("ALL upgrade preview matches the BlockUpgradeCost formula × ship count", async () => { + // drive: mass=5 current=1 target=2 → (1 - 0.5) * 10 * 5 = 25 + // shields: mass=5 current=1 target=2 → 25 + // cargo: mass=5 current=1 target=2 → 25 + // weapons: armament=0 weapons=0 → block mass 0 → 0 + // per-ship = 75; group of 4 → 300 + const ui = mount(group(), { core: stubCore() }); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-modernize")); + const preview = ui.getByTestId("inspector-ship-group-form-modernize-cost"); + expect(preview).toHaveTextContent("300"); + }); + + test("per-block tech with custom level uses only that block", async () => { + // DRIVE only, target=2: 25 per ship × 4 = 100. + const ui = mount(group(), { core: stubCore() }); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-modernize")); + await fireEvent.change( + ui.getByTestId("inspector-ship-group-form-modernize-tech"), + { target: { value: "DRIVE" } }, + ); + await fireEvent.input( + ui.getByTestId("inspector-ship-group-form-modernize-level"), + { target: { value: "2" } }, + ); + const preview = ui.getByTestId("inspector-ship-group-form-modernize-cost"); + expect(preview).toHaveTextContent("100"); + }); + + test("preview is unavailable when Core is not loaded", async () => { + const ui = mount(group(), { core: null }); + await fireEvent.click(ui.getByTestId("inspector-ship-group-action-modernize")); + const preview = ui.getByTestId("inspector-ship-group-form-modernize-cost"); + expect(preview).toHaveTextContent(/preview unavailable/i); + }); +}); diff --git a/ui/frontend/tests/sync-order-types-ship-group.test.ts b/ui/frontend/tests/sync-order-types-ship-group.test.ts new file mode 100644 index 0000000..e432081 --- /dev/null +++ b/ui/frontend/tests/sync-order-types-ship-group.test.ts @@ -0,0 +1,244 @@ +// Vitest coverage for the Phase 20 ship-group command shapes — +// `validateCommand` for each of the eight new variants. The +// validator is invoked through the public `OrderDraftStore.add` +// path so a regression in either layer surfaces here. + +import "fake-indexeddb/auto"; +import { afterEach, beforeEach, describe, expect, test } from "vitest"; + +import { OrderDraftStore } from "../src/sync/order-draft.svelte"; +import type { OrderCommand } from "../src/sync/order-types"; +import { IDBCache } from "../src/platform/store/idb-cache"; +import { openGalaxyDB, type GalaxyDB } from "../src/platform/store/idb"; +import type { Cache } from "../src/platform/store/index"; +import type { IDBPDatabase } from "idb"; + +const GAME_ID = "11111111-2222-3333-4444-555555555555"; +const GROUP_ID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; +const NEW_GROUP_ID = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"; + +let db: IDBPDatabase; +let dbName: string; +let cache: Cache; +let draft: OrderDraftStore; + +beforeEach(async () => { + dbName = `galaxy-validate-ship-group-${crypto.randomUUID()}`; + db = await openGalaxyDB(dbName); + cache = new IDBCache(db); + draft = new OrderDraftStore(); + await draft.init({ cache, gameId: GAME_ID }); +}); + +afterEach(async () => { + draft.dispose(); + db.close(); + await new Promise((resolve) => { + const req = indexedDB.deleteDatabase(dbName); + req.onsuccess = () => resolve(); + req.onerror = () => resolve(); + req.onblocked = () => resolve(); + }); +}); + +async function statusOf(cmd: OrderCommand): Promise { + await draft.add(cmd); + return draft.statuses[cmd.id]!; +} + +describe("validateCommand — ship-group variants", () => { + test("breakShipGroup with positive quantity is valid", async () => { + expect( + await statusOf({ + kind: "breakShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + newGroupId: NEW_GROUP_ID, + quantity: 2, + }), + ).toBe("valid"); + }); + + test("breakShipGroup with quantity 0 is invalid", async () => { + expect( + await statusOf({ + kind: "breakShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + newGroupId: NEW_GROUP_ID, + quantity: 0, + }), + ).toBe("invalid"); + }); + + test("breakShipGroup with same source and new id is invalid", async () => { + expect( + await statusOf({ + kind: "breakShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + newGroupId: GROUP_ID, + quantity: 1, + }), + ).toBe("invalid"); + }); + + test("sendShipGroup with positive destination is valid", async () => { + expect( + await statusOf({ + kind: "sendShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + destinationPlanetNumber: 7, + }), + ).toBe("valid"); + }); + + test("sendShipGroup to planet 0 is invalid", async () => { + expect( + await statusOf({ + kind: "sendShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + destinationPlanetNumber: 0, + }), + ).toBe("invalid"); + }); + + test("loadShipGroup with valid cargo and quantity is valid", async () => { + expect( + await statusOf({ + kind: "loadShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + cargo: "COL", + quantity: 1.5, + }), + ).toBe("valid"); + }); + + test("loadShipGroup with zero quantity is invalid", async () => { + expect( + await statusOf({ + kind: "loadShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + cargo: "COL", + quantity: 0, + }), + ).toBe("invalid"); + }); + + test("unloadShipGroup with positive quantity is valid", async () => { + expect( + await statusOf({ + kind: "unloadShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + quantity: 0.5, + }), + ).toBe("valid"); + }); + + test("upgradeShipGroup ALL with level 0 is valid", async () => { + expect( + await statusOf({ + kind: "upgradeShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + tech: "ALL", + level: 0, + }), + ).toBe("valid"); + }); + + test("upgradeShipGroup ALL with non-zero level is invalid", async () => { + expect( + await statusOf({ + kind: "upgradeShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + tech: "ALL", + level: 2, + }), + ).toBe("invalid"); + }); + + test("upgradeShipGroup DRIVE with positive level is valid", async () => { + expect( + await statusOf({ + kind: "upgradeShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + tech: "DRIVE", + level: 1.5, + }), + ).toBe("valid"); + }); + + test("upgradeShipGroup DRIVE with level 0 is invalid", async () => { + expect( + await statusOf({ + kind: "upgradeShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + tech: "DRIVE", + level: 0, + }), + ).toBe("invalid"); + }); + + test("dismantleShipGroup with valid uuid is valid", async () => { + expect( + await statusOf({ + kind: "dismantleShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + }), + ).toBe("valid"); + }); + + test("transferShipGroup with valid acceptor name is valid", async () => { + expect( + await statusOf({ + kind: "transferShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + acceptor: "Aliens", + }), + ).toBe("valid"); + }); + + test("transferShipGroup with empty acceptor is invalid", async () => { + expect( + await statusOf({ + kind: "transferShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + acceptor: "", + }), + ).toBe("invalid"); + }); + + test("joinFleetShipGroup with valid name is valid", async () => { + expect( + await statusOf({ + kind: "joinFleetShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + name: "Vanguard", + }), + ).toBe("valid"); + }); + + test("joinFleetShipGroup with empty name is invalid", async () => { + expect( + await statusOf({ + kind: "joinFleetShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + name: "", + }), + ).toBe("invalid"); + }); +}); diff --git a/ui/frontend/tests/sync-submit-ship-group.test.ts b/ui/frontend/tests/sync-submit-ship-group.test.ts new file mode 100644 index 0000000..95b0a33 --- /dev/null +++ b/ui/frontend/tests/sync-submit-ship-group.test.ts @@ -0,0 +1,266 @@ +// Vitest round-trip coverage for the eight Phase 20 ship-group +// command shapes. The encoder lives in `sync/submit.ts`; the +// decoder lives in `sync/order-load.ts`. We capture the request +// bytes the encoder produces, re-emit them inside a +// `UserGamesOrderGetResponse` envelope, and feed that to +// `fetchOrder`. The decoded command must match the original — any +// drift between encoder and decoder fails here first. + +import { Builder, ByteBuffer } from "flatbuffers"; +import { describe, expect, test, vi } from "vitest"; + +import type { GalaxyClient } from "../src/api/galaxy-client"; +import { uuidToHiLo } from "../src/api/game-state"; +import { UUID } from "../src/proto/galaxy/fbs/common"; +import { + CommandItem, + CommandPayload, + CommandShipGroupBreak, + CommandShipGroupDismantle, + CommandShipGroupJoinFleet, + CommandShipGroupLoad, + CommandShipGroupSend, + CommandShipGroupTransfer, + CommandShipGroupUnload, + CommandShipGroupUpgrade, + UserGamesOrder, + UserGamesOrderGetResponse, + UserGamesOrderResponse, +} from "../src/proto/galaxy/fbs/order"; +import { fetchOrder } from "../src/sync/order-load"; +import { submitOrder } from "../src/sync/submit"; +import type { OrderCommand } from "../src/sync/order-types"; + +const GAME_ID = "11111111-2222-3333-4444-555555555555"; +const GROUP_ID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; + +function mockClient( + executeCommand: ( + messageType: string, + payload: Uint8Array, + ) => Promise<{ resultCode: string; payloadBytes: Uint8Array }>, +): GalaxyClient { + return { executeCommand } as unknown as GalaxyClient; +} + +// captureRequestBytes runs submitOrder against a mock that records +// the outgoing payload, then returns those bytes (which are a valid +// `UserGamesOrder` envelope). +async function captureRequestBytes(cmds: OrderCommand[]): Promise { + let captured: Uint8Array | null = null; + const exec = vi.fn(async (_msg: string, payload: Uint8Array) => { + captured = payload; + const builder = new Builder(64); + const [hi, lo] = uuidToHiLo(GAME_ID); + const gameIdOffset = UUID.createUUID(builder, hi, lo); + UserGamesOrderResponse.startUserGamesOrderResponse(builder); + UserGamesOrderResponse.addGameId(builder, gameIdOffset); + UserGamesOrderResponse.addUpdatedAt(builder, BigInt(0)); + const offset = UserGamesOrderResponse.endUserGamesOrderResponse(builder); + builder.finish(offset); + return { resultCode: "ok", payloadBytes: builder.asUint8Array() }; + }); + const result = await submitOrder(mockClient(exec), GAME_ID, cmds); + expect(result.ok).toBe(true); + expect(captured).not.toBeNull(); + return captured!; +} + +// wrapAsGetResponse rebuilds the captured `UserGamesOrder` inside a +// `UserGamesOrderGetResponse` envelope by walking each +// `CommandItem`, copying its identity fields, and re-packing each +// payload through `unpack().pack(builder)` — the FBS-generated +// helper that round-trips a typed table into a fresh builder. +function wrapAsGetResponse(orderBytes: Uint8Array): Uint8Array { + const order = UserGamesOrder.getRootAsUserGamesOrder( + new ByteBuffer(orderBytes), + ); + const builder = new Builder(256); + const itemOffsets: number[] = []; + for (let i = 0; i < order.commandsLength(); i++) { + const item = order.commands(i); + if (item === null) continue; + const cmdIdOffset = builder.createString(item.cmdId() ?? ""); + const payloadType = item.payloadType(); + const payloadOffset = packPayload(builder, item, payloadType); + CommandItem.startCommandItem(builder); + CommandItem.addCmdId(builder, cmdIdOffset); + CommandItem.addPayloadType(builder, payloadType); + CommandItem.addPayload(builder, payloadOffset); + itemOffsets.push(CommandItem.endCommandItem(builder)); + } + const commandsVec = UserGamesOrder.createCommandsVector(builder, itemOffsets); + const [hi, lo] = uuidToHiLo(GAME_ID); + const gameIdOffset = UUID.createUUID(builder, hi, lo); + UserGamesOrder.startUserGamesOrder(builder); + UserGamesOrder.addGameId(builder, gameIdOffset); + UserGamesOrder.addUpdatedAt(builder, order.updatedAt()); + UserGamesOrder.addCommands(builder, commandsVec); + const orderOffset = UserGamesOrder.endUserGamesOrder(builder); + + UserGamesOrderGetResponse.startUserGamesOrderGetResponse(builder); + UserGamesOrderGetResponse.addFound(builder, true); + UserGamesOrderGetResponse.addOrder(builder, orderOffset); + const resOffset = + UserGamesOrderGetResponse.endUserGamesOrderGetResponse(builder); + builder.finish(resOffset); + return builder.asUint8Array(); +} + +function packPayload( + builder: Builder, + item: NonNullable>, + payloadType: CommandPayload, +): number { + switch (payloadType) { + case CommandPayload.CommandShipGroupBreak: { + const inner = new CommandShipGroupBreak(); + item.payload(inner); + return inner.unpack().pack(builder); + } + case CommandPayload.CommandShipGroupSend: { + const inner = new CommandShipGroupSend(); + item.payload(inner); + return inner.unpack().pack(builder); + } + case CommandPayload.CommandShipGroupLoad: { + const inner = new CommandShipGroupLoad(); + item.payload(inner); + return inner.unpack().pack(builder); + } + case CommandPayload.CommandShipGroupUnload: { + const inner = new CommandShipGroupUnload(); + item.payload(inner); + return inner.unpack().pack(builder); + } + case CommandPayload.CommandShipGroupUpgrade: { + const inner = new CommandShipGroupUpgrade(); + item.payload(inner); + return inner.unpack().pack(builder); + } + case CommandPayload.CommandShipGroupDismantle: { + const inner = new CommandShipGroupDismantle(); + item.payload(inner); + return inner.unpack().pack(builder); + } + case CommandPayload.CommandShipGroupTransfer: { + const inner = new CommandShipGroupTransfer(); + item.payload(inner); + return inner.unpack().pack(builder); + } + case CommandPayload.CommandShipGroupJoinFleet: { + const inner = new CommandShipGroupJoinFleet(); + item.payload(inner); + return inner.unpack().pack(builder); + } + default: + throw new Error(`unsupported payload type ${payloadType}`); + } +} + +async function roundTrip(cmd: OrderCommand): Promise { + const requestBytes = await captureRequestBytes([cmd]); + const responseBytes = wrapAsGetResponse(requestBytes); + const exec = vi.fn(async () => ({ + resultCode: "ok", + payloadBytes: responseBytes, + })); + const result = await fetchOrder(mockClient(exec), GAME_ID, 0); + expect(result.commands).toHaveLength(1); + return result.commands[0]!; +} + +describe("submit + order-load round-trip — ship-group commands", () => { + test("breakShipGroup", async () => { + const cmd: OrderCommand = { + kind: "breakShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + newGroupId: "11112222-3333-4444-5555-666677778888", + quantity: 3, + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); + + test("sendShipGroup", async () => { + const cmd: OrderCommand = { + kind: "sendShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + destinationPlanetNumber: 42, + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); + + test("loadShipGroup", async () => { + const cmd: OrderCommand = { + kind: "loadShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + cargo: "MAT", + quantity: 12.5, + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); + + test("unloadShipGroup", async () => { + const cmd: OrderCommand = { + kind: "unloadShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + quantity: 6.5, + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); + + test("upgradeShipGroup ALL", async () => { + const cmd: OrderCommand = { + kind: "upgradeShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + tech: "ALL", + level: 0, + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); + + test("upgradeShipGroup DRIVE level 1.5", async () => { + const cmd: OrderCommand = { + kind: "upgradeShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + tech: "DRIVE", + level: 1.5, + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); + + test("dismantleShipGroup", async () => { + const cmd: OrderCommand = { + kind: "dismantleShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); + + test("transferShipGroup", async () => { + const cmd: OrderCommand = { + kind: "transferShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + acceptor: "Aliens", + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); + + test("joinFleetShipGroup", async () => { + const cmd: OrderCommand = { + kind: "joinFleetShipGroup", + id: crypto.randomUUID(), + groupId: GROUP_ID, + name: "Vanguard", + }; + expect(await roundTrip(cmd)).toEqual(cmd); + }); +}); diff --git a/ui/wasm/main.go b/ui/wasm/main.go index 7bc311c..dfb13b2 100644 --- a/ui/wasm/main.go +++ b/ui/wasm/main.go @@ -25,6 +25,7 @@ // - speed(fields) -> number // - cargoCapacity(fields) -> number // - carryingMass(fields) -> number +// - blockUpgradeCost(fields) -> number (Phase 20: modernize cost preview) // // Field objects are plain JS objects with camelCase keys matching the // TypeScript `Core` interface, and bytes fields are Uint8Array. @@ -59,6 +60,7 @@ func main() { "speed": js.FuncOf(speed), "cargoCapacity": js.FuncOf(cargoCapacity), "carryingMass": js.FuncOf(carryingMass), + "blockUpgradeCost": js.FuncOf(blockUpgradeCost), })) // Block forever so the Go runtime stays alive while JS keeps calling @@ -224,6 +226,21 @@ func carryingMass(_ js.Value, args []js.Value) any { return js.ValueOf(calc.CarryingMass(load, cargoTech)) } +// blockUpgradeCost bridges `calc.BlockUpgradeCost`. Input +// `{ blockMass, currentTech, targetTech }`, output a JS number +// (production cost of moving one block from currentTech to +// targetTech; zero when blockMass is zero or targetTech is not +// above currentTech). +func blockUpgradeCost(_ js.Value, args []js.Value) any { + if len(args) != 1 { + return js.Null() + } + blockMass := args[0].Get("blockMass").Float() + currentTech := args[0].Get("currentTech").Float() + targetTech := args[0].Get("targetTech").Float() + return js.ValueOf(calc.BlockUpgradeCost(blockMass, currentTech, targetTech)) +} + // copyBytesFromJS materialises a JS Uint8Array (or any indexable // byte-shaped value) into a Go byte slice. We avoid `js.CopyBytesToGo` // because TinyGo's implementation panics on values it does not