Commit 460fd6d
chore(runway): cherry-pick fix(perps): complete spot-balance parity cp-7.72.2 (#29237)
- fix(perps): complete spot-balance parity cp-7.72.2 (#29110)
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **Description**
Full fix for **TAT-3016 — [PROD INCIDENT] MetaMask UI shows $0 balance
for accounts with spot + perps funds on HyperLiquid**. Builds on Matt's
stream fix
([#29089](#29089)) and
adds the two missing pieces uncovered during investigation.
### What was broken
For HyperLiquid accounts that hold collateral as spot USDC (non-zero
`spotClearinghouseState.balances.USDC`) but zero perps clearinghouse
balance (`clearinghouseState.withdrawable == 0`,
`marginSummary.accountValue == 0`), three independent code paths were
under-reporting the balance:
| Path | Pre-fix `totalBalance` | Pre-fix `availableBalance` | Why |
|---|---|---|---|
| Streamed (`HyperLiquidSubscriptionService` webData2 +
clearinghouseState callbacks) | `0` | `0` |
`adaptAccountStateFromSDK(data.clearinghouseState, undefined)` never
fetched/attached `spotClearinghouseState` |
| Standalone fetch (`PerpsController.getAccountState({standalone:
true})`) | `0` | `0` | Same omission pattern in a separate provider path
(`HyperLiquidProvider.ts:5545-5573`) |
| Full fetch (`PerpsController.getAccountState()`) | **correct**
(`101.13…`) | `0` | Only path that correctly queried both clearinghouse
+ spot |
### Why it surfaced now
Two independent changes in the week leading up to the incident made a
long-standing omission visible at scale:
1. **`feat(perps): disk-backed cold-start cache for instant data
display`
([#27898](#27898),
merged 2026-04-11)** changed `usePerpsLiveAccount` to seed first render
from the in-memory stream snapshot
(`streamManager.account.getSnapshot()`) before falling back to the
preloaded disk cache. The stream snapshot has always been spot-less
because `HyperLiquidSubscriptionService.ts:1406` and `:1604` have passed
`spotState=undefined` to `adaptAccountStateFromSDK` since December 2025
/ February 2026 (git blame). Flipping the trust order from disk cache →
live stream exposed the pre-existing zero on first paint.
2. **HyperLiquid Portfolio Margin alpha shipped on the 2026-04-18
network upgrade.** PM pushes more users to hold collateral as spot USDC
rather than transferring into perps clearinghouse, expanding the
population hitting the spot-only account shape.
Neither change is the root cause. The fix is on the MetaMask side: the
streamed and standalone account paths must read `spotClearinghouseState`
alongside `clearinghouseState` and include spot balance in
`totalBalance` for parity with the full-fetch path.
### What this PR does
- **Spot-inclusive balance across all three account-state paths.**
Streamed, standalone, and full-fetch paths now fold
`spotClearinghouseState.balances` into `AccountState.totalBalance` via
the shared `addSpotBalanceToAccountState` helper. Only
collateral-eligible coins contribute (`SPOT_COLLATERAL_COINS = {USDC,
USDH}`) — non-collateral spot assets (HYPE, PURR, …) are excluded so
they don't mis-gate the CTA for users who can't actually trade them.
- **USDH handled for HIP-3 USDH DEXs.** The codebase already models USDH
as auto-collateral (`HyperLiquidProvider.#isUsdhCollateralDex` /
`#getSpotUsdhBalance`); including USDH in the allowlist keeps USDH-only
HIP-3 users from hitting the same $0 regression.
- **`Add Funds` CTA gates on `totalBalance`.**
`PerpsMarketDetailsView.showAddFundsCTA` now checks `totalBalance <
threshold && defaultPayToken === null`. "User has any money in the perps
ecosystem → hide Add Funds." Also fixes the pre-existing edge case where
funds locked in an open position incorrectly prompted Add Funds.
- **Order-form preselect keeps `availableBalance`.**
`useDefaultPayWithTokenWhenNoPerpsBalance` gates on withdrawable so
spot-funded / margin-locked accounts still get an external pay token
preselected in `PerpsOrderView`. CTA correctness is preserved by the
component-level `totalBalance` guard.
- **Race-free spot state cache.** `#spotStateGeneration` token +
`#spotStatePromiseUserAddress` tracker in
`HyperLiquidSubscriptionService`. `#ensureSpotState` only shares
in-flight promises when the user matches; `#refreshSpotState` discards
result + error if generation was bumped post-await; `cleanUp` /
`clearAll` bump generation and null promise refs. Prevents user-A's spot
fetch from re-populating the cache after a switch to user B.
- **Cold-start SDK init.** `#refreshSpotState` now awaits
`ensureSubscriptionClient` before `getInfoClient()` (which throws on
fresh instances) so the first `subscribeToAccount` on a cold service
gets the spot-adjusted snapshot instead of perps-only until resubscribe.
- **`NaN` guard** in `addSpotBalanceToAccountState` keeps
`FallbackDataDisplay` sentinels intact when upstream `totalBalance` is
non-numeric.
### What this PR deliberately does NOT change
- **Order-form slider and order-placement warnings**
(`usePerpsOrderForm.ts`, `PerpsOrderView.tsx`) keep reading
`availableBalance`. Those surfaces need *immediately-spendable
withdrawable*. On standard-margin (non-Unified/non-PM) HyperLiquid
accounts, spot USDC is not directly usable as perps margin — users must
transfer spot → perps clearinghouse first. Showing a max order size that
HyperLiquid would reject at submit would be worse UX than the current
behaviour. This is HL's model for standard accounts and outside the
scope of the `$0 balance` incident.
- **No new fields on `AccountState`**. Considered adding
`availableToTradeBalance` (see
[#29090](#29090)) or
`spotUsdcBalance` (see
[#29092](#29092)); both
leak HL primitives into the shared protocol-agnostic contract and will
need reshaping once Portfolio Margin graduates from
[pre-alpha](https://hyperliquid.gitbook.io/hyperliquid-docs/trading/portfolio-margin).
Reusing existing `totalBalance` for the CTA gate solves the incident
with zero contract changes.
- **Portfolio Margin buying-power**. PM pre-alpha uses
HYPE-as-collateral with LTV-based borrow (`token_balance * oracle_price
* ltv`, LTV 0.5 for HYPE, `borrow_cap(USDC) = 1000` per user). Correct
PM buying-power math needs live oracle prices, LTV queries, and
account-mode detection — deferred until PM graduates and the API
stabilises. The spot USDC/USDH fix here still handles PM users who
happen to hold spot collateral.
- **Account-mode UI surface** (standard / Unified / PM). Valuable UX
signal, but independent of the balance math — tracked as a separate
follow-up. The fix on this PR is correct whether or not we surface mode
in the UI.
- **Core-side companion.** Matt's core PR
[#8533](MetaMask/core#8533) covers the stream
fix. The standalone-path fix on this PR needs a 1-liner mirror in
`@metamask/perps-controller` before mobile syncs that package — flagging
as follow-up.
## **Changelog**
CHANGELOG entry: Fixed Perps $0 balance display for accounts funded via
HyperLiquid spot USDC
## **Related issues**
Fixes:
[TAT-3016](https://consensyssoftware.atlassian.net/browse/TAT-3016)
Supersedes:
[#29090](#29090),
[#29092](#29092) (both
introduce a new `AccountState` field; this PR achieves the same
user-visible outcome via `totalBalance` without a contract change)
## **Manual testing steps**
```gherkin
Feature: Perps balance visibility for spot-funded accounts
Background:
Given the user holds spot USDC on HyperLiquid mainnet
And the user's HyperLiquid perps clearinghouse balance (withdrawable, marginSummary.accountValue) is 0
And the user is on MetaMask mobile with Perps enabled
Scenario: Header reflects spot-backed collateral
When user navigates to the Perps tab
Then the Perps header shows the spot USDC balance (e.g. $101.14), not $0
And "$0.00 available" is shown as the subtitle (correctly reflecting withdrawable)
Scenario: Market detail CTA respects total balance
Given user is on the Perps tab with the spot-only account
When user opens the BTC market detail view
Then the Long and Short action buttons are visible
And the "Add Funds" CTA is not shown
Scenario: Standalone account-state fetch
Given a developer queries Engine.context.PerpsController.getAccountState({ standalone: true, userAddress })
Then totalBalance matches the full-fetch path and includes the spot USDC balance
```
**Agentic recipe**: `evidence/recipe.json` (also in this branch) replays
the scenario via CDP and captures the stream / full-fetch / standalone
values plus screenshots. Run:
```bash
bash scripts/perps/agentic/validate-recipe.sh evidence --no-hud --skip-manual
```
Expected captures (after fix): `{stream,fetch,standalone}_totalBalance =
"101.13506928"` for the `0x316BDE155acd07609872a56Bc32CcfB0B13201fA`
Trading fixture; CTA state `{addFundsVisible:false,
longButtonVisible:true, shortButtonVisible:true}`.
## **Screenshots/Recordings**
Recipe: `evidence/recipe.json` on this branch — captures the 3 balance
paths, screenshots PerpsHome + PerpsMarketDetails, and probes CTA
testIDs on every run.
<table>
<tr>
<th width="50%">Before (pre-fix main)</th>
<th width="50%">After (this PR)</th>
</tr>
<tr>
<td>
<em>Perps tab header</em><br/>
Shows <code>$0</code> — the streamed value (spot-less). PerpsHome
renders the <code>PerpsEmptyBalance</code> placeholder instead of
Withdraw + Add Funds action buttons.
</td>
<td>
<em>Perps tab header</em><br/>
<img
src="https://raw.githubusercontent.com/abretonc7s/mm-mobile-farm-artifacts/main/fixes/29110/after-perps-home.png"
width="320"/><br/>
<code>$101.14</code> balance + "$0.00 available" subtitle + Withdraw /
Add Funds row (non-empty funded-state UI)
</td>
</tr>
<tr>
<td>
<em>PerpsMarketDetails (BTC)</em><br/>
Shows "Add Funds" CTA instead of Long / Short buttons. Trade path
blocked for spot-only accounts.
</td>
<td>
<em>PerpsMarketDetails (BTC)</em><br/>
<img
src="https://raw.githubusercontent.com/abretonc7s/mm-mobile-farm-artifacts/main/fixes/29110/after-market-details.png"
width="320"/><br/>
Long + Short buttons, no "Add Funds" CTA
</td>
</tr>
</table>
Visual before-fix screenshot was blocked by intermittent iOS Simulator
crashes during this session (unrelated Apple `libsystem_sim_platform`
issue). Trace-level evidence from the unfixed code stands:
```
// Streamed (HyperLiquidSubscriptionService #cachedAccount replayed via fresh subscribeToAccount listener)
{ "availableBalance": "0", "totalBalance": "0", ... }
// Standalone fetch: getAccountState({ standalone: true, userAddress: '0x316B...' })
{ "availableBalance": "0", "totalBalance": "0", ... }
// Full fetch: getAccountState() — the only path that was correct pre-fix
{ "availableBalance": "0", "totalBalance": "101.13506928", ... }
```
Three paths disagreed on the same account at the same moment. Matt's
`[PerpsDiag][ImportedAccount]` Sentry trace from prod confirms the same
spot-less streamed payload shape for multiple users hitting TAT-3016.
After-fix `trace.json` captures (from `evidence/recipe.json` run on
commit `7f0e9def6f`):
```
stream: totalBalance = "101.13506928", availableBalance = "0"
fetch: totalBalance = "101.13506928", availableBalance = "0"
standalone: totalBalance = "101.13506928", availableBalance = "0"
CTA probe: addFundsVisible = false, longButtonVisible = true, shortButtonVisible = true
```
All three balance paths now agree; CTA probe confirms Long + Short
visible, Add Funds hidden on the BTC market detail view.
## **Pre-merge author checklist**
- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
#### Performance checks (if applicable)
- [ ] I've tested on Android
- Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example
For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).
## **Pre-merge reviewer checklist**
- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
[TAT-3016]:
https://consensyssoftware.atlassian.net/browse/TAT-3016?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Medium Risk**
> Touches core perps balance reporting and adds new async spot-state
caching logic, so regressions could impact displayed totals and
streaming updates across accounts/DEXs. Changes are localized and
covered by targeted unit tests, but still affect user-visible
funded-state gating.
>
> **Overview**
> Fixes HyperLiquid *spot-funded* accounts showing a `$0` perps balance
by folding eligible spot collateral (USDC only) into
`AccountState.totalBalance` across **full fetch, standalone fetch, and
WebSocket-streamed** account updates via new
`getSpotBalance`/`addSpotBalanceToAccountState` helpers.
>
> Updates `HyperLiquidSubscriptionService` to fetch/cache
`spotClearinghouseState` (with generation-based anti-stale guards) and
apply spot-adjusted totals for both multi-DEX aggregation and single-DEX
`webData2` updates; `HyperLiquidProvider`’s standalone `getAccountState`
path now also fetches spot state and applies the same adjustment.
>
> Adjusts `PerpsMarketDetailsView` funding CTA logic to key off “has
direct order funding path” (spendable balance above threshold *or*
pay-with-token preselect available), adds coverage for the “total funded
but not spendable/no direct order path” case, and updates a perps market
list page-object selector to tap rows by test id instead of text.
>
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
385c39c. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: geositta <matthew.denton@consensys.net>
Co-authored-by: Michal Szorad <michal.szorad@consensys.net>
Co-authored-by: Javier Garcia Vera <javier.vera@consensys.net>
[3e535e6](3e535e6)
[TAT-3016]:
https://consensyssoftware.atlassian.net/browse/TAT-3016?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
Co-authored-by: abretonc7s <107169956+abretonc7s@users.noreply.github.com>
Co-authored-by: geositta <matthew.denton@consensys.net>
Co-authored-by: Michal Szorad <michal.szorad@consensys.net>
Co-authored-by: Javier Garcia Vera <javier.vera@consensys.net>
Co-authored-by: chloeYue <105063779+chloeYue@users.noreply.github.com>1 parent 6b85848 commit 460fd6d
10 files changed
Lines changed: 572 additions & 47 deletions
File tree
- app
- components/UI/Perps
- Views/PerpsMarketDetailsView
- hooks
- controllers/perps
- providers
- services
- utils
- tests/page-objects/Perps
Lines changed: 41 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1056 | 1056 | | |
1057 | 1057 | | |
1058 | 1058 | | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + | |
| 1074 | + | |
| 1075 | + | |
| 1076 | + | |
| 1077 | + | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + | |
| 1083 | + | |
| 1084 | + | |
| 1085 | + | |
| 1086 | + | |
| 1087 | + | |
| 1088 | + | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
| 1092 | + | |
| 1093 | + | |
| 1094 | + | |
| 1095 | + | |
| 1096 | + | |
| 1097 | + | |
| 1098 | + | |
| 1099 | + | |
1059 | 1100 | | |
1060 | 1101 | | |
1061 | 1102 | | |
| |||
Lines changed: 9 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
432 | 432 | | |
433 | 433 | | |
434 | 434 | | |
435 | | - | |
436 | | - | |
437 | | - | |
438 | | - | |
439 | | - | |
| 435 | + | |
440 | 436 | | |
441 | | - | |
442 | | - | |
| 437 | + | |
| 438 | + | |
443 | 439 | | |
444 | 440 | | |
445 | 441 | | |
| |||
1151 | 1147 | | |
1152 | 1148 | | |
1153 | 1149 | | |
1154 | | - | |
| 1150 | + | |
| 1151 | + | |
| 1152 | + | |
| 1153 | + | |
| 1154 | + | |
1155 | 1155 | | |
1156 | | - | |
| 1156 | + | |
1157 | 1157 | | |
1158 | 1158 | | |
1159 | 1159 | | |
| |||
Lines changed: 4 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
42 | 46 | | |
43 | 47 | | |
44 | 48 | | |
| |||
Lines changed: 19 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2154 | 2154 | | |
2155 | 2155 | | |
2156 | 2156 | | |
| 2157 | + | |
| 2158 | + | |
| 2159 | + | |
| 2160 | + | |
| 2161 | + | |
| 2162 | + | |
| 2163 | + | |
| 2164 | + | |
| 2165 | + | |
| 2166 | + | |
| 2167 | + | |
| 2168 | + | |
| 2169 | + | |
| 2170 | + | |
| 2171 | + | |
| 2172 | + | |
| 2173 | + | |
| 2174 | + | |
2157 | 2175 | | |
2158 | 2176 | | |
2159 | 2177 | | |
| |||
8575 | 8593 | | |
8576 | 8594 | | |
8577 | 8595 | | |
| 8596 | + | |
8578 | 8597 | | |
8579 | 8598 | | |
8580 | 8599 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
114 | 117 | | |
115 | 118 | | |
116 | 119 | | |
| |||
5632 | 5635 | | |
5633 | 5636 | | |
5634 | 5637 | | |
5635 | | - | |
5636 | | - | |
5637 | | - | |
5638 | | - | |
5639 | | - | |
| 5638 | + | |
| 5639 | + | |
| 5640 | + | |
| 5641 | + | |
| 5642 | + | |
| 5643 | + | |
| 5644 | + | |
| 5645 | + | |
| 5646 | + | |
| 5647 | + | |
| 5648 | + | |
| 5649 | + | |
| 5650 | + | |
| 5651 | + | |
| 5652 | + | |
| 5653 | + | |
| 5654 | + | |
| 5655 | + | |
| 5656 | + | |
| 5657 | + | |
| 5658 | + | |
| 5659 | + | |
5640 | 5660 | | |
5641 | | - | |
5642 | | - | |
| 5661 | + | |
| 5662 | + | |
| 5663 | + | |
5643 | 5664 | | |
5644 | 5665 | | |
5645 | | - | |
| 5666 | + | |
| 5667 | + | |
| 5668 | + | |
| 5669 | + | |
5646 | 5670 | | |
5647 | 5671 | | |
5648 | 5672 | | |
| |||
5757 | 5781 | | |
5758 | 5782 | | |
5759 | 5783 | | |
5760 | | - | |
5761 | | - | |
5762 | | - | |
5763 | | - | |
5764 | | - | |
5765 | | - | |
5766 | | - | |
5767 | | - | |
5768 | | - | |
5769 | | - | |
5770 | | - | |
5771 | | - | |
5772 | | - | |
| 5784 | + | |
| 5785 | + | |
| 5786 | + | |
| 5787 | + | |
5773 | 5788 | | |
5774 | 5789 | | |
5775 | 5790 | | |
| |||
Lines changed: 157 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
| 107 | + | |
107 | 108 | | |
108 | 109 | | |
109 | 110 | | |
| |||
371 | 372 | | |
372 | 373 | | |
373 | 374 | | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
374 | 379 | | |
375 | 380 | | |
376 | 381 | | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
377 | 385 | | |
378 | 386 | | |
379 | 387 | | |
| |||
3672 | 3680 | | |
3673 | 3681 | | |
3674 | 3682 | | |
| 3683 | + | |
| 3684 | + | |
| 3685 | + | |
| 3686 | + | |
| 3687 | + | |
| 3688 | + | |
| 3689 | + | |
| 3690 | + | |
| 3691 | + | |
| 3692 | + | |
| 3693 | + | |
| 3694 | + | |
| 3695 | + | |
| 3696 | + | |
| 3697 | + | |
| 3698 | + | |
| 3699 | + | |
| 3700 | + | |
| 3701 | + | |
| 3702 | + | |
| 3703 | + | |
| 3704 | + | |
| 3705 | + | |
| 3706 | + | |
| 3707 | + | |
| 3708 | + | |
| 3709 | + | |
| 3710 | + | |
| 3711 | + | |
| 3712 | + | |
| 3713 | + | |
| 3714 | + | |
| 3715 | + | |
| 3716 | + | |
| 3717 | + | |
| 3718 | + | |
| 3719 | + | |
| 3720 | + | |
| 3721 | + | |
| 3722 | + | |
| 3723 | + | |
| 3724 | + | |
| 3725 | + | |
| 3726 | + | |
| 3727 | + | |
| 3728 | + | |
| 3729 | + | |
| 3730 | + | |
| 3731 | + | |
| 3732 | + | |
| 3733 | + | |
| 3734 | + | |
| 3735 | + | |
| 3736 | + | |
| 3737 | + | |
| 3738 | + | |
| 3739 | + | |
| 3740 | + | |
| 3741 | + | |
| 3742 | + | |
| 3743 | + | |
| 3744 | + | |
| 3745 | + | |
| 3746 | + | |
| 3747 | + | |
| 3748 | + | |
| 3749 | + | |
| 3750 | + | |
| 3751 | + | |
| 3752 | + | |
| 3753 | + | |
| 3754 | + | |
| 3755 | + | |
| 3756 | + | |
| 3757 | + | |
| 3758 | + | |
| 3759 | + | |
| 3760 | + | |
| 3761 | + | |
| 3762 | + | |
| 3763 | + | |
| 3764 | + | |
| 3765 | + | |
| 3766 | + | |
| 3767 | + | |
| 3768 | + | |
| 3769 | + | |
| 3770 | + | |
| 3771 | + | |
| 3772 | + | |
| 3773 | + | |
| 3774 | + | |
| 3775 | + | |
| 3776 | + | |
| 3777 | + | |
| 3778 | + | |
| 3779 | + | |
| 3780 | + | |
| 3781 | + | |
| 3782 | + | |
| 3783 | + | |
| 3784 | + | |
| 3785 | + | |
| 3786 | + | |
| 3787 | + | |
| 3788 | + | |
| 3789 | + | |
| 3790 | + | |
| 3791 | + | |
| 3792 | + | |
| 3793 | + | |
| 3794 | + | |
| 3795 | + | |
| 3796 | + | |
| 3797 | + | |
| 3798 | + | |
| 3799 | + | |
| 3800 | + | |
| 3801 | + | |
| 3802 | + | |
| 3803 | + | |
| 3804 | + | |
| 3805 | + | |
| 3806 | + | |
| 3807 | + | |
| 3808 | + | |
| 3809 | + | |
| 3810 | + | |
| 3811 | + | |
| 3812 | + | |
| 3813 | + | |
| 3814 | + | |
| 3815 | + | |
| 3816 | + | |
| 3817 | + | |
| 3818 | + | |
| 3819 | + | |
| 3820 | + | |
| 3821 | + | |
| 3822 | + | |
| 3823 | + | |
| 3824 | + | |
| 3825 | + | |
| 3826 | + | |
| 3827 | + | |
| 3828 | + | |
| 3829 | + | |
| 3830 | + | |
| 3831 | + | |
3675 | 3832 | | |
3676 | 3833 | | |
3677 | 3834 | | |
| |||
0 commit comments