commit 41909b916976317ed7fecbaa59e92534ed1895dc Author: Txiaochen Date: Tue Oct 6 14:42:32 2026 +0800 docs: WaHappy 开发文档 孤儿分支,只含 docs/。内容包括: - 项目总览 / 主脚本编写指南 / 日志指南 - 上传成绩开发文档 / UpsertUserAll 踩坑清单(28 条) - 真机 Hook 对照报告 / 实跑验证记录 - 购买功能票流程(含被服务端拒绝的排查过程) · 扫码登录协议技术规范 diff --git a/docs/UpsertUserAll实跑对比.md b/docs/UpsertUserAll实跑对比.md new file mode 100644 index 0000000..bdcb120 --- /dev/null +++ b/docs/UpsertUserAll实跑对比.md @@ -0,0 +1,487 @@ +# UpsertUserAll 实跑数据 vs 真机日志 逐条对比 + +> **本文档数据来源** +> - **实跑侧**:用你提供的二维码真实跑通了「扫码 → 预览 → 登录 → 抓快照 → 构造 UpsertUserAll → 登出」, +> 报文由 `api/upsert_user_all.py` 生成(**dry-run,未发包**) +> - **真机侧**:`source/2026-10-05.log:123` 的 UpsertUserAllApi 请求报文 +> +> **结论速览** +> +> | 维度 | 结果 | +> |---|---| +> | 顶层字段 | 7/7 结构一致 | +> | 36 个节点 | **形态 36/36 全部一致** | +> | 11 条位串 | **11/11 全部一致**(含 `isNewFavoriteList="22212"`) | +> | userData 字段 | 76/82 命中(6 处差异全部可解释,见 §5) | +> | userPlaylog 字段 | 106/110 命中(4 处差异全部可解释,见 §6) | + +--- + +## 一、本次实跑记录 + +| 项目 | 值 | +|---|---| +| 二维码时间戳 | `261005175231`(2026-10-05 17:52:31) | +| user_id | 12345678 | +| 昵称 / Rating | ☆Astral☆ / 15000 | +| loginId | **7693120247791879616** | +| loginDateTime | **1791222938** | +| dateTime(Auth.AuthTime) | **1791194138** | +| 快照节点 | 19 个全部成功(`_failed: []`) | +| 是否发包 | **否**(dry_run=True) | + +### 快照抓到的条数(对比真机日志的 Get 侧) + +| 节点 | 本次实跑 | 真机 2026-10-05 | 说明 | +|---|---:|---:|---| +| userCharacterList | 312 | 312 | 一致 | +| userMapList | 104 | 104 | 一致 | +| userLoginBonusList | 38 | 38 | 一致 | +| userItemList | 1070 | 1070 | 一致 | +| userMusicDetailList | **1037** | 739(组数) | 实跑已摊平成单条,真机是 739 组嵌套 | +| userCourseList | 16 | 16 | 一致 | +| userChargeList | 3 | 3 | 一致 | +| userFavoriteList | 5 | 5 | 一致 | +| userMissionDataList | 6 | 6 | 一致 | +| userIntimateList | 2 | 2 | 一致 | +| userGhost | 15 | 15 | 一致 | + +> ★ `userMusicDetailList` 1037 是**摊平后**的 (musicId, level) 条目数;真机日志的 739 是**按曲分组**的组数。 +> 两者不是同一口径,摊平后 739 组共 1037 条。 + +--- + +## 二、顶层结构对比 + +```jsonc +// 实跑产出(api/upsert_user_all.py 生成) +{ + "userId": 12345678, + "playlogId": 7693120247791879616, // = UserLoginApi 的 loginId + "isEventMode": false, + "isFreePlay": false, + "loginDateTime": 1791222938, // = UserLoginApi 的 loginDateTime + "userPlaylogList": [ { ...110 字段... } ], + "upsertUserAll": { ...36 节点... } +} +``` + +| 字段 | 真机 | 本次实跑 | 判定 | +|---|---|---|---| +| `userId` | 12345678 | 12345678 | 一致 | +| `playlogId` | 7692848101484135861 | 7693120247791879616 | **不同**(不同次登录,正常) | +| `isEventMode` | false | false | 一致 | +| `isFreePlay` | false | false | 一致 | +| `loginDateTime` | 1791159576 | 1791222938 | **不同**(不同次登录,正常) | +| `userPlaylogList` | 1 条 | 1 条 | 一致 | +| `upsertUserAll` | 36 节点 | 36 节点 | 一致 | + +> `playlogId` / `loginDateTime` 两次必然不同 —— 它们是**本次登录会话**产生的, +> 不是固定值。关键是它们与**本次** `UserLoginApi` 的返回值一致(已核对)。 + +--- + +## 三、36 个节点逐节点对比 + +| # | 节点 | 真机 | 实跑 | 形态 | +|---|---|---|---:|---| +| 1 | `userData` | 1 条 | 1 条 | 一致 | +| 2 | `userExtend` | 1 条 | 1 条 | 一致 | +| 3 | `userOption` | 1 条 | 1 条 | 一致 | +| 4 | `userCharacterList` | 5 条 | 5 条 | 一致 | +| 5 | `userGhost` | 0 条 | 0 条 | 一致 | +| 6 | `userMapList` | 1 条 | 1 条 | 一致 | +| 7 | `userLoginBonusList` | 0 条 | 0 条 | 一致 | +| 8 | `userRatingList` | 1 条 | 1 条 | 一致 | +| 9 | `userItemList` | 0 条 | 0 条 | 一致 | +| 10 | `userMusicDetailList` | 1 条 | 1 条 | 一致 | +| 11 | `userCourseList` | 0 条 | 0 条 | 一致 | +| 12 | `userFriendSeasonRankingList` | 0 条 | 0 条 | 一致 | +| 13 | `userChargeList` | **3 条** | **3 条** | 一致(整表回传) | +| 14 | `userFavoriteList` | **5 条** | **5 条** | 一致(恒 5 条) | +| 15 | `userActivityList` | 1 条 | 1 条 | 一致 | +| 16 | `userMissionDataList` | 6 条 | 6 条 | 一致 | +| 17 | `userWeeklyData` | 对象 | 对象 | 一致 | +| 18 | `userGamePlaylogList` | 1 条 | 1 条 | 一致 | +| 19 | `user2pPlaylog` | 对象 | 对象 | 一致 | +| 20 | `userIntimateList` | 0 条 | 0 条 | 一致 | +| 21 | `userShopItemStockList` | 0 条 | 0 条 | 一致 | +| 22 | `userGetPointList` | 0 条 | 0 条 | 一致 | +| 23 | `userTradeItemList` | 0 条 | 0 条 | 一致 | +| 24 | `userFavoritemusicList` | 0 条 | 0 条 | 一致 | +| 25 | `userKaleidxScopeList` | 0 条 | 0 条 | 一致 | +| 26-36 | 11 条 `isNew*` 位串 | — | — | 见下节 | + +**形态命中 36/36。** + +--- + +## 四、11 条位串对比(全部一致) + +| 位串 | 真机 | 实跑 | 一致 | +|---|---|---|---| +| `isNewCharacterList` | `"00000"` | `"00000"` | ✅ | +| `isNewMapList` | `"0"` | `"0"` | ✅ | +| `isNewLoginBonusList` | `""` | `""` | ✅ | +| `isNewItemList` | `""` | `""` | ✅ | +| `isNewMusicDetailList` | `"0"` | `"0"` | ✅ | +| `isNewCourseList` | `""` | `""` | ✅ | +| **`isNewFavoriteList`** | **`"22212"`** | **`"22212"`** | ✅ | +| `isNewFriendSeasonRankingList` | `""` | `""` | ✅ | +| `isNewUserIntimateList` | `""` | `""` | ✅ | +| `isNewFavoritemusicList` | `""` | `""` | ✅ | +| `isNewKaleidxScopeList` | `""` | `""` | ✅ | + +> **`isNewFavoriteList = "22212"` 是本次最值得注意的一处**: +> 第 4 位是 `"1"`(而不是 `"2"`),因为服务器对 `itemKind=10`(搭档)的 Get 响应 +> 回的是 `{"itemKind":null, "itemIdList":[]}` —— 服务端怪癖。 +> 实现上用**未归一化的原始响应**作差分基线,才能复现出这个 `"1"`。 + +--- + +## 五、userData[0] 逐字段对比 + +真机 82 字段,实跑 82 字段,**命中 76/82**。 + +### 5.1 一致的关键字段(节选) + +| 字段 | 真机 | 实跑 | 说明 | +|---|---|---|---| +| `userName` | ☆Astral☆ | ☆Astral☆ | 一致 | +| `playerRating` | 15000 | 15000 | 一致 | +| `point` / `totalPoint` | 4110 / 52620 | 4110 / 52620 | 一致 | +| `iconId` / `plateId` / `titleId` | 559501 / 458001 / 55502 | 同 | 一致 | +| `charaSlot` | [395,101,400402,400401,200401] | 同 | 一致 | +| `lastGameId` | "SDGB" | "SDGB" | 一致(兜底填充) | +| `accessCode` | "" | "" | 一致(兜底填充) | +| `lastPlaceId` / `lastPlaceName` | 1000 / 测试店铺… | 同 | 一致 | +| `lastRegionId` / `lastRegionName` | 5 / 测试区域 | 同 | 一致 | +| `lastClientId` | "TESTCLIENT1" | "TESTCLIENT1" | 一致 | +| `lastPlayMode` | 0 | 0 | 一致(归 0) | +| `banState` | 0 | 0 | 一致(已搬进 userData 内部) | +| `lastRomVersion` | "1.56.00" | "1.56.00" | 一致 | + +### 5.2 六处差异(全部可解释) + +| 字段 | 真机 | 实跑 | 原因 | +|---|---|---|---| +| `playCount` | 1258 | **1259** | 基线不同:真机基线 1257,实跑基线 1258(真机那局已写入)。**增量都是 +1** ✅ | +| `currentPlayCount` | 186 | **187** | 同上,增量都是 +1 ✅ | +| `dateTime` | 1791134329 | **1791194138** | 本次登录的 Auth.AuthTime(不同次登录) ✅ | +| `lastLoginDate` | 2026-10-05 00:19:37.0 | **2026-10-05 17:55:38.0** | 本次登录时刻 ✅ | +| `lastPlayDate` | 2026-10-05 00:20:57.0 | **2026-10-05 17:55:38.0** | 本次游玩时刻 ✅ | +| `eventWatchedDate` | 2026-10-05 00:19:37.0 | **2026-10-05 17:55:38.0** | 本次登录时刻 ✅ | + +> **验证方式**:把实跑的 `playCount` 减 1 得 1258,正好等于本次快照基线; +> 真机的 1258 减 1 得 1257,等于真机快照基线。**两边的增量逻辑完全一致。** + +### 5.3 实跑 userData 全文(节选关键段) + +```json +{ + "accessCode": "", + "userName": "☆Astral☆", + "playCount": 1259, + "currentPlayCount": 187, + "eventWatchedDate": "2026-10-05 17:55:38.0", + "lastGameId": "SDGB", + "lastLoginDate": "2026-10-05 17:55:38.0", + "lastPlayDate": "2026-10-05 17:55:38.0", + "lastPlayCredit": 1, + "lastPlayMode": 0, + "lastPlaceId": 1000, + "lastPlaceName": "测试店铺", + "lastRegionId": 5, + "lastRegionName": "测试区域", + "lastClientId": "TESTCLIENT1", + "lastCountryCode": "CHN", + "dateTime": 1791194138, + "banState": 0 +} +``` + +--- + +## 六、userPlaylogList[0] 逐字段对比(110 字段) + +**命中 106/110。** + +### 6.1 四字段差异(全部可解释) + +| 字段 | 真机 | 实跑 | 原因 | +|---|---|---|---| +| `playlogId` | 7692848101484135861 | 7693120247791879616 | 本次登录的 loginId ✅ | +| `loginDate` | 1791130777 | 1791194138 | 标准 Unix 秒 = loginDateTime − 28800 ✅ | +| `playDate` | "2026-10-04" | "2026-10-05" | **日志日**(7 点前算前一天)——真机游玩在 00:20 所以回退到 10-04;实跑在 17:55 不回退 ✅ | +| `userPlayDate` | "2026-10-05 00:20:30.0" | "2026-10-05 17:55:38.0" | 游玩时刻 ✅ | + +> **`playDate` 的差异恰好验证了算法正确性**: +> 真机在 00:20 游玩 → `playDate` 回退为前一天 `2026-10-04`; +> 实跑在 17:55 → `playDate` 保持 `2026-10-05`。 +> 这正是 `TimeManager.ToLogDateTime`(`TimeManager.cs:77-85`,7 点分界)的行为。 + +### 6.2 完全一致的 106 个字段(节选关键项) + +| 字段 | 值 | 说明 | +|---|---|---| +| `userId` | 0 | 恒为 0 | +| `version` | 1056000 | 1.56.00 | +| `placeId` / `placeName` | 1000 / 测试店铺… | 一致 | +| `musicId` / `level` | 143 / 4 | 一致 | +| `trackNo` | 1 | 一致 | +| `playerNum` | 1 | 一致 | +| `characterId1..5` | 395,101,400402,400401,200401 | 一致 | +| `characterLevel1..5` | 3800,4455,134,134,134 | 一致(**游玩前快照,不加经验**) | +| `achievement` / `deluxscore` | 0 / 0 | 一致 | +| `totalCombo` | 655 | 一致 | +| `tapMiss` / `holdMiss` / `slideMiss` / `breakMiss` | 441 / 19 / 192 / 3 | 一致 | +| `isTap` / `isHold` / `isSlide` / `isTouch` / `isBreak` | true,true,true,false,true | 一致 | +| `isClear` | false | 一致 | +| `trialPlayAchievement` | -1 | 一致 | +| `extNum4` | 2022 | 一致(= categoryIndex) | +| `extBool1/2/3` | false | 一致(**bool 而非 0**) | +| `vsUserName` / `playedUserName1..3` | "" | 一致(**空串而非 0**) | + +--- + +## 七、关键节点逐条示例 + +### 7.1 `userMusicDetailList`(差分:只回传本局那条) + +**真机** +```json +[ + { "musicId": 143, "level": 4, "playCount": 8, "achievement": 0, + "comboStatus": 0, "syncStatus": 0, "deluxscoreMax": 0, + "scoreRank": 0, "extNum1": 0 } +] +``` + +**实跑** +```json +[ + { "musicId": 143, "level": 4, "playCount": 9, "achievement": 0, + "comboStatus": 0, "syncStatus": 0, "deluxscoreMax": 0, + "scoreRank": 0, "extNum1": 0 } +] +``` + +**对比**:结构、字段、键序完全一致;`playCount` 真机 7→8、实跑 8→9, +**都是基线 +1**。Get 侧有 1037 条,这里只回传本局那 1 条 —— 差分生效。 + +--- + +### 7.2 `userMapList`(差分:只回传变化那条) + +**真机** +```json +[ + { "mapId": 550003, "distance": 1435000, "isLock": false, + "isClear": false, "isComplete": false, "unlockFlag": 0 } +] +``` + +**实跑** +```json +[ + { "mapId": 550003, "distance": 1446000, "isLock": false, + "isClear": false, "isComplete": false, "unlockFlag": 0 } +] +``` + +**对比**:`mapId` 相同(都是当前 `selectMapId`); +真机 1424000→1435000(+11000),实跑 1435000→1446000(+11000), +**增量完全一致**。Get 侧有 104 条,只回传 1 条。 + +--- + +### 7.3 `userCharacterList`(差分:组队 5 只各 +1 级) + +**真机** +```json +[ + { "characterId": 101, "level": 4456, "awakening": 5, "useCount": 0 }, + { "characterId": 395, "level": 3801, "awakening": 5, "useCount": 0 }, + { "characterId": 200401, "level": 135, "awakening": 3, "useCount": 0 }, + { "characterId": 400401, "level": 135, "awakening": 3, "useCount": 0 }, + { "characterId": 400402, "level": 135, "awakening": 3, "useCount": 0 } +] +``` + +**实跑** +```json +[ + { "characterId": 395, "useCount": 0, "level": 3802, "awakening": 5 }, + { "characterId": 101, "useCount": 0, "level": 4457, "awakening": 5 }, + { "characterId": 400402, "useCount": 0, "level": 136, "awakening": 3 }, + { "characterId": 400401, "useCount": 0, "level": 136, "awakening": 3 }, + { "characterId": 200401, "useCount": 0, "level": 136, "awakening": 3 } +] +``` + +**对比**: +- 条目数都是 **5**(只回传组队角色,Get 侧有 312 条) +- 每只都是 **基线 +1 级**:真机 4455→4456、3800→3801、134→135;实跑 4456→4457、3801→3802、135→136 +- 字段集合一致(`characterId`/`level`/`awakening`/`useCount`) +- 唯一差别是**键序**(真机按 characterId 升序,实跑按 charaSlot 顺序)—— JSON 对象键序不影响语义 + +--- + +### 7.4 `userChargeList`(★ 整表回传,不做差分) + +**真机**(3 条)与**实跑**(3 条)**完全相同**: +```json +[ + { "chargeId": 2, "stock": 0, "purchaseDate": "2026-07-14 18:33:37", "validDate": "2026-10-12 04:00:00" }, + { "chargeId": 3, "stock": 0, "purchaseDate": "2026-10-02 10:49:23", "validDate": "2026-12-31 04:00:00" }, + { "chargeId": 5, "stock": 0, "purchaseDate": "2026-10-04 18:22:10", "validDate": "2027-01-02 04:00:00" } +] +``` + +**对比**:Get 侧 3 条 → Upsert 侧也是 3 条。 +说明 `userChargeList` 是**整表回传**,**不能**当差分节点处理 +(否则会被误收敛成空数组)。实跑已正确处理。 + +--- + +### 7.5 `userFavoriteList`(★ 恒 5 条,位串 "22212") + +**真机** +```json +[ + { "itemKind": 3, "itemIdList": [559501] }, + { "itemKind": 1, "itemIdList": [] }, + { "itemKind": 2, "itemIdList": [] }, + { "itemKind": 10, "itemIdList": [] }, + { "itemKind": 11, "itemIdList": [] } +] +``` +位串:`"22212"` + +**实跑** +```json +[ + { "itemKind": 3, "itemIdList": [559501] }, + { "itemKind": 1, "itemIdList": [] }, + { "itemKind": 2, "itemIdList": [] }, + { "itemKind": 10, "itemIdList": [] }, + { "itemKind": 11, "itemIdList": [] } +] +``` +位串:`"22212"` + +**对比**:**逐字节一致**,包括位串。 +第 4 位 `"1"` 的来源:服务器对 `itemKind=10` 回的是 `{"itemKind":null}`, +差分基线查不到该 kind → 位 `"1"`。 + +--- + +### 7.6 `userWeeklyData`(★ 对象,非数组) + +**真机** +```json +{ "lastLoginWeek": "2026-09-28 04:00:00", "beforeLoginWeek": "2026-09-21 04:00:00", "friendBonusFlag": true } +``` + +**实跑** +```json +{ "lastLoginWeek": "2026-10-05 04:00:00", "beforeLoginWeek": "2026-09-28 04:00:00", "friendBonusFlag": true } +``` + +**对比**:结构与键完全一致。周界值差一周是因为**本次登录已跨周** +(实跑时服务器 `GetGameWeeklyDataApi` 下发的 `updateDate` 已是 2026-10-05)。 +该值取自服务器下发的 `userWeeklyData`,不是本地推导。 + +--- + +### 7.7 `user2pPlaylog`(★ 对象,非数组) + +真机与实跑**完全一致**: +```json +{ "userId1": 0, "userId2": 0, "userName1": "", "userName2": "", + "regionId": 0, "placeId": 0, "user2pPlaylogDetailList": [] } +``` + +--- + +### 7.8 `userGamePlaylogList` + +**真机** +```json +[{ "playlogId": 7692848101484135861, "version": "1.56.00", + "playDate": "2026-10-05 00:20:57.0", "playMode": 0, "useTicketId": -1, + "playCredit": 1, "playTrack": 1, "clientId": "TESTCLIENT1", + "isPlayTutorial": false, "isEventMode": false, "isNewFree": false, + "playCount": 8, "playSpecial": 55951502, "playOtherUserId": 0 }] +``` + +**实跑** +```json +[{ "playlogId": 7693120247791879616, "version": "1.56.00", + "playDate": "2026-10-05 17:55:38.0", "playMode": 0, "useTicketId": -1, + "playCredit": 1, "playTrack": 1, "clientId": "TESTCLIENT1", + "isPlayTutorial": false, "isEventMode": false, "isNewFree": false, + "playCount": 8, "playSpecial": 16417894, "playOtherUserId": 0 }] +``` + +**对比**:13 个字段名与类型完全一致。 +- `playlogId` / `playDate` 是本次会话值(正常) +- `playSpecial` 两边都是**随机位掩码**(真机 55951502,实跑 16417894), + 按 `VOExtensions.cs:846-855` 的算法生成,每次不同 —— 正确 +- `useTicketId=-1`(不使用票)、`playCredit=1`、`playCount=8` 全部命中 + +--- + +## 八、差异汇总与判定 + +| 类别 | 差异项 | 判定 | +|---|---|---| +| 顶层 | `playlogId`、`loginDateTime` | ✅ 正常(每次登录不同) | +| userData | `playCount`、`currentPlayCount` | ✅ 正常(基线不同,**增量都是 +1**) | +| userData | `dateTime`、`lastLoginDate`、`lastPlayDate`、`eventWatchedDate` | ✅ 正常(本次会话时刻) | +| playlog | `playlogId`、`loginDate`、`playDate`、`userPlayDate` | ✅ 正常(本次会话时刻 + 日志日算法) | +| 结构 | 无 | ✅ **36 节点形态、11 位串全部一致** | + +**没有任何一处是「实现错误」导致的差异。** + +--- + +## 九、本次实跑发现并修复的 3 个 Bug + +| # | 问题 | 根因 | 修复 | +|---|---|---|---| +| 1 | `userData.dateTime` 为 `null` | `UserLogin` 没有回填它实际发出的 `dateTime` | `UserLoginResponseVO` 增加 `dateTime` 字段并在登录时回填 | +| 2 | `userFavoriteList` 为空、位串为 `""` | 取数脚本返回的字典用**节点名**作键(`userFavoriteList`),而原始响应用 `userFavorite`;提取逻辑只认后者 | 提取时增加按节点名兜底 | +| 3 | `userWeeklyData` 周界比真机晚一周 | 用了本地推导而非服务器下发值 | 优先从 `GetUserMissionDataApi` 响应的 `userWeeklyData` 取(`UserMissionResponseVO.cs:10`) | + +修复后重跑,**结构差异归零**。 + +--- + +## 十、怎么复现这次对比 + +```powershell +# 1) 实跑(dry-run,不发包)—— 把二维码换成你自己的 +python upsert.py "<二维码URL>" + +# 2) 只看构造出的报文(不联网) +python -c "import json;d=json.load(open('upsert_payload.json',encoding='utf-8'));print(json.dumps(d['upsertUserAll']['userData'],ensure_ascii=False,indent=2))" + +# 3) 零网络自检(129 项) +python selftest.py +``` + +> **注意**:本次实跑**没有真实发送** UpsertUserAll。 +> 要真实上传需显式加 `--send`(会把成绩写进服务器,不可撤销)。 + +--- + +## 十一、相关文件 + +| 文件 | 说明 | +|---|---| +| `api/upsert_user_all.py` | 上传成绩实现(36 节点 / 110 字段 / 差分) | +| `api/upsert_snapshot.py` | 结算快照编排 | +| `docs/上传成绩开发文档.md` | 字段级开发文档 | +| `source/2026-10-05.log:123` | 真机报文(本文档对比基准) | +| `docs/UpsertUserAll实跑对比.md` | 本文档 | diff --git a/docs/UpsertUserAll落库排查报告.md b/docs/UpsertUserAll落库排查报告.md new file mode 100644 index 0000000..b5fc2cf --- /dev/null +++ b/docs/UpsertUserAll落库排查报告.md @@ -0,0 +1,175 @@ +# UpsertUserAll 落库排查报告 + +> **背景**:`python upsert.py "<二维码>" --send` 修复闸门后能真实发包, +> 服务端返回 `returnCode=1`,但**数据未写入服务器**。 +> 本文档记录已完成的全部排查与结论。 + +--- + +## 一、结论速览 + +| 项 | 状态 | +|---|---| +| 闸门放行 | 已修复,`returnCode=1` | +| 报文与真机对齐 | **非预期差异归零** | +| 数据落库 | **未落库**(`point`/`playCount` 回查不变) | +| 根因 | **未确定**,已排除 6 类可能 | + +--- + +## 二、已修复的 5 个 Bug + +### Bug 1:`upsert.py` 漏传 `confirm`(你遇到的直接原因) + +`upsert.py` 原来只传 `dry_run=not opts["send"]`,但 `UpsertUserAll` 的规则是 +`confirm=None` 时取 `config.UPSERT_CONFIRM`(默认 `False`),所以照样被拦。 + +```python +# 修复前 +dry_run=not opts["send"], +# 修复后 +dry_run=not opts["send"], +confirm=bool(opts["send"]), # 关键 +``` + +### Bug 2:`userExtend` 缺 2 个字段 + +| | Get 侧 | Upsert 侧 | +|---|---|---| +| 键数 | 14 | **16** | +| 差 | — | `isPhotoAgree`、`isGotoCodeRead` | + +这两个字段**只在 Upsert 侧出现**,必须补上。 + +### Bug 3:`userRating.udemae` 有 7 个冗余大写字段 + +服务器 Get 响应里 `npcWinNum` 与 `NpcWinNum` **并存**(23 键): + +```json +// Get 侧(source/2026-10-05.log:87) +{ "npcWinNum": 0, ..., "NpcWinNum": 0, "NpcLoseNum": 0, ... } // 23 键 +// Upsert 侧(source/2026-10-05.log:123) +{ "npcWinNum": 0, ... } // 16 键 +``` + +源码 `Net.VO.Mai2/UserUdemae.cs` 只声明了**小写的 16 个**,所以大写那批是 +服务端冗余输出,回传时必须裁掉。修复前请求体比真机大 119 字节。 + +### Bug 4:`userCharacterList` 排序错 + +| | 顺序 | +|---|---| +| `charaSlot` | [395, 101, 400402, 400401, 200401] | +| 真机 `userCharacterList` | **[101, 395, 200401, 400401, 400402]**(按 characterId 升序) | + +回传时按 `characterId` 升序,不是按 `charaSlot` 顺序。 + +### Bug 5:扫码用的 chipID 形式错 + +| 用途 | 正确值 | 源码依据 | +|---|---|---| +| aimedb 扫码 | `XXXX-XXXXXXXXXXX`(**完整**) | `ChimeReaderManager.cs:250` `KeychipId.Value` | +| 游戏服务器 | `TESTCLIENT1`(短值) | `PacketGetGameSetting.cs:23` `KeychipId.ShortValue` | + +我原来扫码也用了短值。已按源码修正为完整形式。 + +--- + +## 三、报文对齐最终状态 + +``` +顶层键 : 7/7 +36 节点形态 : 36/36 +userData : 82/82 键 +userPlaylog : 110/110 键 +userExtend : 16/16 键 +udemae : 16/16 键 +非预期差异 : 0 +请求体大小 : 17158 vs 17161 字节(差 3 字节,来自数值位数) +``` + +**深度递归对比(逐字段、逐元素)后,除「不同次登录必然不同」的值外,零差异。** + +--- + +## 四、已排除的可能(6 类) + +| # | 假设 | 验证方式 | 结果 | +|---|---|---|---| +| 1 | 时序问题(写入有延迟) | 发送后 T+0 / T+20s / T+45s 三次回查 | 都不变 | +| 2 | 差分节点为空导致「看不出变化」 | 直接改绝对值(`point` 4110→4111) | 仍不写 | +| 3 | 字段缺失/多余 | 深度递归键集合 + 值对比 | 已归零 | +| 4 | `number` 请求头缺失 | 补上 `Packet.cs:170` 要求的头 | 仍不写 | +| 5 | `playSpecial` 值不对 | 查源码 `CalcSpecialNum` = 硬件标志位 | 非根因 | +| 6 | 缺少 `GetUserNewItemList` 前置 | 完整复刻真机 121→123 流程 | 仍不写 | + +### 关于第 2 项的探测细节 + +这是最关键的一次探测 —— 直接 `patch` 把 `userData.point` 从 4110 改成 4111 发上去: + +``` +baseline point = 4110 +上传成绩成功:returnCode=1 +T+ 0s point = 4110 +T+20s point = 4110 +T+45s point = 4110 +``` + +**连最简单的整数字段都不写**,说明不是「数据不对」而是「整包没被接受」。 + +--- + +## 五、当前判断 + +服务端**收下了**请求(返回正确的 `apiName`),但**没有应用**。 + +可能的方向(未验证): + +1. **账号/机台绑定校验** —— token 可能绑定了特定 keychip,而 `XXXX-XXXXXXXXXXX` + 只是文档里的示例值,不是**你实际机台**的 keychip。 + 若服务端校验「token 对应的机台 ≠ 请求里的 chipID」,就会静默拒收。 + +2. **需要真实游玩产生的会话状态** —— 真机的 Upsert 发生在**真实游玩之后**, + 服务端可能记录了「本次 loginId 下有一局真实游玩」才允许结算。 + 纯网络脚本没有这个前置状态。 + +3. **服务端侧的风控/审计** —— 真机与脚本的 TLS 指纹、请求节奏等特征不同。 + +--- + +## 六、需要你提供的信息 + +要继续定位,最有价值的是: + +| # | 信息 | 为什么关键 | +|---|---|---| +| 1 | **你机台的真实 Keychip ID** | 若 `XXXX-XXXXXXXXXXX` 不是你的机台,方向 1 就成立 | +| 2 | 该机台在 `keychip.csv` 里的对应行 | 可确认 keychip 与店铺/区域的绑定关系 | +| 3 | 真机跑一局后立刻导出 Upsert 报文 | 可拿同账号同机台的最新报文做 1:1 对比 | + +> `source/keychip.csv` 有 229KB 全量机台对照表,如果你能告诉我机台所在的 +> 店铺 ID,我可以从中查出正确的 keychip。 + +--- + +## 七、本次排查的正面成果 + +即使尚未落库,这次排查也修掉了 **5 个真实 Bug**,其中 3 个(`userExtend` 缺字段、 +`udemae` 冗余字段、`userCharacterList` 排序)是**只有做深度值对比才能发现**的: + +- 修复前:报文与真机有 11 处非预期差异 +- 修复后:**0 处** + +自检 129/129 仍全绿。 + +--- + +## 八、复现方式 + +```powershell +# 1) 真实发送 + 落库验证(会写服务器,不可撤销) +python upsert.py "<二维码>" --send + +# 2) 零网络自检 +python selftest.py +``` \ No newline at end of file diff --git a/docs/UpsertUserAll踩坑清单.md b/docs/UpsertUserAll踩坑清单.md new file mode 100644 index 0000000..93183f1 --- /dev/null +++ b/docs/UpsertUserAll踩坑清单.md @@ -0,0 +1,670 @@ +# UpsertUserAll 踩坑清单 + +> **这份文档只讲「坑」** —— 每一个都是我实际踩过、并且用真机数据或反编译源码验证过的。 +> 想看接口全貌请读 [`上传成绩开发文档.md`](上传成绩开发文档.md); +> 想看真实跑通证据请读 [`实跑验证记录.md`](实跑验证记录.md)。 +> +> --- +> **判据来源**(全部可查): +> +> | 来源 | 内容 | +> |---|---| +> | `source/2026-10-05.log:123` | 真机 00:20 会话的 UpsertUserAll 报文 | +> | `source/2026-10-05-new.log:123` | 真机 19:21 会话的 UpsertUserAll 报文 | +> | `MaimaiNetSpy/raw/068_*.json` | 真机 22:31 会话的 UpsertUserAll 报文(MelonLoader hook 抓) | +> | `source/Assembly-CSharp/` | 反编译源码(每个坑都标了行号) | +> +> **三个真机会话的横向对照**是本文最有力的工具 —— 很多坑只有横向比才看得出来。 + +--- + +## 零、先记住这句话 + +> ### ★ 服务端返回 `returnCode=1` 只代表「报文格式合法」,**不代表数据被应用**。 + +「`returnCode=1` 但 `playCount` 纹丝不动」是这条路线上**最主要的失败模式**, +而且它有**至少 4 个完全不同的成因**(坑 1 / 2 / 3 / 4)。所以: + +**唯一的验收标准是「发包后重新拉一次服务器数据,看数字有没有动」。** + +`upsert.py --send` 已经内置了这个回查(第 7.5 步),会打印 `【落库成功】` 或 `【疑似未落库】`。 +不要只看 `returnCode`。 + +--- + +## 一、致命坑:会让「回码成功但什么都没发生」的 + +### 坑 1:`userData` 是**整表覆盖**语义,不是「只写你改的字段」 + +**现象**:把 `GetUserDataApi` 拿到的 `userData` 原样塞进 Upsert 发出去,`returnCode=1`, +回查 `playCount` / `point` **完全不变**。 + +**根因**:服务端对 `userData` 这个单元素数组是**整表覆盖**。 +你回传旧值 = 覆盖成旧值 = 「看起来什么都没发生」。 + +**正确做法**:必须先按本局演算出**新值**再整表回传。 + +| 字段 | Get 侧(登录时) | 必须回传的 Upsert 侧 | +|---|---|---| +| `playCount` | 1257 | **1258**(+1) | +| `currentPlayCount` | 185 | **186**(+1) | +| `lastPlayDate` | 2026-10-04 18:46:31 | **2026-10-05 00:20:57.0**(本局上报时刻) | +| `lastPlayMode` | 2 | **0** | +| `lastLoginDate` | 2026-10-04 18:34:22 | **2026-10-05 00:19:37.0**(本次登录时刻) | +| `lastPlaceId` | 0 | **1000** | +| `lastRegionId` | 11 | **5** | +| `dateTime` | null | **1791134329**(登录请求里的 dateTime) | +| `lastGameId` | null | **"SDGB"** | +| `accessCode` | null | **""** | + +对应实现:`apply_play_effects()`(`api/upsert_user_all.py`)。 + +**自检**:`validate_before_send()` 会检查 +`playCount` / `currentPlayCount` 是否为 0、`dateTime` 是否为 0、 +`lastPlayDate` / `lastLoginDate` 是否为空。 + +--- + +### 坑 2:差分节点全空 = 服务端认为「本局什么都没变」★ 已用 A/B 实验证实 + +**现象**:`userData` 改对了,但 `userMusicDetailList` / `userMapList` / `userCharacterList` +全是 `[]`,回码成功但战绩表没多一条。 + +**根因**:这些节点是**差分语义** —— 只回传「本局发生变化的条目」。 +全空等于告诉服务端「没有任何条目变化」。 + +#### ★★ 2026-10-06 的 A/B 对照实验(决定性证据) + +同一天、同一账号、同一份代码,**唯一差别是 `userMusicDetailList` 空不空**: + +| 时间 | `userMusicDetailList` | 其他差分节点 | `userData.playCount` | 结果 | +|---|---|---|---|---| +| 12:52 | **`[]`** | 都空 | 1261 → 1261 | ❌ `returnCode=1` 但**没落库** | +| 12:57 | **1 条**(次数不变) | 都空 | 1261 → **1262** | ✅ **落库** | + +两次的 `returnCode` 都是 1、`apiName` 都是 `com.sega.maimai.api.UpsertUserAllApi`, +**唯一变量就是这个节点**。 + +> **推论(已实测)**: +> 只要 `userPlaylogList` 里有本局成绩,`userMusicDetailList` 就**必须**回传本局那条。 +> 「有 playlog 却没有任何曲目明细」会被服务端当成无效包**静默丢弃**。 +> +> 注意这里的关键是**节点非空**,不是**次数必须 +1** —— +> 回传条目但 `playCount` 保持不变(+0)同样能落库(12:57 那次就是)。 +> 所以「不想让乐曲 playCount 增加」应该把增量设成 0, +> **而不是**把整个节点清空。见 `config.PLAY_MUSIC_PLAY_COUNT_GAIN`。 + +**真机对照**(同一账号 Get 侧 vs Upsert 侧): + +| 节点 | Get 侧条数 | Upsert 侧条数 | 是差分吗 | +|---|---:|---:|---| +| `userMusicDetailList` | 739 组 | **1** | 是(本局那条 playCount +1) | +| `userMapList` | 104 | **1** | 是(选中地图 distance +11000) | +| `userCharacterList` | 312 | **5** | 是(组队 5 只各 +1 级) | +| `userItemList` | 1070 | **0** | 是(无变化 → 空) | +| `userCourseList` | 16 | **0** | 是(无变化 → 空) | +| `userChargeList` | 3 | **3** | ★ **否!整表回传** | + +**正确做法**:`build_user_all()` 用 `DIFF_PRIMARY_KEYS` 对每个差分节点算 (新 − 基线)。 + +**★ 反例警告 1**:`userChargeList` **不是差分节点**,真机原样发了全部 3 条。 +如果把它当差分处理(且本局没买票),会被误收敛成 `[]` —— 这是我踩过的具体坑。 + +**★ 反例警告 2(本次新增)**:差分收敛会把「和基线完全相同」的条目剔掉。 +`PLAY_MUSIC_PLAY_COUNT_GAIN = 0` 时本局那条和基线一样,会被剔光 → 节点变空 → 整包失效。 +所以 `build_user_all()` 里对这个节点做了**兜底**: +`apply_play_effects` 会把本局那条暂存到 `_played_music_entry`, +差分收敛后如果节点空了就再塞回去,并把 `isNewMusicDetailList` 置 `"0"`(存量更新)。 + +--- + +### 坑 3:`playlogId` / `loginDateTime` 必须**逐字节等于** `UserLoginApi` 的返回值 + +**现象**:`playlogId` 自己造一个、或用了上一局的 `loginId` → 服务端静默拒收。 + +**根因**(`PacketUpsertUserAll.cs:31`): +这两个值**不是本接口产生的**,而是登录会话的标识。服务端拿它们找会话, +找不到就不应用。 + +**正确做法**: + +```python +login = UserLogin(user_id, token, ...) # 先登录 +UpsertUserAll(user_id, login.loginId, # ★ 必须是它 + login_date_time=login.loginDateTime, # ★ 必须是它 + auth_date_time=login.dateTime, # userData.dateTime 用这个 + ...) +``` + +**★ 容易混的三个时间**: + +| 变量 | 是什么 | 用在哪 | +|---|---|---| +| `login.loginDateTime` | 「本地墙上时间当 UTC」(= 标准 Unix 秒 + 28800) | 顶层 `loginDateTime` 字段 | +| `login.dateTime` | 登录**请求**里发的 `Auth.AuthTime` | `userData.dateTime` | +| `loginDate`(playlog 里) | **标准 Unix 秒** | `userPlaylogList[].loginDate` | + +**中途重新登录必须重取这两个值** —— 换了会话还发旧 `loginId` 一定失败。 + +**自检**:`validate_before_send()` 会检查 `playlogId` / `loginDateTime` 是否为 0。 + +--- + +### 坑 4:`confirm` 参数漏传 —— 闸门根本没开,但你以为开了 + +**现象**:`upsert.py --send` 跑完显示「上传成功」,其实**一个包都没发**。 + +**根因**:`UpsertUserAll` 的闸门规则是 +`confirm=None` 时取 `config.UPSERT_CONFIRM`(默认 `False`)。 +所以只写 `dry_run=False` **不够**,必须同时显式给 `confirm=True`。 + +```python +# ✗ 错的:dry_run=False 但 confirm 没给 → 走 config 的 False → 被拦 +UpsertUserAll(..., dry_run=False) + +# ✓ 对的 +UpsertUserAll(..., dry_run=False, confirm=True) +``` + +**这是「排查了半天以为服务端不收,其实是自己没发」的经典案例。** + +--- + +## 二、结构坑:报文对不上 + +### 坑 5:`userWeeklyData` / `user2pPlaylog` 是**对象**,不是数组 + +36 个节点里有 **2 个** JSON 形态是 `{}` 而不是 `[]`: + +```jsonc +"userWeeklyData": { "lastLoginWeek": "...", "beforeLoginWeek": "...", "friendBonusFlag": true } +"user2pPlaylog" : { "userId1": 0, ..., "user2pPlaylogDetailList": [] } +``` + +传成数组会被 `coerce_node_value()` 直接抛 `PatchError`(刻意的防呆)。 + +**四种形态总览**: + +| 类别 | 数量 | JSON 形态 | +|---|---:|---| +| 单元素数组(userData/userExtend/userOption/userRatingList) | 4 | `[{...}]` | +| **对象** | 2 | `{...}` ★ | +| 普通数组 | 19 | `[...]` | +| **位串** | 11 | `"0101..."` | + +4 + 2 + 19 + 11 = 36。 + +--- + +### 坑 6:11 条位串的长度**必须**等于对应数组的条数 + +`isNew*` 与同名数组一一对应。长度不符 → 服务端误判「哪些是新增」。 + +`build_user_all()` 末尾用 `sync_bits_to_arrays()` 自动补齐,但如果你手工 `patch` 了数组, +位串也要跟着对。 + +**收藏夹是特例**(见坑 12):位串取值不是 `0/1` 而是 `1/2`。 + +--- + +### 坑 7:`userExtend` 在 Upsert 侧**多出 2 个字段** + +| | Get 侧 | Upsert 侧 | +|---|---:|---:| +| 键数 | 14 | **16** | +| 多出 | — | `isPhotoAgree`、`isGotoCodeRead` | + +这两个字段**只在 Upsert 侧出现**(Get 响应里没有),必须手工补上, +否则报文比真机少 2 个键。 + +对应实现:`USER_EXTEND_EXTRA_KEYS`。 + +--- + +### 坑 8:`userRating.udemae` 有一批**首字母大写的重复字段**,必须裁掉 + +**现象**:`GetUserRatingApi` 的响应里 `npcWinNum` 和 `NpcWinNum` **同时存在**(23 键)。 + +```jsonc +// Get 侧(source/2026-10-05.log:87)—— 23 键 +{ "npcWinNum": 0, ..., "NpcWinNum": 0, "NpcLoseNum": 0, "MaxLoseNum": 0, ... } + +// Upsert 侧(source/2026-10-05.log:123)—— 只有小写 16 键 +{ "npcWinNum": 0, ... } +``` + +**根因**:源码 `Net.VO.Mai2/UserUdemae.cs` 只声明了小写的 16 个字段, +大写那批是**服务端的冗余输出**。 + +**影响**:不裁掉的话 ① 报文里出现源码不存在的字段 ② 请求体比真机大 **119 字节**。 + +对应实现:`USER_RATING_UDEMAE_DROP_KEYS`。 + +> ★ 这个坑**只有做深度递归值对比才能发现** —— 光看键数或报文长度是看不出来的。 + +--- + +### 坑 9:`userCharacterList` 要按 `characterId` **升序**,不是 `charaSlot` 顺序 + +| | 顺序 | +|---|---| +| `userData.charaSlot` | `[395, 101, 400402, 400401, 200401]` | +| 真机 `userCharacterList` | `[101, 395, 200401, 400401, 400402]` | + +**两者顺序不同** —— 回传时按 `characterId` 升序排。 + +对应实现:`grown.sort(key=lambda c: int(c.get("characterId", 0)))`。 + +--- + +### 坑 10:字段裁剪 —— Get 侧有的,Upsert 侧不一定有 + +| 节点 | 要丢掉的字段 | +|---|---| +| `userData` | `friendCode`、`nameplateId`、`trophyId`、`cmLastEmoneyCredit`、`cmLastEmoneyBrand` | +| `userOption` | `tempoVolume` | +| `userCharacterList` | 只保留 `characterId`/`level`/`awakening`/`useCount` | +| `userMusicDetailList` | `extNum2` | +| `userChargeList` | `extNum1` | +| `userMissionDataList` / `userWeeklyData` | `userId` | + +### 坑 10.1:`banState` 的位置会「漂移」 + +- **Get 侧**:`banState` 是 `userData` 的**同级顶层**字段 +- **Upsert 侧**:它被**移进了 `userData` 内部** + +`_extract_from_get_responses()` 会自动搬运,但如果你自己手工拼快照,别忘了。 + +--- + +## 三、字段值坑:结构对了但值错了 + +### 坑 11:`characterLevelN` 是**游玩前**等级,不要加经验 + +**源码**(`VOExtensions.cs:1361`): + +```csharp +result.characterLevel1 = (int)gameScore.CharaLevel[0]; +``` + +`gameScore.CharaLevel` 是**本次开始游玩时**灌进去的快照,整局不变。 + +**三个真机会话的三方对照**(这是唯一能定论的方式): + +| 会话 | Get 侧 `userCharacterList` | `userPlaylogList[].characterLevel` | Upsert 侧 `userCharacterList` | +|---|---|---|---| +| 00:20 | 3800/4455/134 | **3800/4455/134** | 3801/4456/135 | +| 19:21 | 3801/4456/135 | **3801/4456/135** | 3802/4457/136 | +| 22:31 | 3802/4457/136 | **3802/4457/136** | 3803/4458/137 | + +**结论:`playlog.characterLevel` 恒等于 Get 侧(游玩前), +`upsertUserAll.userCharacterList` 恒为 +1(游玩后)。** + +> ⚠ 我一度写成 `level + character_exp_gain`,因为只看了单个会话、 +> 把「Get 侧」和「Upsert 侧」的数值记混了。**横向比三个会话立刻暴露。** + +**推荐做法**:别手填 `config.PLAY_CHARACTERS`,直接用 +`derive_play_characters(snapshot)` 从服务器快照推(`upsert.py` 已接上)。 +账号一升级手填值就过期,会出现「playlog 与 userCharacterList 对不上」的诡异现象。 + +--- + +### 坑 12:收藏夹**不做剔除**,且位串取值是 `1/2` 不是 `0/1` + +`build_favorite_delta()` 复刻 `VOExtensions.cs:345-367`: + +- **恒返回完整 5 条**(不做差分剔除) +- 位串按真机 `"22212"` 反推:`"2"` = 服务器侧有该 itemKind,`"1"` = 查不到 + +**★ 必须用未归一化的原始 Get 响应作基线**: +真机里 `itemKind=10`(搭档)的 Get 响应回的是 `{"itemKind": null}`, +正因为查不到才产生那个 `"1"`。 +但 `user_favorite.py` 会「补 itemKind」,补完之后就看不出原始 null 了。 + +**两个真机会话都是 `"22212"`** —— 第 4 位(itemKind=10)**稳定为 "1"**, +说明服务端对该 kind 恒回 null。 + +**实现上的处理**: +- 有原始响应 → 用它建索引,自然得到 `"22212"` +- 只有归一化基线 → 传 `assume_missing=FAVORITE_MISSING_KINDS`(= `(10,)`)兜底 + +--- + +### 坑 13:`loginDate` 是**标准 Unix 秒**,不是 `loginDateTime` + +``` +loginDateTime = 1791239482 (「墙上时间当 UTC」= 标准 Unix 秒 + 28800) +loginDate = 1791210683 (标准 Unix 秒) +``` + +**三个真机会话的实际差值**: + +| 会话 | `loginDateTime` | `loginDate` | 差 | +|---|---|---|---| +| 00:20 | 1791159576 | 1791130777 | **28799** | +| 19:21 | 1791228113 | 1791199315 | **28798** | +| 22:31 | 1791239482 | 1791210683 | **28799** | + +**注意不是整 28800!** 原因:`loginDate` 来自 +`TimeManager.GetUnixTime(src.Detail.LastLoginDate)`(`VOExtensions.cs:1290`), +而 `lastLoginDate` 是客户端在**登录响应处理完那一刻**写的,比 `loginDateTime` 晚 1~2 秒。 + +本工程用 `loginDateTime − 28800`,**稳定差 1~2 秒**。 +服务端两次都接受了 → 它**不对这几个时刻做等式校验**。知道这一点可以省掉一轮无谓排查。 + +--- + +### 坑 14:`playDate` 是**日志日**(7 点分界),不是自然日 + +源码 `TimeManager.cs:77-85`: + +```csharp +public static DateTime ToLogDateTime(DateTime dateTime, int hour = 0) +{ + DateTime result = new(dateTime.Year, dateTime.Month, dateTime.Day, hour, 0, 0); + if (7 > dateTime.Hour) return result.AddDays(-1.0); // ★ 7 点前回退一天 + return result; +} +``` + +真机验证:00:20 那一局的 `userPlaylogList[0].playDate = "2026-10-04"` +(自然日是 10-05,因为 00:20 < 07:00 所以回退)。19:21 那局则是 `"2026-10-05"`。 + +**`playDate` 是日期串(`YYYY-MM-DD`),`userPlayDate` 才是完整时间串**,别搞混。 + +--- + +### 坑 15:`lastLoginDate` 与 `lastPlayDate` 是**两个不同的时刻** + +**现象**:所有时间字段都填成 `loginDateTime` → 数值上「能用」,但和真机对不上。 + +**真机规律**(三个会话全部成立): + +| 字段 | 语义 | 00:20 会话 | 19:21 会话 | 22:31 会话 | +|---|---|---|---|---| +| `userData.lastLoginDate` | **登录**时刻 | 00:19:37.0 | 19:21:55.0 | 22:31:23.0 | +| `userData.eventWatchedDate` | **与 lastLoginDate 同值** | 00:19:37.0 | 19:21:55.0 | 22:31:23.0 | +| `userData.lastPlayDate` | **上报**时刻 | 00:20:57.0 | 19:23:02.0 | 22:32:21.0 | +| `userGamePlaylogList[0].playDate` | **与 lastPlayDate 同值** | 00:20:57.0 | 19:23:02.0 | 22:32:21.0 | +| `userPlaylogList[0].userPlayDate` | **游玩**时刻(更早) | 00:20:30.0 | 19:22:36.0 | 22:31:59.0 | + +即:登录 → 游玩 → 上报是三个时刻,真机分别是 +「loginDateTime +1~2s」「userPlayDate」「上报那一刻」。 + +本工程把「游玩/上报时刻」抽成参数 `play_date_time`(不传则退回 `login_date_time`), +`upsert.py` 传 `login_date_time_now()`。 + +--- + +### 坑 16:`userGetPointList` / `userLoginBonusList` 是**登录奖励**才产生的 + +**真机证据**: + +| 会话 | `userData.point` | `userGetPointList` | `userLoginBonusList` | +|---|---|---|---| +| 00:20 | 4110 | `[]` | `[]` | +| 19:21 | 4460 | `[{"getKind":1,"point":200},{"getKind":2,"point":150}]` | `[{"bonusId":61,"point":1,"isCurrent":true,...}]` | +| 22:31 | 4460 | `[]` | `[]` | + +**规律**:这两个节点非空 ⟺ 本次登录触发了奖励发放。 +留空则 `point` 保持基线值不变 —— 这是「不发放点数」的**必然结果,不是 bug**。 + +**★ 排查陷阱**:如果你把 `point` 手工 +200 但 `userGetPointList` 留空, +会出现「数字对不上」的矛盾。要么两个一起改,要么两个都不动。 + +对应实现:`DEFAULT_EMPTY_NODES`。 + +--- + +### 坑 17:`userGamePlaylogList[].playCount` 是**机台本地计数器**,服务器不返回 + +真机值:00:20 会话 = **8**、19:21 = **9**、22:31 = **10**(每打一局 +1)。 + +源码 `VOExtensions.cs:881`:`result.playCount = Backup.localParameter.playCount`。 + +**任何 Get 接口都不返回它** —— 既推不出来,服务端也不会纠正。 +填错只是统计数字不对,不影响落库。放在 `config.PLAY_LOCAL_PLAY_COUNT`。 + +--- + +### 坑 18:`playSpecial` 不是 0,是一枚**随机位掩码** + +源码 `VOExtensions.cs:846-855`: + +```csharp +int max = 1037933; +int num2 = UnityEngine.Random.Range(1, max) * 2069; +num2 += GameManager.CalcSpecialNum(); +int num3 = 0; +for (int i = 0; i < 32; i++) { num3 <<= 1; num3 += num2 % 2; num2 >>= 1; } +result.playSpecial = num3; +``` + +**`CalcSpecialNum()` 是机台硬件标志位掩码**(`GameManager.cs:332-378`), +逐位含义:`SpecialAP`、`IsAutoPlay()`、键鼠数量、`IsDevelop`、 +以及三条**否定条件**(不含 "ACA" / 不含 "GeForce GTX" / 不含 "Core(TM) i3-8100"), +最后 `num |= 0x400` **无条件置位**。 + +**真机实测**:`[CalcSpecialNum] = 1024`(= 0x400,标准 ACA 机台其余位恰好全 0)。 + +**反推验证**(这一步很有说服力): + +``` +真机 playSpecial = 892014272 +位反转32(892014272) = 57726124 = 27900 × 2069 + 1024 + └───┬───┘ └─┬─┘ + 随机系数 余数 = CalcSpecialNum ✅ +``` + +配置项:`config.PLAY_SPECIAL_NUM = 1024`。 + +> 注意位反转后可能超过 int32 变成负数 —— 真机 19:21 那局就是 `-603697438`,这是正常的。 + +--- + +### 坑 19:`extBool1/2/3` 是 bool 但**名字不带 `is` 前缀** + +用 `name.startswith("is")` 判断布尔字段会**漏掉这三个**, +导致序列化成 `0` 而不是 `false`。 + +同理字符串字段(`vsUserName`、`playedUserName1..3`、`placeName`、`playDate`、`userPlayDate`) +默认值必须是 `""` 而不是 `0`。 + +对应实现:显式集合 `PLAYLOG_BOOL_FIELDS` / `PLAYLOG_STRING_FIELDS`。 + +--- + +### 坑 20:110 个字段**一个都不能省** + +把真机报文的 `userPlaylogList[0]` 与 `Net.VO.Mai2/UserPlaylog.cs` 做双向集合比对: + +| 方向 | 差异 | +|---|---| +| C# 声明但报文未出现 | **0** | +| 报文有但 C# 未声明 | **0** | + +**能精简的是「填写的内容要真实」,而不是删字段。** + +--- + +## 四、网络层坑 + +### 坑 21:`number` 头只由 **Ping 心跳**刷新,不是每个请求都更新 + +**真机 70 个请求里它只变过一次**: + +``` +#1 ~ #10 number = 0 ← 还没跑过心跳 +#11 ~ #17 Ping 包(按 Packet.cs:187 **不带** number 头) +#18 ~ #70 number = 63 ← 心跳往返 63ms,此后 53 个业务请求恒定 +``` + +**源码链路**: + +``` +PingChecker.cs:166 StartPacket(new PacketPing(PingSuccess, PingError)) +PacketPing.cs:34 _onDone((int)sw.ElapsedMilliseconds) ← 值 = Ping 包往返毫秒 +PingChecker.cs:227 GameManager.PingMsec = pingMsec +Packet.cs:189 Client.AddHeader("number", GameManager.PingMsec.ToString()) +``` + +**我原来的错法**:每个请求结束后把「本请求耗时」写进 `ping_msec`, +于是 number 随每个包抖动。已改成只有 Ping 包更新。 + +**调用方注意**:`upsert.py` 在取完服务器设置后加了一步 `Ping()`,否则 number 恒为 0。 + +--- + +### 坑 22:Cookie —— 登录响应**会**下发 `JSESSIONID`,而且必须带着 + +**这个坑我踩了两次(先误判、后自我推翻)**: + +1. hook 日志里显示 `Cookie : userId=12345678` —— 这是我 hook **自己拼的假串** + (`gamehook/Main.cs:196-199` 的 `_cookie = "userId=" + userId`),不是真实 Cookie 头。 +2. 于是我用 `Ping` 探针去验证,看到响应头里**没有 Set-Cookie**, + 就得出「服务器从不下发 Cookie,无需处理」的结论 —— **这是错的**。 +3. 后来跑完整登录链路,`UserLoginApi` 的响应头里明确有: + ``` + Set-Cookie: JSESSIONID=FC9D0F122F7F24A522CD623BA3B76B74; Path=/Maimai2Servlet; HttpOnly + ``` + +**源码**(`Packet.cs:228-234`):**只在 `UserLogin` 响应上**把 Set-Cookie 收进 +`CookieContainer`;之后 `Packet.cs:190-193` 每个带 userId 的请求都挂回去。 + +**结论**:这是**真实的会话粘滞**。 +`requests.Session` 会自动处理,**但前提是全程复用同一个 `MaimaiNetClient`** +(本工程各 api 函数在 `client=None` 时都走 `get_default_client()` 单例)。 +**如果谁手动 new 一个 client 去发结算包,就会丢掉 JSESSIONID。** + +> **教训**:用「只读探针」验证一件事时,要确认探针覆盖了完整链路 —— +> 我只探了 Ping,就下了关于整个服务器的结论。 + +--- + +### 坑 23:`Accept-Encoding` 必须**显式置空** + +`requests` 默认发 `Accept-Encoding: gzip, deflate`。 +本协议响应体是 AES 密文(二进制),服务端若据此做内容编码会返回**空 body**。 + +实测:不发该头 → HTTP 200 / 0 字节;显式置空 → 正常返回。 + +C# 端不需要是因为 `HttpWebRequest` 默认 `AutomaticDecompression = None`。 + +--- + +### 坑 24:扫码 chipID 用**完整形式**,游戏服务器用**短值** + +| 用途 | 正确值 | 源码依据 | +|---|---|---| +| aimedb 扫码 | `XXXX-XXXXXXXXXXX`(**带连字符**) | `ChimeReaderManager.cs:250` `KeychipId.Value` | +| 游戏服务器 `clientId` | `TESTCLIENT1`(短值) | `PacketGetGameSetting.cs:23` `KeychipId.ShortValue` | + +我原来扫码也用了短值,导致 aimedb 返回错误。 + +--- + +## 五、工程/流程坑 + +### 坑 25:不做**落库回查**,你永远不知道有没有写进去 + +`returnCode=1` 完全不可信(见坑 1~4)。**必须**发包后重新拉一次数据比对。 + +`upsert.py --send` 的第 7.5 步已经内置: + +``` +7.5 落库回查(重新拉服务器数据) + playCount 1260 -> 1261 + currentPlayCount 188 -> 189 + lastPlayDate 2026-10-05 22:32:21 -> 2026-10-06 01:28:04 + musicId=143 level=4 playCount -> 11 +【落库成功】userData.playCount 已 +1 +``` + +**为什么在登出前回查**:同一个登录会话内 `GetUserDataApi` 立刻能读到新值, +不用再开一次会话(也就不会消耗第二个二维码)。 + +--- + +### 坑 26:报文体长度差异要**逐节点**看,不要只看总长 + +总长差几字节可能来自随机数位数(`playSpecial`),也可能来自真实的结构错误。 +**逐节点比对字节数**才能定位: + +``` +节点 真机068 本次 差 +userData 1985 1985 0 +... +userGamePlaylogList 294 295 1 <<< 只有它差(playSpecial 随机数) +(36 节点合计) 14255 14256 1 +``` + +**35 个节点 0 差异**才是「结构完全对齐」的证据。 + +--- + +### 坑 27:`--debug` 日志会很大 + +DEBUG 模式会完整打印每个请求的头 + 体 + 响应体, +一次结算流程(含 19 节点快照 + 739 组曲目分页)能到 **18 MB**。 + +只想看流程就别加 `--debug`;想减小体积调 `config.LOG_VALUE_MAX`(0 = 不截断)。 + +--- + +## 六、发包前 Checklist + +按顺序过一遍,能挡掉上面绝大多数坑: + +- [ ] **闸门**:`confirm=True`(或 `config.UPSERT_CONFIRM=True`) +- [ ] **会话**:`playlogId == login.loginId`,`loginDateTime == login.loginDateTime` +- [ ] **同会话**:中途没重新登录过(重登必须重取上面两个值) +- [ ] **快照**:`fetch_upsert_snapshot()` 抓了 19 个节点,失败 0 个 +- [ ] **userData 演算**:`playCount`/`currentPlayCount` +1,`lastPlayDate` 是上报时刻, + `lastLoginDate`/`eventWatchedDate` 是登录时刻,`dateTime` 非 0 +- [ ] **差分节点**:`userMusicDetailList` 至少 1 条(本局曲目战绩); + `userMapList` / `userCharacterList` 按 config 增量决定 —— + `PLAY_MAP_DISTANCE_GAIN` / `PLAY_CHARACTER_EXP_GAIN` **默认都是 0**, + 此时它们为空是**预期行为**;只有把增量设成非 0 时才必须有条目 +- [ ] **`userChargeList`** 是整表回传,没被当差分收敛成空 +- [ ] **位串**:11 条长度等于对应数组条数;`isNewFavoriteList` 应为 `"22212"` +- [ ] **playlog**:110 个字段齐全;`characterLevelN` 是**游玩前**等级 +- [ ] **playSpecial**:非 0,且余数 = `config.PLAY_SPECIAL_NUM` +- [ ] **网络**:跑过 `Ping()`(number 头),同一个 client(Cookie) +- [ ] **自检**:`validate_before_send()` 返回 0 个问题 +- [ ] **回查**:发包后确认 `playCount` 真的 +1 + +--- + +## 六点五、关于 `userMapList` / `userCharacterList` 的默认空值 + +本工程默认: + +```python +PLAY_MAP_DISTANCE_GAIN = 0 # 本局不推进地图 -> userMapList 回传 [] +PLAY_CHARACTER_EXP_GAIN = 0 # 本局不给角色加经验 -> userCharacterList 回传 [] +``` + +**这不是坑,是刻意的默认值** —— 因为「地图走多远」「角色升几级」取决于真实游玩, +纯网络脚本推不出来。想要真机那种 +11000 / +1 级,把这两个配置改回去即可。 + +★ 唯一要注意的连带影响:`validate_before_send()` 的「差分节点为空」告警 +只在**增量非 0 却没产出条目**时才触发,所以默认值下不会刷无意义的告警。 + +--- + +## 七、这个清单是怎么攒出来的 + +| 阶段 | 手段 | 抓到的坑 | +|---|---|---| +| 初版实现 | 读源码 + 单个真机日志 | 坑 5、6、13、14、18、19、20、23、24 | +| 深度值对比 | 逐字段递归 diff 真机报文 vs 本工程 | 坑 7、8、9、10 | +| 落库失败排查 | 直接 `patch` 绝对值探测服务端行为 | 坑 1、2、3、4 | +| **MelonLoader hook 抓真机** | 在游戏里 hook 网络层抓完整会话 | 坑 11、12、15、16、17、21、22 | +| 真实跑通 | `--send` + 落库回查 | 坑 25、26、27 | + +**最有效的一招是「横向比多个真机会话」** —— 坑 11(characterLevel 语义)、 +坑 13(loginDate 差 28798/28799)、坑 15(两个时刻分离)都是单看一个会话看不出来、 +一横向比就立刻暴露的。 + +第二有效的是 **MelonLoader hook** —— 它能看到 HTTP 头(`number`)、 +能抓到 `CalcSpecialNum()` 的真实返回值,这些在纯日志里根本看不到。 diff --git a/docs/samples/UpsertUserAll_实跑元信息.json b/docs/samples/UpsertUserAll_实跑元信息.json new file mode 100644 index 0000000..81a8e65 --- /dev/null +++ b/docs/samples/UpsertUserAll_实跑元信息.json @@ -0,0 +1,46 @@ +{ + "user_id": 12345678, + "login": { + "loginId": 7693120247791879616, + "loginDateTime": 1791222938, + "lastLoginDate": "2026-10-05 17:53:49", + "loginCount": 184, + "consecutiveLoginCount": 3, + "token": "HcXOwSdDwBSEPzngjdfp" + }, + "auth_date_time": 1791194138, + "snapshot_summary": { + "userData": 1, + "userExtend": 1, + "userOption": 1, + "userCharacterList": 312, + "userMapList": 104, + "userLoginBonusList": 38, + "userRatingList": 1, + "userItemList": 1070, + "userMusicDetailList": 1037, + "userCourseList": 16, + "userChargeList": 3, + "userFavoriteList": 5, + "userActivityList": 1, + "userMissionDataList": 6, + "userIntimateList": 2, + "userFavoritemusicList": 27, + "userKaleidxScopeList": 7, + "userGhost": 15 + }, + "snapshot_failed": [], + "preview": { + "userName": "☆Astral☆", + "playerRating": 15000, + "isLogin": false, + "banState": 0, + "errorId": 0, + "lastLoginDate": "1970-01-01 00:00:00", + "lastPlayDate": "1970-01-01 00:00:00", + "totalAwake": 184, + "iconId": 559501, + "frameId": 0 + }, + "qr_run_at": "2026-10-05 17:53" +} \ No newline at end of file diff --git a/docs/samples/UpsertUserAll_实跑报文.json b/docs/samples/UpsertUserAll_实跑报文.json new file mode 100644 index 0000000..3fd8c1d --- /dev/null +++ b/docs/samples/UpsertUserAll_实跑报文.json @@ -0,0 +1,1311 @@ +{ + "userId": 12345678, + "playlogId": 7693120247791879616, + "isEventMode": false, + "isFreePlay": false, + "loginDateTime": 1791222938, + "userPlaylogList": [ + { + "userId": 0, + "orderId": 0, + "playlogId": 7693120247791879616, + "version": 1056000, + "placeId": 1000, + "placeName": "测试店铺", + "loginDate": 1791194138, + "playDate": "2026-10-05", + "userPlayDate": "2026-10-05 17:55:38.0", + "type": 0, + "musicId": 143, + "level": 4, + "trackNo": 1, + "vsMode": 0, + "vsUserName": "", + "vsStatus": 0, + "vsUserRating": 0, + "vsUserAchievement": 0, + "vsUserGradeRank": 0, + "vsRank": 0, + "playerNum": 1, + "playedUserId1": 0, + "playedUserName1": "", + "playedMusicLevel1": 0, + "playedUserId2": 0, + "playedUserName2": "", + "playedMusicLevel2": 0, + "playedUserId3": 0, + "playedUserName3": "", + "playedMusicLevel3": 0, + "characterId1": 395, + "characterLevel1": 3800, + "characterAwakening1": 5, + "characterId2": 101, + "characterLevel2": 4455, + "characterAwakening2": 5, + "characterId3": 400402, + "characterLevel3": 134, + "characterAwakening3": 3, + "characterId4": 400401, + "characterLevel4": 134, + "characterAwakening4": 3, + "characterId5": 200401, + "characterLevel5": 134, + "characterAwakening5": 3, + "achievement": 0, + "deluxscore": 0, + "scoreRank": 0, + "maxCombo": 0, + "totalCombo": 655, + "maxSync": 0, + "totalSync": 0, + "tapCriticalPerfect": 0, + "tapPerfect": 0, + "tapGreat": 0, + "tapGood": 0, + "tapMiss": 441, + "holdCriticalPerfect": 0, + "holdPerfect": 0, + "holdGreat": 0, + "holdGood": 0, + "holdMiss": 19, + "slideCriticalPerfect": 0, + "slidePerfect": 0, + "slideGreat": 0, + "slideGood": 0, + "slideMiss": 192, + "touchCriticalPerfect": 0, + "touchPerfect": 0, + "touchGreat": 0, + "touchGood": 0, + "touchMiss": 0, + "breakCriticalPerfect": 0, + "breakPerfect": 0, + "breakGreat": 0, + "breakGood": 0, + "breakMiss": 3, + "isTap": true, + "isHold": true, + "isSlide": true, + "isTouch": false, + "isBreak": true, + "isCriticalDisp": true, + "isFastLateDisp": true, + "fastCount": 0, + "lateCount": 0, + "isAchieveNewRecord": false, + "isDeluxscoreNewRecord": false, + "comboStatus": 0, + "syncStatus": 0, + "isClear": false, + "beforeRating": 15000, + "afterRating": 15000, + "beforeGrade": 0, + "afterGrade": 0, + "afterGradeRank": 1, + "beforeDeluxRating": 15000, + "afterDeluxRating": 15000, + "isPlayTutorial": false, + "isEventMode": false, + "isFreedomMode": false, + "playMode": 0, + "isNewFree": false, + "trialPlayAchievement": -1, + "extNum1": 0, + "extNum2": 0, + "extNum4": 2022, + "extBool1": false, + "extBool2": false, + "extBool3": false + } + ], + "upsertUserAll": { + "userData": [ + { + "accessCode": "", + "userName": "☆Astral☆", + "isNetMember": 1, + "point": 4110, + "totalPoint": 52620, + "playerRating": 15000, + "playerOldRating": 10927, + "playerNewRating": 4606, + "highestRating": 15000, + "gradeRating": 0, + "musicRating": 15000, + "gradeRank": 0, + "courseRank": 10, + "classRank": 1, + "frameId": 209504, + "iconId": 559501, + "plateId": 458001, + "titleId": 55502, + "partnerId": 1, + "charaSlot": [ + 395, + 101, + 400402, + 400401, + 200401 + ], + "charaLockSlot": [ + 395, + 101, + 0, + 0, + 0 + ], + "contentBit": 2145488608, + "selectMapId": 550003, + "playCount": 1259, + "currentPlayCount": 187, + "playVsCount": 0, + "playSyncCount": 0, + "winCount": 0, + "helpCount": 0, + "comboCount": 0, + "totalDeluxscore": 1869771, + "totalBasicDeluxscore": 1274, + "totalAdvancedDeluxscore": 6566, + "totalExpertDeluxscore": 470976, + "totalMasterDeluxscore": 1236693, + "totalReMasterDeluxscore": 154262, + "totalSync": 1112, + "totalBasicSync": 5, + "totalAdvancedSync": 5, + "totalExpertSync": 425, + "totalMasterSync": 604, + "totalReMasterSync": 73, + "totalAchievement": 975613200, + "totalBasicAchievement": 2984753, + "totalAdvancedAchievement": 7755815, + "totalExpertAchievement": 315483810, + "totalMasterAchievement": 578226016, + "totalReMasterAchievement": 71162806, + "eventWatchedDate": "2026-10-05 17:55:38.0", + "lastGameId": "SDGB", + "lastRomVersion": "1.56.00", + "lastDataVersion": "1.55.05", + "lastLoginDate": "2026-10-05 17:55:38.0", + "lastPlayDate": "2026-10-05 17:55:38.0", + "lastPairLoginDate": "2026-10-04 18:05:18", + "lastTrialPlayDate": "2026-10-03 21:07:50", + "lastPlayCredit": 1, + "lastPlayMode": 0, + "lastPlaceId": 1000, + "lastPlaceName": "测试店铺", + "lastAllNetId": 0, + "lastRegionId": 5, + "lastRegionName": "测试区域", + "lastClientId": "TESTCLIENT1", + "lastCountryCode": "CHN", + "lastSelectEMoney": 0, + "lastSelectTicket": 0, + "lastSelectCourse": 552304, + "lastCountCourse": 0, + "firstGameId": "SDGB", + "firstRomVersion": "1.41.00", + "firstDataVersion": "1.40.08", + "firstPlayDate": "2024-12-31 21:25:58", + "compatibleCmVersion": "1.55.00", + "totalAwake": 184, + "dailyBonusDate": "1970-01-01 08:00:00", + "dailyCourseBonusDate": "2026-07-13 00:00:00", + "mapStock": 0, + "renameCredit": 0, + "friendRegistSkip": 0, + "dateTime": 1791194138, + "banState": 0 + } + ], + "userExtend": [ + { + "selectMusicId": 143, + "selectDifficultyId": 4, + "categoryIndex": 2022, + "musicIndex": 10, + "extraFlag": 1721, + "selectScoreType": 1, + "selectResultDetails": false, + "selectResultScoreViewType": 1, + "sortCategorySetting": 2, + "sortMusicSetting": 5, + "selectedCardList": [], + "encountMapNpcList": [], + "extendContentBit": 16, + "playStatusSetting": 0 + } + ], + "userOption": [ + { + "optionKind": 3, + "noteSpeed": 24, + "slideSpeed": 10, + "touchSpeed": 24, + "noteSize": 1, + "slideSize": 1, + "touchSize": 1, + "tapDesign": 2, + "holdDesign": 0, + "slideDesign": 0, + "starType": 1, + "starRotate": 1, + "adjustTiming": 20, + "judgeTiming": 20, + "mirrorMode": 0, + "ansVolume": 8, + "tapHoldVolume": 5, + "touchHoldVolume": 5, + "breakVolume": 5, + "exVolume": 5, + "slideVolume": 5, + "breakSe": 1, + "slideSe": 0, + "exSe": 0, + "criticalSe": 1, + "tapSe": 0, + "headPhoneVolume": 1, + "matching": 1, + "brightness": 1, + "dispRate": 1, + "dispCenter": 0, + "dispJudge": 10, + "dispJudgePos": 1, + "dispJudgeTouchPos": 1, + "dispChain": 0, + "dispBar": 0, + "trackSkip": 1, + "touchEffect": 2, + "outlineDesign": 0, + "submonitorAnimation": 2, + "submonitorAppeal": 1, + "submonitorAchive": 1, + "sortTab": 0, + "sortMusic": 0, + "damageSeVolume": 5, + "touchVolume": 5, + "outFrameType": 1, + "breakSlideVolume": 5 + } + ], + "userCharacterList": [ + { + "characterId": 395, + "useCount": 0, + "level": 3802, + "awakening": 5 + }, + { + "characterId": 101, + "useCount": 0, + "level": 4457, + "awakening": 5 + }, + { + "characterId": 400402, + "useCount": 0, + "level": 136, + "awakening": 3 + }, + { + "characterId": 400401, + "useCount": 0, + "level": 136, + "awakening": 3 + }, + { + "characterId": 200401, + "useCount": 0, + "level": 136, + "awakening": 3 + } + ], + "userGhost": [], + "userMapList": [ + { + "mapId": 550003, + "distance": 1446000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + } + ], + "userLoginBonusList": [], + "userRatingList": [ + { + "rating": 0, + "ratingList": [ + { + "musicId": 11771, + "level": 3, + "romVersion": 25005, + "achievement": 1006008 + }, + { + "musicId": 11328, + "level": 3, + "romVersion": 22004, + "achievement": 1005210 + }, + { + "musicId": 11752, + "level": 3, + "romVersion": 25008, + "achievement": 1001992 + }, + { + "musicId": 11472, + "level": 3, + "romVersion": 23006, + "achievement": 1006509 + }, + { + "musicId": 11299, + "level": 3, + "romVersion": 22004, + "achievement": 1005722 + }, + { + "musicId": 11454, + "level": 3, + "romVersion": 23005, + "achievement": 1006321 + }, + { + "musicId": 11721, + "level": 3, + "romVersion": 25003, + "achievement": 1005440 + }, + { + "musicId": 11491, + "level": 3, + "romVersion": 23006, + "achievement": 1005245 + }, + { + "musicId": 11591, + "level": 3, + "romVersion": 24003, + "achievement": 1005023 + }, + { + "musicId": 11761, + "level": 3, + "romVersion": 25005, + "achievement": 1006028 + }, + { + "musicId": 11331, + "level": 3, + "romVersion": 22004, + "achievement": 1005958 + }, + { + "musicId": 11343, + "level": 3, + "romVersion": 22005, + "achievement": 1005831 + }, + { + "musicId": 11671, + "level": 3, + "romVersion": 25000, + "achievement": 1005695 + }, + { + "musicId": 11678, + "level": 3, + "romVersion": 25003, + "achievement": 1005174 + }, + { + "musicId": 11706, + "level": 3, + "romVersion": 25002, + "achievement": 1005144 + }, + { + "musicId": 11413, + "level": 3, + "romVersion": 23000, + "achievement": 1005077 + }, + { + "musicId": 11550, + "level": 3, + "romVersion": 24001, + "achievement": 1004327 + }, + { + "musicId": 11578, + "level": 3, + "romVersion": 24004, + "achievement": 1001611 + }, + { + "musicId": 11566, + "level": 3, + "romVersion": 23000, + "achievement": 1007790 + }, + { + "musicId": 11447, + "level": 3, + "romVersion": 23003, + "achievement": 1006728 + }, + { + "musicId": 11796, + "level": 3, + "romVersion": 25007, + "achievement": 1006689 + }, + { + "musicId": 11514, + "level": 3, + "romVersion": 23008, + "achievement": 1006617 + }, + { + "musicId": 11784, + "level": 3, + "romVersion": 25006, + "achievement": 1006273 + }, + { + "musicId": 11633, + "level": 3, + "romVersion": 24004, + "achievement": 1006058 + }, + { + "musicId": 11466, + "level": 3, + "romVersion": 23007, + "achievement": 1005871 + }, + { + "musicId": 11007, + "level": 4, + "romVersion": 20000, + "achievement": 1005868 + }, + { + "musicId": 11692, + "level": 4, + "romVersion": 25000, + "achievement": 1005751 + }, + { + "musicId": 11638, + "level": 3, + "romVersion": 24005, + "achievement": 1005699 + }, + { + "musicId": 11527, + "level": 3, + "romVersion": 24000, + "achievement": 1005661 + }, + { + "musicId": 11453, + "level": 3, + "romVersion": 23005, + "achievement": 1005558 + }, + { + "musicId": 10288, + "level": 3, + "romVersion": 20000, + "achievement": 1005400 + }, + { + "musicId": 11769, + "level": 3, + "romVersion": 25005, + "achievement": 1005369 + }, + { + "musicId": 11663, + "level": 2, + "romVersion": 24004, + "achievement": 1005365 + }, + { + "musicId": 11152, + "level": 4, + "romVersion": 21004, + "achievement": 1005360 + }, + { + "musicId": 11542, + "level": 3, + "romVersion": 24002, + "achievement": 1005308 + } + ], + "newRatingList": [ + { + "musicId": 11823, + "level": 3, + "romVersion": 25500, + "achievement": 1005376 + }, + { + "musicId": 11842, + "level": 3, + "romVersion": 25500, + "achievement": 1006389 + }, + { + "musicId": 11809, + "level": 3, + "romVersion": 25500, + "achievement": 1000563 + }, + { + "musicId": 11838, + "level": 4, + "romVersion": 25500, + "achievement": 1007142 + }, + { + "musicId": 11832, + "level": 3, + "romVersion": 25500, + "achievement": 1005742 + }, + { + "musicId": 10030, + "level": 3, + "romVersion": 25500, + "achievement": 1006920 + }, + { + "musicId": 11811, + "level": 3, + "romVersion": 25502, + "achievement": 1006098 + }, + { + "musicId": 11806, + "level": 3, + "romVersion": 25500, + "achievement": 1005554 + }, + { + "musicId": 11855, + "level": 3, + "romVersion": 25501, + "achievement": 1000863 + }, + { + "musicId": 11813, + "level": 3, + "romVersion": 25502, + "achievement": 1000096 + }, + { + "musicId": 11821, + "level": 3, + "romVersion": 25504, + "achievement": 1001961 + }, + { + "musicId": 11854, + "level": 3, + "romVersion": 25501, + "achievement": 1001145 + }, + { + "musicId": 11807, + "level": 3, + "romVersion": 25500, + "achievement": 1004409 + }, + { + "musicId": 11844, + "level": 3, + "romVersion": 25500, + "achievement": 1002627 + }, + { + "musicId": 11860, + "level": 3, + "romVersion": 25503, + "achievement": 990398 + } + ], + "nextRatingList": [ + { + "musicId": 11741, + "level": 3, + "romVersion": 25005, + "achievement": 999832 + }, + { + "musicId": 11343, + "level": 4, + "romVersion": 22005, + "achievement": 1002872 + }, + { + "musicId": 11576, + "level": 3, + "romVersion": 23001, + "achievement": 1004814 + }, + { + "musicId": 11594, + "level": 3, + "romVersion": 24001, + "achievement": 1002173 + }, + { + "musicId": 365, + "level": 3, + "romVersion": 15007, + "achievement": 998026 + }, + { + "musicId": 11222, + "level": 3, + "romVersion": 21007, + "achievement": 996834 + }, + { + "musicId": 11209, + "level": 3, + "romVersion": 21007, + "achievement": 1000552 + }, + { + "musicId": 11544, + "level": 3, + "romVersion": 24002, + "achievement": 995578 + }, + { + "musicId": 11523, + "level": 3, + "romVersion": 23006, + "achievement": 995382 + }, + { + "musicId": 11739, + "level": 3, + "romVersion": 25005, + "achievement": 1001871 + }, + { + "musicId": 772, + "level": 3, + "romVersion": 19511, + "achievement": 1001485 + }, + { + "musicId": 11687, + "level": 3, + "romVersion": 25000, + "achievement": 998126 + }, + { + "musicId": 11713, + "level": 3, + "romVersion": 25002, + "achievement": 995426 + }, + { + "musicId": 11661, + "level": 3, + "romVersion": 24006, + "achievement": 994437 + }, + { + "musicId": 381, + "level": 3, + "romVersion": 14000, + "achievement": 1004352 + }, + { + "musicId": 11377, + "level": 3, + "romVersion": 23000, + "achievement": 1002986 + }, + { + "musicId": 11374, + "level": 3, + "romVersion": 22005, + "achievement": 993904 + }, + { + "musicId": 472, + "level": 4, + "romVersion": 16002, + "achievement": 1000487 + }, + { + "musicId": 820, + "level": 3, + "romVersion": 19995, + "achievement": 1000474 + }, + { + "musicId": 11672, + "level": 3, + "romVersion": 25000, + "achievement": 995966 + } + ], + "nextNewRatingList": [ + { + "musicId": 11847, + "level": 3, + "romVersion": 25501, + "achievement": 1003413 + }, + { + "musicId": 11824, + "level": 3, + "romVersion": 25502, + "achievement": 1000310 + }, + { + "musicId": 11848, + "level": 3, + "romVersion": 25501, + "achievement": 995346 + }, + { + "musicId": 11861, + "level": 3, + "romVersion": 25503, + "achievement": 993751 + }, + { + "musicId": 11862, + "level": 3, + "romVersion": 25503, + "achievement": 1001073 + }, + { + "musicId": 11812, + "level": 3, + "romVersion": 25502, + "achievement": 999924 + }, + { + "musicId": 11828, + "level": 3, + "romVersion": 25503, + "achievement": 999584 + }, + { + "musicId": 11815, + "level": 3, + "romVersion": 25504, + "achievement": 991088 + }, + { + "musicId": 11853, + "level": 3, + "romVersion": 25501, + "achievement": 1004028 + }, + { + "musicId": 11834, + "level": 3, + "romVersion": 25500, + "achievement": 998344 + }, + { + "musicId": 11850, + "level": 3, + "romVersion": 25501, + "achievement": 1004913 + }, + { + "musicId": 11810, + "level": 3, + "romVersion": 25500, + "achievement": 970442 + }, + { + "musicId": 11833, + "level": 3, + "romVersion": 25500, + "achievement": 1003821 + }, + { + "musicId": 11846, + "level": 3, + "romVersion": 25502, + "achievement": 996406 + }, + { + "musicId": 11849, + "level": 3, + "romVersion": 25501, + "achievement": 989664 + }, + { + "musicId": 11816, + "level": 3, + "romVersion": 25504, + "achievement": 987284 + }, + { + "musicId": 11817, + "level": 3, + "romVersion": 25504, + "achievement": 986685 + }, + { + "musicId": 11808, + "level": 3, + "romVersion": 25500, + "achievement": 989657 + }, + { + "musicId": 11843, + "level": 3, + "romVersion": 25500, + "achievement": 996527 + }, + { + "musicId": 11830, + "level": 3, + "romVersion": 25501, + "achievement": 984517 + } + ], + "udemae": { + "maxLoseNum": 0, + "npcTotalWinNum": 0, + "npcTotalLoseNum": 0, + "npcMaxWinNum": 0, + "npcMaxLoseNum": 0, + "npcWinNum": 0, + "npcLoseNum": 0, + "rate": 0, + "classValue": 10000, + "maxRate": 0, + "maxClassValue": 10000, + "totalWinNum": 6, + "totalLoseNum": 0, + "maxWinNum": 6, + "MaxLoseNum": 0, + "winNum": 6, + "loseNum": 0, + "NpcTotalWinNum": 0, + "NpcTotalLoseNum": 0, + "NpcMaxWinNum": 0, + "NpcMaxLoseNum": 0, + "NpcWinNum": 0, + "NpcLoseNum": 0 + } + } + ], + "userItemList": [], + "userMusicDetailList": [ + { + "musicId": 143, + "level": 4, + "playCount": 9, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0 + } + ], + "userCourseList": [], + "userFriendSeasonRankingList": [], + "userChargeList": [ + { + "chargeId": 2, + "stock": 0, + "purchaseDate": "2026-07-14 18:33:37", + "validDate": "2026-10-12 04:00:00" + }, + { + "chargeId": 3, + "stock": 0, + "purchaseDate": "2026-10-02 10:49:23", + "validDate": "2026-12-31 04:00:00" + }, + { + "chargeId": 5, + "stock": 0, + "purchaseDate": "2026-10-04 18:22:10", + "validDate": "2027-01-02 04:00:00" + } + ], + "userFavoriteList": [ + { + "itemKind": 3, + "itemIdList": [ + 559501 + ] + }, + { + "itemKind": 1, + "itemIdList": [] + }, + { + "itemKind": 2, + "itemIdList": [] + }, + { + "itemKind": 10, + "itemIdList": [] + }, + { + "itemKind": 11, + "itemIdList": [] + } + ], + "userActivityList": [ + { + "playList": [ + { + "kind": 1, + "id": 25, + "sortNumber": 1790768552, + "param1": 11796, + "param2": 3, + "param3": 138, + "param4": 0 + }, + { + "kind": 1, + "id": 44, + "sortNumber": 1790768754, + "param1": 11741, + "param2": 3, + "param3": 147, + "param4": 0 + }, + { + "kind": 1, + "id": 10, + "sortNumber": 1790782892, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 1, + "id": 10, + "sortNumber": 1790909325, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 1, + "id": 90, + "sortNumber": 1790909345, + "param1": 550003, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 1, + "id": 24, + "sortNumber": 1790935933, + "param1": 11752, + "param2": 3, + "param3": 147, + "param4": 0 + }, + { + "kind": 1, + "id": 30, + "sortNumber": 1790936128, + "param1": 365, + "param2": 3, + "param3": 146, + "param4": 0 + }, + { + "kind": 1, + "id": 30, + "sortNumber": 1791033313, + "param1": 11842, + "param2": 3, + "param3": 141, + "param4": 0 + }, + { + "kind": 1, + "id": 25, + "sortNumber": 1791033313, + "param1": 11842, + "param2": 3, + "param3": 141, + "param4": 0 + }, + { + "kind": 1, + "id": 44, + "sortNumber": 1791035153, + "param1": 11860, + "param2": 3, + "param3": 145, + "param4": 0 + }, + { + "kind": 1, + "id": 30, + "sortNumber": 1791107781, + "param1": 11576, + "param2": 3, + "param3": 142, + "param4": 0 + }, + { + "kind": 1, + "id": 24, + "sortNumber": 1791107781, + "param1": 11576, + "param2": 3, + "param3": 142, + "param4": 0 + }, + { + "kind": 1, + "id": 44, + "sortNumber": 1791109213, + "param1": 11687, + "param2": 3, + "param3": 145, + "param4": 0 + }, + { + "kind": 1, + "id": 10, + "sortNumber": 1791109401, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 1, + "id": 10, + "sortNumber": 1791130786, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + } + ], + "musicList": [ + { + "kind": 2, + "id": 11509, + "sortNumber": 1791108736, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 11479, + "sortNumber": 1791108929, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 11544, + "sortNumber": 1791109635, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 643, + "sortNumber": 1791109808, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 11686, + "sortNumber": 1791110015, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 348, + "sortNumber": 1791110210, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 799, + "sortNumber": 1791110371, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 11687, + "sortNumber": 1791110553, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 496, + "sortNumber": 1791110744, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 143, + "sortNumber": 1791130834, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + } + ] + } + ], + "userMissionDataList": [ + { + "type": 0, + "difficulty": 0, + "targetGenreId": 0, + "targetGenreTableId": 0, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": true + }, + { + "type": 0, + "difficulty": 1, + "targetGenreId": 0, + "targetGenreTableId": 0, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": true + }, + { + "type": 1, + "difficulty": 0, + "targetGenreId": 0, + "targetGenreTableId": 3, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": true + }, + { + "type": 1, + "difficulty": 1, + "targetGenreId": 1, + "targetGenreTableId": 21, + "conditionGenreId": 1, + "conditionGenreTableId": 10, + "clearFlag": true + }, + { + "type": 2, + "difficulty": 0, + "targetGenreId": 0, + "targetGenreTableId": 3, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": true + }, + { + "type": 2, + "difficulty": 1, + "targetGenreId": 0, + "targetGenreTableId": 3, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": false + } + ], + "userWeeklyData": { + "lastLoginWeek": "2026-09-28 04:00:00", + "beforeLoginWeek": "2026-09-21 04:00:00", + "friendBonusFlag": true + }, + "userGamePlaylogList": [ + { + "playlogId": 7693120247791879616, + "version": "1.56.00", + "playDate": "2026-10-05 17:55:38.0", + "playMode": 0, + "useTicketId": -1, + "playCredit": 1, + "playTrack": 1, + "clientId": "TESTCLIENT1", + "isPlayTutorial": false, + "isEventMode": false, + "isNewFree": false, + "playCount": 8, + "playSpecial": 16417894, + "playOtherUserId": 0 + } + ], + "user2pPlaylog": { + "userId1": 0, + "userId2": 0, + "userName1": "", + "userName2": "", + "regionId": 0, + "placeId": 0, + "user2pPlaylogDetailList": [] + }, + "userIntimateList": [], + "userShopItemStockList": [], + "userGetPointList": [], + "userTradeItemList": [], + "userFavoritemusicList": [], + "userKaleidxScopeList": [], + "isNewCharacterList": "00000", + "isNewMapList": "0", + "isNewLoginBonusList": "", + "isNewItemList": "", + "isNewMusicDetailList": "0", + "isNewCourseList": "", + "isNewFavoriteList": "22212", + "isNewFriendSeasonRankingList": "", + "isNewUserIntimateList": "", + "isNewFavoritemusicList": "", + "isNewKaleidxScopeList": "" + } +} \ No newline at end of file diff --git a/docs/samples/快照_基线.json b/docs/samples/快照_基线.json new file mode 100644 index 0000000..5e26757 --- /dev/null +++ b/docs/samples/快照_基线.json @@ -0,0 +1,27889 @@ +{ + "userData": { + "userId": 12345678, + "userData": { + "accessCode": null, + "userName": "☆Astral☆", + "friendCode": null, + "isNetMember": 1, + "point": 4110, + "totalPoint": 52620, + "playerRating": 15000, + "playerOldRating": 10927, + "playerNewRating": 4606, + "highestRating": 15000, + "gradeRating": 0, + "musicRating": 15000, + "gradeRank": 0, + "courseRank": 10, + "classRank": 1, + "nameplateId": 0, + "frameId": 209504, + "iconId": 559501, + "trophyId": 0, + "plateId": 458001, + "titleId": 55502, + "partnerId": 1, + "charaSlot": [ + 395, + 101, + 400402, + 400401, + 200401 + ], + "charaLockSlot": [ + 395, + 101, + 0, + 0, + 0 + ], + "contentBit": 2145488608, + "selectMapId": 550003, + "playCount": 1258, + "currentPlayCount": 186, + "playVsCount": 0, + "playSyncCount": 0, + "winCount": 0, + "helpCount": 0, + "comboCount": 0, + "totalDeluxscore": 1869771, + "totalBasicDeluxscore": 1274, + "totalAdvancedDeluxscore": 6566, + "totalExpertDeluxscore": 470976, + "totalMasterDeluxscore": 1236693, + "totalReMasterDeluxscore": 154262, + "totalSync": 1112, + "totalBasicSync": 5, + "totalAdvancedSync": 5, + "totalExpertSync": 425, + "totalMasterSync": 604, + "totalReMasterSync": 73, + "totalAchievement": 975613200, + "totalBasicAchievement": 2984753, + "totalAdvancedAchievement": 7755815, + "totalExpertAchievement": 315483810, + "totalMasterAchievement": 578226016, + "totalReMasterAchievement": 71162806, + "eventWatchedDate": "2026-10-05 00:19:37", + "lastGameId": null, + "lastRomVersion": "1.56.00", + "lastDataVersion": "1.55.05", + "lastLoginDate": "2026-10-05 00:19:37", + "lastPlayDate": "2026-10-05 00:20:57", + "lastPairLoginDate": "2026-10-04 18:05:18", + "lastTrialPlayDate": "2026-10-03 21:07:50", + "lastPlayCredit": 1, + "lastPlayMode": 0, + "lastPlaceId": 0, + "lastPlaceName": null, + "lastAllNetId": 0, + "lastRegionId": 5, + "lastRegionName": "测试区域", + "lastClientId": null, + "lastCountryCode": "CHN", + "lastSelectEMoney": 0, + "lastSelectTicket": 0, + "lastSelectCourse": 552304, + "lastCountCourse": 0, + "firstGameId": "SDGB", + "firstRomVersion": "1.41.00", + "firstDataVersion": "1.40.08", + "firstPlayDate": "2024-12-31 21:25:58", + "compatibleCmVersion": "1.55.00", + "totalAwake": 184, + "dailyBonusDate": "1970-01-01 08:00:00", + "dailyCourseBonusDate": "2026-07-13 00:00:00", + "mapStock": 0, + "renameCredit": 0, + "friendRegistSkip": 0, + "cmLastEmoneyCredit": 0, + "cmLastEmoneyBrand": 0, + "dateTime": null + }, + "banState": 0 + }, + "userExtend": { + "userId": 12345678, + "userExtend": { + "selectMusicId": 143, + "selectDifficultyId": 4, + "categoryIndex": 2022, + "musicIndex": 10, + "extraFlag": 1721, + "selectScoreType": 1, + "selectResultDetails": false, + "selectResultScoreViewType": 1, + "sortCategorySetting": 2, + "sortMusicSetting": 5, + "selectedCardList": [ + 0, + 0, + 0, + 0, + 0 + ], + "encountMapNpcList": [ + { + "npcId": 0, + "musicId": 0 + }, + { + "npcId": 0, + "musicId": 0 + }, + { + "npcId": 0, + "musicId": 0 + } + ], + "extendContentBit": 16, + "playStatusSetting": 0 + } + }, + "userOption": { + "userId": 12345678, + "userOption": { + "optionKind": 3, + "noteSpeed": 24, + "slideSpeed": 10, + "touchSpeed": 24, + "noteSize": 1, + "slideSize": 1, + "touchSize": 1, + "tapDesign": 2, + "holdDesign": 0, + "slideDesign": 0, + "starType": 1, + "starRotate": 1, + "adjustTiming": 20, + "judgeTiming": 20, + "mirrorMode": 0, + "ansVolume": 8, + "tempoVolume": 0, + "tapHoldVolume": 5, + "touchHoldVolume": 5, + "breakVolume": 5, + "exVolume": 5, + "slideVolume": 5, + "breakSe": 1, + "slideSe": 0, + "exSe": 0, + "criticalSe": 1, + "tapSe": 0, + "headPhoneVolume": 1, + "matching": 1, + "brightness": 1, + "dispRate": 1, + "dispCenter": 0, + "dispJudge": 10, + "dispJudgePos": 1, + "dispJudgeTouchPos": 1, + "dispChain": 0, + "dispBar": 0, + "trackSkip": 1, + "touchEffect": 2, + "outlineDesign": 0, + "submonitorAnimation": 2, + "submonitorAppeal": 1, + "submonitorAchive": 1, + "sortTab": 0, + "sortMusic": 0, + "damageSeVolume": 5, + "touchVolume": 5, + "outFrameType": 1, + "breakSlideVolume": 5 + } + }, + "userCharacterList": { + "userId": 12345678, + "length": 312, + "userCharacterList": [ + { + "characterId": 101, + "point": 0, + "useCount": 0, + "level": 4456, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 5 + }, + { + "characterId": 102, + "point": 0, + "useCount": 0, + "level": 190, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 103, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 104, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 201, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 202, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 203, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 204, + "point": 0, + "useCount": 0, + "level": 80, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 205, + "point": 0, + "useCount": 0, + "level": 80, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 301, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 302, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 303, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 304, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305, + "point": 0, + "useCount": 0, + "level": 96, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 306, + "point": 0, + "useCount": 0, + "level": 96, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 392, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 393, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 394, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 395, + "point": 0, + "useCount": 0, + "level": 3801, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 5 + }, + { + "characterId": 401, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 402, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 403, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 404, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405, + "point": 0, + "useCount": 0, + "level": 184, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 501, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 502, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 503, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 504, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 601, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 602, + "point": 0, + "useCount": 0, + "level": 37, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 603, + "point": 0, + "useCount": 0, + "level": 37, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 604, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 605, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 3901, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 3902, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 3903, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 3904, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 3905, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 100101, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 100102, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 100501, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105501, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105502, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105503, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105504, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105505, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105601, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105602, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105603, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105604, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105605, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105606, + "point": 0, + "useCount": 0, + "level": 67, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 105607, + "point": 0, + "useCount": 0, + "level": 67, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 105608, + "point": 0, + "useCount": 0, + "level": 67, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 105801, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105802, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105803, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 105804, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 150101, + "point": 0, + "useCount": 0, + "level": 104, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 200101, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 200102, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 200103, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 200104, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 200401, + "point": 0, + "useCount": 0, + "level": 135, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 200402, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 200403, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 200404, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 200405, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 250101, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 250401, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 250402, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 255801, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 255802, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 255803, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 255804, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 255805, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 255806, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 256001, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 256002, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 256003, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300101, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300102, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300103, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300104, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300105, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300201, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300301, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300401, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300601, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300602, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300603, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300604, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 300605, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305201, + "point": 0, + "useCount": 0, + "level": 69, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 305202, + "point": 0, + "useCount": 0, + "level": 66, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 305203, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305204, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305205, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305206, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305207, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305208, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305209, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 305210, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350401, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350402, + "point": 0, + "useCount": 0, + "level": 32, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 350403, + "point": 0, + "useCount": 0, + "level": 64, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 350701, + "point": 0, + "useCount": 0, + "level": 76, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 350702, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350703, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350704, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350705, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350706, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350707, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350708, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350709, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350710, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350711, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350712, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350713, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350714, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350715, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350716, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350717, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350718, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350719, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350720, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350721, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350722, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350723, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350724, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350725, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350726, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 350727, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355601, + "point": 0, + "useCount": 0, + "level": 465, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 4 + }, + { + "characterId": 355602, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355603, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355604, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355605, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355606, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355607, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355608, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355609, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 355610, + "point": 0, + "useCount": 0, + "level": 2603, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 5 + }, + { + "characterId": 355611, + "point": 0, + "useCount": 0, + "level": 2565, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 5 + }, + { + "characterId": 355612, + "point": 0, + "useCount": 0, + "level": 2457, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 5 + }, + { + "characterId": 400101, + "point": 0, + "useCount": 0, + "level": 184, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 400102, + "point": 0, + "useCount": 0, + "level": 184, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 400401, + "point": 0, + "useCount": 0, + "level": 135, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 400402, + "point": 0, + "useCount": 0, + "level": 135, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 400601, + "point": 0, + "useCount": 0, + "level": 78, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 405101, + "point": 0, + "useCount": 0, + "level": 2, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405102, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405103, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405104, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405105, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405401, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405402, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405403, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405404, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405405, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405601, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405602, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405603, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405604, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 405701, + "point": 0, + "useCount": 0, + "level": 37, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 405702, + "point": 0, + "useCount": 0, + "level": 37, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 405703, + "point": 0, + "useCount": 0, + "level": 37, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 405901, + "point": 0, + "useCount": 0, + "level": 59, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 406201, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 406202, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 406203, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 406204, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 406205, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 406206, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 450101, + "point": 0, + "useCount": 0, + "level": 13, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 450102, + "point": 0, + "useCount": 0, + "level": 13, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 450103, + "point": 0, + "useCount": 0, + "level": 13, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 450104, + "point": 0, + "useCount": 0, + "level": 13, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 450201, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 450202, + "point": 0, + "useCount": 0, + "level": 164, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 450203, + "point": 0, + "useCount": 0, + "level": 164, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 450204, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 450301, + "point": 0, + "useCount": 0, + "level": 64, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 450302, + "point": 0, + "useCount": 0, + "level": 95, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 450401, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 450402, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455101, + "point": 0, + "useCount": 0, + "level": 57, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 455102, + "point": 0, + "useCount": 0, + "level": 57, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 455301, + "point": 0, + "useCount": 0, + "level": 26, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 455302, + "point": 0, + "useCount": 0, + "level": 23, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 455303, + "point": 0, + "useCount": 0, + "level": 23, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 455304, + "point": 0, + "useCount": 0, + "level": 770, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 4 + }, + { + "characterId": 455305, + "point": 0, + "useCount": 0, + "level": 770, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 4 + }, + { + "characterId": 455306, + "point": 0, + "useCount": 0, + "level": 770, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 4 + }, + { + "characterId": 455307, + "point": 0, + "useCount": 0, + "level": 17, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 455308, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455309, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455310, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455311, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455312, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455701, + "point": 0, + "useCount": 0, + "level": 33, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 455702, + "point": 0, + "useCount": 0, + "level": 33, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 455703, + "point": 0, + "useCount": 0, + "level": 33, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 455704, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455705, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455706, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 455801, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 456101, + "point": 0, + "useCount": 0, + "level": 63, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 456102, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500101, + "point": 0, + "useCount": 0, + "level": 80, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 500102, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500103, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500104, + "point": 0, + "useCount": 0, + "level": 11, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 500201, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500202, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500203, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 500204, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 500301, + "point": 0, + "useCount": 0, + "level": 78, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 500302, + "point": 0, + "useCount": 0, + "level": 70, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 500303, + "point": 0, + "useCount": 0, + "level": 58, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 500304, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500305, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500401, + "point": 0, + "useCount": 0, + "level": 132, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 500402, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500403, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 500404, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505201, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505202, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505203, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505204, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505401, + "point": 0, + "useCount": 0, + "level": 4, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505402, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505701, + "point": 0, + "useCount": 0, + "level": 67, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 505702, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505801, + "point": 0, + "useCount": 0, + "level": 66, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 505802, + "point": 0, + "useCount": 0, + "level": 38, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 505803, + "point": 0, + "useCount": 0, + "level": 38, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 505804, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 505805, + "point": 0, + "useCount": 0, + "level": 11, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 505901, + "point": 0, + "useCount": 0, + "level": 19, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 505902, + "point": 0, + "useCount": 0, + "level": 19, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 505903, + "point": 0, + "useCount": 0, + "level": 16, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 505904, + "point": 0, + "useCount": 0, + "level": 16, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 505905, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506001, + "point": 0, + "useCount": 0, + "level": 66, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 506002, + "point": 0, + "useCount": 0, + "level": 63, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 506003, + "point": 0, + "useCount": 0, + "level": 63, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 506004, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506005, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506006, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506007, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506008, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506009, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506010, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506011, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506012, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506013, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506014, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506015, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506016, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 506017, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550101, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550102, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550103, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550104, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550105, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550106, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550201, + "point": 0, + "useCount": 0, + "level": 64, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 550202, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550203, + "point": 0, + "useCount": 0, + "level": 32, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 550204, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550301, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 550302, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555101, + "point": 0, + "useCount": 0, + "level": 51, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 555102, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555103, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555104, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555105, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555106, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555107, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555108, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555201, + "point": 0, + "useCount": 0, + "level": 28, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555202, + "point": 0, + "useCount": 0, + "level": 25, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555203, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555204, + "point": 0, + "useCount": 0, + "level": 10, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555205, + "point": 0, + "useCount": 0, + "level": 10, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555401, + "point": 0, + "useCount": 0, + "level": 14, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555402, + "point": 0, + "useCount": 0, + "level": 10, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555403, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555404, + "point": 0, + "useCount": 0, + "level": 7, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555405, + "point": 0, + "useCount": 0, + "level": 7, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555501, + "point": 0, + "useCount": 0, + "level": 106, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 3 + }, + { + "characterId": 555502, + "point": 0, + "useCount": 0, + "level": 48, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555503, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555504, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555601, + "point": 0, + "useCount": 0, + "level": 36, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555602, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555603, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555604, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555605, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555606, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555801, + "point": 0, + "useCount": 0, + "level": 31, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 1 + }, + { + "characterId": 555802, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555803, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 555901, + "point": 0, + "useCount": 0, + "level": 4, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 605901, + "point": 0, + "useCount": 0, + "level": 72, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 605902, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + }, + { + "characterId": 605903, + "point": 0, + "useCount": 0, + "level": 56, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 605904, + "point": 0, + "useCount": 0, + "level": 56, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 2 + }, + { + "characterId": 605905, + "point": 0, + "useCount": 0, + "level": 1, + "nextAwake": 0, + "nextAwakePercent": 0, + "awakening": 0 + } + ] + }, + "userMapList": { + "userMapList": [ + { + "mapId": 1, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 1 + }, + { + "mapId": 2, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 1 + }, + { + "mapId": 3, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 1 + }, + { + "mapId": 4, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 1 + }, + { + "mapId": 5, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 1 + }, + { + "mapId": 6, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 1 + }, + { + "mapId": 39, + "distance": 200000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 100001, + "distance": 126000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 100003, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 100004, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 100005, + "distance": 84000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 100006, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 100055, + "distance": 588000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 100056, + "distance": 774000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 100058, + "distance": 128000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 150001, + "distance": 30000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 150002, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 150003, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 150004, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 150005, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 200001, + "distance": 468000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 200002, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 200003, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 200004, + "distance": 1200000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 200006, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 200060, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 250001, + "distance": 35000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 250002, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 250003, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 250004, + "distance": 400000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 250006, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 250007, + "distance": 777000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 250058, + "distance": 500000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 250060, + "distance": 75000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 300001, + "distance": 472000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 300002, + "distance": 70000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 300003, + "distance": 35000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 300004, + "distance": 150000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 300005, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 300006, + "distance": 400000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 300052, + "distance": 380000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 300053, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 350001, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 350003, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 350004, + "distance": 1111000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 350005, + "distance": 57000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 350006, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 350007, + "distance": 1111000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 350056, + "distance": 710000, + "isLock": true, + "isClear": false, + "isComplete": true, + "unlockFlag": 1 + }, + { + "mapId": 400001, + "distance": 30000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 400002, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 400003, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 400004, + "distance": 400000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 400005, + "distance": 393000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 400006, + "distance": 26000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 400051, + "distance": 220000, + "isLock": true, + "isClear": false, + "isComplete": true, + "unlockFlag": 1 + }, + { + "mapId": 400054, + "distance": 700000, + "isLock": true, + "isClear": false, + "isComplete": true, + "unlockFlag": 1 + }, + { + "mapId": 400056, + "distance": 240000, + "isLock": true, + "isClear": false, + "isComplete": true, + "unlockFlag": 1 + }, + { + "mapId": 400057, + "distance": 444000, + "isLock": true, + "isClear": false, + "isComplete": true, + "unlockFlag": 1 + }, + { + "mapId": 400058, + "distance": 240000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 400059, + "distance": 666000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 400062, + "distance": 480000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 1 + }, + { + "mapId": 400063, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450001, + "distance": 900000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 450002, + "distance": 1100000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 450003, + "distance": 140000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450004, + "distance": 400000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450005, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450051, + "distance": 250000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 450052, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450053, + "distance": 250000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 450054, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450056, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450057, + "distance": 200000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450058, + "distance": 30000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450059, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450060, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 450061, + "distance": 30000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 500001, + "distance": 800000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 500002, + "distance": 1100000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 500003, + "distance": 800000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 500004, + "distance": 1400000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 500005, + "distance": 805000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 500052, + "distance": 240000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 500053, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 500054, + "distance": 50000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 500055, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 500056, + "distance": 0, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 500057, + "distance": 750000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 500058, + "distance": 500000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 500059, + "distance": 350000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 500060, + "distance": 750000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 550001, + "distance": 900000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 550002, + "distance": 1200000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 550003, + "distance": 1435000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 550004, + "distance": 2898000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 550051, + "distance": 350000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 550052, + "distance": 300000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 550054, + "distance": 200000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 550055, + "distance": 350000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 550056, + "distance": 600000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + }, + { + "mapId": 550058, + "distance": 350000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 550059, + "distance": 25000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + }, + { + "mapId": 600059, + "distance": 700000, + "isLock": false, + "isClear": false, + "isComplete": true, + "unlockFlag": 0 + } + ] + }, + "userLoginBonusList": { + "userLoginBonusList": [ + { + "bonusId": 5, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 6, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 7, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 8, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 9, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 19, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 20, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 24, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 25, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 26, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 30, + "point": 5, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 32, + "point": 3, + "isCurrent": false, + "isComplete": false + }, + { + "bonusId": 33, + "point": 2, + "isCurrent": false, + "isComplete": false + }, + { + "bonusId": 34, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 37, + "point": 5, + "isCurrent": false, + "isComplete": false + }, + { + "bonusId": 39, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 40, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 43, + "point": 3, + "isCurrent": false, + "isComplete": false + }, + { + "bonusId": 48, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 49, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 51, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 52, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 53, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 55, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 56, + "point": 5, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 57, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 58, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 62, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 63, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 64, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 65, + "point": 5, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 501, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 608, + "point": 8, + "isCurrent": false, + "isComplete": false + }, + { + "bonusId": 610, + "point": 9, + "isCurrent": false, + "isComplete": false + }, + { + "bonusId": 611, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 613, + "point": 6, + "isCurrent": false, + "isComplete": false + }, + { + "bonusId": 615, + "point": 10, + "isCurrent": false, + "isComplete": true + }, + { + "bonusId": 616, + "point": 2, + "isCurrent": false, + "isComplete": false + } + ] + }, + "userRatingList": { + "userId": 12345678, + "userRating": { + "rating": 0, + "ratingList": [ + { + "musicId": 11771, + "level": 3, + "romVersion": 25005, + "achievement": 1006008 + }, + { + "musicId": 11328, + "level": 3, + "romVersion": 22004, + "achievement": 1005210 + }, + { + "musicId": 11752, + "level": 3, + "romVersion": 25008, + "achievement": 1001992 + }, + { + "musicId": 11472, + "level": 3, + "romVersion": 23006, + "achievement": 1006509 + }, + { + "musicId": 11299, + "level": 3, + "romVersion": 22004, + "achievement": 1005722 + }, + { + "musicId": 11454, + "level": 3, + "romVersion": 23005, + "achievement": 1006321 + }, + { + "musicId": 11721, + "level": 3, + "romVersion": 25003, + "achievement": 1005440 + }, + { + "musicId": 11491, + "level": 3, + "romVersion": 23006, + "achievement": 1005245 + }, + { + "musicId": 11591, + "level": 3, + "romVersion": 24003, + "achievement": 1005023 + }, + { + "musicId": 11761, + "level": 3, + "romVersion": 25005, + "achievement": 1006028 + }, + { + "musicId": 11331, + "level": 3, + "romVersion": 22004, + "achievement": 1005958 + }, + { + "musicId": 11343, + "level": 3, + "romVersion": 22005, + "achievement": 1005831 + }, + { + "musicId": 11671, + "level": 3, + "romVersion": 25000, + "achievement": 1005695 + }, + { + "musicId": 11678, + "level": 3, + "romVersion": 25003, + "achievement": 1005174 + }, + { + "musicId": 11706, + "level": 3, + "romVersion": 25002, + "achievement": 1005144 + }, + { + "musicId": 11413, + "level": 3, + "romVersion": 23000, + "achievement": 1005077 + }, + { + "musicId": 11550, + "level": 3, + "romVersion": 24001, + "achievement": 1004327 + }, + { + "musicId": 11578, + "level": 3, + "romVersion": 24004, + "achievement": 1001611 + }, + { + "musicId": 11566, + "level": 3, + "romVersion": 23000, + "achievement": 1007790 + }, + { + "musicId": 11447, + "level": 3, + "romVersion": 23003, + "achievement": 1006728 + }, + { + "musicId": 11796, + "level": 3, + "romVersion": 25007, + "achievement": 1006689 + }, + { + "musicId": 11514, + "level": 3, + "romVersion": 23008, + "achievement": 1006617 + }, + { + "musicId": 11784, + "level": 3, + "romVersion": 25006, + "achievement": 1006273 + }, + { + "musicId": 11633, + "level": 3, + "romVersion": 24004, + "achievement": 1006058 + }, + { + "musicId": 11466, + "level": 3, + "romVersion": 23007, + "achievement": 1005871 + }, + { + "musicId": 11007, + "level": 4, + "romVersion": 20000, + "achievement": 1005868 + }, + { + "musicId": 11692, + "level": 4, + "romVersion": 25000, + "achievement": 1005751 + }, + { + "musicId": 11638, + "level": 3, + "romVersion": 24005, + "achievement": 1005699 + }, + { + "musicId": 11527, + "level": 3, + "romVersion": 24000, + "achievement": 1005661 + }, + { + "musicId": 11453, + "level": 3, + "romVersion": 23005, + "achievement": 1005558 + }, + { + "musicId": 10288, + "level": 3, + "romVersion": 20000, + "achievement": 1005400 + }, + { + "musicId": 11769, + "level": 3, + "romVersion": 25005, + "achievement": 1005369 + }, + { + "musicId": 11663, + "level": 2, + "romVersion": 24004, + "achievement": 1005365 + }, + { + "musicId": 11152, + "level": 4, + "romVersion": 21004, + "achievement": 1005360 + }, + { + "musicId": 11542, + "level": 3, + "romVersion": 24002, + "achievement": 1005308 + } + ], + "newRatingList": [ + { + "musicId": 11823, + "level": 3, + "romVersion": 25500, + "achievement": 1005376 + }, + { + "musicId": 11842, + "level": 3, + "romVersion": 25500, + "achievement": 1006389 + }, + { + "musicId": 11809, + "level": 3, + "romVersion": 25500, + "achievement": 1000563 + }, + { + "musicId": 11838, + "level": 4, + "romVersion": 25500, + "achievement": 1007142 + }, + { + "musicId": 11832, + "level": 3, + "romVersion": 25500, + "achievement": 1005742 + }, + { + "musicId": 10030, + "level": 3, + "romVersion": 25500, + "achievement": 1006920 + }, + { + "musicId": 11811, + "level": 3, + "romVersion": 25502, + "achievement": 1006098 + }, + { + "musicId": 11806, + "level": 3, + "romVersion": 25500, + "achievement": 1005554 + }, + { + "musicId": 11855, + "level": 3, + "romVersion": 25501, + "achievement": 1000863 + }, + { + "musicId": 11813, + "level": 3, + "romVersion": 25502, + "achievement": 1000096 + }, + { + "musicId": 11821, + "level": 3, + "romVersion": 25504, + "achievement": 1001961 + }, + { + "musicId": 11854, + "level": 3, + "romVersion": 25501, + "achievement": 1001145 + }, + { + "musicId": 11807, + "level": 3, + "romVersion": 25500, + "achievement": 1004409 + }, + { + "musicId": 11844, + "level": 3, + "romVersion": 25500, + "achievement": 1002627 + }, + { + "musicId": 11860, + "level": 3, + "romVersion": 25503, + "achievement": 990398 + } + ], + "nextRatingList": [ + { + "musicId": 11741, + "level": 3, + "romVersion": 25005, + "achievement": 999832 + }, + { + "musicId": 11343, + "level": 4, + "romVersion": 22005, + "achievement": 1002872 + }, + { + "musicId": 11576, + "level": 3, + "romVersion": 23001, + "achievement": 1004814 + }, + { + "musicId": 11594, + "level": 3, + "romVersion": 24001, + "achievement": 1002173 + }, + { + "musicId": 365, + "level": 3, + "romVersion": 15007, + "achievement": 998026 + }, + { + "musicId": 11222, + "level": 3, + "romVersion": 21007, + "achievement": 996834 + }, + { + "musicId": 11209, + "level": 3, + "romVersion": 21007, + "achievement": 1000552 + }, + { + "musicId": 11544, + "level": 3, + "romVersion": 24002, + "achievement": 995578 + }, + { + "musicId": 11523, + "level": 3, + "romVersion": 23006, + "achievement": 995382 + }, + { + "musicId": 11739, + "level": 3, + "romVersion": 25005, + "achievement": 1001871 + }, + { + "musicId": 772, + "level": 3, + "romVersion": 19511, + "achievement": 1001485 + }, + { + "musicId": 11687, + "level": 3, + "romVersion": 25000, + "achievement": 998126 + }, + { + "musicId": 11713, + "level": 3, + "romVersion": 25002, + "achievement": 995426 + }, + { + "musicId": 11661, + "level": 3, + "romVersion": 24006, + "achievement": 994437 + }, + { + "musicId": 381, + "level": 3, + "romVersion": 14000, + "achievement": 1004352 + }, + { + "musicId": 11377, + "level": 3, + "romVersion": 23000, + "achievement": 1002986 + }, + { + "musicId": 11374, + "level": 3, + "romVersion": 22005, + "achievement": 993904 + }, + { + "musicId": 472, + "level": 4, + "romVersion": 16002, + "achievement": 1000487 + }, + { + "musicId": 820, + "level": 3, + "romVersion": 19995, + "achievement": 1000474 + }, + { + "musicId": 11672, + "level": 3, + "romVersion": 25000, + "achievement": 995966 + } + ], + "nextNewRatingList": [ + { + "musicId": 11847, + "level": 3, + "romVersion": 25501, + "achievement": 1003413 + }, + { + "musicId": 11824, + "level": 3, + "romVersion": 25502, + "achievement": 1000310 + }, + { + "musicId": 11848, + "level": 3, + "romVersion": 25501, + "achievement": 995346 + }, + { + "musicId": 11861, + "level": 3, + "romVersion": 25503, + "achievement": 993751 + }, + { + "musicId": 11862, + "level": 3, + "romVersion": 25503, + "achievement": 1001073 + }, + { + "musicId": 11812, + "level": 3, + "romVersion": 25502, + "achievement": 999924 + }, + { + "musicId": 11828, + "level": 3, + "romVersion": 25503, + "achievement": 999584 + }, + { + "musicId": 11815, + "level": 3, + "romVersion": 25504, + "achievement": 991088 + }, + { + "musicId": 11853, + "level": 3, + "romVersion": 25501, + "achievement": 1004028 + }, + { + "musicId": 11834, + "level": 3, + "romVersion": 25500, + "achievement": 998344 + }, + { + "musicId": 11850, + "level": 3, + "romVersion": 25501, + "achievement": 1004913 + }, + { + "musicId": 11810, + "level": 3, + "romVersion": 25500, + "achievement": 970442 + }, + { + "musicId": 11833, + "level": 3, + "romVersion": 25500, + "achievement": 1003821 + }, + { + "musicId": 11846, + "level": 3, + "romVersion": 25502, + "achievement": 996406 + }, + { + "musicId": 11849, + "level": 3, + "romVersion": 25501, + "achievement": 989664 + }, + { + "musicId": 11816, + "level": 3, + "romVersion": 25504, + "achievement": 987284 + }, + { + "musicId": 11817, + "level": 3, + "romVersion": 25504, + "achievement": 986685 + }, + { + "musicId": 11808, + "level": 3, + "romVersion": 25500, + "achievement": 989657 + }, + { + "musicId": 11843, + "level": 3, + "romVersion": 25500, + "achievement": 996527 + }, + { + "musicId": 11830, + "level": 3, + "romVersion": 25501, + "achievement": 984517 + } + ], + "udemae": { + "maxLoseNum": 0, + "npcTotalWinNum": 0, + "npcTotalLoseNum": 0, + "npcMaxWinNum": 0, + "npcMaxLoseNum": 0, + "npcWinNum": 0, + "npcLoseNum": 0, + "rate": 0, + "classValue": 10000, + "maxRate": 0, + "maxClassValue": 10000, + "totalWinNum": 6, + "totalLoseNum": 0, + "maxWinNum": 6, + "MaxLoseNum": 0, + "winNum": 6, + "loseNum": 0, + "NpcTotalWinNum": 0, + "NpcTotalLoseNum": 0, + "NpcMaxWinNum": 0, + "NpcMaxLoseNum": 0, + "NpcWinNum": 0, + "NpcLoseNum": 0 + } + } + }, + "userItemList": { + "userItemList": [ + { + "itemKind": 1, + "itemId": 1, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 11, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 105501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 105601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 255801, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 300101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 300601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 305201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 305202, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 350401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 350701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 355601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 355602, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 355603, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 355604, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 405101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 405401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 405402, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 405601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 405602, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 405603, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 405604, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 405701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 406201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 409501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 409502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 409503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 409504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 409505, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 409507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 409508, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 450101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 450201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 455101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 455102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 455301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 455302, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 455303, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 455701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 458001, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 459501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 500101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 500201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 500301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 500401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 505201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 505202, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 505701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 505702, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 505801, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 505802, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 505901, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 506001, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 506002, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 509501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 550101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 550201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 550301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 555101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 555102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 555201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 555202, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 555401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 555501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 555502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 555601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 559501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 559502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 1, + "itemId": 605901, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 1, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 11, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 34, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 36, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 37, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 38, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 395, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 5503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 5539, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 5541, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 55502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 55511, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 55514, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 108501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 108509, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 108520, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 108522, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 150001, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 150002, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 150003, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 150004, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 150006, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 158502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 158503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 158507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 158516, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 158517, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 208512, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 208527, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 208538, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 208539, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 208545, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 258507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 258508, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 258509, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 258510, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 258513, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 258515, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 258533, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 258544, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 259001, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 259002, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 259003, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 259004, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 300021, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 300022, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 300023, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308512, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308514, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308515, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308523, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308542, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308543, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308561, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308564, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308566, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308571, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308580, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 308586, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 355610, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 355611, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 355612, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358519, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358523, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358525, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358527, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358530, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358534, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358535, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358545, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358550, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358561, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358564, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358565, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358566, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358567, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358568, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358585, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358588, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358593, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 358595, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408188, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408189, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408190, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408203, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408207, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408209, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408212, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408214, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408219, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408220, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408223, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408226, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408227, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408231, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408234, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408235, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408238, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408259, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408260, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408261, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408262, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408263, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408264, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 408265, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458505, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458506, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458508, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458512, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458513, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458518, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458520, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458521, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458522, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458525, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458529, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458530, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458539, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458542, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458543, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458546, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458547, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458548, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458550, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458552, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458558, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458563, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458568, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458569, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458570, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458580, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 458584, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 459101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 459201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 459301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508518, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508521, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508522, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508528, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508529, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508541, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508543, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508544, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508549, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508551, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508558, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508559, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508560, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 508563, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 509013, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 550001, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558510, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558520, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558525, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558526, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558528, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558537, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558540, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 558570, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 559501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 559502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 559503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 559504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 559505, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 559506, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 559507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 559998, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 608551, + "stock": 1, + "isValid": true + }, + { + "itemKind": 2, + "itemId": 609000, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 1, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 10, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 11, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 12, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 13, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 204, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 205, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 305, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 306, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 395, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 405, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 602, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 603, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 105606, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 105607, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 105608, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 150101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 200401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 250701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 250702, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 250703, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 250704, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 250705, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 250706, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 250707, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 305201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 305202, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 309502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 350402, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 350403, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 350701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 355601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 355610, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 355611, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 355612, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 400101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 400102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 400401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 400402, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 400601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 405701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 405702, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 405703, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 405901, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 406205, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 406206, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 409503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 409505, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 409506, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 409507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 450101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 450102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 450103, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 450104, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 450202, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 450203, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 450301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 450302, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455302, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455303, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455304, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455305, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455306, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455307, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455702, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 455703, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 456101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 458001, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 458021, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 500101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 500104, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 500203, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 500204, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 500301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 500302, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 500303, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 500401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505801, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505802, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505803, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505805, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505901, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505902, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505903, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 505904, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 506001, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 506002, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 506003, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 509501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 509502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 509503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 509504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 509505, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 550201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 550203, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555202, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555204, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555205, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555402, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555603, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555604, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555605, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 555801, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 559501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 559502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 559506, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 559507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 559508, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 559509, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 559510, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 559511, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 605901, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 605903, + "stock": 1, + "isValid": true + }, + { + "itemKind": 3, + "itemId": 605904, + "stock": 1, + "isValid": true + }, + { + "itemKind": 4, + "itemId": 12030001, + "stock": 0, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 1085, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 1736, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 1810, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 1819, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 10030, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 10044, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 10699, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 10734, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 10835, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11014, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11208, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11209, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11311, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11535, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11542, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11543, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11544, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11545, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11546, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11547, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11548, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11642, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11643, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11646, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11647, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11648, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11661, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11662, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11669, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11670, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11671, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11672, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11674, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11675, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11676, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11677, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11678, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11682, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11687, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11737, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11738, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11739, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11740, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11742, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11743, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11744, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11745, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11749, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11750, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11751, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11752, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11753, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11756, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11758, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11759, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11788, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11789, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11800, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11803, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11804, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11806, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11807, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11808, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11809, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11811, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11812, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11813, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11814, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11815, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11816, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11817, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11818, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11819, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11820, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11821, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11832, + "stock": 1, + "isValid": true + }, + { + "itemKind": 5, + "itemId": 11946, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 1810, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10030, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10070, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10146, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10185, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10193, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10288, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10302, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10319, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10363, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10411, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10536, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10572, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10574, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10593, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10641, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10690, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10734, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 10835, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11002, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11003, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11004, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11007, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11008, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11010, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11015, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11020, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11021, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11023, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11026, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11027, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11028, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11029, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11037, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11048, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11051, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11069, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11075, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11083, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11085, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11089, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11094, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11095, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11096, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11103, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11106, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11115, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11136, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11139, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11140, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11141, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11152, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11158, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11159, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11160, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11164, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11166, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11175, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11176, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11177, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11184, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11187, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11197, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11198, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11204, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11205, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11206, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11207, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11208, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11209, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11210, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11212, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11213, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11215, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11216, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11221, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11222, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11223, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11224, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11228, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11231, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11232, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11233, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11234, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11236, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11237, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11238, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11239, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11241, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11248, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11249, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11253, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11255, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11263, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11270, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11271, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11281, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11282, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11284, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11286, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11289, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11292, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11293, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11296, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11297, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11298, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11299, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11300, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11302, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11303, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11304, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11306, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11308, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11309, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11310, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11311, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11312, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11315, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11318, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11319, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11328, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11330, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11331, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11333, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11335, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11343, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11344, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11349, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11353, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11354, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11355, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11358, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11363, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11364, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11365, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11369, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11371, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11374, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11375, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11376, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11377, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11378, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11379, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11381, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11383, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11384, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11386, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11387, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11388, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11389, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11390, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11391, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11392, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11394, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11395, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11398, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11400, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11410, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11411, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11412, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11413, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11418, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11422, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11423, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11424, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11429, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11432, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11433, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11435, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11437, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11438, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11441, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11447, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11452, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11453, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11454, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11455, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11456, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11457, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11458, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11459, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11460, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11461, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11466, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11467, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11469, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11470, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11471, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11472, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11475, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11477, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11479, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11481, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11482, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11484, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11485, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11488, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11490, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11491, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11492, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11496, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11497, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11499, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11505, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11509, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11512, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11513, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11514, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11516, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11517, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11523, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11524, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11525, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11527, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11528, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11529, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11534, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11535, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11537, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11539, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11540, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11541, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11542, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11543, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11544, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11545, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11546, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11547, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11548, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11549, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11550, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11552, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11553, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11554, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11556, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11557, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11558, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11559, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11560, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11561, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11562, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11563, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11564, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11565, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11566, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11568, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11571, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11572, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11573, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11575, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11576, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11578, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11583, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11584, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11585, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11590, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11591, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11592, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11593, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11594, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11597, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11599, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11600, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11602, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11607, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11610, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11612, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11615, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11617, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11618, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11619, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11622, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11623, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11625, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11626, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11629, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11630, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11631, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11633, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11637, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11638, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11639, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11640, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11641, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11642, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11643, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11645, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11646, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11647, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11648, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11650, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11651, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11653, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11655, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11656, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11657, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11658, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11660, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11661, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11662, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11663, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11665, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11666, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11668, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11669, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11670, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11671, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11672, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11674, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11675, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11676, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11677, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11678, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11680, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11682, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11684, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11685, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11686, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11687, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11691, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11692, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11693, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11694, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11695, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11696, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11697, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11698, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11699, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11700, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11702, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11706, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11707, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11710, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11711, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11712, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11713, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11714, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11715, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11716, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11717, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11720, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11721, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11722, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11723, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11725, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11726, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11729, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11730, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11731, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11734, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11735, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11737, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11738, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11739, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11740, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11741, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11742, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11743, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11744, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11745, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11746, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11747, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11748, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11750, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11751, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11752, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11753, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11754, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11755, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11757, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11758, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11759, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11761, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11763, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11767, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11769, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11771, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11772, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11773, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11783, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11784, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11786, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11787, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11788, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11792, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11793, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11794, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11795, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11796, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11797, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11798, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11799, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11800, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11803, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11804, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11806, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11807, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11808, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11809, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11810, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11811, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11812, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11813, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11814, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11815, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11816, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11817, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11821, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11823, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11824, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11828, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11830, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11831, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11832, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11833, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11834, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11835, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11838, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11839, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11842, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11843, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11844, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11845, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11846, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11847, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11848, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11849, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11850, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11851, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11852, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11853, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11854, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11855, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11860, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11861, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11862, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11944, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11945, + "stock": 1, + "isValid": true + }, + { + "itemKind": 6, + "itemId": 11946, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 1810, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 10835, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11002, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11004, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11007, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11010, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11015, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11023, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11152, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11177, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11184, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11228, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11232, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11241, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11333, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11343, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11369, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11410, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11485, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11558, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11561, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11562, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11629, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11637, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11663, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11687, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11692, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11696, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11697, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11698, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11763, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11803, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11835, + "stock": 1, + "isValid": true + }, + { + "itemKind": 7, + "itemId": 11838, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 1, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 15, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 16, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 17, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 18, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 19, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 20, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 21, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 22, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 23, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 24, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 25, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 26, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 28, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 29, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 30, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 31, + "stock": 1, + "isValid": true + }, + { + "itemKind": 10, + "itemId": 33, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 1, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 150051, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 209504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250702, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250703, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250704, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250705, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250706, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250707, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250708, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250709, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250710, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250711, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250712, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250713, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250714, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250715, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250716, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250717, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250718, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250719, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250720, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250721, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250722, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250723, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250724, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250725, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250726, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250727, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250728, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250729, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250730, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250731, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250732, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250733, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250734, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250735, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250736, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250737, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250738, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250739, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250740, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250741, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250742, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250743, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250744, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250745, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250746, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250747, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250749, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250750, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250751, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250752, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 250753, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 255801, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 255802, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 305202, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 305203, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 350401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 350701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 355601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 355602, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 355603, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 355604, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405103, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405402, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405403, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405602, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405801, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405901, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 405902, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 409507, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 450101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 450201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 455101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 455102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 455103, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 455104, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 455301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 455302, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 459504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 500101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 500201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 500301, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 500401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505701, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505702, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505703, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505801, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505802, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505803, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505804, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505901, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 505902, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 506001, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 509504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 550101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 550201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555101, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555102, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555103, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555201, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555202, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555203, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555401, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555501, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555502, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555503, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555601, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 555602, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 559504, + "stock": 1, + "isValid": true + }, + { + "itemKind": 11, + "itemId": 605901, + "stock": 1, + "isValid": true + }, + { + "itemKind": 12, + "itemId": 11001, + "stock": 0, + "isValid": true + }, + { + "itemKind": 12, + "itemId": 30001, + "stock": 0, + "isValid": true + }, + { + "itemKind": 12, + "itemId": 30002, + "stock": 0, + "isValid": true + }, + { + "itemKind": 14, + "itemId": 10001, + "stock": 5, + "isValid": true + } + ] + }, + "userMusicDetailList": { + "userMusicList": [ + { + "musicId": 22, + "level": 3, + "playCount": 2, + "achievement": 989414, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 937, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 22, + "level": 4, + "playCount": 3, + "achievement": 956648, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1952, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 24, + "level": 4, + "playCount": 2, + "achievement": 969185, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1275, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 25, + "level": 3, + "playCount": 2, + "achievement": 1005059, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 1020, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 30, + "level": 3, + "playCount": 1, + "achievement": 1004674, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 915, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 35, + "level": 3, + "playCount": 1, + "achievement": 969161, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 844, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 47, + "level": 4, + "playCount": 2, + "achievement": 967923, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1778, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 56, + "level": 3, + "playCount": 3, + "achievement": 983945, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1342, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 61, + "level": 4, + "playCount": 1, + "achievement": 939803, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1695, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 62, + "level": 4, + "playCount": 1, + "achievement": 1000030, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1219, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 66, + "level": 4, + "playCount": 1, + "achievement": 991396, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1582, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 70, + "level": 3, + "playCount": 1, + "achievement": 939676, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1399, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 80, + "level": 4, + "playCount": 1, + "achievement": 999071, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1532, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 81, + "level": 4, + "playCount": 2, + "achievement": 1001883, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1620, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 82, + "level": 3, + "playCount": 5, + "achievement": 994266, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1428, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 101, + "level": 3, + "playCount": 11, + "achievement": 1002365, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1295, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 107, + "level": 4, + "playCount": 1, + "achievement": 971426, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1505, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 109, + "level": 1, + "playCount": 1, + "achievement": 816678, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 495, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 109, + "level": 3, + "playCount": 2, + "achievement": 983196, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1477, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 112, + "level": 3, + "playCount": 2, + "achievement": 954477, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1531, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 113, + "level": 2, + "playCount": 1, + "achievement": 996728, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1327, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 113, + "level": 3, + "playCount": 1, + "achievement": 985055, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1264, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 114, + "level": 3, + "playCount": 2, + "achievement": 975577, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1096, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 117, + "level": 3, + "playCount": 1, + "achievement": 963807, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 927, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 128, + "level": 2, + "playCount": 1, + "achievement": 947028, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 425, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 133, + "level": 4, + "playCount": 1, + "achievement": 964731, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1417, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 136, + "level": 2, + "playCount": 2, + "achievement": 947971, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 665, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 138, + "level": 3, + "playCount": 2, + "achievement": 973442, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1102, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 143, + "level": 3, + "playCount": 15, + "achievement": 989559, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1610, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 143, + "level": 4, + "playCount": 8, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 144, + "level": 4, + "playCount": 2, + "achievement": 957812, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1108, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 146, + "level": 4, + "playCount": 2, + "achievement": 962093, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1361, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 159, + "level": 3, + "playCount": 3, + "achievement": 1002133, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1031, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 188, + "level": 3, + "playCount": 1, + "achievement": 860701, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1142, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 189, + "level": 3, + "playCount": 17, + "achievement": 1009705, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1289, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 191, + "level": 2, + "playCount": 2, + "achievement": 1004426, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1170, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 191, + "level": 3, + "playCount": 3, + "achievement": 974551, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1579, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 198, + "level": 4, + "playCount": 1, + "achievement": 639171, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1391, + "scoreRank": 2, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 199, + "level": 2, + "playCount": 4, + "achievement": 996054, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 952, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 199, + "level": 3, + "playCount": 2, + "achievement": 961131, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1192, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 200, + "level": 1, + "playCount": 1, + "achievement": 772292, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 395, + "scoreRank": 4, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 200, + "level": 2, + "playCount": 1, + "achievement": 976796, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1074, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 200, + "level": 3, + "playCount": 5, + "achievement": 1005571, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1587, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 200, + "level": 4, + "playCount": 2, + "achievement": 961897, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1591, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 201, + "level": 2, + "playCount": 1, + "achievement": 1000000, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 851, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 202, + "level": 3, + "playCount": 1, + "achievement": 996141, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1851, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 204, + "level": 2, + "playCount": 1, + "achievement": 964770, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1307, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 204, + "level": 4, + "playCount": 1, + "achievement": 960985, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2333, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 212, + "level": 3, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 213, + "level": 3, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 219, + "level": 3, + "playCount": 1, + "achievement": 928739, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1477, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 226, + "level": 3, + "playCount": 1, + "achievement": 947384, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1420, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 227, + "level": 2, + "playCount": 12, + "achievement": 1002848, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1970, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 227, + "level": 3, + "playCount": 13, + "achievement": 984347, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2241, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 227, + "level": 4, + "playCount": 1, + "achievement": 938470, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2240, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 229, + "level": 3, + "playCount": 3, + "achievement": 994195, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1002, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 230, + "level": 3, + "playCount": 1, + "achievement": 992385, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1323, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 234, + "level": 2, + "playCount": 1, + "achievement": 966862, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1115, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 239, + "level": 2, + "playCount": 1, + "achievement": 998667, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1269, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 239, + "level": 4, + "playCount": 1, + "achievement": 976742, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1781, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 241, + "level": 3, + "playCount": 4, + "achievement": 989737, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1061, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 242, + "level": 3, + "playCount": 3, + "achievement": 1004652, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1382, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 247, + "level": 4, + "playCount": 1, + "achievement": 923686, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1363, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 261, + "level": 3, + "playCount": 1, + "achievement": 976797, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1849, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 269, + "level": 0, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 269, + "level": 3, + "playCount": 4, + "achievement": 995961, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1662, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 270, + "level": 3, + "playCount": 2, + "achievement": 973302, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1686, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 271, + "level": 3, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 278, + "level": 3, + "playCount": 4, + "achievement": 1000023, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1577, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 282, + "level": 4, + "playCount": 1, + "achievement": 966549, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1383, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 283, + "level": 3, + "playCount": 1, + "achievement": 962725, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2035, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 288, + "level": 3, + "playCount": 1, + "achievement": 994461, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1883, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 295, + "level": 4, + "playCount": 2, + "achievement": 994315, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1294, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 296, + "level": 4, + "playCount": 1, + "achievement": 998212, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1304, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 299, + "level": 0, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 299, + "level": 3, + "playCount": 1, + "achievement": 954471, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2077, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 299, + "level": 4, + "playCount": 2, + "achievement": 974011, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2248, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 301, + "level": 4, + "playCount": 2, + "achievement": 981667, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2224, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 308, + "level": 3, + "playCount": 5, + "achievement": 992790, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1024, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 309, + "level": 3, + "playCount": 1, + "achievement": 991178, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1057, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 311, + "level": 2, + "playCount": 1, + "achievement": 996664, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 749, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 315, + "level": 2, + "playCount": 1, + "achievement": 971306, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 622, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 315, + "level": 3, + "playCount": 2, + "achievement": 1002380, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1541, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 325, + "level": 3, + "playCount": 1, + "achievement": 987743, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1799, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 327, + "level": 3, + "playCount": 2, + "achievement": 981791, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1317, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 328, + "level": 3, + "playCount": 1, + "achievement": 937967, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1651, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 337, + "level": 3, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 339, + "level": 2, + "playCount": 3, + "achievement": 977457, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 934, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 339, + "level": 3, + "playCount": 6, + "achievement": 964070, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1412, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 341, + "level": 3, + "playCount": 2, + "achievement": 990768, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1366, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 345, + "level": 3, + "playCount": 2, + "achievement": 999692, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1882, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 347, + "level": 3, + "playCount": 2, + "achievement": 979602, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1438, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 348, + "level": 3, + "playCount": 4, + "achievement": 977211, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2185, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 349, + "level": 3, + "playCount": 1, + "achievement": 980405, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1706, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 351, + "level": 3, + "playCount": 2, + "achievement": 992759, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1384, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 363, + "level": 2, + "playCount": 4, + "achievement": 981120, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1502, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 363, + "level": 3, + "playCount": 16, + "achievement": 987664, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2763, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 365, + "level": 2, + "playCount": 3, + "achievement": 969463, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1281, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 365, + "level": 3, + "playCount": 11, + "achievement": 998026, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2189, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 365, + "level": 4, + "playCount": 1, + "achievement": 968712, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2075, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 367, + "level": 4, + "playCount": 1, + "achievement": 973075, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2010, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 374, + "level": 3, + "playCount": 2, + "achievement": 980940, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1767, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 375, + "level": 3, + "playCount": 1, + "achievement": 983768, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1218, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 376, + "level": 3, + "playCount": 3, + "achievement": 991732, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2087, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 379, + "level": 2, + "playCount": 11, + "achievement": 998653, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1744, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 379, + "level": 3, + "playCount": 18, + "achievement": 998234, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2448, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 381, + "level": 2, + "playCount": 6, + "achievement": 982505, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1644, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 381, + "level": 3, + "playCount": 29, + "achievement": 1004352, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2369, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 384, + "level": 2, + "playCount": 1, + "achievement": 982557, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1257, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 384, + "level": 3, + "playCount": 12, + "achievement": 982643, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2197, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 386, + "level": 3, + "playCount": 1, + "achievement": 756519, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1270, + "scoreRank": 4, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 387, + "level": 3, + "playCount": 1, + "achievement": 971432, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2371, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 388, + "level": 2, + "playCount": 1, + "achievement": 956125, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1356, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 388, + "level": 3, + "playCount": 2, + "achievement": 949023, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1868, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 389, + "level": 4, + "playCount": 1, + "achievement": 952209, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2178, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 403, + "level": 3, + "playCount": 1, + "achievement": 999883, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 1819, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 411, + "level": 2, + "playCount": 6, + "achievement": 992541, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1567, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 411, + "level": 3, + "playCount": 4, + "achievement": 940234, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2097, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 417, + "level": 3, + "playCount": 28, + "achievement": 1007844, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 2073, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 424, + "level": 3, + "playCount": 1, + "achievement": 950269, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1264, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 427, + "level": 2, + "playCount": 1, + "achievement": 985193, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1191, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 431, + "level": 2, + "playCount": 3, + "achievement": 977583, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1814, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 431, + "level": 3, + "playCount": 5, + "achievement": 993826, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2612, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 432, + "level": 2, + "playCount": 8, + "achievement": 1005388, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1432, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 432, + "level": 3, + "playCount": 10, + "achievement": 995832, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2244, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 439, + "level": 2, + "playCount": 1, + "achievement": 977435, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1511, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 439, + "level": 3, + "playCount": 1, + "achievement": 965302, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2036, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 446, + "level": 3, + "playCount": 2, + "achievement": 988313, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2643, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 453, + "level": 3, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 456, + "level": 3, + "playCount": 7, + "achievement": 973606, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2762, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 457, + "level": 3, + "playCount": 1, + "achievement": 944761, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1285, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 461, + "level": 3, + "playCount": 4, + "achievement": 1008299, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2489, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 462, + "level": 3, + "playCount": 1, + "achievement": 956214, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2008, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 464, + "level": 2, + "playCount": 1, + "achievement": 999106, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1649, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 464, + "level": 3, + "playCount": 5, + "achievement": 995836, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2360, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 464, + "level": 4, + "playCount": 1, + "achievement": 963365, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2122, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 471, + "level": 3, + "playCount": 4, + "achievement": 994836, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1737, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 472, + "level": 4, + "playCount": 23, + "achievement": 1000487, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2507, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 488, + "level": 2, + "playCount": 2, + "achievement": 1007267, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1723, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 492, + "level": 2, + "playCount": 1, + "achievement": 971544, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1625, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 492, + "level": 3, + "playCount": 4, + "achievement": 989793, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2698, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 495, + "level": 3, + "playCount": 1, + "achievement": 967292, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2395, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 496, + "level": 2, + "playCount": 12, + "achievement": 1002061, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2339, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 496, + "level": 3, + "playCount": 4, + "achievement": 988335, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2817, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 496, + "level": 4, + "playCount": 2, + "achievement": 985722, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2805, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 508, + "level": 3, + "playCount": 5, + "achievement": 1002030, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1614, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 512, + "level": 3, + "playCount": 1, + "achievement": 969269, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1386, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 513, + "level": 4, + "playCount": 6, + "achievement": 990155, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1389, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 521, + "level": 2, + "playCount": 4, + "achievement": 1000539, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1380, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 521, + "level": 3, + "playCount": 9, + "achievement": 983240, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1876, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 524, + "level": 3, + "playCount": 1, + "achievement": 972012, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1469, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 529, + "level": 3, + "playCount": 2, + "achievement": 994855, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2109, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 540, + "level": 3, + "playCount": 1, + "achievement": 972824, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 969, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 546, + "level": 3, + "playCount": 1, + "achievement": 990622, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1508, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 547, + "level": 3, + "playCount": 1, + "achievement": 981182, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2055, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 548, + "level": 2, + "playCount": 1, + "achievement": 982594, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1444, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 552, + "level": 3, + "playCount": 4, + "achievement": 1004849, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1829, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 553, + "level": 2, + "playCount": 1, + "achievement": 952764, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1203, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 553, + "level": 3, + "playCount": 3, + "achievement": 997577, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2209, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 555, + "level": 2, + "playCount": 2, + "achievement": 988664, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1366, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 561, + "level": 3, + "playCount": 4, + "achievement": 978235, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2166, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 566, + "level": 2, + "playCount": 5, + "achievement": 1006745, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1908, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 566, + "level": 3, + "playCount": 10, + "achievement": 997005, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2463, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 567, + "level": 3, + "playCount": 6, + "achievement": 987305, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2525, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 571, + "level": 3, + "playCount": 2, + "achievement": 958731, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2279, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 573, + "level": 3, + "playCount": 5, + "achievement": 956419, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1507, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 580, + "level": 3, + "playCount": 2, + "achievement": 993350, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2170, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 581, + "level": 2, + "playCount": 3, + "achievement": 999876, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1935, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 581, + "level": 3, + "playCount": 1, + "achievement": 978554, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2479, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 586, + "level": 3, + "playCount": 2, + "achievement": 1006584, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1768, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 589, + "level": 3, + "playCount": 1, + "achievement": 912495, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2043, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 593, + "level": 2, + "playCount": 1, + "achievement": 989427, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1684, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 593, + "level": 3, + "playCount": 1, + "achievement": 966998, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2177, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 599, + "level": 3, + "playCount": 1, + "achievement": 932085, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1449, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 602, + "level": 3, + "playCount": 1, + "achievement": 995447, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2369, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 606, + "level": 2, + "playCount": 1, + "achievement": 983816, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2148, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 606, + "level": 3, + "playCount": 3, + "achievement": 982216, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2503, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 614, + "level": 3, + "playCount": 4, + "achievement": 995016, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2401, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 624, + "level": 3, + "playCount": 3, + "achievement": 980936, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1824, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 627, + "level": 3, + "playCount": 2, + "achievement": 997124, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2024, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 631, + "level": 3, + "playCount": 3, + "achievement": 970807, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2553, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 636, + "level": 3, + "playCount": 1, + "achievement": 973526, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1732, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 641, + "level": 2, + "playCount": 6, + "achievement": 978542, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1557, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 641, + "level": 3, + "playCount": 19, + "achievement": 987577, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2762, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 642, + "level": 2, + "playCount": 1, + "achievement": 986913, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1527, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 643, + "level": 2, + "playCount": 22, + "achievement": 1005030, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1737, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 643, + "level": 3, + "playCount": 9, + "achievement": 988813, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2422, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 655, + "level": 3, + "playCount": 1, + "achievement": 937273, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1389, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 658, + "level": 2, + "playCount": 1, + "achievement": 962154, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1730, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 658, + "level": 3, + "playCount": 1, + "achievement": 941830, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2087, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 664, + "level": 2, + "playCount": 1, + "achievement": 986093, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1699, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 664, + "level": 3, + "playCount": 3, + "achievement": 973403, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2276, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 665, + "level": 3, + "playCount": 2, + "achievement": 954505, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1807, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 666, + "level": 3, + "playCount": 1, + "achievement": 948287, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1603, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 670, + "level": 3, + "playCount": 2, + "achievement": 957187, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2233, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 672, + "level": 2, + "playCount": 1, + "achievement": 974367, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1283, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 673, + "level": 3, + "playCount": 1, + "achievement": 945956, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1793, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 674, + "level": 3, + "playCount": 1, + "achievement": 970662, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1440, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 681, + "level": 2, + "playCount": 1, + "achievement": 987604, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 1210, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 688, + "level": 2, + "playCount": 16, + "achievement": 1002773, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1515, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 688, + "level": 3, + "playCount": 9, + "achievement": 991514, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2089, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 689, + "level": 2, + "playCount": 14, + "achievement": 979946, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 810, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 689, + "level": 3, + "playCount": 3, + "achievement": 942493, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1633, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 690, + "level": 2, + "playCount": 1, + "achievement": 1001962, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1728, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 690, + "level": 3, + "playCount": 12, + "achievement": 1007540, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2228, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 694, + "level": 3, + "playCount": 2, + "achievement": 973189, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1903, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 700, + "level": 3, + "playCount": 1, + "achievement": 979459, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2141, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 701, + "level": 3, + "playCount": 7, + "achievement": 1005043, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2345, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 705, + "level": 2, + "playCount": 10, + "achievement": 1005709, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 1483, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 705, + "level": 3, + "playCount": 20, + "achievement": 1003477, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2237, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 710, + "level": 3, + "playCount": 2, + "achievement": 989535, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1564, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 713, + "level": 2, + "playCount": 1, + "achievement": 992134, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1140, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 717, + "level": 2, + "playCount": 1, + "achievement": 982712, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 945, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 719, + "level": 2, + "playCount": 1, + "achievement": 997612, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1760, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 719, + "level": 3, + "playCount": 5, + "achievement": 987327, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2688, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 720, + "level": 3, + "playCount": 1, + "achievement": 984539, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2017, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 725, + "level": 2, + "playCount": 1, + "achievement": 989326, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1193, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 725, + "level": 3, + "playCount": 2, + "achievement": 994190, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1797, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 726, + "level": 3, + "playCount": 4, + "achievement": 985604, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1832, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 731, + "level": 2, + "playCount": 1, + "achievement": 997922, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 1084, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 731, + "level": 3, + "playCount": 2, + "achievement": 980273, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1233, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 731, + "level": 4, + "playCount": 16, + "achievement": 1004897, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1923, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 734, + "level": 2, + "playCount": 17, + "achievement": 1005102, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1751, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 734, + "level": 3, + "playCount": 2, + "achievement": 972228, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2047, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 736, + "level": 2, + "playCount": 9, + "achievement": 989516, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1780, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 736, + "level": 3, + "playCount": 12, + "achievement": 987883, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2632, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 737, + "level": 3, + "playCount": 2, + "achievement": 968653, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1417, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 738, + "level": 2, + "playCount": 1, + "achievement": 954622, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1020, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 738, + "level": 3, + "playCount": 2, + "achievement": 990735, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1677, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 746, + "level": 3, + "playCount": 3, + "achievement": 958356, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2734, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 750, + "level": 2, + "playCount": 1, + "achievement": 994108, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1354, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 750, + "level": 3, + "playCount": 1, + "achievement": 949755, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1876, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 753, + "level": 3, + "playCount": 12, + "achievement": 998541, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1170, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 756, + "level": 4, + "playCount": 8, + "achievement": 994459, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2428, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 757, + "level": 3, + "playCount": 3, + "achievement": 988860, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2860, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 758, + "level": 2, + "playCount": 1, + "achievement": 985532, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1221, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 759, + "level": 2, + "playCount": 1, + "achievement": 990699, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1412, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 759, + "level": 4, + "playCount": 1, + "achievement": 988305, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2456, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 763, + "level": 4, + "playCount": 1, + "achievement": 953481, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1803, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 764, + "level": 3, + "playCount": 2, + "achievement": 982813, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1908, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 772, + "level": 2, + "playCount": 11, + "achievement": 1006652, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1866, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 772, + "level": 3, + "playCount": 30, + "achievement": 1001485, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2825, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 773, + "level": 3, + "playCount": 1, + "achievement": 950531, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2401, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 776, + "level": 3, + "playCount": 4, + "achievement": 972739, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1163, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 777, + "level": 2, + "playCount": 5, + "achievement": 983324, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1049, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 777, + "level": 3, + "playCount": 1, + "achievement": 949577, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2063, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 777, + "level": 4, + "playCount": 12, + "achievement": 993690, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1047, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 779, + "level": 2, + "playCount": 1, + "achievement": 937036, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1702, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 779, + "level": 3, + "playCount": 3, + "achievement": 976664, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2851, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 781, + "level": 3, + "playCount": 1, + "achievement": 990771, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1643, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 786, + "level": 3, + "playCount": 2, + "achievement": 979319, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1368, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 792, + "level": 2, + "playCount": 1, + "achievement": 998462, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1211, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 792, + "level": 3, + "playCount": 1, + "achievement": 885253, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1343, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 792, + "level": 4, + "playCount": 17, + "achievement": 1008166, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2019, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 793, + "level": 2, + "playCount": 1, + "achievement": 995627, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1271, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 793, + "level": 4, + "playCount": 2, + "achievement": 990904, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2128, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 796, + "level": 3, + "playCount": 1, + "achievement": 981075, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2332, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 798, + "level": 3, + "playCount": 1, + "achievement": 988984, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2473, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 799, + "level": 2, + "playCount": 32, + "achievement": 995689, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1816, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 799, + "level": 3, + "playCount": 3, + "achievement": 952520, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2512, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 799, + "level": 4, + "playCount": 19, + "achievement": 973439, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2813, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 803, + "level": 3, + "playCount": 18, + "achievement": 998982, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2248, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 803, + "level": 4, + "playCount": 5, + "achievement": 978957, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2140, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 812, + "level": 3, + "playCount": 2, + "achievement": 967542, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2342, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 818, + "level": 3, + "playCount": 1, + "achievement": 973600, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1668, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 820, + "level": 3, + "playCount": 12, + "achievement": 1000474, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2250, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 820, + "level": 4, + "playCount": 5, + "achievement": 977347, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2342, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 825, + "level": 2, + "playCount": 1, + "achievement": 976100, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1530, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 825, + "level": 3, + "playCount": 1, + "achievement": 927664, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2432, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 825, + "level": 4, + "playCount": 2, + "achievement": 936849, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2515, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 829, + "level": 3, + "playCount": 1, + "achievement": 964421, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2203, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 833, + "level": 1, + "playCount": 1, + "achievement": 932221, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1017, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 833, + "level": 2, + "playCount": 13, + "achievement": 973606, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1909, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 833, + "level": 3, + "playCount": 6, + "achievement": 980284, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2557, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 833, + "level": 4, + "playCount": 5, + "achievement": 951838, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2394, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 834, + "level": 1, + "playCount": 4, + "achievement": 972972, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1261, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 834, + "level": 2, + "playCount": 26, + "achievement": 1002346, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2232, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 834, + "level": 3, + "playCount": 3, + "achievement": 955068, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2918, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 834, + "level": 4, + "playCount": 4, + "achievement": 946221, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2933, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 835, + "level": 3, + "playCount": 1, + "achievement": 984642, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1176, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 836, + "level": 2, + "playCount": 4, + "achievement": 999275, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1603, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 836, + "level": 3, + "playCount": 1, + "achievement": 981363, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2203, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 837, + "level": 2, + "playCount": 2, + "achievement": 997888, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1021, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 837, + "level": 3, + "playCount": 6, + "achievement": 1000189, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1270, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 838, + "level": 2, + "playCount": 2, + "achievement": 993241, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1448, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 838, + "level": 3, + "playCount": 1, + "achievement": 965497, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1594, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 840, + "level": 3, + "playCount": 4, + "achievement": 995934, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2643, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 841, + "level": 2, + "playCount": 4, + "achievement": 996094, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1326, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 841, + "level": 3, + "playCount": 8, + "achievement": 1007823, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1911, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 844, + "level": 2, + "playCount": 7, + "achievement": 1001275, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1439, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 844, + "level": 3, + "playCount": 13, + "achievement": 970339, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2209, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 850, + "level": 2, + "playCount": 1, + "achievement": 894937, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 998, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 850, + "level": 3, + "playCount": 3, + "achievement": 961304, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1983, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 852, + "level": 2, + "playCount": 9, + "achievement": 995972, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2070, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 852, + "level": 3, + "playCount": 29, + "achievement": 982966, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2754, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 853, + "level": 3, + "playCount": 1, + "achievement": 985988, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1767, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 1051, + "level": 2, + "playCount": 1, + "achievement": 992581, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1319, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 1051, + "level": 3, + "playCount": 13, + "achievement": 992719, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 2270, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 1235, + "level": 3, + "playCount": 3, + "achievement": 972450, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2685, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 1819, + "level": 3, + "playCount": 1, + "achievement": 955047, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1335, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10030, + "level": 3, + "playCount": 5, + "achievement": 1006920, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1672, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10070, + "level": 2, + "playCount": 1, + "achievement": 1004850, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1158, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10070, + "level": 3, + "playCount": 3, + "achievement": 951481, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2282, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10146, + "level": 2, + "playCount": 3, + "achievement": 1002378, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1036, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10146, + "level": 3, + "playCount": 1, + "achievement": 975264, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1525, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10185, + "level": 3, + "playCount": 2, + "achievement": 975537, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1363, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10193, + "level": 3, + "playCount": 1, + "achievement": 991330, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1981, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10288, + "level": 2, + "playCount": 2, + "achievement": 947803, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 779, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10288, + "level": 3, + "playCount": 2, + "achievement": 1005400, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1904, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10301, + "level": 3, + "playCount": 2, + "achievement": 1002308, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1899, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10302, + "level": 3, + "playCount": 1, + "achievement": 1005829, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1896, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10319, + "level": 3, + "playCount": 1, + "achievement": 990897, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1866, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10363, + "level": 2, + "playCount": 7, + "achievement": 986537, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1507, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10363, + "level": 3, + "playCount": 24, + "achievement": 1005328, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2814, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10411, + "level": 2, + "playCount": 1, + "achievement": 1001138, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1682, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10411, + "level": 3, + "playCount": 4, + "achievement": 973408, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2501, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10536, + "level": 2, + "playCount": 1, + "achievement": 1008001, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 755, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10572, + "level": 3, + "playCount": 1, + "achievement": 975114, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2464, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10574, + "level": 3, + "playCount": 1, + "achievement": 993075, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2104, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10593, + "level": 2, + "playCount": 2, + "achievement": 982244, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1429, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10593, + "level": 3, + "playCount": 2, + "achievement": 991087, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2388, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10641, + "level": 2, + "playCount": 2, + "achievement": 990772, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1468, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10641, + "level": 3, + "playCount": 15, + "achievement": 1006812, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2551, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10690, + "level": 2, + "playCount": 1, + "achievement": 1007658, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1671, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10690, + "level": 3, + "playCount": 1, + "achievement": 953166, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2064, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 10734, + "level": 2, + "playCount": 10, + "achievement": 1001746, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1635, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11002, + "level": 4, + "playCount": 3, + "achievement": 982464, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2322, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11003, + "level": 2, + "playCount": 4, + "achievement": 1001101, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1561, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11003, + "level": 3, + "playCount": 25, + "achievement": 1006214, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2160, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11004, + "level": 2, + "playCount": 4, + "achievement": 967918, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1596, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11004, + "level": 3, + "playCount": 2, + "achievement": 988734, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2457, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11004, + "level": 4, + "playCount": 2, + "achievement": 959541, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2406, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11007, + "level": 2, + "playCount": 2, + "achievement": 1003522, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1712, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11007, + "level": 3, + "playCount": 14, + "achievement": 995035, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2588, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11007, + "level": 4, + "playCount": 19, + "achievement": 1005868, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2898, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11008, + "level": 3, + "playCount": 2, + "achievement": 1008596, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 2510, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11009, + "level": 3, + "playCount": 1, + "achievement": 800105, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 614, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11010, + "level": 2, + "playCount": 1, + "achievement": 1002173, + "comboStatus": 2, + "syncStatus": 1, + "deluxscoreMax": 999, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11010, + "level": 3, + "playCount": 2, + "achievement": 1005539, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 1457, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11015, + "level": 4, + "playCount": 1, + "achievement": 985565, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2372, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11020, + "level": 3, + "playCount": 1, + "achievement": 976355, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2140, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11021, + "level": 3, + "playCount": 1, + "achievement": 994352, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1789, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11023, + "level": 3, + "playCount": 1, + "achievement": 995238, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2742, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11023, + "level": 4, + "playCount": 1, + "achievement": 959069, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2383, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11026, + "level": 2, + "playCount": 1, + "achievement": 973456, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1578, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11026, + "level": 3, + "playCount": 3, + "achievement": 968186, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2694, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11027, + "level": 2, + "playCount": 1, + "achievement": 985247, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1949, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11028, + "level": 2, + "playCount": 1, + "achievement": 983942, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1539, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11028, + "level": 3, + "playCount": 2, + "achievement": 985393, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2413, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11029, + "level": 2, + "playCount": 2, + "achievement": 975290, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1742, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11029, + "level": 3, + "playCount": 1, + "achievement": 946527, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2380, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11032, + "level": 3, + "playCount": 1, + "achievement": 962600, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1919, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11034, + "level": 2, + "playCount": 1, + "achievement": 956439, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1025, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11037, + "level": 2, + "playCount": 1, + "achievement": 1007106, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 870, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11048, + "level": 2, + "playCount": 1, + "achievement": 985482, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1313, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11049, + "level": 3, + "playCount": 2, + "achievement": 964714, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1763, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11051, + "level": 2, + "playCount": 4, + "achievement": 995483, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1139, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11051, + "level": 3, + "playCount": 3, + "achievement": 987323, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1522, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11069, + "level": 2, + "playCount": 2, + "achievement": 994473, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1287, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11069, + "level": 3, + "playCount": 4, + "achievement": 1006350, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1949, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11075, + "level": 2, + "playCount": 1, + "achievement": 997766, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1535, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11083, + "level": 2, + "playCount": 1, + "achievement": 988560, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 1294, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11085, + "level": 2, + "playCount": 2, + "achievement": 995882, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1633, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11085, + "level": 3, + "playCount": 1, + "achievement": 988496, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2586, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11089, + "level": 2, + "playCount": 1, + "achievement": 973733, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1690, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11089, + "level": 3, + "playCount": 2, + "achievement": 967169, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2512, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11094, + "level": 2, + "playCount": 2, + "achievement": 1001886, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1239, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11094, + "level": 3, + "playCount": 37, + "achievement": 1007901, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1741, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11095, + "level": 3, + "playCount": 1, + "achievement": 996975, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2030, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11096, + "level": 3, + "playCount": 3, + "achievement": 978855, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2307, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11097, + "level": 3, + "playCount": 1, + "achievement": 800053, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1052, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11098, + "level": 3, + "playCount": 1, + "achievement": 800105, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 680, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11099, + "level": 3, + "playCount": 1, + "achievement": 800016, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 633, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11100, + "level": 3, + "playCount": 1, + "achievement": 800021, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 562, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11102, + "level": 2, + "playCount": 2, + "achievement": 974541, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1437, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11102, + "level": 3, + "playCount": 2, + "achievement": 945327, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2498, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11103, + "level": 3, + "playCount": 1, + "achievement": 975833, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 3061, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11106, + "level": 2, + "playCount": 10, + "achievement": 993333, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2131, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11106, + "level": 3, + "playCount": 6, + "achievement": 957668, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2831, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11113, + "level": 2, + "playCount": 1, + "achievement": 82719, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 54, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11115, + "level": 3, + "playCount": 1, + "achievement": 996975, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1746, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11121, + "level": 3, + "playCount": 1, + "achievement": 959443, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1968, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11136, + "level": 2, + "playCount": 1, + "achievement": 996763, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1208, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11139, + "level": 2, + "playCount": 1, + "achievement": 1002019, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1161, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11140, + "level": 2, + "playCount": 1, + "achievement": 1008077, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1507, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11141, + "level": 2, + "playCount": 3, + "achievement": 996708, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1544, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11141, + "level": 3, + "playCount": 3, + "achievement": 996285, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2403, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11142, + "level": 2, + "playCount": 6, + "achievement": 963426, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1276, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11143, + "level": 3, + "playCount": 1, + "achievement": 937813, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1912, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11152, + "level": 2, + "playCount": 2, + "achievement": 1008180, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1553, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11152, + "level": 3, + "playCount": 17, + "achievement": 1007738, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2154, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11152, + "level": 4, + "playCount": 20, + "achievement": 1005360, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2044, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11158, + "level": 3, + "playCount": 2, + "achievement": 987846, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2033, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11159, + "level": 3, + "playCount": 1, + "achievement": 1001084, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2168, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11160, + "level": 3, + "playCount": 2, + "achievement": 987021, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2517, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11161, + "level": 3, + "playCount": 1, + "achievement": 800001, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 778, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11162, + "level": 3, + "playCount": 1, + "achievement": 800076, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 723, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11163, + "level": 3, + "playCount": 1, + "achievement": 799950, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 794, + "scoreRank": 4, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11164, + "level": 3, + "playCount": 2, + "achievement": 995472, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2505, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11165, + "level": 3, + "playCount": 1, + "achievement": 927783, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2246, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11166, + "level": 3, + "playCount": 8, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11175, + "level": 3, + "playCount": 1, + "achievement": 994207, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3453, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11176, + "level": 2, + "playCount": 1, + "achievement": 978014, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2032, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11176, + "level": 3, + "playCount": 1, + "achievement": 992704, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2987, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11177, + "level": 4, + "playCount": 1, + "achievement": 996021, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2578, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11184, + "level": 2, + "playCount": 2, + "achievement": 1007508, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 1003, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11184, + "level": 4, + "playCount": 5, + "achievement": 995024, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1788, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11187, + "level": 2, + "playCount": 1, + "achievement": 1005378, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1050, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11187, + "level": 3, + "playCount": 2, + "achievement": 988823, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1674, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11187, + "level": 4, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11197, + "level": 2, + "playCount": 1, + "achievement": 1002276, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1007, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11197, + "level": 3, + "playCount": 1, + "achievement": 990660, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1415, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11198, + "level": 2, + "playCount": 1, + "achievement": 988358, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1287, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11204, + "level": 3, + "playCount": 1, + "achievement": 994519, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2359, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11205, + "level": 2, + "playCount": 1, + "achievement": 977859, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1332, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11206, + "level": 2, + "playCount": 4, + "achievement": 978384, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1880, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11206, + "level": 3, + "playCount": 4, + "achievement": 975251, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3004, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11207, + "level": 3, + "playCount": 1, + "achievement": 985663, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2194, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11208, + "level": 2, + "playCount": 4, + "achievement": 982475, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1466, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11208, + "level": 3, + "playCount": 5, + "achievement": 994775, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2447, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11209, + "level": 2, + "playCount": 14, + "achievement": 997689, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1840, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11209, + "level": 3, + "playCount": 23, + "achievement": 1000552, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2651, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11210, + "level": 2, + "playCount": 4, + "achievement": 1001009, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1307, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11210, + "level": 3, + "playCount": 1, + "achievement": 983406, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2134, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11212, + "level": 1, + "playCount": 1, + "achievement": 950233, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 596, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11212, + "level": 2, + "playCount": 3, + "achievement": 985439, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1226, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11212, + "level": 3, + "playCount": 2, + "achievement": 993324, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2248, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11213, + "level": 2, + "playCount": 1, + "achievement": 1003385, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1424, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11213, + "level": 3, + "playCount": 1, + "achievement": 992591, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2078, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11215, + "level": 3, + "playCount": 1, + "achievement": 972932, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2942, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11216, + "level": 3, + "playCount": 4, + "achievement": 990709, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2809, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11221, + "level": 2, + "playCount": 1, + "achievement": 1007579, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1942, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11221, + "level": 3, + "playCount": 4, + "achievement": 994032, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2869, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11222, + "level": 2, + "playCount": 1, + "achievement": 958879, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1734, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11222, + "level": 3, + "playCount": 10, + "achievement": 996834, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2824, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11223, + "level": 2, + "playCount": 1, + "achievement": 990712, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1981, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11223, + "level": 3, + "playCount": 2, + "achievement": 968592, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2844, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11224, + "level": 3, + "playCount": 4, + "achievement": 1000564, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2085, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11228, + "level": 3, + "playCount": 1, + "achievement": 800106, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 736, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11228, + "level": 4, + "playCount": 1, + "achievement": 971059, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2046, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11229, + "level": 3, + "playCount": 1, + "achievement": 800057, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 540, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11230, + "level": 3, + "playCount": 1, + "achievement": 800023, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1168, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11231, + "level": 3, + "playCount": 5, + "achievement": 1005447, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2274, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11232, + "level": 3, + "playCount": 8, + "achievement": 1005028, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2039, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11232, + "level": 4, + "playCount": 6, + "achievement": 1007261, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2086, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11233, + "level": 2, + "playCount": 1, + "achievement": 1003290, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 1347, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11234, + "level": 3, + "playCount": 1, + "achievement": 980396, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2928, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11236, + "level": 2, + "playCount": 1, + "achievement": 963997, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 606, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11236, + "level": 3, + "playCount": 2, + "achievement": 973252, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1094, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11237, + "level": 3, + "playCount": 2, + "achievement": 989258, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2248, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11238, + "level": 3, + "playCount": 2, + "achievement": 974716, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2227, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11239, + "level": 2, + "playCount": 1, + "achievement": 992287, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1252, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11241, + "level": 2, + "playCount": 1, + "achievement": 983635, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1510, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11241, + "level": 4, + "playCount": 1, + "achievement": 983969, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2695, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11248, + "level": 3, + "playCount": 2, + "achievement": 981182, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3098, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11249, + "level": 3, + "playCount": 1, + "achievement": 1002174, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2665, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11253, + "level": 2, + "playCount": 1, + "achievement": 1008144, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1222, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11255, + "level": 3, + "playCount": 1, + "achievement": 980617, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 824, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11263, + "level": 2, + "playCount": 1, + "achievement": 998090, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1337, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11263, + "level": 3, + "playCount": 12, + "achievement": 999992, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2073, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11265, + "level": 3, + "playCount": 1, + "achievement": 929216, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1444, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11270, + "level": 2, + "playCount": 1, + "achievement": 1002801, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1253, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11271, + "level": 3, + "playCount": 1, + "achievement": 976074, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1560, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11272, + "level": 3, + "playCount": 1, + "achievement": 920239, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1200, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11273, + "level": 2, + "playCount": 1, + "achievement": 874113, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 945, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11281, + "level": 2, + "playCount": 6, + "achievement": 993655, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1608, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11281, + "level": 3, + "playCount": 4, + "achievement": 985810, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2815, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11282, + "level": 2, + "playCount": 8, + "achievement": 1003378, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 959, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11282, + "level": 3, + "playCount": 18, + "achievement": 1003426, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1827, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11283, + "level": 2, + "playCount": 1, + "achievement": 917209, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1563, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11284, + "level": 3, + "playCount": 1, + "achievement": 976850, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2401, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11286, + "level": 2, + "playCount": 1, + "achievement": 991602, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1383, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11289, + "level": 2, + "playCount": 1, + "achievement": 994340, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1375, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11292, + "level": 3, + "playCount": 1, + "achievement": 988843, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2468, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11293, + "level": 3, + "playCount": 1, + "achievement": 991227, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1580, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11294, + "level": 0, + "playCount": 1, + "achievement": 42771, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 10, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11295, + "level": 3, + "playCount": 1, + "achievement": 927859, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2893, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11296, + "level": 3, + "playCount": 2, + "achievement": 997160, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2490, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11297, + "level": 3, + "playCount": 1, + "achievement": 993835, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1963, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11298, + "level": 2, + "playCount": 1, + "achievement": 984982, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 1158, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11299, + "level": 2, + "playCount": 1, + "achievement": 976686, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1380, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11299, + "level": 3, + "playCount": 19, + "achievement": 1005722, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2299, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11300, + "level": 2, + "playCount": 1, + "achievement": 1008266, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1950, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11300, + "level": 3, + "playCount": 2, + "achievement": 964436, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2403, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11302, + "level": 2, + "playCount": 1, + "achievement": 980245, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1493, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11302, + "level": 3, + "playCount": 3, + "achievement": 982204, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2387, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11303, + "level": 2, + "playCount": 1, + "achievement": 1001252, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1350, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11304, + "level": 3, + "playCount": 1, + "achievement": 994988, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2173, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11306, + "level": 2, + "playCount": 1, + "achievement": 977945, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1504, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11306, + "level": 3, + "playCount": 4, + "achievement": 980102, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2268, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11307, + "level": 3, + "playCount": 2, + "achievement": 953445, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2225, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11308, + "level": 2, + "playCount": 1, + "achievement": 974078, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1582, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11308, + "level": 3, + "playCount": 1, + "achievement": 993259, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2335, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11309, + "level": 3, + "playCount": 1, + "achievement": 978148, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1878, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11310, + "level": 3, + "playCount": 5, + "achievement": 986880, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2230, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11311, + "level": 2, + "playCount": 8, + "achievement": 1002698, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1929, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11311, + "level": 3, + "playCount": 9, + "achievement": 973257, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2558, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11312, + "level": 3, + "playCount": 1, + "achievement": 986631, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2601, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11314, + "level": 3, + "playCount": 1, + "achievement": 955194, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1740, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11315, + "level": 3, + "playCount": 3, + "achievement": 975543, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2508, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11318, + "level": 2, + "playCount": 1, + "achievement": 985763, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1904, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11319, + "level": 2, + "playCount": 5, + "achievement": 988141, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1901, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11319, + "level": 3, + "playCount": 13, + "achievement": 995841, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2901, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11325, + "level": 2, + "playCount": 1, + "achievement": 944523, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 877, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11328, + "level": 2, + "playCount": 1, + "achievement": 988458, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1979, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11328, + "level": 3, + "playCount": 17, + "achievement": 1005210, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3290, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11330, + "level": 2, + "playCount": 2, + "achievement": 977654, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1471, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11330, + "level": 3, + "playCount": 3, + "achievement": 970098, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2364, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11331, + "level": 3, + "playCount": 8, + "achievement": 1005958, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2769, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11333, + "level": 2, + "playCount": 3, + "achievement": 974049, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1452, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11333, + "level": 4, + "playCount": 24, + "achievement": 996732, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 3002, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11334, + "level": 2, + "playCount": 2, + "achievement": 960285, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1356, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11335, + "level": 2, + "playCount": 1, + "achievement": 1001330, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1160, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11335, + "level": 3, + "playCount": 3, + "achievement": 976412, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1800, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11336, + "level": 3, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11343, + "level": 3, + "playCount": 4, + "achievement": 1005831, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2677, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11343, + "level": 4, + "playCount": 23, + "achievement": 1002872, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3015, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11344, + "level": 2, + "playCount": 1, + "achievement": 1003996, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1550, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11349, + "level": 3, + "playCount": 3, + "achievement": 996645, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2049, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11350, + "level": 3, + "playCount": 1, + "achievement": 968244, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1600, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11353, + "level": 2, + "playCount": 1, + "achievement": 996790, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1337, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11353, + "level": 3, + "playCount": 5, + "achievement": 983250, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1737, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11354, + "level": 2, + "playCount": 1, + "achievement": 949494, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 973, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11354, + "level": 3, + "playCount": 2, + "achievement": 1003288, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1748, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11355, + "level": 3, + "playCount": 30, + "achievement": 1005889, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2084, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11358, + "level": 2, + "playCount": 5, + "achievement": 1008577, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1208, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11358, + "level": 3, + "playCount": 9, + "achievement": 999547, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1879, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11363, + "level": 3, + "playCount": 16, + "achievement": 1006399, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2505, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11364, + "level": 2, + "playCount": 6, + "achievement": 991079, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1799, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11365, + "level": 3, + "playCount": 3, + "achievement": 1004175, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2434, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11369, + "level": 2, + "playCount": 1, + "achievement": 997516, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1507, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11371, + "level": 3, + "playCount": 1, + "achievement": 996089, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1342, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11374, + "level": 2, + "playCount": 1, + "achievement": 995758, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1589, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11374, + "level": 3, + "playCount": 18, + "achievement": 993904, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2919, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11375, + "level": 2, + "playCount": 1, + "achievement": 1003610, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1706, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11376, + "level": 2, + "playCount": 1, + "achievement": 1009111, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 1243, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11376, + "level": 3, + "playCount": 1, + "achievement": 999340, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1952, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11377, + "level": 3, + "playCount": 10, + "achievement": 1002986, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2553, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11378, + "level": 2, + "playCount": 1, + "achievement": 1006440, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 2070, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11378, + "level": 3, + "playCount": 2, + "achievement": 977918, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2621, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11379, + "level": 2, + "playCount": 8, + "achievement": 989826, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1860, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11379, + "level": 3, + "playCount": 4, + "achievement": 948724, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2217, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11381, + "level": 3, + "playCount": 1, + "achievement": 994820, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1724, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11382, + "level": 3, + "playCount": 1, + "achievement": 942063, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2375, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11383, + "level": 3, + "playCount": 3, + "achievement": 1002446, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 2097, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11384, + "level": 2, + "playCount": 1, + "achievement": 987314, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1348, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11385, + "level": 3, + "playCount": 1, + "achievement": 932305, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1710, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11386, + "level": 2, + "playCount": 1, + "achievement": 1003717, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1566, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11386, + "level": 3, + "playCount": 3, + "achievement": 988098, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2214, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11387, + "level": 3, + "playCount": 1, + "achievement": 991777, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2431, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11388, + "level": 2, + "playCount": 1, + "achievement": 974070, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1245, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11388, + "level": 3, + "playCount": 3, + "achievement": 945927, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2267, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11389, + "level": 2, + "playCount": 1, + "achievement": 996778, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1630, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11389, + "level": 3, + "playCount": 3, + "achievement": 975231, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2472, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11390, + "level": 2, + "playCount": 2, + "achievement": 988819, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1386, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11390, + "level": 3, + "playCount": 24, + "achievement": 1005337, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2405, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11391, + "level": 2, + "playCount": 1, + "achievement": 1002210, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1942, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11391, + "level": 3, + "playCount": 6, + "achievement": 971875, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2744, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11392, + "level": 2, + "playCount": 1, + "achievement": 997181, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1385, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11394, + "level": 2, + "playCount": 6, + "achievement": 1004774, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1986, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11394, + "level": 3, + "playCount": 5, + "achievement": 954165, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2910, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11395, + "level": 2, + "playCount": 1, + "achievement": 975940, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1445, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11395, + "level": 3, + "playCount": 2, + "achievement": 990854, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2372, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11398, + "level": 2, + "playCount": 8, + "achievement": 1004274, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1659, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11398, + "level": 3, + "playCount": 30, + "achievement": 995480, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2288, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11400, + "level": 2, + "playCount": 1, + "achievement": 999478, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1736, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11400, + "level": 3, + "playCount": 2, + "achievement": 998774, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2588, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11401, + "level": 3, + "playCount": 1, + "achievement": 909725, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2077, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11405, + "level": 3, + "playCount": 4, + "achievement": 967977, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2567, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11407, + "level": 1, + "playCount": 2, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11410, + "level": 2, + "playCount": 2, + "achievement": 1005654, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1574, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11410, + "level": 3, + "playCount": 3, + "achievement": 994972, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1647, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11410, + "level": 4, + "playCount": 8, + "achievement": 1005257, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2020, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11411, + "level": 2, + "playCount": 1, + "achievement": 1001412, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1486, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11412, + "level": 2, + "playCount": 3, + "achievement": 960460, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1611, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11412, + "level": 3, + "playCount": 1, + "achievement": 979620, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2506, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11413, + "level": 2, + "playCount": 15, + "achievement": 999204, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2104, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11413, + "level": 3, + "playCount": 28, + "achievement": 1005077, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2653, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11418, + "level": 2, + "playCount": 5, + "achievement": 989587, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 951, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11418, + "level": 3, + "playCount": 25, + "achievement": 1005370, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1565, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11419, + "level": 3, + "playCount": 1, + "achievement": 950767, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1138, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11422, + "level": 3, + "playCount": 2, + "achievement": 1002687, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1682, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11423, + "level": 2, + "playCount": 1, + "achievement": 984808, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1278, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11423, + "level": 3, + "playCount": 2, + "achievement": 963713, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2126, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11424, + "level": 2, + "playCount": 1, + "achievement": 977771, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1090, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11424, + "level": 3, + "playCount": 2, + "achievement": 996259, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1668, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11426, + "level": 3, + "playCount": 1, + "achievement": 966250, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3022, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11429, + "level": 2, + "playCount": 2, + "achievement": 974874, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1987, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11429, + "level": 3, + "playCount": 2, + "achievement": 937986, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2690, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11430, + "level": 2, + "playCount": 1, + "achievement": 957711, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1217, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11432, + "level": 2, + "playCount": 1, + "achievement": 1000964, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1127, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11433, + "level": 3, + "playCount": 2, + "achievement": 1004808, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2185, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11435, + "level": 3, + "playCount": 1, + "achievement": 1002033, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2095, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11437, + "level": 2, + "playCount": 1, + "achievement": 1005631, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1344, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11437, + "level": 3, + "playCount": 9, + "achievement": 1006223, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 2225, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11438, + "level": 2, + "playCount": 1, + "achievement": 1005703, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1756, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11438, + "level": 3, + "playCount": 2, + "achievement": 992545, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2604, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11441, + "level": 2, + "playCount": 1, + "achievement": 1003120, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1325, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11443, + "level": 3, + "playCount": 1, + "achievement": 937172, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1861, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11446, + "level": 3, + "playCount": 1, + "achievement": 965537, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2544, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11447, + "level": 3, + "playCount": 21, + "achievement": 1006728, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 1877, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11451, + "level": 3, + "playCount": 1, + "achievement": 917854, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1245, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11452, + "level": 3, + "playCount": 1, + "achievement": 1005834, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2367, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11453, + "level": 3, + "playCount": 5, + "achievement": 1005558, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2501, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11454, + "level": 3, + "playCount": 13, + "achievement": 1006321, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2500, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11455, + "level": 2, + "playCount": 1, + "achievement": 999959, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1711, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11455, + "level": 3, + "playCount": 5, + "achievement": 1001633, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2680, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11456, + "level": 3, + "playCount": 1, + "achievement": 985083, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2738, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11457, + "level": 2, + "playCount": 1, + "achievement": 1002301, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1967, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11457, + "level": 3, + "playCount": 4, + "achievement": 980518, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2880, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11458, + "level": 2, + "playCount": 1, + "achievement": 998342, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1761, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11459, + "level": 3, + "playCount": 1, + "achievement": 992956, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1767, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11460, + "level": 3, + "playCount": 1, + "achievement": 983541, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1740, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11461, + "level": 3, + "playCount": 2, + "achievement": 976097, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2388, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11463, + "level": 3, + "playCount": 1, + "achievement": 800189, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 603, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11464, + "level": 3, + "playCount": 1, + "achievement": 800100, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 647, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11465, + "level": 3, + "playCount": 1, + "achievement": 800019, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 726, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11466, + "level": 3, + "playCount": 11, + "achievement": 1005871, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2631, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11467, + "level": 3, + "playCount": 1, + "achievement": 983058, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1896, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11469, + "level": 3, + "playCount": 1, + "achievement": 983064, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2359, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11470, + "level": 2, + "playCount": 1, + "achievement": 989374, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1833, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11470, + "level": 3, + "playCount": 3, + "achievement": 964580, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2663, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11471, + "level": 2, + "playCount": 4, + "achievement": 995700, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1793, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11471, + "level": 3, + "playCount": 10, + "achievement": 988857, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2718, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11472, + "level": 2, + "playCount": 6, + "achievement": 980206, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1872, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11472, + "level": 3, + "playCount": 13, + "achievement": 1006509, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2947, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11475, + "level": 2, + "playCount": 1, + "achievement": 1008094, + "comboStatus": 2, + "syncStatus": 1, + "deluxscoreMax": 1760, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11475, + "level": 3, + "playCount": 8, + "achievement": 996141, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2749, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11477, + "level": 3, + "playCount": 1, + "achievement": 987041, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2182, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11479, + "level": 3, + "playCount": 22, + "achievement": 999416, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2703, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11481, + "level": 2, + "playCount": 2, + "achievement": 990531, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1758, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11481, + "level": 3, + "playCount": 4, + "achievement": 1001832, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 2587, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11482, + "level": 2, + "playCount": 1, + "achievement": 999577, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1576, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11482, + "level": 3, + "playCount": 1, + "achievement": 1001572, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2347, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11483, + "level": 4, + "playCount": 1, + "achievement": 962237, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2085, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11484, + "level": 3, + "playCount": 1, + "achievement": 983042, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2335, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11485, + "level": 4, + "playCount": 16, + "achievement": 1007923, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2083, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11488, + "level": 2, + "playCount": 2, + "achievement": 1004699, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 825, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11488, + "level": 3, + "playCount": 19, + "achievement": 1005874, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1944, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11489, + "level": 3, + "playCount": 1, + "achievement": 959537, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2207, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11490, + "level": 2, + "playCount": 2, + "achievement": 991050, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1228, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11491, + "level": 2, + "playCount": 7, + "achievement": 1005434, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1824, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11491, + "level": 3, + "playCount": 34, + "achievement": 1005245, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2235, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11492, + "level": 3, + "playCount": 1, + "achievement": 1006309, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1035, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11496, + "level": 3, + "playCount": 1, + "achievement": 992517, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2491, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11497, + "level": 2, + "playCount": 1, + "achievement": 1004426, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1128, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11498, + "level": 3, + "playCount": 1, + "achievement": 962679, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2082, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11499, + "level": 2, + "playCount": 1, + "achievement": 1006682, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1528, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11499, + "level": 3, + "playCount": 4, + "achievement": 970752, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2147, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11502, + "level": 2, + "playCount": 1, + "achievement": 989362, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1266, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11502, + "level": 3, + "playCount": 1, + "achievement": 971439, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1616, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11503, + "level": 2, + "playCount": 1, + "achievement": 1005137, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1599, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11503, + "level": 3, + "playCount": 2, + "achievement": 952028, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2374, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11504, + "level": 3, + "playCount": 1, + "achievement": 977809, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 678, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11505, + "level": 3, + "playCount": 3, + "achievement": 993304, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2880, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11509, + "level": 3, + "playCount": 5, + "achievement": 998391, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2152, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11512, + "level": 2, + "playCount": 8, + "achievement": 1005392, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 1633, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11512, + "level": 3, + "playCount": 38, + "achievement": 1006245, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 2279, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11513, + "level": 3, + "playCount": 1, + "achievement": 1000891, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1368, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11514, + "level": 2, + "playCount": 4, + "achievement": 1006182, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1517, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11514, + "level": 3, + "playCount": 13, + "achievement": 1006617, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2451, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11516, + "level": 2, + "playCount": 9, + "achievement": 1005575, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1765, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11516, + "level": 3, + "playCount": 2, + "achievement": 991469, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2751, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11517, + "level": 2, + "playCount": 10, + "achievement": 1002080, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2081, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11517, + "level": 3, + "playCount": 6, + "achievement": 992843, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2739, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11523, + "level": 2, + "playCount": 18, + "achievement": 1005675, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1914, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11523, + "level": 3, + "playCount": 31, + "achievement": 995382, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2788, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11524, + "level": 2, + "playCount": 1, + "achievement": 997106, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1269, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11524, + "level": 3, + "playCount": 2, + "achievement": 984970, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2024, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11525, + "level": 3, + "playCount": 1, + "achievement": 983187, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2175, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11527, + "level": 2, + "playCount": 1, + "achievement": 995387, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1165, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11527, + "level": 3, + "playCount": 6, + "achievement": 1005661, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1674, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11528, + "level": 2, + "playCount": 1, + "achievement": 997856, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1577, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11529, + "level": 2, + "playCount": 1, + "achievement": 1007826, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1729, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11529, + "level": 3, + "playCount": 1, + "achievement": 985439, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2460, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11534, + "level": 3, + "playCount": 3, + "achievement": 991186, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2454, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11535, + "level": 2, + "playCount": 1, + "achievement": 997624, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1181, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11535, + "level": 3, + "playCount": 5, + "achievement": 967034, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1874, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11537, + "level": 2, + "playCount": 1, + "achievement": 979790, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1308, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11537, + "level": 3, + "playCount": 2, + "achievement": 879591, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2388, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11538, + "level": 3, + "playCount": 1, + "achievement": 799901, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 818, + "scoreRank": 4, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11539, + "level": 3, + "playCount": 3, + "achievement": 1005122, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 1744, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11540, + "level": 3, + "playCount": 2, + "achievement": 1003095, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 1559, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11541, + "level": 3, + "playCount": 3, + "achievement": 992252, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1921, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11542, + "level": 2, + "playCount": 5, + "achievement": 1006484, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1590, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11542, + "level": 3, + "playCount": 24, + "achievement": 1005308, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2515, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11543, + "level": 2, + "playCount": 1, + "achievement": 956019, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 898, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11543, + "level": 3, + "playCount": 1, + "achievement": 992173, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1803, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11544, + "level": 2, + "playCount": 6, + "achievement": 999145, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1641, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11544, + "level": 3, + "playCount": 9, + "achievement": 995578, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2402, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11545, + "level": 3, + "playCount": 2, + "achievement": 984465, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2110, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11546, + "level": 2, + "playCount": 2, + "achievement": 984081, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1392, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11546, + "level": 3, + "playCount": 3, + "achievement": 974113, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2118, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11547, + "level": 2, + "playCount": 2, + "achievement": 995436, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1866, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11548, + "level": 2, + "playCount": 1, + "achievement": 984590, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1534, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11548, + "level": 3, + "playCount": 1, + "achievement": 927684, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2333, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11549, + "level": 2, + "playCount": 1, + "achievement": 991131, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2020, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11549, + "level": 3, + "playCount": 2, + "achievement": 992081, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2960, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11550, + "level": 2, + "playCount": 3, + "achievement": 998597, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1690, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11550, + "level": 3, + "playCount": 13, + "achievement": 1004327, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2702, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11552, + "level": 2, + "playCount": 1, + "achievement": 992143, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1645, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11552, + "level": 3, + "playCount": 2, + "achievement": 991006, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2547, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11553, + "level": 2, + "playCount": 7, + "achievement": 1009512, + "comboStatus": 2, + "syncStatus": 3, + "deluxscoreMax": 1804, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11553, + "level": 3, + "playCount": 14, + "achievement": 1005144, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 2290, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11554, + "level": 1, + "playCount": 1, + "achievement": 823485, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 599, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11554, + "level": 2, + "playCount": 3, + "achievement": 988129, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1900, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11554, + "level": 3, + "playCount": 3, + "achievement": 967361, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2482, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11556, + "level": 3, + "playCount": 4, + "achievement": 999909, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2348, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11557, + "level": 2, + "playCount": 1, + "achievement": 997323, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1163, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11558, + "level": 2, + "playCount": 2, + "achievement": 955198, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 741, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11558, + "level": 3, + "playCount": 4, + "achievement": 996565, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1251, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11558, + "level": 4, + "playCount": 6, + "achievement": 991056, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1384, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11559, + "level": 2, + "playCount": 1, + "achievement": 966550, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 802, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11559, + "level": 3, + "playCount": 5, + "achievement": 988628, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1633, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11560, + "level": 2, + "playCount": 1, + "achievement": 994618, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1302, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11560, + "level": 3, + "playCount": 1, + "achievement": 991879, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1838, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11561, + "level": 4, + "playCount": 1, + "achievement": 980752, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2381, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11562, + "level": 4, + "playCount": 1, + "achievement": 985462, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1891, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11563, + "level": 2, + "playCount": 1, + "achievement": 951872, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 817, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11563, + "level": 3, + "playCount": 5, + "achievement": 1007926, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1752, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11564, + "level": 3, + "playCount": 2, + "achievement": 992037, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2265, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11565, + "level": 1, + "playCount": 1, + "achievement": 947036, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 739, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11565, + "level": 2, + "playCount": 4, + "achievement": 1001592, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1383, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11565, + "level": 3, + "playCount": 2, + "achievement": 995996, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1592, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11566, + "level": 2, + "playCount": 7, + "achievement": 1003487, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1511, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11566, + "level": 3, + "playCount": 28, + "achievement": 1007790, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2428, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11568, + "level": 2, + "playCount": 12, + "achievement": 1004448, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1456, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11568, + "level": 3, + "playCount": 36, + "achievement": 1008769, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 2245, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11571, + "level": 0, + "playCount": 1, + "achievement": 894642, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 238, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11571, + "level": 2, + "playCount": 2, + "achievement": 1005294, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1225, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11572, + "level": 3, + "playCount": 4, + "achievement": 997886, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1487, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11573, + "level": 3, + "playCount": 10, + "achievement": 1005171, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2388, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11575, + "level": 2, + "playCount": 1, + "achievement": 983887, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1559, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11575, + "level": 3, + "playCount": 16, + "achievement": 999372, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3087, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11576, + "level": 2, + "playCount": 12, + "achievement": 1005118, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 2016, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11576, + "level": 3, + "playCount": 22, + "achievement": 1004814, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 3114, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11578, + "level": 2, + "playCount": 19, + "achievement": 994866, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1682, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11578, + "level": 3, + "playCount": 16, + "achievement": 1001611, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2499, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11583, + "level": 3, + "playCount": 3, + "achievement": 1002112, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2034, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11584, + "level": 3, + "playCount": 2, + "achievement": 1001402, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2379, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11585, + "level": 3, + "playCount": 3, + "achievement": 1003694, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1620, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11590, + "level": 0, + "playCount": 3, + "achievement": 1009935, + "comboStatus": 3, + "syncStatus": 0, + "deluxscoreMax": 557, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11590, + "level": 2, + "playCount": 2, + "achievement": 1002407, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1428, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11590, + "level": 3, + "playCount": 2, + "achievement": 993280, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2140, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11591, + "level": 2, + "playCount": 9, + "achievement": 1005136, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1367, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11591, + "level": 3, + "playCount": 20, + "achievement": 1005023, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2409, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11592, + "level": 3, + "playCount": 1, + "achievement": 995320, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 809, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11593, + "level": 3, + "playCount": 1, + "achievement": 989801, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1715, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11594, + "level": 3, + "playCount": 11, + "achievement": 1002173, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2592, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11596, + "level": 2, + "playCount": 1, + "achievement": 964650, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1213, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11597, + "level": 2, + "playCount": 1, + "achievement": 981525, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 829, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11597, + "level": 3, + "playCount": 3, + "achievement": 991284, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1180, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11599, + "level": 3, + "playCount": 1, + "achievement": 1004601, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1931, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11600, + "level": 2, + "playCount": 1, + "achievement": 1007234, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1267, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11600, + "level": 3, + "playCount": 2, + "achievement": 980473, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1723, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11602, + "level": 2, + "playCount": 1, + "achievement": 996921, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1212, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11607, + "level": 2, + "playCount": 1, + "achievement": 990887, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1257, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11607, + "level": 3, + "playCount": 5, + "achievement": 993776, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2125, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11610, + "level": 3, + "playCount": 2, + "achievement": 987257, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1957, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11611, + "level": 2, + "playCount": 1, + "achievement": 871693, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1107, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11612, + "level": 2, + "playCount": 13, + "achievement": 1003414, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2109, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11612, + "level": 3, + "playCount": 16, + "achievement": 970863, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3320, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11615, + "level": 3, + "playCount": 1, + "achievement": 996600, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2091, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11617, + "level": 2, + "playCount": 1, + "achievement": 983192, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1391, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11618, + "level": 2, + "playCount": 1, + "achievement": 984569, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1863, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11618, + "level": 3, + "playCount": 1, + "achievement": 967237, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2292, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11619, + "level": 2, + "playCount": 4, + "achievement": 992334, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1512, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11619, + "level": 3, + "playCount": 1, + "achievement": 947976, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2176, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11620, + "level": 3, + "playCount": 1, + "achievement": 800097, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 886, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11621, + "level": 3, + "playCount": 1, + "achievement": 800035, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 803, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11622, + "level": 3, + "playCount": 2, + "achievement": 1004719, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1723, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11623, + "level": 3, + "playCount": 1, + "achievement": 997682, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1903, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11625, + "level": 2, + "playCount": 1, + "achievement": 1002039, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1957, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11625, + "level": 3, + "playCount": 1, + "achievement": 950871, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2449, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11626, + "level": 3, + "playCount": 6, + "achievement": 1005881, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1766, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11627, + "level": 3, + "playCount": 1, + "achievement": 833913, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2026, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11629, + "level": 2, + "playCount": 1, + "achievement": 1008744, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1498, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11629, + "level": 3, + "playCount": 1, + "achievement": 942070, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1560, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11629, + "level": 4, + "playCount": 8, + "achievement": 998506, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2631, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11630, + "level": 2, + "playCount": 1, + "achievement": 1003623, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1014, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11630, + "level": 3, + "playCount": 3, + "achievement": 975747, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1437, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11631, + "level": 2, + "playCount": 1, + "achievement": 994590, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1388, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11631, + "level": 3, + "playCount": 10, + "achievement": 1005936, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 2395, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11633, + "level": 3, + "playCount": 12, + "achievement": 1006058, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2003, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11637, + "level": 2, + "playCount": 1, + "achievement": 997711, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1631, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11637, + "level": 4, + "playCount": 5, + "achievement": 989525, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2491, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11638, + "level": 2, + "playCount": 11, + "achievement": 1005278, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1919, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11638, + "level": 3, + "playCount": 46, + "achievement": 1005699, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2821, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11639, + "level": 2, + "playCount": 1, + "achievement": 1005822, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1585, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11639, + "level": 3, + "playCount": 4, + "achievement": 1001687, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2170, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11640, + "level": 2, + "playCount": 8, + "achievement": 1002434, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1591, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11640, + "level": 3, + "playCount": 6, + "achievement": 999083, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2120, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11641, + "level": 2, + "playCount": 4, + "achievement": 1007223, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1404, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11641, + "level": 3, + "playCount": 3, + "achievement": 995143, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2016, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11642, + "level": 2, + "playCount": 3, + "achievement": 1002164, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1404, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11642, + "level": 3, + "playCount": 2, + "achievement": 979055, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2451, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11643, + "level": 2, + "playCount": 2, + "achievement": 987542, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1771, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11643, + "level": 3, + "playCount": 1, + "achievement": 972418, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2631, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11645, + "level": 2, + "playCount": 1, + "achievement": 1003578, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1221, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11645, + "level": 3, + "playCount": 26, + "achievement": 1005034, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2107, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11646, + "level": 2, + "playCount": 14, + "achievement": 1004420, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2234, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11646, + "level": 3, + "playCount": 27, + "achievement": 992031, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3241, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11647, + "level": 2, + "playCount": 1, + "achievement": 970351, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1484, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11647, + "level": 3, + "playCount": 1, + "achievement": 976301, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1961, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11648, + "level": 0, + "playCount": 2, + "achievement": 169271, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 26, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11648, + "level": 1, + "playCount": 2, + "achievement": 33584, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 6, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11648, + "level": 2, + "playCount": 5, + "achievement": 979856, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 923, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11648, + "level": 3, + "playCount": 27, + "achievement": 1006150, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2416, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11650, + "level": 2, + "playCount": 3, + "achievement": 1004128, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1323, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11650, + "level": 3, + "playCount": 28, + "achievement": 1006237, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2007, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11651, + "level": 3, + "playCount": 3, + "achievement": 1002292, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1676, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11653, + "level": 2, + "playCount": 1, + "achievement": 984377, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1366, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11655, + "level": 3, + "playCount": 3, + "achievement": 1006049, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1649, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11656, + "level": 3, + "playCount": 1, + "achievement": 983348, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2153, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11657, + "level": 3, + "playCount": 2, + "achievement": 990964, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2396, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11658, + "level": 3, + "playCount": 3, + "achievement": 1007612, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2153, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11660, + "level": 3, + "playCount": 1, + "achievement": 990072, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1826, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11661, + "level": 2, + "playCount": 17, + "achievement": 1007457, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2292, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11661, + "level": 3, + "playCount": 21, + "achievement": 994437, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3072, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11662, + "level": 2, + "playCount": 21, + "achievement": 1005309, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2376, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11662, + "level": 3, + "playCount": 8, + "achievement": 951296, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2950, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11663, + "level": 1, + "playCount": 1, + "achievement": 952339, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1122, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11663, + "level": 2, + "playCount": 37, + "achievement": 1005365, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1946, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11663, + "level": 3, + "playCount": 5, + "achievement": 985010, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2958, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11663, + "level": 4, + "playCount": 8, + "achievement": 899824, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2859, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11665, + "level": 3, + "playCount": 1, + "achievement": 999859, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1722, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11666, + "level": 3, + "playCount": 1, + "achievement": 1004853, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1371, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11668, + "level": 3, + "playCount": 4, + "achievement": 994914, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2428, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11669, + "level": 3, + "playCount": 17, + "achievement": 1006489, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2682, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11670, + "level": 3, + "playCount": 5, + "achievement": 1003943, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 2034, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11671, + "level": 3, + "playCount": 23, + "achievement": 1005695, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 2268, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11672, + "level": 2, + "playCount": 1, + "achievement": 1006406, + "comboStatus": 2, + "syncStatus": 1, + "deluxscoreMax": 1984, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11672, + "level": 3, + "playCount": 31, + "achievement": 995966, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2797, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11674, + "level": 3, + "playCount": 9, + "achievement": 1005259, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2221, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11675, + "level": 3, + "playCount": 5, + "achievement": 993925, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2671, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11676, + "level": 3, + "playCount": 3, + "achievement": 998073, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2541, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11677, + "level": 3, + "playCount": 7, + "achievement": 987739, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2844, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11678, + "level": 2, + "playCount": 1, + "achievement": 1009583, + "comboStatus": 3, + "syncStatus": 0, + "deluxscoreMax": 1923, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11678, + "level": 3, + "playCount": 6, + "achievement": 1005174, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2787, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11680, + "level": 3, + "playCount": 1, + "achievement": 998152, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2099, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11682, + "level": 3, + "playCount": 6, + "achievement": 1005661, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2169, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11684, + "level": 3, + "playCount": 4, + "achievement": 984598, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2707, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11685, + "level": 2, + "playCount": 1, + "achievement": 1003872, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1854, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11685, + "level": 3, + "playCount": 1, + "achievement": 971964, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2732, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11686, + "level": 2, + "playCount": 1, + "achievement": 998216, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1919, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11686, + "level": 3, + "playCount": 9, + "achievement": 985038, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3203, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11687, + "level": 3, + "playCount": 21, + "achievement": 998126, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2743, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11691, + "level": 3, + "playCount": 2, + "achievement": 985382, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2166, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11692, + "level": 2, + "playCount": 3, + "achievement": 1009617, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 1935, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11692, + "level": 4, + "playCount": 23, + "achievement": 1005751, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2972, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11693, + "level": 3, + "playCount": 9, + "achievement": 1006140, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2086, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11694, + "level": 2, + "playCount": 1, + "achievement": 1007868, + "comboStatus": 2, + "syncStatus": 3, + "deluxscoreMax": 1362, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11694, + "level": 3, + "playCount": 11, + "achievement": 1005433, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1570, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11695, + "level": 3, + "playCount": 2, + "achievement": 996761, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1684, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11696, + "level": 2, + "playCount": 1, + "achievement": 1007723, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1421, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11696, + "level": 4, + "playCount": 8, + "achievement": 1005779, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2117, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11697, + "level": 2, + "playCount": 1, + "achievement": 1008285, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1527, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11697, + "level": 3, + "playCount": 1, + "achievement": 992114, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1812, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11697, + "level": 4, + "playCount": 10, + "achievement": 1005590, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2523, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11698, + "level": 2, + "playCount": 1, + "achievement": 1001228, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 860, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11698, + "level": 4, + "playCount": 9, + "achievement": 1003271, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1850, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11699, + "level": 3, + "playCount": 1, + "achievement": 1001594, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2796, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11700, + "level": 1, + "playCount": 1, + "achievement": 554975, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 336, + "scoreRank": 1, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11700, + "level": 2, + "playCount": 1, + "achievement": 1007418, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1566, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11700, + "level": 3, + "playCount": 6, + "achievement": 1005144, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 2449, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11701, + "level": 3, + "playCount": 10, + "achievement": 1006420, + "comboStatus": 1, + "syncStatus": 1, + "deluxscoreMax": 2087, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11702, + "level": 3, + "playCount": 12, + "achievement": 1005773, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 2338, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11706, + "level": 3, + "playCount": 16, + "achievement": 1005144, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2270, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11707, + "level": 3, + "playCount": 2, + "achievement": 979773, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3101, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11710, + "level": 2, + "playCount": 1, + "achievement": 1002696, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1210, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11711, + "level": 3, + "playCount": 9, + "achievement": 1006174, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2027, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11712, + "level": 3, + "playCount": 2, + "achievement": 1006353, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 1249, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11713, + "level": 2, + "playCount": 1, + "achievement": 994271, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2021, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11713, + "level": 3, + "playCount": 6, + "achievement": 995426, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2920, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11714, + "level": 2, + "playCount": 1, + "achievement": 1007549, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 1318, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11714, + "level": 3, + "playCount": 6, + "achievement": 1005998, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1804, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11715, + "level": 3, + "playCount": 7, + "achievement": 1006396, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2585, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11716, + "level": 3, + "playCount": 2, + "achievement": 1006278, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2780, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11717, + "level": 3, + "playCount": 1, + "achievement": 1002757, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1461, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11720, + "level": 3, + "playCount": 2, + "achievement": 972967, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2904, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11721, + "level": 2, + "playCount": 1, + "achievement": 1003989, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1732, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11721, + "level": 3, + "playCount": 19, + "achievement": 1005440, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2248, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11722, + "level": 3, + "playCount": 2, + "achievement": 1002687, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2110, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11723, + "level": 3, + "playCount": 2, + "achievement": 995601, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2026, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11725, + "level": 3, + "playCount": 2, + "achievement": 982843, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2469, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11726, + "level": 3, + "playCount": 3, + "achievement": 1001100, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2034, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11729, + "level": 3, + "playCount": 1, + "achievement": 998001, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2193, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11730, + "level": 3, + "playCount": 5, + "achievement": 1005081, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2515, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11731, + "level": 3, + "playCount": 1, + "achievement": 993682, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1936, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11734, + "level": 2, + "playCount": 1, + "achievement": 1005721, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1163, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11734, + "level": 3, + "playCount": 11, + "achievement": 998622, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1672, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11735, + "level": 2, + "playCount": 2, + "achievement": 1003288, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 975, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11737, + "level": 3, + "playCount": 2, + "achievement": 983597, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1802, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11738, + "level": 3, + "playCount": 2, + "achievement": 997926, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2218, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11739, + "level": 2, + "playCount": 1, + "achievement": 1006138, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1795, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11739, + "level": 3, + "playCount": 17, + "achievement": 1001871, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3024, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11740, + "level": 3, + "playCount": 3, + "achievement": 999949, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2154, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11741, + "level": 2, + "playCount": 1, + "achievement": 1000048, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1840, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11741, + "level": 3, + "playCount": 23, + "achievement": 999832, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2566, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11742, + "level": 3, + "playCount": 2, + "achievement": 1006161, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1779, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11743, + "level": 3, + "playCount": 6, + "achievement": 995753, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1859, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11744, + "level": 2, + "playCount": 1, + "achievement": 1003292, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 1486, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11744, + "level": 3, + "playCount": 4, + "achievement": 972746, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2154, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11745, + "level": 2, + "playCount": 1, + "achievement": 1002942, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1994, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11745, + "level": 3, + "playCount": 5, + "achievement": 962765, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2680, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11746, + "level": 2, + "playCount": 1, + "achievement": 1003950, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1949, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11746, + "level": 3, + "playCount": 2, + "achievement": 961245, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2834, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11747, + "level": 3, + "playCount": 2, + "achievement": 1003785, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1901, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11748, + "level": 3, + "playCount": 3, + "achievement": 1002055, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2005, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11749, + "level": 3, + "playCount": 2, + "achievement": 956148, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2282, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11750, + "level": 3, + "playCount": 2, + "achievement": 990789, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2094, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11751, + "level": 3, + "playCount": 2, + "achievement": 993666, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1887, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11752, + "level": 2, + "playCount": 1, + "achievement": 1002091, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2386, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11752, + "level": 3, + "playCount": 21, + "achievement": 1001992, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3212, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11753, + "level": 2, + "playCount": 1, + "achievement": 998960, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1779, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11753, + "level": 3, + "playCount": 4, + "achievement": 941933, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2445, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11754, + "level": 3, + "playCount": 1, + "achievement": 990082, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2675, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11755, + "level": 3, + "playCount": 1, + "achievement": 988025, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2564, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11757, + "level": 3, + "playCount": 1, + "achievement": 997895, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2737, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11758, + "level": 3, + "playCount": 4, + "achievement": 1004614, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2199, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11759, + "level": 2, + "playCount": 1, + "achievement": 1007324, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 1584, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11759, + "level": 3, + "playCount": 1, + "achievement": 988379, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2059, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11761, + "level": 2, + "playCount": 1, + "achievement": 1006688, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1683, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11761, + "level": 3, + "playCount": 6, + "achievement": 1006028, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2537, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11763, + "level": 4, + "playCount": 2, + "achievement": 999643, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2353, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11767, + "level": 3, + "playCount": 1, + "achievement": 1009330, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 2157, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11769, + "level": 3, + "playCount": 4, + "achievement": 1005369, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2767, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11771, + "level": 2, + "playCount": 1, + "achievement": 1006665, + "comboStatus": 2, + "syncStatus": 3, + "deluxscoreMax": 1737, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11771, + "level": 3, + "playCount": 15, + "achievement": 1006008, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2457, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11772, + "level": 2, + "playCount": 1, + "achievement": 1004861, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1156, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11772, + "level": 3, + "playCount": 5, + "achievement": 999699, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2128, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11773, + "level": 2, + "playCount": 1, + "achievement": 990254, + "comboStatus": 1, + "syncStatus": 2, + "deluxscoreMax": 1264, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11783, + "level": 2, + "playCount": 1, + "achievement": 1008217, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1723, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11783, + "level": 3, + "playCount": 10, + "achievement": 1005233, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2325, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11784, + "level": 2, + "playCount": 1, + "achievement": 977920, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1411, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11784, + "level": 3, + "playCount": 11, + "achievement": 1006273, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2237, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11786, + "level": 2, + "playCount": 1, + "achievement": 1006723, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1122, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11786, + "level": 3, + "playCount": 1, + "achievement": 995724, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 1909, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11787, + "level": 2, + "playCount": 1, + "achievement": 1000168, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1429, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11787, + "level": 3, + "playCount": 1, + "achievement": 1003923, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2189, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11788, + "level": 2, + "playCount": 1, + "achievement": 1007745, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1514, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11788, + "level": 3, + "playCount": 2, + "achievement": 984337, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2460, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11789, + "level": 3, + "playCount": 1, + "achievement": 957307, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2476, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11792, + "level": 3, + "playCount": 2, + "achievement": 997155, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1946, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11793, + "level": 3, + "playCount": 2, + "achievement": 1006271, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2288, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11794, + "level": 3, + "playCount": 2, + "achievement": 1005224, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2408, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11795, + "level": 2, + "playCount": 1, + "achievement": 1008016, + "comboStatus": 2, + "syncStatus": 3, + "deluxscoreMax": 1476, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11796, + "level": 2, + "playCount": 1, + "achievement": 1007849, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1751, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11796, + "level": 3, + "playCount": 9, + "achievement": 1006689, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2818, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11797, + "level": 2, + "playCount": 1, + "achievement": 1006395, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1319, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11797, + "level": 3, + "playCount": 2, + "achievement": 1005637, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 2140, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11798, + "level": 3, + "playCount": 12, + "achievement": 1007078, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2246, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11799, + "level": 3, + "playCount": 1, + "achievement": 998164, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2170, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11800, + "level": 3, + "playCount": 1, + "achievement": 985660, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2642, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11804, + "level": 3, + "playCount": 1, + "achievement": 991922, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2211, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11806, + "level": 3, + "playCount": 5, + "achievement": 1005554, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2180, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11807, + "level": 3, + "playCount": 12, + "achievement": 1004409, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2290, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11808, + "level": 3, + "playCount": 2, + "achievement": 989657, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2408, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11809, + "level": 2, + "playCount": 1, + "achievement": 1006982, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1877, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11809, + "level": 3, + "playCount": 12, + "achievement": 1000563, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2771, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11810, + "level": 3, + "playCount": 1, + "achievement": 970442, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2487, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11811, + "level": 3, + "playCount": 4, + "achievement": 1006098, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2141, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11812, + "level": 3, + "playCount": 3, + "achievement": 999924, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2391, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11813, + "level": 2, + "playCount": 2, + "achievement": 1008421, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 1428, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11813, + "level": 3, + "playCount": 10, + "achievement": 1000096, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2522, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11814, + "level": 0, + "playCount": 1, + "achievement": 868134, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 443, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11814, + "level": 2, + "playCount": 1, + "achievement": 1005551, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1621, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11814, + "level": 3, + "playCount": 2, + "achievement": 959948, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2488, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11815, + "level": 3, + "playCount": 1, + "achievement": 991088, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2352, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11816, + "level": 3, + "playCount": 1, + "achievement": 987284, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1990, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11817, + "level": 3, + "playCount": 1, + "achievement": 986685, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1887, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11820, + "level": 4, + "playCount": 1, + "achievement": 926853, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 4717, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11821, + "level": 3, + "playCount": 1, + "achievement": 1001961, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 3323, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11823, + "level": 3, + "playCount": 12, + "achievement": 1005376, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2015, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11824, + "level": 3, + "playCount": 1, + "achievement": 1000310, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2375, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11828, + "level": 3, + "playCount": 1, + "achievement": 999584, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1952, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11830, + "level": 3, + "playCount": 1, + "achievement": 984517, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1527, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11831, + "level": 3, + "playCount": 1, + "achievement": 1005777, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 2010, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11832, + "level": 3, + "playCount": 9, + "achievement": 1005742, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2737, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11833, + "level": 3, + "playCount": 1, + "achievement": 1003821, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1724, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11834, + "level": 3, + "playCount": 3, + "achievement": 998344, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2168, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11835, + "level": 4, + "playCount": 4, + "achievement": 1007446, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2308, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11838, + "level": 4, + "playCount": 10, + "achievement": 1007142, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2739, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11839, + "level": 3, + "playCount": 1, + "achievement": 1007159, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 1778, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11842, + "level": 2, + "playCount": 1, + "achievement": 1007090, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 1778, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11842, + "level": 3, + "playCount": 18, + "achievement": 1006389, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2984, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11843, + "level": 3, + "playCount": 1, + "achievement": 996527, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2154, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11844, + "level": 3, + "playCount": 2, + "achievement": 1002627, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2635, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11845, + "level": 3, + "playCount": 3, + "achievement": 999772, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 1369, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11846, + "level": 3, + "playCount": 3, + "achievement": 996406, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1544, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11847, + "level": 3, + "playCount": 3, + "achievement": 1003413, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2516, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11848, + "level": 3, + "playCount": 2, + "achievement": 995346, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2779, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11849, + "level": 2, + "playCount": 1, + "achievement": 1007276, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 1050, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11849, + "level": 3, + "playCount": 2, + "achievement": 989664, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1796, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11850, + "level": 3, + "playCount": 1, + "achievement": 1004913, + "comboStatus": 1, + "syncStatus": 0, + "deluxscoreMax": 2059, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11851, + "level": 3, + "playCount": 2, + "achievement": 1006640, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 2089, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11852, + "level": 2, + "playCount": 1, + "achievement": 1008221, + "comboStatus": 2, + "syncStatus": 5, + "deluxscoreMax": 961, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11852, + "level": 3, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11853, + "level": 3, + "playCount": 2, + "achievement": 1004028, + "comboStatus": 1, + "syncStatus": 5, + "deluxscoreMax": 2473, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11854, + "level": 3, + "playCount": 4, + "achievement": 1001145, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2194, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11855, + "level": 3, + "playCount": 5, + "achievement": 1000863, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2737, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11860, + "level": 2, + "playCount": 1, + "achievement": 999725, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2029, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11860, + "level": 3, + "playCount": 3, + "achievement": 990398, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2875, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11861, + "level": 2, + "playCount": 1, + "achievement": 1006354, + "comboStatus": 2, + "syncStatus": 0, + "deluxscoreMax": 1229, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11861, + "level": 3, + "playCount": 3, + "achievement": 993751, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1709, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11862, + "level": 2, + "playCount": 1, + "achievement": 997014, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1416, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11862, + "level": 3, + "playCount": 1, + "achievement": 1001073, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2533, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11871, + "level": 3, + "playCount": 1, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11920, + "level": 3, + "playCount": 2, + "achievement": 967532, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 2256, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11944, + "level": 2, + "playCount": 1, + "achievement": 1009297, + "comboStatus": 2, + "syncStatus": 2, + "deluxscoreMax": 1511, + "scoreRank": 13, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11944, + "level": 3, + "playCount": 6, + "achievement": 1000200, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2485, + "scoreRank": 12, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11945, + "level": 3, + "playCount": 3, + "achievement": 997142, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2193, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11946, + "level": 2, + "playCount": 1, + "achievement": 999707, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1712, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 11946, + "level": 3, + "playCount": 11, + "achievement": 982775, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2774, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100018, + "level": 10, + "playCount": 1, + "achievement": 842587, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 600, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100199, + "level": 10, + "playCount": 7, + "achievement": 954567, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 687, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100220, + "level": 10, + "playCount": 4, + "achievement": 908423, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1846, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100230, + "level": 10, + "playCount": 1, + "achievement": 979213, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1996, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100327, + "level": 10, + "playCount": 2, + "achievement": 45528, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 145, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100363, + "level": 10, + "playCount": 2, + "achievement": 953654, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 706, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100508, + "level": 10, + "playCount": 2, + "achievement": 975441, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2036, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100524, + "level": 10, + "playCount": 1, + "achievement": 867743, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2500, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 100998, + "level": 10, + "playCount": 2, + "achievement": 921858, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2532, + "scoreRank": 6, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 110114, + "level": 10, + "playCount": 1, + "achievement": 895857, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3805, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 110227, + "level": 10, + "playCount": 1, + "achievement": 868781, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 1700, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 110417, + "level": 10, + "playCount": 3, + "achievement": 992491, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1714, + "scoreRank": 10, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 110553, + "level": 10, + "playCount": 2, + "achievement": 1945522, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3896, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 110647, + "level": 10, + "playCount": 2, + "achievement": 1926559, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3604, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111325, + "level": 10, + "playCount": 1, + "achievement": 1958987, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3219, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111355, + "level": 10, + "playCount": 1, + "achievement": 1751744, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2784, + "scoreRank": 5, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111429, + "level": 10, + "playCount": 1, + "achievement": 954457, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 3627, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111488, + "level": 10, + "playCount": 2, + "achievement": 1967134, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 1306, + "scoreRank": 9, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111513, + "level": 10, + "playCount": 1, + "achievement": 998198, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 748, + "scoreRank": 11, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111516, + "level": 10, + "playCount": 1, + "achievement": 304772, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 725, + "scoreRank": 0, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111597, + "level": 10, + "playCount": 2, + "achievement": 969196, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2142, + "scoreRank": 7, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111636, + "level": 10, + "playCount": 1, + "achievement": 1376109, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2318, + "scoreRank": 2, + "extNum1": 0, + "extNum2": 0 + }, + { + "musicId": 111852, + "level": 10, + "playCount": 1, + "achievement": 971630, + "comboStatus": 0, + "syncStatus": 5, + "deluxscoreMax": 2255, + "scoreRank": 8, + "extNum1": 0, + "extNum2": 0 + } + ] + }, + "userCourseList": { + "userCourseList": [ + { + "courseId": 351004, + "isLastClear": true, + "totalRestlife": 622, + "totalAchievement": 3968829, + "totalDeluxscore": 4494, + "bestAchievement": 3968829, + "bestDeluxscore": 4494, + "bestAchievementDate": "2025-01-23 20:25:54", + "bestDeluxscoreDate": "2025-01-23 20:25:54", + "playCount": 1, + "clearDate": "2025-01-23 20:25:54", + "lastPlayDate": "2025-01-23 20:25:54", + "extNum1": 0 + }, + { + "courseId": 351005, + "isLastClear": true, + "totalRestlife": 459, + "totalAchievement": 3930185, + "totalDeluxscore": 5348, + "bestAchievement": 3930185, + "bestDeluxscore": 5348, + "bestAchievementDate": "2025-01-27 18:15:45", + "bestDeluxscoreDate": "2025-01-27 18:15:45", + "playCount": 1, + "clearDate": "2025-01-27 18:15:45", + "lastPlayDate": "2025-01-27 18:15:45", + "extNum1": 0 + }, + { + "courseId": 351006, + "isLastClear": true, + "totalRestlife": 316, + "totalAchievement": 3888908, + "totalDeluxscore": 4884, + "bestAchievement": 3888908, + "bestDeluxscore": 4884, + "bestAchievementDate": "2025-01-30 14:23:04", + "bestDeluxscoreDate": "2025-01-30 14:23:04", + "playCount": 1, + "clearDate": "2025-01-30 14:23:04", + "lastPlayDate": "2025-01-30 14:23:04", + "extNum1": 0 + }, + { + "courseId": 351007, + "isLastClear": true, + "totalRestlife": 68, + "totalAchievement": 3823738, + "totalDeluxscore": 6130, + "bestAchievement": 3823738, + "bestDeluxscore": 6130, + "bestAchievementDate": "2025-02-03 15:32:58", + "bestDeluxscoreDate": "2025-02-03 15:32:58", + "playCount": 1, + "clearDate": "2025-02-03 15:32:58", + "lastPlayDate": "2025-02-03 15:32:58", + "extNum1": 0 + }, + { + "courseId": 352203, + "isLastClear": true, + "totalRestlife": 54, + "totalAchievement": 3840953, + "totalDeluxscore": 3823, + "bestAchievement": 3840953, + "bestDeluxscore": 3823, + "bestAchievementDate": "2025-01-25 16:53:59", + "bestDeluxscoreDate": "2025-01-25 16:53:59", + "playCount": 1, + "clearDate": "2025-01-25 16:53:59", + "lastPlayDate": "2025-01-25 16:53:59", + "extNum1": 0 + }, + { + "courseId": 352204, + "isLastClear": true, + "totalRestlife": 103, + "totalAchievement": 3905290, + "totalDeluxscore": 5566, + "bestAchievement": 3905290, + "bestDeluxscore": 6402, + "bestAchievementDate": "2025-03-01 17:17:41", + "bestDeluxscoreDate": "2025-02-14 20:28:21", + "playCount": 3, + "clearDate": "2025-03-01 17:17:41", + "lastPlayDate": "2025-03-01 17:17:41", + "extNum1": 0 + }, + { + "courseId": 352303, + "isLastClear": false, + "totalRestlife": 0, + "totalAchievement": 3845196, + "totalDeluxscore": 7247, + "bestAchievement": 3845196, + "bestDeluxscore": 7641, + "bestAchievementDate": "2025-05-24 15:46:02", + "bestDeluxscoreDate": "2025-05-24 16:01:37", + "playCount": 2, + "clearDate": null, + "lastPlayDate": "2025-05-24 16:01:37", + "extNum1": 0 + }, + { + "courseId": 451010, + "isLastClear": true, + "totalRestlife": 261, + "totalAchievement": 3940357, + "totalDeluxscore": 9717, + "bestAchievement": 3940357, + "bestDeluxscore": 9717, + "bestAchievementDate": "2025-07-21 21:35:31", + "bestDeluxscoreDate": "2025-07-21 21:35:31", + "playCount": 2, + "clearDate": "2025-07-21 21:35:31", + "lastPlayDate": "2025-07-21 21:35:31", + "extNum1": 0 + }, + { + "courseId": 451101, + "isLastClear": false, + "totalRestlife": 0, + "totalAchievement": 3763907, + "totalDeluxscore": 6291, + "bestAchievement": 3763907, + "bestDeluxscore": 6291, + "bestAchievementDate": "2026-02-13 23:18:20", + "bestDeluxscoreDate": "2026-02-13 23:18:20", + "playCount": 2, + "clearDate": null, + "lastPlayDate": "2026-02-13 23:18:20", + "extNum1": 0 + }, + { + "courseId": 452204, + "isLastClear": true, + "totalRestlife": 357, + "totalAchievement": 4008020, + "totalDeluxscore": 6869, + "bestAchievement": 4008020, + "bestDeluxscore": 6869, + "bestAchievementDate": "2026-06-07 16:42:25", + "bestDeluxscoreDate": "2026-06-07 16:42:25", + "playCount": 1, + "clearDate": "2026-06-07 16:42:25", + "lastPlayDate": "2026-06-07 16:42:25", + "extNum1": 0 + }, + { + "courseId": 452303, + "isLastClear": false, + "totalRestlife": 0, + "totalAchievement": 3931905, + "totalDeluxscore": 9033, + "bestAchievement": 3931905, + "bestDeluxscore": 9033, + "bestAchievementDate": "2026-02-01 10:42:20", + "bestDeluxscoreDate": "2026-02-01 10:42:20", + "playCount": 2, + "clearDate": null, + "lastPlayDate": "2026-02-01 10:42:20", + "extNum1": 0 + }, + { + "courseId": 452304, + "isLastClear": false, + "totalRestlife": 0, + "totalAchievement": 3796869, + "totalDeluxscore": 9199, + "bestAchievement": 3796869, + "bestDeluxscore": 10163, + "bestAchievementDate": "2026-02-26 22:13:44", + "bestDeluxscoreDate": "2026-05-23 00:03:11", + "playCount": 3, + "clearDate": null, + "lastPlayDate": "2026-05-23 00:03:11", + "extNum1": 0 + }, + { + "courseId": 551010, + "isLastClear": true, + "totalRestlife": 337, + "totalAchievement": 3938584, + "totalDeluxscore": 9529, + "bestAchievement": 3938584, + "bestDeluxscore": 9529, + "bestAchievementDate": "2026-06-19 23:20:09", + "bestDeluxscoreDate": "2026-06-19 23:20:09", + "playCount": 1, + "clearDate": "2026-06-19 23:20:09", + "lastPlayDate": "2026-06-19 23:20:09", + "extNum1": 0 + }, + { + "courseId": 552204, + "isLastClear": true, + "totalRestlife": 361, + "totalAchievement": 4012485, + "totalDeluxscore": 5543, + "bestAchievement": 4012485, + "bestDeluxscore": 5543, + "bestAchievementDate": "2026-07-13 18:05:02", + "bestDeluxscoreDate": "2026-07-13 18:05:02", + "playCount": 1, + "clearDate": "2026-07-13 18:05:02", + "lastPlayDate": "2026-07-13 18:05:02", + "extNum1": 0 + }, + { + "courseId": 552303, + "isLastClear": true, + "totalRestlife": 59, + "totalAchievement": 3972495, + "totalDeluxscore": 7894, + "bestAchievement": 3972495, + "bestDeluxscore": 7894, + "bestAchievementDate": "2026-07-13 18:17:48", + "bestDeluxscoreDate": "2026-07-13 18:17:48", + "playCount": 1, + "clearDate": "2026-07-13 18:17:48", + "lastPlayDate": "2026-07-13 18:17:48", + "extNum1": 0 + }, + { + "courseId": 552304, + "isLastClear": false, + "totalRestlife": 0, + "totalAchievement": 3927407, + "totalDeluxscore": 10483, + "bestAchievement": 3927407, + "bestDeluxscore": 11876, + "bestAchievementDate": "2026-10-04 18:46:03", + "bestDeluxscoreDate": "2026-08-05 17:25:04", + "playCount": 16, + "clearDate": null, + "lastPlayDate": "2026-10-04 18:46:03", + "extNum1": 0 + } + ] + }, + "userChargeList": { + "userId": 12345678, + "length": 3, + "userChargeList": [ + { + "chargeId": 2, + "stock": 0, + "purchaseDate": "2026-07-14 18:33:37", + "validDate": "2026-10-12 04:00:00", + "extNum1": 0 + }, + { + "chargeId": 3, + "stock": 0, + "purchaseDate": "2026-10-02 10:49:23", + "validDate": "2026-12-31 04:00:00", + "extNum1": 0 + }, + { + "chargeId": 5, + "stock": 0, + "purchaseDate": "2026-10-04 18:22:10", + "validDate": "2027-01-02 04:00:00", + "extNum1": 0 + } + ] + }, + "userFavoriteList": { + "userFavoriteList": [ + { + "itemKind": 3, + "itemIdList": [ + 559501 + ] + }, + { + "itemKind": 1, + "itemIdList": [] + }, + { + "itemKind": 2, + "itemIdList": [] + }, + { + "itemKind": 10, + "itemIdList": [] + }, + { + "itemKind": 11, + "itemIdList": [] + } + ], + "_raw": [ + { + "itemKind": 3, + "itemIdList": [ + 559501 + ] + }, + { + "itemKind": 1, + "itemIdList": [] + }, + { + "itemKind": 2, + "itemIdList": [] + }, + { + "itemKind": null, + "itemIdList": [] + }, + { + "itemKind": 11, + "itemIdList": [] + } + ] + }, + "_raw_favorite": [ + { + "itemKind": 3, + "itemIdList": [ + 559501 + ] + }, + { + "itemKind": 1, + "itemIdList": [] + }, + { + "itemKind": 2, + "itemIdList": [] + }, + { + "itemKind": null, + "itemIdList": [] + }, + { + "itemKind": 11, + "itemIdList": [] + } + ], + "userActivityList": { + "userActivity": { + "playList": [ + { + "kind": 1, + "id": 25, + "sortNumber": 1790768552, + "param1": 11796, + "param2": 3, + "param3": 138, + "param4": 0 + }, + { + "kind": 1, + "id": 44, + "sortNumber": 1790768754, + "param1": 11741, + "param2": 3, + "param3": 147, + "param4": 0 + }, + { + "kind": 1, + "id": 10, + "sortNumber": 1790782892, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 1, + "id": 10, + "sortNumber": 1790909325, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 1, + "id": 90, + "sortNumber": 1790909345, + "param1": 550003, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 1, + "id": 24, + "sortNumber": 1790935933, + "param1": 11752, + "param2": 3, + "param3": 147, + "param4": 0 + }, + { + "kind": 1, + "id": 30, + "sortNumber": 1790936128, + "param1": 365, + "param2": 3, + "param3": 146, + "param4": 0 + }, + { + "kind": 1, + "id": 30, + "sortNumber": 1791033313, + "param1": 11842, + "param2": 3, + "param3": 141, + "param4": 0 + }, + { + "kind": 1, + "id": 25, + "sortNumber": 1791033313, + "param1": 11842, + "param2": 3, + "param3": 141, + "param4": 0 + }, + { + "kind": 1, + "id": 44, + "sortNumber": 1791035153, + "param1": 11860, + "param2": 3, + "param3": 145, + "param4": 0 + }, + { + "kind": 1, + "id": 30, + "sortNumber": 1791107781, + "param1": 11576, + "param2": 3, + "param3": 142, + "param4": 0 + }, + { + "kind": 1, + "id": 24, + "sortNumber": 1791107781, + "param1": 11576, + "param2": 3, + "param3": 142, + "param4": 0 + }, + { + "kind": 1, + "id": 44, + "sortNumber": 1791109213, + "param1": 11687, + "param2": 3, + "param3": 145, + "param4": 0 + }, + { + "kind": 1, + "id": 10, + "sortNumber": 1791109401, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 1, + "id": 10, + "sortNumber": 1791130786, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + } + ], + "musicList": [ + { + "kind": 2, + "id": 11509, + "sortNumber": 1791108736, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 11479, + "sortNumber": 1791108929, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 11544, + "sortNumber": 1791109635, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 643, + "sortNumber": 1791109808, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 11686, + "sortNumber": 1791110015, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 348, + "sortNumber": 1791110210, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 799, + "sortNumber": 1791110371, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 11687, + "sortNumber": 1791110553, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 496, + "sortNumber": 1791110744, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + }, + { + "kind": 2, + "id": 143, + "sortNumber": 1791130834, + "param1": 0, + "param2": 0, + "param3": 0, + "param4": 0 + } + ] + } + }, + "userMissionDataList": { + "userId": 12345678, + "userWeeklyData": { + "userId": 12345678, + "lastLoginWeek": "2026-09-28 04:00:00", + "beforeLoginWeek": "2026-09-21 04:00:00", + "friendBonusFlag": true + }, + "userMissionDataList": [ + { + "userId": 12345678, + "type": 0, + "difficulty": 0, + "targetGenreId": 0, + "targetGenreTableId": 0, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": true + }, + { + "userId": 12345678, + "type": 0, + "difficulty": 1, + "targetGenreId": 0, + "targetGenreTableId": 0, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": true + }, + { + "userId": 12345678, + "type": 1, + "difficulty": 0, + "targetGenreId": 0, + "targetGenreTableId": 3, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": true + }, + { + "userId": 12345678, + "type": 1, + "difficulty": 1, + "targetGenreId": 1, + "targetGenreTableId": 21, + "conditionGenreId": 1, + "conditionGenreTableId": 10, + "clearFlag": true + }, + { + "userId": 12345678, + "type": 2, + "difficulty": 0, + "targetGenreId": 0, + "targetGenreTableId": 3, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": true + }, + { + "userId": 12345678, + "type": 2, + "difficulty": 1, + "targetGenreId": 0, + "targetGenreTableId": 3, + "conditionGenreId": 0, + "conditionGenreTableId": 0, + "clearFlag": false + } + ] + }, + "userIntimateList": { + "userId": 12345678, + "length": 2, + "userIntimateList": [ + { + "partnerId": 1, + "intimateLevel": 500, + "intimateCountRewarded": 500 + }, + { + "partnerId": 21, + "intimateLevel": 20, + "intimateCountRewarded": 10 + } + ] + }, + "userFavoritemusicList": { + "userFavoriteItemList": [ + { + "orderId": 1, + "id": 11333 + }, + { + "orderId": 2, + "id": 11364 + }, + { + "orderId": 3, + "id": 11094 + }, + { + "orderId": 4, + "id": 643 + }, + { + "orderId": 5, + "id": 11661 + }, + { + "orderId": 6, + "id": 11672 + }, + { + "orderId": 7, + "id": 852 + }, + { + "orderId": 8, + "id": 379 + }, + { + "orderId": 9, + "id": 11209 + }, + { + "orderId": 10, + "id": 11479 + }, + { + "orderId": 11, + "id": 381 + }, + { + "orderId": 12, + "id": 464 + }, + { + "orderId": 13, + "id": 11523 + }, + { + "orderId": 14, + "id": 844 + }, + { + "orderId": 15, + "id": 11550 + }, + { + "orderId": 16, + "id": 11454 + }, + { + "orderId": 17, + "id": 11540 + }, + { + "orderId": 18, + "id": 11798 + }, + { + "orderId": 19, + "id": 11152 + }, + { + "orderId": 20, + "id": 11232 + }, + { + "orderId": 21, + "id": 11299 + }, + { + "orderId": 22, + "id": 11752 + }, + { + "orderId": 23, + "id": 11282 + }, + { + "orderId": 24, + "id": 11413 + }, + { + "orderId": 25, + "id": 757 + }, + { + "orderId": 26, + "id": 803 + }, + { + "orderId": 27, + "id": 11007 + } + ] + }, + "userKaleidxScopeList": { + "userId": 12345678, + "userKaleidxScopeList": [ + { + "gateId": 1, + "isGateFound": true, + "isKeyFound": true, + "isClear": true, + "totalRestlife": 0, + "totalAchievement": 3006521, + "totalDeluxscore": 5414, + "bestAchievement": 3006521, + "bestDeluxscore": 5414, + "bestAchievementDate": "2026-04-18 17:46:57", + "bestDeluxscoreDate": "2026-04-18 17:46:57", + "playCount": 1, + "clearDate": "2026-04-18 17:46:57", + "lastPlayDate": "2026-04-18 17:46:57", + "isInfoWatched": true + }, + { + "gateId": 2, + "isGateFound": true, + "isKeyFound": true, + "isClear": true, + "totalRestlife": 0, + "totalAchievement": 3008066, + "totalDeluxscore": 5198, + "bestAchievement": 3008066, + "bestDeluxscore": 5198, + "bestAchievementDate": "2026-02-27 15:34:52", + "bestDeluxscoreDate": "2026-02-27 15:34:52", + "playCount": 3, + "clearDate": "2026-02-27 15:34:52", + "lastPlayDate": "2026-03-01 18:31:16", + "isInfoWatched": true + }, + { + "gateId": 3, + "isGateFound": true, + "isKeyFound": true, + "isClear": true, + "totalRestlife": 0, + "totalAchievement": 2955049, + "totalDeluxscore": 6002, + "bestAchievement": 2955049, + "bestDeluxscore": 6002, + "bestAchievementDate": "2026-05-03 17:05:55", + "bestDeluxscoreDate": "2026-05-03 17:05:55", + "playCount": 1, + "clearDate": "2026-05-03 17:05:55", + "lastPlayDate": "2026-05-03 17:05:55", + "isInfoWatched": true + }, + { + "gateId": 4, + "isGateFound": true, + "isKeyFound": true, + "isClear": true, + "totalRestlife": 0, + "totalAchievement": 2842045, + "totalDeluxscore": 6601, + "bestAchievement": 2842045, + "bestDeluxscore": 6601, + "bestAchievementDate": "2026-05-23 20:15:40", + "bestDeluxscoreDate": "2026-05-23 20:15:40", + "playCount": 2, + "clearDate": "2026-05-23 20:15:40", + "lastPlayDate": "2026-06-04 16:07:23", + "isInfoWatched": true + }, + { + "gateId": 5, + "isGateFound": true, + "isKeyFound": true, + "isClear": true, + "totalRestlife": 0, + "totalAchievement": 3022533, + "totalDeluxscore": 5190, + "bestAchievement": 3022533, + "bestDeluxscore": 5190, + "bestAchievementDate": "2026-06-23 20:32:50", + "bestDeluxscoreDate": "2026-06-23 20:32:50", + "playCount": 2, + "clearDate": "2026-06-23 20:32:50", + "lastPlayDate": "2026-06-23 20:32:50", + "isInfoWatched": true + }, + { + "gateId": 6, + "isGateFound": true, + "isKeyFound": true, + "isClear": true, + "totalRestlife": 0, + "totalAchievement": 3023555, + "totalDeluxscore": 4957, + "bestAchievement": 3023555, + "bestDeluxscore": 4957, + "bestAchievementDate": "2026-08-19 21:39:07", + "bestDeluxscoreDate": "2026-08-19 21:39:07", + "playCount": 1, + "clearDate": "2026-08-19 21:39:07", + "lastPlayDate": "2026-08-19 21:39:07", + "isInfoWatched": true + }, + { + "gateId": 7, + "isGateFound": false, + "isKeyFound": true, + "isClear": false, + "totalRestlife": 0, + "totalAchievement": 0, + "totalDeluxscore": 0, + "bestAchievement": 0, + "bestDeluxscore": 0, + "bestAchievementDate": null, + "bestDeluxscoreDate": null, + "playCount": 0, + "clearDate": null, + "lastPlayDate": null, + "isInfoWatched": false + } + ] + }, + "userGhost": { + "length": 15, + "userGhostList": [ + { + "name": "maimai", + "iconId": 11, + "plateId": 1, + "titleId": 11, + "rate": 1302, + "udemaeRate": 0, + "courseRank": 0, + "classRank": 0, + "classValue": 0, + "playDatetime": "2026-10-05 17:25:03", + "regionCode": 23, + "shopId": 5244, + "typeId": 1, + "musicId": 11643, + "difficulty": 1, + "version": 1055005, + "resultNum": 418, + "achievement": 962974, + "resultBitList": [ + 119, + 119, + 119, + 119, + 120, + 119, + -120, + 85, + 117, + 102, + 119, + -25, + 119, + 119, + 119, + 119, + 119, + 118, + 103, + 119, + 103, + 103, + 94, + -120, + 118, + 120, + 87, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + -120, + -122, + -105, + -18, + 99, + 102, + 119, + -118, + 120, + -120, + 119, + -88, + 90, + 122, + 118, + -120, + 119, + -41, + 118, + -87, + 119, + 119, + 119, + -104, + -104, + -84, + -50, + -72, + 121, + 119, + 119, + 120, + 116, + 119, + 120, + 122, + 121, + 118, + 118, + 119, + -105, + -120, + -120, + 119, + 120, + 118, + 118, + 119, + 122, + -87, + -120, + 119, + 104, + 118, + 87, + -119, + 120, + -120, + 120, + 119, + 119, + 123, + 119, + 119, + 119, + 119, + -105, + 119, + 119, + 103, + 119, + 119, + -103, + 120, + -119, + 119, + -34, + 122, + -57, + -72, + 119, + 119, + 119, + 119, + 119, + 126, + 119, + -25, + 119, + 102, + 119, + -106, + 122, + -104, + -120, + 103, + 118, + 119, + 119, + 119, + 119, + 119, + 120, + 119, + 109, + 103, + 118, + -89, + -120, + 119, + 102, + 119, + 119, + -18, + -118, + 119, + 119, + -41, + 103, + -121, + 118, + 119, + -121, + 103, + 120, + 102, + -121, + -119, + -105, + -119, + 119, + -119, + -103, + 119, + 119, + 119, + 119, + -120, + 88, + 119, + -121, + -104, + 119, + 118, + 119, + 122, + 119, + 120, + 118, + 104, + 119, + 102, + 119, + 40, + -125, + -103, + 119, + 118, + 104, + 102, + 73, + -126, + 121, + -119, + 23, + -111, + -118, + -119, + 120, + 87, + 85, + 116, + 97, + 71, + 120 + ] + }, + { + "name": "yili", + "iconId": 458015, + "plateId": 555401, + "titleId": 5530, + "rate": 8134, + "udemaeRate": 0, + "courseRank": 3, + "classRank": 0, + "classValue": 0, + "playDatetime": "2026-10-05 17:43:39", + "regionCode": 27, + "shopId": 1866, + "typeId": 2, + "musicId": 417, + "difficulty": 2, + "version": 1055005, + "resultNum": 463, + "achievement": 955931, + "resultBitList": [ + -121, + 103, + 118, + -121, + -121, + 119, + 119, + 71, + 85, + 118, + -120, + 120, + -121, + 119, + 102, + 86, + 68, + 101, + 118, + 119, + -88, + -102, + 87, + 55, + 114, + 118, + 87, + 103, + 104, + 119, + 103, + 101, + -121, + -87, + 120, + 115, + -119, + -105, + -121, + 119, + 100, + 102, + 100, + 119, + 120, + 103, + 119, + -104, + -42, + 59, + 117, + -121, + 119, + 118, + -121, + 116, + -121, + 122, + -19, + 125, + -84, + 119, + 121, + 103, + 119, + 86, + 120, + 102, + 54, + 34, + 52, + 119, + 102, + 86, + 34, + 67, + 118, + 119, + 118, + 119, + 119, + 119, + -121, + -86, + 103, + 119, + 119, + -121, + 101, + 103, + 118, + 103, + 118, + 119, + 118, + 101, + 71, + 84, + 100, + 119, + 118, + 82, + 54, + 84, + 117, + 68, + 120, + 104, + 103, + 118, + 84, + 113, + 85, + 117, + 118, + -88, + -120, + 118, + 97, + 69, + 84, + 102, + 100, + 84, + 102, + 84, + 116, + 119, + 116, + 101, + 85, + 118, + -122, + 87, + 52, + 84, + 103, + 110, + 103, + 85, + -121, + -120, + 103, + 87, + 121, + 54, + 20, + 101, + 22, + 119, + -92, + -121, + 103, + 115, + 76, + 125, + 118, + 55, + 98, + 118, + -121, + 119, + 119, + -102, + 119, + 121, + 120, + 119, + 101, + 118, + -121, + 103, + 102, + 20, + 21, + 118, + 52, + 53, + 67, + 70, + 119, + -121, + 120, + -103, + -121, + 119, + 120, + 22, + -121, + 119, + 87, + 87, + 70, + 102, + 85, + 101, + 66, + 70, + 119, + 66, + 52, + 118, + 119, + 103, + 82, + 87, + 52, + 83, + 51, + 81, + 118, + 120, + 119, + 119, + 36, + 120, + 115, + 69, + -122, + -119, + 104, + 119, + 87, + 52, + 71, + 68, + 102, + 120, + -124, + -104, + -40, + 2 + ] + }, + { + "name": "emachan!", + "iconId": 409503, + "plateId": 550101, + "titleId": 1, + "rate": 9811, + "udemaeRate": 0, + "courseRank": 0, + "classRank": 0, + "classValue": 0, + "playDatetime": "2026-10-05 17:48:00", + "regionCode": 12, + "shopId": 1559, + "typeId": 2, + "musicId": 10536, + "difficulty": 2, + "version": 1055005, + "resultNum": 280, + "achievement": 958810, + "resultBitList": [ + -118, + 119, + 106, + 118, + 121, + 119, + 120, + 120, + 120, + 119, + 118, + 119, + 85, + 120, + 119, + 117, + -73, + -67, + 123, + -119, + 119, + 119, + -121, + 119, + 119, + 17, + 118, + -89, + 103, + 102, + 120, + -120, + -121, + -121, + 103, + 119, + 118, + 120, + 120, + 120, + 87, + 119, + -89, + -102, + -117, + -121, + 119, + 120, + 119, + 118, + 119, + -105, + 119, + 119, + 103, + 119, + -115, + 119, + -118, + 121, + 102, + 121, + -105, + 119, + 119, + 103, + 100, + 119, + 103, + 118, + -122, + 86, + 101, + 118, + 119, + 119, + -106, + 87, + 116, + 119, + -88, + -103, + 122, + 119, + 126, + 119, + -35, + -103, + -105, + -21, + 118, + 119, + -69, + 119, + 119, + 119, + 123, + -89, + 39, + 116, + -86, + -120, + -121, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + -121, + 104, + 103, + -121, + 119, + -73, + 119, + 119, + -25, + 125, + 119, + -122, + 25, + 121, + 119, + 103, + 119, + 119, + -121, + 119, + 119, + 119, + 119, + 119, + 121, + 119, + 119, + 119, + 119, + 123 + ] + }, + { + "name": "θωθ☆", + "iconId": 603, + "plateId": 555101, + "titleId": 558540, + "rate": 9764, + "udemaeRate": 0, + "courseRank": 0, + "classRank": 0, + "classValue": 0, + "playDatetime": "2026-10-05 17:20:45", + "regionCode": 14, + "shopId": 1553, + "typeId": 2, + "musicId": 11532, + "difficulty": 2, + "version": 1055005, + "resultNum": 461, + "achievement": 973650, + "resultBitList": [ + 119, + 102, + 102, + 117, + 87, + 119, + 120, + 119, + -103, + -104, + 120, + -102, + 120, + 120, + 119, + 119, + 119, + 119, + 118, + 119, + 118, + 103, + 86, + 102, + 102, + 119, + 119, + 118, + 119, + 119, + 119, + 119, + 121, + 103, + 102, + 86, + 103, + 119, + 102, + 119, + 116, + -121, + 119, + -119, + 104, + 119, + 118, + 118, + -121, + 118, + -121, + 119, + 119, + -104, + 119, + 119, + 119, + 119, + 119, + 103, + 119, + 121, + 119, + 118, + 120, + 119, + 103, + -121, + 103, + 87, + -122, + 119, + 119, + -121, + 104, + -121, + 87, + 121, + 119, + 119, + 119, + -121, + -119, + 122, + 120, + 122, + 119, + -121, + -105, + -101, + 119, + -121, + 119, + 119, + 119, + -120, + -120, + 120, + 119, + 119, + 119, + 119, + 118, + 118, + 117, + 117, + 119, + -41, + 120, + 119, + -102, + -118, + 87, + -93, + 120, + -120, + 119, + -41, + 119, + -41, + 119, + -41, + -41, + -86, + 119, + 119, + -118, + 119, + 117, + 119, + 118, + 119, + 119, + 119, + 103, + 119, + 126, + 119, + 119, + 103, + 67, + 87, + 119, + 119, + 119, + 122, + 101, + 119, + 119, + 119, + 121, + 119, + 119, + 103, + 87, + -121, + 121, + -119, + 117, + 117, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 102, + 103, + 119, + -120, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 118, + 118, + 120, + 119, + -38, + -38, + -102, + 119, + 103, + 119, + 119, + 116, + 119, + 120, + 119, + 119, + 119, + 118, + -44, + -42, + -41, + 118, + 119, + -121, + 119, + 125, + -105, + 103, + 120, + 119, + -121, + 120, + 120, + -123, + 119, + 119, + 117, + 119, + 119, + 101, + 102, + 103, + 102, + 113, + 113, + 7 + ] + }, + { + "name": "maimai", + "iconId": 406304, + "plateId": 555401, + "titleId": 37, + "rate": 5356, + "udemaeRate": 0, + "courseRank": 2, + "classRank": 0, + "classValue": 0, + "playDatetime": "2026-10-05 17:25:11", + "regionCode": 23, + "shopId": 3971, + "typeId": 1, + "musicId": 11629, + "difficulty": 1, + "version": 1055005, + "resultNum": 360, + "achievement": 955531, + "resultBitList": [ + -88, + -118, + -122, + 106, + -121, + -89, + 119, + -106, + 119, + 119, + -105, + 119, + -120, + 71, + 116, + -104, + 118, + 104, + 119, + -85, + 102, + 101, + 119, + -89, + 118, + -86, + -118, + 119, + -73, + 119, + 106, + 118, + -54, + -119, + 119, + 103, + 119, + -88, + -86, + 120, + -121, + -119, + -38, + 120, + -105, + 122, + -68, + -69, + -119, + 121, + 103, + 103, + 103, + 103, + -120, + 120, + -121, + -86, + 120, + -120, + -104, + -103, + -100, + 119, + -118, + -103, + -103, + -85, + -89, + -121, + -121, + 120, + 119, + -70, + 120, + 118, + 123, + 121, + 119, + 119, + 123, + 118, + 119, + 119, + -121, + 119, + 119, + 119, + 120, + 119, + -86, + -102, + 120, + -73, + 118, + 120, + -122, + -121, + -100, + 119, + -120, + -104, + -86, + -104, + 121, + -88, + 119, + -69, + -119, + 102, + -120, + 120, + 119, + 102, + 102, + -103, + 119, + 119, + -102, + -120, + -121, + -104, + -85, + 120, + 118, + 119, + 121, + 120, + 121, + 119, + -117, + -103, + -70, + -101, + -88, + 120, + 119, + -118, + -85, + -121, + -103, + 119, + -101, + -103, + -87, + -54, + 119, + -103, + 118, + -120, + 68, + -120, + 101, + 119, + -104, + -103, + -54, + -86, + -100, + -84, + -102, + -118, + -53, + -119, + -104, + -104, + -119, + 103, + 119, + -105, + 120, + -119, + 87, + 103, + -120, + 120, + -71, + -119, + -86, + -69 + ] + }, + { + "name": "bvvd", + "iconId": 555104, + "plateId": 555102, + "titleId": 558506, + "rate": 9973, + "udemaeRate": 0, + "courseRank": 4, + "classRank": 1, + "classValue": 10000, + "playDatetime": "2026-10-04 21:43:22", + "regionCode": 16, + "shopId": 1671, + "typeId": 2, + "musicId": 11298, + "difficulty": 2, + "version": 1055005, + "resultNum": 459, + "achievement": 959650, + "resultBitList": [ + 85, + 118, + 119, + 119, + 103, + 117, + 119, + 119, + 119, + 120, + 119, + 119, + 102, + -121, + 119, + 102, + 116, + -123, + -120, + 120, + 116, + 119, + 85, + 103, + 119, + 68, + 118, + 87, + 119, + 102, + 102, + 118, + 103, + 117, + 119, + 113, + -121, + 119, + 119, + 118, + 102, + 118, + 120, + 52, + -105, + -36, + 119, + 73, + 117, + 119, + 119, + 84, + 55, + 119, + -105, + 120, + 102, + 119, + -119, + 119, + -120, + 119, + -119, + 119, + -121, + 120, + -121, + 119, + -121, + 121, + 119, + -120, + -121, + 119, + 118, + 117, + -122, + 119, + 102, + 101, + 116, + 103, + 103, + 70, + 86, + 69, + 119, + 120, + 103, + 119, + -41, + -19, + 126, + -92, + 118, + 102, + 86, + 87, + 103, + 86, + -121, + 119, + 119, + 103, + 119, + -122, + 54, + 117, + 102, + 86, + 119, + -106, + 119, + -121, + 120, + 119, + 119, + 119, + 102, + 102, + 118, + 119, + 119, + 119, + 119, + 17, + 17, + -47, + 121, + 122, + -89, + 71, + 39, + -121, + 119, + 119, + 102, + 103, + 97, + -121, + 73, + 100, + 117, + 119, + 100, + 86, + 118, + 103, + 103, + 117, + 118, + 53, + -119, + 103, + 117, + 102, + -121, + 120, + 71, + 119, + 103, + 118, + 85, + 102, + 103, + 119, + -24, + -88, + 120, + 103, + 85, + 86, + 116, + 103, + 117, + 120, + 103, + 102, + 86, + 117, + 118, + 119, + 119, + -122, + 119, + -121, + 119, + -25, + 120, + 121, + -105, + -100, + 102, + 118, + 103, + 117, + 119, + -120, + 120, + 120, + 119, + 119, + 103, + 103, + 101, + 85, + 102, + 119, + 103, + 119, + 17, + 17, + 33, + -82, + 125, + -25, + 113, + 119, + 118, + 116, + 119, + 119, + 71, + 119, + 119, + 119, + 116, + 118, + 103, + 7 + ] + }, + { + "name": "NATSUME☆", + "iconId": 505803, + "plateId": 555102, + "titleId": 458506, + "rate": 11141, + "udemaeRate": 0, + "courseRank": 4, + "classRank": 1, + "classValue": 10000, + "playDatetime": "2026-10-05 11:27:35", + "regionCode": 8, + "shopId": 3061, + "typeId": 2, + "musicId": 11077, + "difficulty": 2, + "version": 1055005, + "resultNum": 315, + "achievement": 955302, + "resultBitList": [ + -121, + -120, + 103, + 119, + 119, + 119, + 119, + 119, + 119, + -72, + -103, + -121, + 120, + -121, + -88, + -102, + -105, + -103, + 119, + 119, + 119, + 122, + 119, + 120, + -104, + -120, + 119, + 118, + 119, + 119, + 119, + 55, + -124, + 103, + 119, + 103, + 118, + 120, + 86, + 119, + 119, + 103, + 102, + 119, + 119, + 87, + 101, + 118, + 119, + 119, + -120, + 119, + -121, + 119, + 101, + 119, + 103, + -89, + 122, + -89, + 119, + 118, + 103, + 118, + 119, + 119, + 119, + 119, + -121, + -121, + 119, + 101, + 85, + 85, + 68, + 102, + 17, + 119, + -107, + -57, + 59, + 51, + 68, + 68, + 53, + 69, + 100, + 84, + 118, + 119, + 102, + -75, + 92, + 118, + 119, + 103, + 119, + 104, + 118, + 86, + 102, + 119, + 119, + 119, + 104, + -88, + 67, + 68, + 118, + 102, + 103, + 118, + -106, + 119, + 119, + 103, + 122, + -102, + 84, + 118, + 118, + 118, + 102, + 118, + 119, + -120, + 118, + 85, + 101, + 100, + 119, + 122, + 119, + 87, + -36, + -121, + -86, + -105, + 119, + 119, + -121, + -121, + 117, + 119, + -121, + 119, + -120, + 118, + 119, + 119, + 118, + 118, + 126, + 101, + 118, + 119, + 119, + 7 + ] + }, + { + "name": "A11AAAAA", + "iconId": 550102, + "plateId": 505801, + "titleId": 558510, + "rate": 10753, + "udemaeRate": 0, + "courseRank": 0, + "classRank": 1, + "classValue": 10000, + "playDatetime": "2026-10-05 14:13:12", + "regionCode": 27, + "shopId": 3252, + "typeId": 2, + "musicId": 11194, + "difficulty": 2, + "version": 1055005, + "resultNum": 561, + "achievement": 967816, + "resultBitList": [ + 119, + 119, + 119, + 121, + 122, + 119, + 103, + 119, + 121, + 121, + 121, + 120, + 119, + -40, + 120, + -120, + 102, + 118, + 119, + 119, + -119, + -120, + -118, + -120, + 120, + -99, + -104, + 120, + 119, + -121, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 25, + 119, + 119, + 120, + 119, + -121, + 120, + 120, + 119, + 120, + 103, + 119, + -121, + -120, + 119, + -41, + 119, + 103, + 119, + -121, + -85, + -120, + 119, + 119, + 119, + 119, + 120, + 120, + -120, + 120, + 119, + 120, + 119, + 119, + 119, + 119, + 119, + -121, + 119, + 119, + -105, + -105, + -121, + 113, + -118, + -105, + 121, + 121, + 120, + 119, + 118, + 119, + -105, + -120, + 119, + -121, + 119, + 23, + -121, + 103, + -87, + -69, + 119, + 120, + 120, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + -89, + 25, + 113, + 103, + 118, + 119, + 119, + -121, + -89, + -102, + 121, + 119, + 87, + 119, + 119, + 119, + -122, + 122, + 87, + 117, + 119, + 119, + 119, + 119, + 119, + -121, + 119, + -73, + 123, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + -105, + -102, + -120, + 120, + 119, + 103, + 117, + 119, + -121, + 120, + 120, + 119, + 103, + 119, + 119, + -122, + 121, + 120, + 119, + 120, + 119, + 119, + 121, + -105, + -119, + -121, + -87, + -118, + 121, + 119, + -25, + -24, + 119, + 120, + 119, + 120, + -105, + 120, + -121, + 120, + -121, + 120, + 119, + 118, + 119, + 119, + 119, + 119, + 120, + 119, + -86, + 87, + -105, + -89, + 119, + 119, + 119, + -120, + 119, + -86, + 119, + 119, + 126, + 119, + 119, + -86, + -53, + -19, + -73, + -118, + 119, + -105, + -73, + -105, + -104, + 120, + 119, + 119, + 125, + -90, + -67, + -120, + -71, + 107, + -121, + 121, + 120, + -104, + 119, + -73, + 122, + 119, + -86, + -119, + -86, + 119, + -121, + -105, + 120, + -122, + 105, + -106, + 120, + 119, + 119, + 119, + 119, + 119, + -121, + 120, + -40, + 109, + 119, + 119, + -72, + -71, + -85, + -118, + -121, + -121, + -87, + -102, + -86, + -115, + -121, + 103, + -75, + -69, + -36, + -70, + -73, + -57, + -82, + -89, + 119, + 7 + ] + }, + { + "name": "Natalia", + "iconId": 101, + "plateId": 155901, + "titleId": 208527, + "rate": 9800, + "udemaeRate": 0, + "courseRank": 0, + "classRank": 1, + "classValue": 10005, + "playDatetime": "2026-10-05 16:16:12", + "regionCode": 27, + "shopId": 3853, + "typeId": 2, + "musicId": 11080, + "difficulty": 2, + "version": 1055005, + "resultNum": 480, + "achievement": 965881, + "resultBitList": [ + 119, + 119, + 119, + 119, + 119, + 119, + -121, + 120, + 103, + 118, + 118, + 103, + 103, + 118, + 102, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 103, + 68, + 70, + 117, + 102, + 100, + 86, + 119, + 119, + 87, + 118, + 119, + 87, + 101, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 84, + 117, + 120, + 103, + 101, + 100, + 86, + 115, + 120, + -121, + 103, + 85, + 118, + 103, + 118, + 103, + 101, + 101, + 103, + 119, + 70, + 90, + 120, + 119, + 117, + 102, + 68, + 100, + 69, + 117, + 119, + 119, + 85, + 100, + 116, + 119, + 103, + 118, + -89, + 119, + 119, + 118, + -121, + 119, + 103, + 119, + 102, + 119, + 104, + 70, + 102, + 99, + 101, + 117, + 126, + 119, + 119, + 119, + 119, + 119, + 119, + 102, + 119, + 119, + 119, + 87, + 118, + 119, + 85, + 54, + 102, + 84, + 119, + 119, + 119, + 119, + 119, + 85, + 67, + 20, + 102, + 101, + 118, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 68, + 53, + 103, + 67, + 67, + 103, + 102, + 86, + 119, + 119, + 119, + 119, + 69, + 33, + 67, + 119, + 103, + 103, + 116, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 71, + 119, + 119, + 119, + 119, + 87, + 117, + 71, + 101, + 101, + 85, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 103, + 115, + 117, + 86, + 87, + 119, + 102, + 118, + 119, + -108, + 25, + 33, + 70, + 102, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 22, + 85, + 86, + 85, + 101, + 101, + 118, + 34, + 119, + 119, + 119, + 119, + 84, + 102, + 38, + 119, + 119, + 102, + 102, + 117, + 119, + 102, + 70, + 116, + 21, + 110, + -58, + 119, + 120, + 119, + 119, + -118, + 40, + 22, + 18 + ] + }, + { + "name": "Ming", + "iconId": 305304, + "plateId": 550301, + "titleId": 158517, + "rate": 13228, + "udemaeRate": 0, + "courseRank": 0, + "classRank": 1, + "classValue": 10005, + "playDatetime": "2026-10-04 14:32:08", + "regionCode": 1, + "shopId": 1468, + "typeId": 2, + "musicId": 11463, + "difficulty": 2, + "version": 1055005, + "resultNum": 383, + "achievement": 972000, + "resultBitList": [ + -18, + -18, + -18, + -18, + -18, + -18, + -18, + -18, + -18, + 126, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 7 + ] + }, + { + "name": "Sakura", + "iconId": 405104, + "plateId": 405101, + "titleId": 509013, + "rate": 10892, + "udemaeRate": 0, + "courseRank": 0, + "classRank": 2, + "classValue": 20000, + "playDatetime": "2026-10-04 16:44:57", + "regionCode": 1, + "shopId": 3514, + "typeId": 2, + "musicId": 508, + "difficulty": 2, + "version": 1055005, + "resultNum": 393, + "achievement": 965238, + "resultBitList": [ + 103, + 86, + 101, + -121, + 119, + -122, + 73, + 86, + 103, + 71, + -102, + 68, + 100, + 119, + -74, + 104, + 119, + 118, + 119, + 119, + -122, + 103, + -120, + -121, + 120, + 119, + -89, + 119, + 86, + 119, + 119, + 119, + 103, + 125, + 118, + -105, + -106, + 120, + -121, + 118, + 121, + -119, + -121, + -120, + -89, + -100, + -123, + 120, + -120, + 120, + -120, + 119, + 89, + 24, + 120, + -121, + 103, + 120, + -88, + 104, + 119, + 116, + 119, + 126, + 120, + -88, + 119, + 121, + 104, + 121, + 119, + -104, + -114, + 122, + 122, + -118, + 119, + -89, + 71, + 116, + 121, + 103, + 71, + 119, + -56, + 118, + 101, + -121, + 119, + -121, + -120, + -88, + 119, + -118, + -88, + 119, + 120, + -86, + -105, + -41, + 123, + 100, + -120, + -87, + -118, + 121, + 119, + -121, + -88, + -23, + 71, + 119, + 123, + -67, + 102, + -104, + 120, + 121, + -121, + 88, + 119, + 103, + -121, + 119, + 119, + 119, + 100, + -121, + 121, + 104, + 119, + 119, + 87, + -104, + -119, + 120, + 104, + 119, + 103, + 119, + -90, + 117, + 103, + 122, + -120, + -124, + 109, + -38, + 119, + -90, + 116, + -118, + 120, + 123, + 117, + -53, + -105, + 117, + 119, + 119, + -121, + 106, + 118, + -41, + 122, + 39, + 120, + 119, + 116, + -118, + 106, + 116, + 102, + 119, + 119, + 103, + 118, + 97, + -118, + 118, + 118, + -88, + 119, + -120, + -122, + 119, + 119, + 118, + -106, + 118, + -121, + 119, + -118, + -121, + 88, + 101, + 7 + ] + }, + { + "name": "maimai", + "iconId": 555601, + "plateId": 555101, + "titleId": 408223, + "rate": 7959, + "udemaeRate": 0, + "courseRank": 3, + "classRank": 2, + "classValue": 20005, + "playDatetime": "2026-10-02 21:13:47", + "regionCode": 24, + "shopId": 4588, + "typeId": 2, + "musicId": 11851, + "difficulty": 2, + "version": 1055005, + "resultNum": 502, + "achievement": 964714, + "resultBitList": [ + 119, + 119, + 119, + 119, + -121, + 119, + -122, + 104, + -106, + 121, + -122, + 88, + -121, + 120, + -122, + 104, + 118, + 119, + 119, + -121, + 119, + -121, + 120, + -122, + 120, + -106, + 122, + -88, + -118, + -72, + -118, + 119, + 103, + 117, + 119, + 119, + 102, + 119, + 119, + 103, + 119, + 121, + 69, + 119, + 55, + -125, + -120, + 86, + 102, + 103, + 87, + 68, + 85, + 119, + 70, + 121, + 104, + 115, + 119, + 119, + -41, + 119, + -24, + 119, + 119, + 119, + 119, + 90, + 119, + 103, + 68, + 52, + 116, + 71, + 84, + 70, + 101, + 101, + 85, + 101, + 119, + 71, + 97, + 118, + 87, + 85, + 70, + 117, + 102, + 119, + 119, + 119, + 118, + 119, + -120, + 119, + 119, + 118, + 86, + 103, + 119, + 118, + 100, + 119, + 119, + 118, + 119, + 119, + 119, + 117, + 118, + 119, + 123, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + 125, + 119, + 119, + 119, + 119, + 119, + 119, + 119, + -105, + 119, + 119, + 119, + 87, + 85, + 102, + 102, + 71, + 98, + 102, + 20, + 49, + 36, + 51, + 115, + 119, + -38, + -119, + 120, + 119, + 19, + 66, + 36, + 65, + 97, + 103, + 17, + 51, + 51, + 69, + 119, + -105, + 119, + 120, + 110, + 119, + 85, + 102, + 101, + 119, + -87, + 119, + 118, + 85, + 102, + 68, + 102, + 86, + 37, + 83, + 119, + 86, + 33, + 68, + 117, + 87, + 119, + 71, + 115, + 70, + 116, + 86, + 118, + 118, + 119, + 103, + 118, + 87, + 86, + 71, + 100, + 86, + 102, + 86, + 116, + 87, + 117, + 104, + 118, + 119, + 103, + 103, + 102, + 86, + 117, + 119, + 103, + 103, + 71, + 116, + 87, + 101, + 87, + 117, + 86, + -107, + 120, + -122, + 55, + 99, + 86, + 118, + 87, + -123, + 119, + -121, + 104, + 102, + 87, + 118, + 103, + 118, + 119, + 119, + 71, + 100, + 102, + 117, + 119, + 119, + 118, + 118 + ] + }, + { + "name": "Miks・Xio", + "iconId": 102, + "plateId": 555202, + "titleId": 602, + "rate": 9769, + "udemaeRate": 0, + "courseRank": 5, + "classRank": 2, + "classValue": 20000, + "playDatetime": "2026-10-01 12:45:50", + "regionCode": 23, + "shopId": 3388, + "typeId": 1, + "musicId": 777, + "difficulty": 1, + "version": 1055005, + "resultNum": 369, + "achievement": 970221, + "resultBitList": [ + -86, + 122, + -73, + 119, + 120, + 102, + 120, + 103, + -108, + 101, + 116, + 106, + -121, + -42, + -105, + -121, + -123, + 25, + 103, + 109, + 49, + 117, + 102, + 117, + 104, + -89, + 103, + 119, + 119, + 119, + 118, + 119, + 119, + 86, + 100, + 118, + -106, + 85, + 68, + 115, + 115, + 119, + -90, + 85, + 119, + 123, + 103, + 101, + 71, + 119, + 87, + 85, + 117, + -87, + 121, + 122, + 119, + 119, + 103, + 118, + 88, + 85, + -25, + 22, + 84, + 119, + 103, + 102, + 100, + 104, + -121, + 121, + -121, + 118, + 119, + 119, + 102, + 102, + -28, + 108, + 71, + 120, + 119, + -122, + 120, + 116, + 102, + 101, + 103, + 20, + 116, + 120, + 120, + 102, + 70, + 120, + 103, + 117, + -121, + -119, + -24, + -74, + 121, + -121, + 23, + 81, + -123, + -69, + 118, + -121, + 39, + -90, + 125, + -41, + -83, + 104, + -75, + -119, + -104, + -116, + -103, + -105, + 103, + 118, + 103, + 85, + 117, + 87, + 119, + 119, + 103, + 118, + 103, + 119, + 101, + -122, + 120, + 119, + 119, + 86, + 102, + 119, + 121, + 119, + 85, + 103, + 117, + 85, + 103, + 119, + 103, + 119, + 119, + 85, + 118, + 116, + 118, + 101, + 67, + 85, + 82, + 117, + 101, + 116, + 101, + -57, + -73, + -118, + -73, + 105, + 119, + 103, + 102, + 118, + 119, + -121, + -120, + -106, + 103, + 120, + 119, + 103, + -105, + 87, + 5 + ] + }, + { + "name": "maimai", + "iconId": 555601, + "plateId": 555101, + "titleId": 308566, + "rate": 7794, + "udemaeRate": 0, + "courseRank": 3, + "classRank": 2, + "classValue": 20005, + "playDatetime": "2026-10-02 12:31:40", + "regionCode": 24, + "shopId": 4588, + "typeId": 2, + "musicId": 731, + "difficulty": 2, + "version": 1055005, + "resultNum": 426, + "achievement": 971218, + "resultBitList": [ + 119, + 118, + 119, + 103, + 119, + 120, + 119, + 118, + 120, + -119, + 120, + -121, + -104, + -121, + -104, + 119, + 102, + 102, + 119, + -121, + -118, + 119, + -123, + 120, + 119, + 86, + 103, + 103, + 84, + 54, + 68, + 118, + 101, + 121, + 102, + 68, + 120, + -119, + 118, + 119, + 119, + 87, + 118, + 104, + 118, + 120, + -121, + 120, + -122, + -88, + -103, + 105, + 70, + -123, + -123, + -122, + 119, + -104, + -122, + 102, + 119, + 118, + 68, + 119, + 119, + 119, + 119, + 103, + 118, + 119, + -121, + -104, + 119, + -120, + 120, + 119, + 119, + 119, + 68, + 119, + 117, + 120, + 56, + 99, + 87, + -120, + 119, + 119, + 119, + 119, + 118, + 119, + 119, + -104, + -103, + -87, + -118, + -121, + 104, + 118, + 119, + 118, + 119, + 121, + 121, + -87, + -118, + 55, + 119, + 119, + -106, + 119, + 102, + 119, + -121, + 102, + -106, + 119, + 119, + 119, + -88, + 120, + -89, + 119, + 87, + 117, + 117, + 119, + 68, + 117, + 119, + 119, + 39, + 99, + 118, + 118, + 118, + -105, + 120, + 102, + 119, + 119, + -120, + -103, + -89, + -87, + -102, + -117, + -105, + 120, + -121, + 87, + -121, + 119, + 102, + 103, + 118, + 118, + 119, + 119, + 118, + 100, + 118, + -105, + -103, + -104, + 119, + 121, + -121, + -121, + 71, + 118, + 84, + 118, + -121, + 119, + 119, + 103, + 120, + 121, + 119, + 103, + 78, + 117, + 119, + 103, + 118, + 119, + 119, + 119, + 120, + 119, + 116, + 116, + 119, + 103, + -74, + -82, + -73, + -101, + 70, + 70, + 119, + 119, + 119, + 124, + 124, + -86, + -103, + 119, + 118, + 118, + 102 + ] + }, + { + "name": "A cat♪♪", + "iconId": 458028, + "plateId": 555501, + "titleId": 508564, + "rate": 8947, + "udemaeRate": 0, + "courseRank": 4, + "classRank": 2, + "classValue": 20005, + "playDatetime": "2026-10-01 14:48:17", + "regionCode": 28, + "shopId": 4882, + "typeId": 2, + "musicId": 579, + "difficulty": 2, + "version": 1055005, + "resultNum": 364, + "achievement": 973572, + "resultBitList": [ + -88, + 122, + 103, + 119, + 104, + -104, + 17, + -118, + -118, + 120, + 119, + 51, + 119, + -103, + 119, + -41, + 119, + 103, + 104, + -104, + -121, + -35, + 119, + -120, + 119, + -121, + 120, + 118, + 118, + 119, + -114, + 121, + -124, + -89, + 103, + 118, + 119, + -104, + 106, + 118, + 103, + 119, + 119, + 122, + 103, + 119, + 120, + -120, + -88, + 121, + 119, + 103, + 119, + 119, + 119, + 119, + 119, + 120, + 122, + 122, + 120, + 119, + -120, + 119, + -121, + -105, + 87, + 119, + 119, + 119, + -121, + 120, + -105, + -120, + -105, + -103, + -121, + 119, + 119, + -120, + -119, + -120, + -120, + -105, + -120, + 121, + -105, + 119, + -89, + 118, + 119, + -105, + -104, + 120, + 118, + 71, + 104, + 122, + 119, + 119, + -104, + -120, + 118, + 102, + 103, + 119, + 100, + 119, + 119, + 117, + 119, + 119, + 119, + -121, + 120, + 119, + 102, + 119, + 87, + -103, + 119, + 119, + -118, + -121, + -121, + 122, + -74, + -105, + 104, + 119, + 120, + 103, + 119, + -87, + 119, + 119, + 119, + -121, + -104, + 104, + 103, + 119, + -26, + -102, + 119, + 103, + 102, + -120, + 119, + -85, + -120, + 119, + -121, + 119, + -105, + 126, + 126, + -121, + -120, + -85, + -22, + -86, + -103, + 119, + 119, + -121, + 119, + 120, + -120, + -105, + -119, + -119, + 119, + 119, + -86, + 119, + 118, + -120, + 102, + 119, + 119, + 118 + ] + } + ] + }, + "_failed": [] +} \ No newline at end of file diff --git a/docs/samples/逐字段对比明细.md b/docs/samples/逐字段对比明细.md new file mode 100644 index 0000000..cd81bb7 --- /dev/null +++ b/docs/samples/逐字段对比明细.md @@ -0,0 +1,626 @@ +## 顶层字段对比 + +| 字段 | 真机 | 本次实跑 | 一致 | +|---|---|---|---| +| `userId` | 12345678 | 12345678 | 一致 | +| `playlogId` | 7692848101484135861 | 7693120247791879616 | **不同** | +| `isEventMode` | False | False | 一致 | +| `isFreePlay` | False | False | 一致 | +| `loginDateTime` | 1791159576 | 1791222938 | **不同** | +| `userPlaylogList` | 1 条 | 1 条 | 一致 | +| `upsertUserAll` | 36 节点 | 36 节点 | 一致 | + +## 36 个节点逐节点对比 + +| # | 节点 | 真机 | 实跑 | 形态一致 | +|---|---|---|---|---| +| 1 | `userData` | 1 条 | 1 条 | 一致 | +| 2 | `userExtend` | 1 条 | 1 条 | 一致 | +| 3 | `userOption` | 1 条 | 1 条 | 一致 | +| 4 | `userCharacterList` | 5 条 | 5 条 | 一致 | +| 5 | `userGhost` | 0 条 | 0 条 | 一致 | +| 6 | `userMapList` | 1 条 | 1 条 | 一致 | +| 7 | `userLoginBonusList` | 0 条 | 0 条 | 一致 | +| 8 | `userRatingList` | 1 条 | 1 条 | 一致 | +| 9 | `userItemList` | 0 条 | 0 条 | 一致 | +| 10 | `userMusicDetailList` | 1 条 | 1 条 | 一致 | +| 11 | `userCourseList` | 0 条 | 0 条 | 一致 | +| 12 | `userFriendSeasonRankingList` | 0 条 | 0 条 | 一致 | +| 13 | `userChargeList` | 3 条 | 3 条 | 一致 | +| 14 | `userFavoriteList` | 5 条 | 5 条 | 一致 | +| 15 | `userActivityList` | 1 条 | 1 条 | 一致 | +| 16 | `userMissionDataList` | 6 条 | 6 条 | 一致 | +| 17 | `userWeeklyData` | 对象(3 键) | 对象(3 键) | 一致 | +| 18 | `userGamePlaylogList` | 1 条 | 1 条 | 一致 | +| 19 | `user2pPlaylog` | 对象(7 键) | 对象(7 键) | 一致 | +| 20 | `userIntimateList` | 0 条 | 0 条 | 一致 | +| 21 | `userShopItemStockList` | 0 条 | 0 条 | 一致 | +| 22 | `userGetPointList` | 0 条 | 0 条 | 一致 | +| 23 | `userTradeItemList` | 0 条 | 0 条 | 一致 | +| 24 | `userFavoritemusicList` | 0 条 | 0 条 | 一致 | +| 25 | `userKaleidxScopeList` | 0 条 | 0 条 | 一致 | +| 26 | `isNewCharacterList` | 位串 '00000' | 位串 '00000' | 一致 | +| 27 | `isNewMapList` | 位串 '0' | 位串 '0' | 一致 | +| 28 | `isNewLoginBonusList` | 位串 '' | 位串 '' | 一致 | +| 29 | `isNewItemList` | 位串 '' | 位串 '' | 一致 | +| 30 | `isNewMusicDetailList` | 位串 '0' | 位串 '0' | 一致 | +| 31 | `isNewCourseList` | 位串 '' | 位串 '' | 一致 | +| 32 | `isNewFavoriteList` | 位串 '22212' | 位串 '22212' | 一致 | +| 33 | `isNewFriendSeasonRankingList` | 位串 '' | 位串 '' | 一致 | +| 34 | `isNewUserIntimateList` | 位串 '' | 位串 '' | 一致 | +| 35 | `isNewFavoritemusicList` | 位串 '' | 位串 '' | 一致 | +| 36 | `isNewKaleidxScopeList` | 位串 '' | 位串 '' | 一致 | + +## 11 条位串对比 + +| 位串 | 真机 | 实跑 | 一致 | +|---|---|---|---| +| `isNewCharacterList` | `00000` | `00000` | 一致 | +| `isNewMapList` | `0` | `0` | 一致 | +| `isNewLoginBonusList` | `` | `` | 一致 | +| `isNewItemList` | `` | `` | 一致 | +| `isNewMusicDetailList` | `0` | `0` | 一致 | +| `isNewCourseList` | `` | `` | 一致 | +| `isNewFavoriteList` | `22212` | `22212` | 一致 | +| `isNewFriendSeasonRankingList` | `` | `` | 一致 | +| `isNewUserIntimateList` | `` | `` | 一致 | +| `isNewFavoritemusicList` | `` | `` | 一致 | +| `isNewKaleidxScopeList` | `` | `` | 一致 | + +## userData[0] 逐字段对比 + +| 字段 | 真机 | 实跑 | 一致 | +|---|---|---|---| +| `accessCode` | "" | "" | 一致 | +| `userName` | "☆Astral☆" | "☆Astral☆" | 一致 | +| `isNetMember` | 1 | 1 | 一致 | +| `point` | 4110 | 4110 | 一致 | +| `totalPoint` | 52620 | 52620 | 一致 | +| `iconId` | 559501 | 559501 | 一致 | +| `plateId` | 458001 | 458001 | 一致 | +| `titleId` | 55502 | 55502 | 一致 | +| `partnerId` | 1 | 1 | 一致 | +| `frameId` | 209504 | 209504 | 一致 | +| `selectMapId` | 550003 | 550003 | 一致 | +| `totalAwake` | 184 | 184 | 一致 | +| `gradeRating` | 0 | 0 | 一致 | +| `musicRating` | 15000 | 15000 | 一致 | +| `playerRating` | 15000 | 15000 | 一致 | +| `highestRating` | 15000 | 15000 | 一致 | +| `gradeRank` | 0 | 0 | 一致 | +| `classRank` | 1 | 1 | 一致 | +| `courseRank` | 10 | 10 | 一致 | +| `charaSlot` | [395, 101, 400402, 400401, 200401] | [395, 101, 400402, 400401, 200401] | 一致 | +| `charaLockSlot` | [395, 101, 0, 0, 0] | [395, 101, 0, 0, 0] | 一致 | +| `contentBit` | 2145488608 | 2145488608 | 一致 | +| `playCount` | 1258 | 1259 | **不同** | +| `currentPlayCount` | 186 | 187 | **不同** | +| `renameCredit` | 0 | 0 | 一致 | +| `mapStock` | 0 | 0 | 一致 | +| `eventWatchedDate` | "2026-10-05 00:19:37.0" | "2026-10-05 17:55:38.0" | **不同** | +| `lastGameId` | "SDGB" | "SDGB" | 一致 | +| `lastRomVersion` | "1.56.00" | "1.56.00" | 一致 | +| `lastDataVersion` | "1.55.05" | "1.55.05" | 一致 | +| `lastLoginDate` | "2026-10-05 00:19:37.0" | "2026-10-05 17:55:38.0" | **不同** | +| `lastPlayDate` | "2026-10-05 00:20:57.0" | "2026-10-05 17:55:38.0" | **不同** | +| `lastPlayCredit` | 1 | 1 | 一致 | +| `lastPlayMode` | 0 | 0 | 一致 | +| `lastPlaceId` | 1000 | 1000 | 一致 | +| `lastPlaceName` | "测试店铺" | "测试店铺" | 一致 | +| `lastAllNetId` | 0 | 0 | 一致 | +| `lastRegionId` | 5 | 5 | 一致 | +| `lastRegionName` | "测试区域" | "测试区域" | 一致 | +| `lastClientId` | "TESTCLIENT1" | "TESTCLIENT1" | 一致 | +| `lastCountryCode` | "CHN" | "CHN" | 一致 | +| `lastSelectEMoney` | 0 | 0 | 一致 | +| `lastSelectTicket` | 0 | 0 | 一致 | +| `lastSelectCourse` | 552304 | 552304 | 一致 | +| `lastCountCourse` | 0 | 0 | 一致 | +| `firstGameId` | "SDGB" | "SDGB" | 一致 | +| `firstRomVersion` | "1.41.00" | "1.41.00" | 一致 | +| `firstDataVersion` | "1.40.08" | "1.40.08" | 一致 | +| `firstPlayDate` | "2024-12-31 21:25:58" | "2024-12-31 21:25:58" | 一致 | +| `compatibleCmVersion` | "1.55.00" | "1.55.00" | 一致 | +| `dailyBonusDate` | "1970-01-01 08:00:00" | "1970-01-01 08:00:00" | 一致 | +| `dailyCourseBonusDate` | "2026-07-13 00:00:00" | "2026-07-13 00:00:00" | 一致 | +| `lastPairLoginDate` | "2026-10-04 18:05:18" | "2026-10-04 18:05:18" | 一致 | +| `lastTrialPlayDate` | "2026-10-03 21:07:50" | "2026-10-03 21:07:50" | 一致 | +| `playVsCount` | 0 | 0 | 一致 | +| `playSyncCount` | 0 | 0 | 一致 | +| `winCount` | 0 | 0 | 一致 | +| `helpCount` | 0 | 0 | 一致 | +| `comboCount` | 0 | 0 | 一致 | +| `totalDeluxscore` | 1869771 | 1869771 | 一致 | +| `totalBasicDeluxscore` | 1274 | 1274 | 一致 | +| `totalAdvancedDeluxscore` | 6566 | 6566 | 一致 | +| `totalExpertDeluxscore` | 470976 | 470976 | 一致 | +| `totalMasterDeluxscore` | 1236693 | 1236693 | 一致 | +| `totalReMasterDeluxscore` | 154262 | 154262 | 一致 | +| `totalSync` | 1112 | 1112 | 一致 | +| `totalBasicSync` | 5 | 5 | 一致 | +| `totalAdvancedSync` | 5 | 5 | 一致 | +| `totalExpertSync` | 425 | 425 | 一致 | +| `totalMasterSync` | 604 | 604 | 一致 | +| `totalReMasterSync` | 73 | 73 | 一致 | +| `totalAchievement` | 975613200 | 975613200 | 一致 | +| `totalBasicAchievement` | 2984753 | 2984753 | 一致 | +| `totalAdvancedAchievement` | 7755815 | 7755815 | 一致 | +| `totalExpertAchievement` | 315483810 | 315483810 | 一致 | +| `totalMasterAchievement` | 578226016 | 578226016 | 一致 | +| `totalReMasterAchievement` | 71162806 | 71162806 | 一致 | +| `playerOldRating` | 10927 | 10927 | 一致 | +| `playerNewRating` | 4606 | 4606 | 一致 | +| `banState` | 0 | 0 | 一致 | +| `friendRegistSkip` | 0 | 0 | 一致 | +| `dateTime` | 1791134329 | 1791194138 | **不同** | + +真机 82 字段,实跑 82 字段,命中 76/82 + +## 差分节点明细 + +### `userMusicDetailList` + +真机: +```json +[ + { + "musicId": 143, + "level": 4, + "playCount": 8, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0 + } +] +``` + +实跑: +```json +[ + { + "musicId": 143, + "level": 4, + "playCount": 9, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, + "extNum1": 0 + } +] +``` + +### `userMapList` + +真机: +```json +[ + { + "mapId": 550003, + "distance": 1435000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + } +] +``` + +实跑: +```json +[ + { + "mapId": 550003, + "distance": 1446000, + "isLock": false, + "isClear": false, + "isComplete": false, + "unlockFlag": 0 + } +] +``` + +### `userCharacterList` + +真机: +```json +[ + { + "characterId": 101, + "level": 4456, + "awakening": 5, + "useCount": 0 + }, + { + "characterId": 395, + "level": 3801, + "awakening": 5, + "useCount": 0 + }, + { + "characterId": 200401, + "level": 135, + "awakening": 3, + "useCount": 0 + }, + { + "characterId": 400401, + "level": 135, + "awakening": 3, + "useCount": 0 + }, + { + "characterId": 400402, + "level": 135, + "awakening": 3, + "useCount": 0 + } +] +``` + +实跑: +```json +[ + { + "characterId": 395, + "useCount": 0, + "level": 3802, + "awakening": 5 + }, + { + "characterId": 101, + "useCount": 0, + "level": 4457, + "awakening": 5 + }, + { + "characterId": 400402, + "useCount": 0, + "level": 136, + "awakening": 3 + }, + { + "characterId": 400401, + "useCount": 0, + "level": 136, + "awakening": 3 + }, + { + "characterId": 200401, + "useCount": 0, + "level": 136, + "awakening": 3 + } +] +``` + +### `userChargeList` + +真机: +```json +[ + { + "chargeId": 2, + "stock": 0, + "purchaseDate": "2026-07-14 18:33:37", + "validDate": "2026-10-12 04:00:00" + }, + { + "chargeId": 3, + "stock": 0, + "purchaseDate": "2026-10-02 10:49:23", + "validDate": "2026-12-31 04:00:00" + }, + { + "chargeId": 5, + "stock": 0, + "purchaseDate": "2026-10-04 18:22:10", + "validDate": "2027-01-02 04:00:00" + } +] +``` + +实跑: +```json +[ + { + "chargeId": 2, + "stock": 0, + "purchaseDate": "2026-07-14 18:33:37", + "validDate": "2026-10-12 04:00:00" + }, + { + "chargeId": 3, + "stock": 0, + "purchaseDate": "2026-10-02 10:49:23", + "validDate": "2026-12-31 04:00:00" + }, + { + "chargeId": 5, + "stock": 0, + "purchaseDate": "2026-10-04 18:22:10", + "validDate": "2027-01-02 04:00:00" + } +] +``` + +### `userFavoriteList` + +真机: +```json +[ + { + "itemKind": 3, + "itemIdList": [ + 559501 + ] + }, + { + "itemKind": 1, + "itemIdList": [] + }, + { + "itemKind": 2, + "itemIdList": [] + }, + { + "itemKind": 10, + "itemIdList": [] + }, + { + "itemKind": 11, + "itemIdList": [] + } +] +``` + +实跑: +```json +[ + { + "itemKind": 3, + "itemIdList": [ + 559501 + ] + }, + { + "itemKind": 1, + "itemIdList": [] + }, + { + "itemKind": 2, + "itemIdList": [] + }, + { + "itemKind": 10, + "itemIdList": [] + }, + { + "itemKind": 11, + "itemIdList": [] + } +] +``` + +## 两个对象节点 + +### `userWeeklyData` + +真机: +```json +{ + "lastLoginWeek": "2026-09-28 04:00:00", + "beforeLoginWeek": "2026-09-21 04:00:00", + "friendBonusFlag": true +} +``` + +实跑: +```json +{ + "lastLoginWeek": "2026-09-28 04:00:00", + "beforeLoginWeek": "2026-09-21 04:00:00", + "friendBonusFlag": true +} +``` + +### `user2pPlaylog` + +真机: +```json +{ + "userId1": 0, + "userId2": 0, + "userName1": "", + "userName2": "", + "regionId": 0, + "placeId": 0, + "user2pPlaylogDetailList": [] +} +``` + +实跑: +```json +{ + "userId1": 0, + "userId2": 0, + "userName1": "", + "userName2": "", + "regionId": 0, + "placeId": 0, + "user2pPlaylogDetailList": [] +} +``` + +## userGamePlaylogList + +真机: +```json +[ + { + "playlogId": 7692848101484135861, + "version": "1.56.00", + "playDate": "2026-10-05 00:20:57.0", + "playMode": 0, + "useTicketId": -1, + "playCredit": 1, + "playTrack": 1, + "clientId": "TESTCLIENT1", + "isPlayTutorial": false, + "isEventMode": false, + "isNewFree": false, + "playCount": 8, + "playSpecial": 55951502, + "playOtherUserId": 0 + } +] +``` + +实跑: +```json +[ + { + "playlogId": 7693120247791879616, + "version": "1.56.00", + "playDate": "2026-10-05 17:55:38.0", + "playMode": 0, + "useTicketId": -1, + "playCredit": 1, + "playTrack": 1, + "clientId": "TESTCLIENT1", + "isPlayTutorial": false, + "isEventMode": false, + "isNewFree": false, + "playCount": 8, + "playSpecial": 16417894, + "playOtherUserId": 0 + } +] +``` + +## userPlaylogList[0] 逐字段对比(110 字段) + +| # | 字段 | 真机 | 实跑 | 一致 | +|---|---|---|---|---| +| 1 | `userId` | 0 | 0 | 一致 | +| 2 | `orderId` | 0 | 0 | 一致 | +| 3 | `playlogId` | 7692848101484135861 | 7693120247791879616 | **不同** | +| 4 | `version` | 1056000 | 1056000 | 一致 | +| 5 | `placeId` | 1000 | 1000 | 一致 | +| 6 | `placeName` | "测试店铺" | "测试店铺" | 一致 | +| 7 | `loginDate` | 1791130777 | 1791194138 | **不同** | +| 8 | `playDate` | "2026-10-04" | "2026-10-05" | **不同** | +| 9 | `userPlayDate` | "2026-10-05 00:20:30.0" | "2026-10-05 17:55:38.0" | **不同** | +| 10 | `type` | 0 | 0 | 一致 | +| 11 | `musicId` | 143 | 143 | 一致 | +| 12 | `level` | 4 | 4 | 一致 | +| 13 | `trackNo` | 1 | 1 | 一致 | +| 14 | `vsMode` | 0 | 0 | 一致 | +| 15 | `vsUserName` | "" | "" | 一致 | +| 16 | `vsStatus` | 0 | 0 | 一致 | +| 17 | `vsUserRating` | 0 | 0 | 一致 | +| 18 | `vsUserAchievement` | 0 | 0 | 一致 | +| 19 | `vsUserGradeRank` | 0 | 0 | 一致 | +| 20 | `vsRank` | 0 | 0 | 一致 | +| 21 | `playerNum` | 1 | 1 | 一致 | +| 22 | `playedUserId1` | 0 | 0 | 一致 | +| 23 | `playedUserName1` | "" | "" | 一致 | +| 24 | `playedMusicLevel1` | 0 | 0 | 一致 | +| 25 | `playedUserId2` | 0 | 0 | 一致 | +| 26 | `playedUserName2` | "" | "" | 一致 | +| 27 | `playedMusicLevel2` | 0 | 0 | 一致 | +| 28 | `playedUserId3` | 0 | 0 | 一致 | +| 29 | `playedUserName3` | "" | "" | 一致 | +| 30 | `playedMusicLevel3` | 0 | 0 | 一致 | +| 31 | `characterId1` | 395 | 395 | 一致 | +| 32 | `characterLevel1` | 3800 | 3800 | 一致 | +| 33 | `characterAwakening1` | 5 | 5 | 一致 | +| 34 | `characterId2` | 101 | 101 | 一致 | +| 35 | `characterLevel2` | 4455 | 4455 | 一致 | +| 36 | `characterAwakening2` | 5 | 5 | 一致 | +| 37 | `characterId3` | 400402 | 400402 | 一致 | +| 38 | `characterLevel3` | 134 | 134 | 一致 | +| 39 | `characterAwakening3` | 3 | 3 | 一致 | +| 40 | `characterId4` | 400401 | 400401 | 一致 | +| 41 | `characterLevel4` | 134 | 134 | 一致 | +| 42 | `characterAwakening4` | 3 | 3 | 一致 | +| 43 | `characterId5` | 200401 | 200401 | 一致 | +| 44 | `characterLevel5` | 134 | 134 | 一致 | +| 45 | `characterAwakening5` | 3 | 3 | 一致 | +| 46 | `achievement` | 0 | 0 | 一致 | +| 47 | `deluxscore` | 0 | 0 | 一致 | +| 48 | `scoreRank` | 0 | 0 | 一致 | +| 49 | `maxCombo` | 0 | 0 | 一致 | +| 50 | `totalCombo` | 655 | 655 | 一致 | +| 51 | `maxSync` | 0 | 0 | 一致 | +| 52 | `totalSync` | 0 | 0 | 一致 | +| 53 | `tapCriticalPerfect` | 0 | 0 | 一致 | +| 54 | `tapPerfect` | 0 | 0 | 一致 | +| 55 | `tapGreat` | 0 | 0 | 一致 | +| 56 | `tapGood` | 0 | 0 | 一致 | +| 57 | `tapMiss` | 441 | 441 | 一致 | +| 58 | `holdCriticalPerfect` | 0 | 0 | 一致 | +| 59 | `holdPerfect` | 0 | 0 | 一致 | +| 60 | `holdGreat` | 0 | 0 | 一致 | +| 61 | `holdGood` | 0 | 0 | 一致 | +| 62 | `holdMiss` | 19 | 19 | 一致 | +| 63 | `slideCriticalPerfect` | 0 | 0 | 一致 | +| 64 | `slidePerfect` | 0 | 0 | 一致 | +| 65 | `slideGreat` | 0 | 0 | 一致 | +| 66 | `slideGood` | 0 | 0 | 一致 | +| 67 | `slideMiss` | 192 | 192 | 一致 | +| 68 | `touchCriticalPerfect` | 0 | 0 | 一致 | +| 69 | `touchPerfect` | 0 | 0 | 一致 | +| 70 | `touchGreat` | 0 | 0 | 一致 | +| 71 | `touchGood` | 0 | 0 | 一致 | +| 72 | `touchMiss` | 0 | 0 | 一致 | +| 73 | `breakCriticalPerfect` | 0 | 0 | 一致 | +| 74 | `breakPerfect` | 0 | 0 | 一致 | +| 75 | `breakGreat` | 0 | 0 | 一致 | +| 76 | `breakGood` | 0 | 0 | 一致 | +| 77 | `breakMiss` | 3 | 3 | 一致 | +| 78 | `isTap` | true | true | 一致 | +| 79 | `isHold` | true | true | 一致 | +| 80 | `isSlide` | true | true | 一致 | +| 81 | `isTouch` | false | false | 一致 | +| 82 | `isBreak` | true | true | 一致 | +| 83 | `isCriticalDisp` | true | true | 一致 | +| 84 | `isFastLateDisp` | true | true | 一致 | +| 85 | `fastCount` | 0 | 0 | 一致 | +| 86 | `lateCount` | 0 | 0 | 一致 | +| 87 | `isAchieveNewRecord` | false | false | 一致 | +| 88 | `isDeluxscoreNewRecord` | false | false | 一致 | +| 89 | `comboStatus` | 0 | 0 | 一致 | +| 90 | `syncStatus` | 0 | 0 | 一致 | +| 91 | `isClear` | false | false | 一致 | +| 92 | `beforeRating` | 15000 | 15000 | 一致 | +| 93 | `afterRating` | 15000 | 15000 | 一致 | +| 94 | `beforeGrade` | 0 | 0 | 一致 | +| 95 | `afterGrade` | 0 | 0 | 一致 | +| 96 | `afterGradeRank` | 1 | 1 | 一致 | +| 97 | `beforeDeluxRating` | 15000 | 15000 | 一致 | +| 98 | `afterDeluxRating` | 15000 | 15000 | 一致 | +| 99 | `isPlayTutorial` | false | false | 一致 | +| 100 | `isEventMode` | false | false | 一致 | +| 101 | `isFreedomMode` | false | false | 一致 | +| 102 | `playMode` | 0 | 0 | 一致 | +| 103 | `isNewFree` | false | false | 一致 | +| 104 | `trialPlayAchievement` | -1 | -1 | 一致 | +| 105 | `extNum1` | 0 | 0 | 一致 | +| 106 | `extNum2` | 0 | 0 | 一致 | +| 107 | `extNum4` | 2022 | 2022 | 一致 | +| 108 | `extBool1` | false | false | 一致 | +| 109 | `extBool2` | false | false | 一致 | +| 110 | `extBool3` | false | false | 一致 | + +命中 106/110 + +## 汇总 + +- userData 字段命中:76/82 +- playlog 字段命中:106/110 +- 节点形态命中:36/36 diff --git a/docs/上传成绩开发文档.md b/docs/上传成绩开发文档.md new file mode 100644 index 0000000..3c871e1 --- /dev/null +++ b/docs/上传成绩开发文档.md @@ -0,0 +1,507 @@ +# 上传成绩(UpsertUserAll)开发文档 + +> 对应 `api/upsert_user_all.py` 与 `api/upsert_snapshot.py`。 +> **判据 = `source/2026-10-05.log:123` 的真机跑通报文 + `source/Assembly-CSharp/` 反编译源码。** + +--- + +## 一、这是什么 + +`UpsertUserAllApi` 是**唯一一个有副作用的写接口**:把一局游玩的完整结算数据 +(成绩明细 + 全量用户数据快照)写进服务器。发出去收不回来。 + +| 项目 | 值 | +|---|---| +| 逻辑 API 名 | `UpsertUserAllApi` | +| 实际 URL 尾段 | `md5("UpsertUserAllApiMaimaiChn" + "8bF76dE9")` | +| 超时 | 60 秒(`NetConfig.TimeOutInMSecLong`) | +| 副作用 | ★ 有,不可撤销 | + +--- + +## 二、顶层请求结构(7 字段) + +依据 `PacketUpsertUserAll.cs:22-35`: + +```python +UserAllRequestVO( + userId = user_id, + playlogId = login.loginId, # ★ 必须 == UserLoginApi 的 loginId + isEventMode = False, + isFreePlay = False, + loginDateTime = login.loginDateTime, # ★ 必须 == UserLoginApi 的 loginDateTime + userPlaylogList = [...本局成绩...], + upsertUserAll = {...36 个节点...}, +) +``` + +响应:`{"returnCode": 1, "apiName": "com.sega.maimai.api.UpsertUserAllApi"}`。 + +> ⚠ `playlogId` 与 `loginDateTime` **不是本接口产生的**,它们来自 `UserLoginApi`。 +> 发错登录 ID 服务端会直接拒。中途换了登录会话必须重新登录。 + +--- + +## 三、upsertUserAll 的 36 个节点 + +依据 `Net.VO.Mai2/UserAll.cs`,并用真机报文逐节点核对。**四种形态**: + +| 类别 | 数量 | C# 类型 | JSON 形态 | +|---|---:|---|---| +| 单元素数组 | 4 | UserDetail[] / UserExtend[] / UserOption[] / UserRating[] | 数组,恒 1 元素 | +| **对象(非数组)** | 2 | UserWeeklyData / User2pPlaylog | `{}` ★ | +| 普通数组 | 19 | Xxx[] | `[]` | +| **位串** | 11 | string | 定长字符串 | + +合计 4 + 2 + 19 + 11 = **36**。 + +### 3.1 ★ 两个对象节点 + +`userWeeklyData` 与 `user2pPlaylog` **不是数组**。传数组会被 `coerce_node_value()` +直接拦下并抛 `PatchError`(这是刻意设计的防呆)。 + +```jsonc +"userWeeklyData": { "lastLoginWeek": "...", "beforeLoginWeek": "...", "friendBonusFlag": true } +"user2pPlaylog" : { "userId1": 0, ..., "user2pPlaylogDetailList": [] } +``` + +### 3.2 ★ 位串长度 == 对应数组条数 + +11 个 `isNew*` 与同名数组一一对应。**长度不符服务端会误判「哪些是新增」**。 +`build_user_all()` 末尾会自动补齐(`sync_bits_to_arrays()`)。 + +| 位串 | 对应数组 | +|---|---| +| `isNewCharacterList` | userCharacterList | +| `isNewMapList` | userMapList | +| `isNewLoginBonusList` | userLoginBonusList | +| `isNewItemList` | userItemList | +| `isNewMusicDetailList` | userMusicDetailList | +| `isNewCourseList` | userCourseList | +| `isNewFavoriteList` | userFavoriteList | +| `isNewFriendSeasonRankingList` | userFriendSeasonRankingList | +| `isNewUserIntimateList` | userIntimateList | +| `isNewFavoritemusicList` | userFavoritemusicList | +| `isNewKaleidxScopeList` | userKaleidxScopeList | + +--- + +## 四、★★ 核心:快照基线 + 本局演算 + 差分 + +### 4.1 真机对照(同一账号的 Get 侧 vs Upsert 侧) + +| 节点 | Get 侧(登录时) | Upsert 侧(结算时) | 结论 | +|---|---|---|---| +| `userData.playCount` | 1257 | **1258** | +1 | +| `userData.currentPlayCount` | 185 | **186** | +1 | +| `userData.lastPlayDate` | 2026-10-04 18:46:31 | **2026-10-05 00:20:57** | 更新 | +| `userData.lastPlayMode` | 2 | **0** | 归 0 | +| `userData.lastLoginDate` | 2026-10-04 18:34:22 | **2026-10-05 00:19:37** | 本次登录 | +| `userData.dateTime` | null | **1791134329** | 登录请求的 dateTime | +| `userData.lastPlaceId` | 0 | **1000** | 当前店铺 | +| `userData.lastRegionId` | 11 | **5** | 当前区域 | +| `userMusicDetailList` | 739 组 | **1 条** | 只回传本局那条,playCount 7→8 | +| `userMapList` | 104 条 | **1 条** | 只回传变化那条,distance +11000 | +| `userCharacterList` | 312 条 | **5 条** | 组队 5 只,各 +1 级 | +| `userItemList` | 1070 条 | **0 条** | 无变化 | +| `userCourseList` | 16 条 | **0 条** | 无变化 | +| `userChargeList` | 3 条 | **3 条** | ★ **整表回传,不做差分** | +| `userFavoriteList` | 5 类 | **5 类** | ★ 不做剔除,恒返回全部 | + +### 4.2 ★★ 为什么必须做差分(这是「returnCode=1 但没落库」的根因) + +**服务器对 `userData` 是整表覆盖语义** —— 把 Get 下来的旧值原样发回去, +写入后「看起来什么都没发生」。 + +**差分节点若为空,服务端也看不出本局有任何变化**,整包等于没生效。 + +所以本模块的流程是: + +``` +1. 从 snapshot(登录后抓的 Get 响应)建立基线 +2. 按本局数据演算出新状态,并对差分节点算 (新 - 基线) +3. 用 patch 做精确覆盖 +4. 生成 11 条位串(长度自动对齐对应数组) +``` + +### 4.3 差分算法(复刻 `VOExtensions.BuildListData`) + +三个要点(源码 `VOExtensions.cs:309-324`): + +1. `nsrc.Except(osrc)` 退化成**全字段逐字段比较** → 任一字段变了整条就回传 +2. `compare` 委托**只用于算位串**,不参与剔除 +3. 位串 `"0"` = 存量已有同主键(更新)、`"1"` = 全新(新增) + +### 4.4 收藏夹是特例 + +`build_favorite_delta()` 复刻 `VOExtensions.cs:345-367`:**不做剔除,恒返回完整 5 条**, +位串按真机 `"22212"` 反推: + +- `"2"` = 服务器侧有对应 itemKind +- `"1"` = 服务器侧查不到(真机 `itemKind=10` 的 Get 响应回的是 `{"itemKind":null}`) + +> 因此**必须用未归一化的原始 Get 响应作基线**。`user_favorite.py` 会把原始副本 +> 放在返回值的 `_raw` 里,`upsert_snapshot.py` 把它存成 `_raw_favorite`。 + +--- + +## 五、userPlaylogList(110 字段成绩明细) + +依据 `Net.VO.Mai2/UserPlaylog.cs`,实际声明 **110 个** `public` 字段。 + +### 5.1 ★ 字段必须全部发送 + +把真机报文的 `userPlaylogList[0]` 与 C# 声明做集合比对: + +| 比对方向 | 结果 | +|---|---| +| C# 声明但报文未出现 | **0 个** | +| 报文有但 C# 未声明 | **0 个** | + +**能精简的是「填写的内容要真实」,而不是删字段。** + +### 5.2 值之间的硬性关系(`validate_user_playlog()` 会查) + +| 关系 | 说明 | +|---|---| +| 各类型判定数之和 == `totalCombo` | totalCombo 是**该谱面 note 总数** | +| `maxCombo` <= 判定总数 | 全连时二者相等 | +| `achievement > 0` 时不应全是 Miss | 否则数值矛盾 | +| `isClear=True` 时 `achievement` 不能为 0 | 否则矛盾 | +| `comboStatus=1`(全连)时 `maxCombo == 判定总数` | | +| `extNum4` == `userExtend.categoryIndex` | 曲种索引冗余两处 | + +### 5.3 ★ 日期字段的真实语义(`TimeManager.cs`) + +真机 `TimeManager` 的日期处理有三个容易搞错的点: + +```csharp +// Manager/TimeManager.cs:9 +public static readonly TimeSpan CSToffset = new TimeSpan(8, 0, 0); + +// :33-37 把 Unix 秒转成"北京时间墙上时间" +public static DateTime GetDateTime(long unixTime) + => DateTimeOffset.FromUnixTimeSeconds(unixTime).DateTime.Add(CSToffset); + +// :77-85 ★ 游玩日志日不是自然日:7 点前算前一天 +public static DateTime ToLogDateTime(DateTime dateTime, int hour = 0) +{ + DateTime result = new(dateTime.Year, dateTime.Month, dateTime.Day, hour, 0, 0); + if (7 > dateTime.Hour) return result.AddDays(-1.0); + return result; +} +``` + +对应到 `VOExtensions.cs:1290-1292`: + +| 字段 | 算法 | 真机值 | +|---|---|---| +| `loginDate` | `GetUnixTime(LastLoginDate)` → **标准 Unix 秒** | 1791130777 | +| `playDate` | `GetLogDateString(playTime)` → **日志日**(7 点前回退一天) | "2026-10-04" | +| `userPlayDate` | `GetDateString(playTime)` → 北京时间墙上串 | "2026-10-05 00:20:30.0" | + +★ 注意 `loginDate` 是**标准 Unix 秒**,不是 `loginDateTime`: + +``` +loginDateTime = 1791159576 (「墙上时间当 UTC」) +loginDate = 1791130777 (= loginDateTime - 28800,标准 Unix 秒) +``` + +### 5.4 bool 字段陷阱 + +`extBool1/2/3` 在 C# 里是 `bool`,但**名字不带 `is` 前缀**。 +用 `name.startswith("is")` 判断会漏掉它们,导致序列化成 `0` 而不是 `false`。 +本模块用显式的 `PLAYLOG_BOOL_FIELDS` 集合判定。 + +同理,字符串字段(`vsUserName` / `playedUserNameN` 等)默认值必须是 `""` 而非 `0`, +见 `PLAYLOG_STRING_FIELDS`。 + +--- + +## 六、userGamePlaylogList + +真机样本(13 字段): + +```json +{"playlogId":7692848101484135861,"version":"1.56.00","playDate":"2026-10-05 00:20:57.0", + "playMode":0,"useTicketId":-1,"playCredit":1,"playTrack":1,"clientId":"TESTCLIENT1", + "isPlayTutorial":false,"isEventMode":false,"isNewFree":false,"playCount":8, + "playSpecial":55951502,"playOtherUserId":0} +``` + +### 6.1 `playSpecial` 是随机位掩码 + +源码 `VOExtensions.cs:846-855`: + +```csharp +int max = 1037933; +int num2 = Random.Range(1, max) * 2069; +num2 += GameManager.CalcSpecialNum(); +int num3 = 0; +for (int i = 0; i < 32; i++) { num3 <<= 1; num3 += num2 % 2; num2 >>= 1; } +``` + +恒传 0 不像真机生成的值,`calc_play_special()` 复刻了该算法。 + +### 6.2 `playCredit` 与 `useTicketId` + +源码 `VOExtensions.cs:838-845`: + +```csharp +int num = Credit.GameCostEnoughPlay(); // 投币成本 +int useTicketId = TicketManager.GetUseTicketId(playerId); +int ticketCredit = TicketManager.GetTicketCredit(useTicketId); +int playCredit = num + ticketCredit; // 本局折合多少 credit +``` + +`useTicketId = -1` 表示**不使用票**(`TicketManager.cs:47` 初始化即 -1)。 + +--- + +## 七、字段裁剪(Get 侧 → Upsert 侧要丢掉的) + +| 节点 | 丢弃字段 | +|---|---| +| `userData` | `friendCode`、`nameplateId`、`trophyId`、`cmLastEmoneyCredit`、`cmLastEmoneyBrand` | +| `userOption` | `tempoVolume` | +| `userCharacterList` | 只保留 `characterId`/`level`/`awakening`/`useCount` | +| `userMusicDetailList` | `extNum2` | +| `userChargeList` | `extNum1` | +| `userMissionDataList` / `userWeeklyData` | `userId` | + +### 7.1 `banState` 位置漂移 + +- **Get 侧**:`banState` 是 `userData` 的**同级顶层**字段(`UserDetailResponseVO.cs:15`) +- **Upsert 侧**:它被**移进了 `userData` 内部** + +`_extract_from_get_responses()` 会自动搬运。 + +--- + +## 八、安全闸门 + +| 调用方式 | 行为 | +|---|---| +| `UpsertUserAll(...)` | 抛 `ConfirmRequiredError`,**未发包** | +| `UpsertUserAll(..., dry_run=True)` | 只构造并返回报文 | +| `UpsertUserAll(..., confirm=True)` | 真实发送 | + +全局开关在 `config.py`:`UPSERT_CONFIRM = False`(改成 True 会永久放行,不建议)。 + +### 8.1 发包前冷却(默认 60 秒) + +真实发包前会固定等待 `config.UPSERT_SEND_COOLDOWN_SEC` 秒(**默认 60**), +让上报节奏贴近真机 —— 真机从登录到结算上报间隔约 81 秒 +(`source/2026-10-05.log:25` 登录 → `:123` 上报)。 + +| 调用方式 | 是否等待 | +|---|---| +| `dry_run=True` | 不等待(只构造报文) | +| 未开闸门(`confirm` 未置位) | 不等待(直接抛 `ConfirmRequiredError`) | +| `confirm=True` | **等待 60 秒**后再发包 | + +实现要点: + +- 冷却位于**「发包前自检」之后** —— 自检有问题时会先看到告警,不必白等 60 秒 +- 每 10 秒打印一次进度,避免刷屏又能看出没卡死 +- 调试时跳过:`cooldown_sec=0` + +``` +上传成绩冷却:等待 60.0 秒后再发送(模拟真机节奏)... + 冷却中 ... 已等待 10s / 剩 50s + 冷却中 ... 已等待 20s / 剩 40s + 冷却中 ... 已等待 30s / 剩 30s + 冷却中 ... 已等待 40s / 剩 20s + 冷却中 ... 已等待 50s / 剩 10s +冷却结束(共等待 60.0 秒) +闸门已放行,开始上传成绩 ... +``` + +```python +UpsertUserAll(..., confirm=True) # 默认按 config 的 60 秒 +UpsertUserAll(..., confirm=True, cooldown_sec=0) # 调试时跳过 +wait_send_cooldown(60, label="上传成绩") # 也可单独调用 +``` + +--- + +## 九、完整用法 + +### 9.1 ★ 推荐写法:一个 `UpsertUserAll` 就够了 + +```python +from api import (setup_logging, teardown_logging, + ParseQRCode, UserPreview, UserLogin, UserLogout, LogoutType, + UpsertUserAll) +from config import REGION_ID, PLACE_ID + +setup_logging("结算") # ← 只需要这一句日志;api 自己会记 +try: + user_id, token = ParseQRCode(qr) + UserPreview(user_id, token) + login = UserLogin(user_id, token, region_id=REGION_ID, place_id=PLACE_ID) + + # ★ 一个函数跑完:抓快照 -> 组包 -> 前置接口 -> 自检 -> 冷却 -> 发包 -> 落库回查 + UpsertUserAll( + user_id, login.loginId, + login_date_time=login.loginDateTime, + auth_date_time=login.dateTime, + token=token, # 让内部自动抓基线快照 + dry_run=True, # 先只看报文;真实发送改成 confirm=True + ) + + UserLogout(user_id, token, login.loginDateTime, + logout_type=LogoutType.TestIn, + region_id=REGION_ID, place_id=PLACE_ID) +finally: + teardown_logging() +``` + +**注意 `snapshot` 都不用自己抓** —— 传了 `token` 且 `auto_snapshot=True`(默认), +`UpsertUserAll` 内部会调 `fetch_upsert_snapshot`。 + +### 9.2 想手工控制每一步(进阶) + +```python +snapshot = fetch_upsert_snapshot(user_id, token=token) # 自己抓 +play = build_play_from_config() # 自己改本局数据 +play.characters = derive_play_characters(snapshot, play) # 自己推角色 + +UpsertUserAll(user_id, login.loginId, + login_date_time=login.loginDateTime, + snapshot=snapshot, play=play, + pre_new_item_list=False, # 不调前置接口 + verify_landing=False, # 不做落库回查 + dry_run=True) +``` + +### 9.3 想额外塞节点:`extra_data` + +```python +UpsertUserAll( + user_id, login.loginId, + login_date_time=login.loginDateTime, + auth_date_time=login.dateTime, + token=token, + extra_data={ + "userKaleidxScopeList": [{ + "gateId": 1, "isGateFound": True, "isKeyFound": True, "isClear": False, + "totalRestLife": 0, "totalAchievement": 0, "totalDeluxscore": 0, + "bestAchievement": 0, "bestDeluxscore": 0, + "bestAchievementDate": "", "bestDeluxscoreDate": "", + "playCount": 0, "clearDate": "", "lastPlayDate": "", "isInfoWatched": False, + }], + "isNewKaleidxScopeList": "1", + }, + confirm=True, +) +``` + +`extra_data` 会自动匹配节点名、按形态强制转换、覆盖快照演算结果: + +| 输入 | 行为 | +|---|---| +| 键不在 36 节点里 | 抛 `PatchError`,报错信息里列出全部可用节点名 | +| 值形态不对(如对象节点传数组) | 抛 `PatchError` | +| 给了数组但没给对应位串 | 按数组长度补 `"0"`,并在日志里提示「新增条目请显式传 "1"」 | +| 也接受 JSON 字符串 / JSON 文件路径 | 内部用 `load_extra_data` 规整 | + +> 位串 `"0"` = 存量已有(更新),`"1"` = 全新(新增)。 +> 传新增条目时**一定要显式给 `"1"`**,否则服务端会当成更新。 + +--- + +## 十、歌曲数据在哪改 + +全部在 `config.py` 的 `PLAY_*` 系列(默认值取自真机 `source/2026-10-05.log:123`): + +| 配置项 | 含义 | 真机默认 | +|---|---|---| +| `PLAY_MUSIC_ID` / `PLAY_MUSIC_LEVEL` | 曲目与难度 | 143 / 4 | +| `PLAY_ACHIEVEMENT` | 达成率 ×10000 | 0 | +| `PLAY_JUDGE_COUNTS` | 判定明细 | 全 Miss | +| `PLAY_TOTAL_COMBO` | 谱面 note 总数 | 655 | +| `PLAY_CATEGORY_INDEX` | 曲种索引(== userExtend.categoryIndex) | 2022 | +| `PLAY_CHARACTERS` | 游玩时的角色快照(**不加经验**)★ 通常不用管,见 10.2 | 5 只 | +| `PLAY_MAP_DISTANCE_GAIN` | 地图进度增量 | **0**(不推进地图) | +| `PLAY_CHARACTER_EXP_GAIN` | 组队角色等级增量 | **0**(不给角色加经验) | +| `PLAY_LOCAL_PLAY_COUNT` | 机台本地计数器 | 8 | +| `PLAY_SPECIAL_NUM` | playSpecial 里的 CalcSpecialNum | 1024 | + +**换歌 / 换成绩只改这里,不用动任何 api 脚本。** + +### 10.1 ★ 两个默认 0 的含义 + +`PLAY_MAP_DISTANCE_GAIN` 与 `PLAY_CHARACTER_EXP_GAIN` **默认都是 0**, +即「本局不推进地图、不给角色加经验」,对应节点回传空数组: + +```json +"userMapList": [], "isNewMapList": "" +"userCharacterList": [], "isNewCharacterList": "" +``` + +这是**预期行为,不是错误**。`validate_before_send()` 也只在 +「你把增量设成非 0、却没产出条目」时才告警。 + +想复刻真机的「地图 +11000 / 组队 5 只各 +1 级」,把这两个值改回 +`11000` / `1` 即可(真机样本:mapId=550003 的 distance 1424000→1435000)。 + +### 10.2 ★ `PLAY_CHARACTERS` 通常不用管 + +`UpsertUserAll` 默认会调 `derive_play_characters(snapshot)`, +直接从服务器刚下发的 `userData.charaSlot` + `userCharacterList` +推出**游玩前**的 5 只角色,并覆盖这份配置。 +只有拿不到快照(纯离线组包)时才会回退到这里。 + +--- + +## 十一、接口速查 + +| 函数 | 作用 | +|---|---| +| `UpsertUserAll(...)` | ★ 主函数:**一个函数跑完整条结算链路**(抓快照 → 组包 → 前置接口 → 自检 → 冷却 → 发包 → 落库回查) | +| `fetch_upsert_snapshot(user_id, ...)` | 一键抓结算基线快照(`UpsertUserAll` 内部会按需自动调) | +| `build_play_from_config()` | 按 config 构造本局数据 | +| `derive_play_characters(snapshot, play)` | 从快照推游玩前 5 只角色 | +| `load_extra_data(extra)` | 把 dict / JSON 字符串 / 文件路径 规整成 dict | +| `merge_extra_data(user_all, extra)` | 把外部 JSON 合并进 36 节点(自动匹配 + 补位串 + 校验) | +| `verify_upsert_landing(user_id, snapshot, play)` | 发包后重新拉数据,确认真的落库 | +| `build_user_all(snapshot, play, patch, extra_data, ...)` | 组装 36 节点 | +| `build_user_playlog(playlog_id, login_date, ...)` | 构造 110 字段成绩明细 | +| `build_user_game_playlog(...)` | 构造 userGamePlaylogList 一条 | +| `validate_user_playlog(playlog)` | 成绩自检,返回问题列表 | +| `validate_before_send(req)` | 发包前自检,返回问题列表 | +| `build_delta(local, server, keys)` | 通用差分 | +| `build_favorite_delta(local, server)` | 收藏夹专用差分 | +| `sync_bits_to_arrays(user_all)` | 位串按数组长度补齐 | +| `coerce_node_value(node, value)` | 单节点类型强制(传错即抛) | +| `empty_user_all()` | 全空骨架 | + +--- + +## 十二、必知的坑 + +**完整清单(28 条,含现象/根因/源码依据/正确做法/自检项)见 +[`UpsertUserAll踩坑清单.md`](UpsertUserAll踩坑清单.md)。** + +先记住最要命的五条: + +1. **服务端返回 `returnCode=1` 不代表数据被应用** —— 唯一验收标准是发包后回查数值有没有变 +2. **`userData` 是整表覆盖语义** —— 原样回传旧值 = 什么都没发生(这是「回码成功但没落库」的头号成因) +3. **差分节点必须反映本局变化** —— `userMusicDetailList`/`userMapList`/`userCharacterList` 全空 = 服务端认为本局无变化 +4. **`playlogId` / `loginDateTime` 必须逐字节等于 `UserLoginApi` 的返回值** +5. **`userWeeklyData` / `user2pPlaylog` 是对象不是数组**;**`userChargeList` 是整表回传不是差分** + +--- + +## 十三、验证方式 + +```powershell +python selftest.py +``` + +覆盖 **196 项**零网络检查,含:URL 混淆(对真机 md5 值)、加解密往返、 +36 节点结构与形态、110 字段完整性、差分算法、收藏夹三值位串、日期语义、 +副作用闸门、位串自动补齐、快照归一化、配置常量、 +`derive_play_characters` 角色推导、`extra_data` 四种输入形态与自动补位串、 +number 头 / Cookie 复用等。 diff --git a/docs/主脚本编写指南.md b/docs/主脚本编写指南.md new file mode 100644 index 0000000..4a80fa4 --- /dev/null +++ b/docs/主脚本编写指南.md @@ -0,0 +1,302 @@ +# 主脚本编写指南 + +> 面向「想用这个工程写自己业务流程」的人。 +> 目标:**你只写业务,日志和协议细节都交给 `api/`**。 + +--- + +## 一、三条铁律 + +### 1. 不要为每个 api 调用写日志 + +`api/` 里每个函数在导入时都被自动套了日志外壳(`log_setup.autowrap`), +调用时会自动打印: + +``` +=== UserLogin 开始运行 === + [接口说明] 用户正式登录(开启本次登录会话)。 + [位置参数] 12345678, 'TpzUKJM6x1d2iKUP5yLI' + [关键字参数] region_id=1, place_id=1000 + [运行结果] 成功 UserLoginResponseVO(8 字段)(耗时 77 ms) +=== UserLogin 运行结束 === +``` + +所以你**不需要**在调用前后写 `log_section` / `log_info`。 +主脚本里唯一必需的日志语句只有开头结尾那两句: + +```python +setup_logging("我的脚本") # 开头 +... +teardown_logging() # 结尾(写在 finally 里) +``` + +### 2. 一定要保证登出 + +账号若停留在 `isLogin=True`,下次登录会返回 `returnCode=100`。 +**用 `try/finally` 兜底**: + +```python +session = {"user_id": 0, "token": "", "login_dt": 0, "logged_in": False} +try: + ... + login = UserLogin(user_id, token, ...) + session.update(login_dt=login.loginDateTime, logged_in=True) + ... + UserLogout(...) + session["logged_in"] = False +finally: + if session["logged_in"]: + UserLogout(session["user_id"], session["token"], session["login_dt"], + logout_type=LogoutType.TestIn) +``` + +### 3. 有副作用的接口要显式开闸门 + +`UpsertUserAll` / `UpsertUserChargelog` 这类写接口默认**不发包**, +必须显式传 `confirm=True`(或 `dry_run=True` 只看报文): + +```python +UpsertUserAll(..., dry_run=True) # 只构造,不发 +UpsertUserAll(..., dry_run=False, confirm=True) # 真发 +``` + +> ⚠ 只写 `dry_run=False` **不够** —— `confirm=None` 时会去读 +> `config.UPSERT_CONFIRM`(默认 `False`),照样被拦。 + +--- + +## 二、最小骨架 + +```python +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import sys +from api import (setup_logging, teardown_logging, + ParseQRCode, UserPreview, UserLogin, UserLogout, LogoutType) +from config import REGION_ID, PLACE_ID + +def main() -> int: + setup_logging("我的脚本") + session = {"user_id": 0, "token": "", "login_dt": 0, "logged_in": False} + try: + user_id, token = ParseQRCode(sys.argv[1]) + session.update(user_id=user_id, token=token) + + UserPreview(user_id, token) # 顶号保护 + login = UserLogin(user_id, token, + region_id=REGION_ID, place_id=PLACE_ID) + session.update(login_dt=login.loginDateTime, logged_in=True) + + # ---- 你的业务写在这里 ---- + + UserLogout(user_id, token, login.loginDateTime, + logout_type=LogoutType.TestIn, + region_id=REGION_ID, place_id=PLACE_ID) + session["logged_in"] = False + return 0 + finally: + if session["logged_in"]: + try: + UserLogout(session["user_id"], session["token"], session["login_dt"], + logout_type=LogoutType.TestIn, + region_id=REGION_ID, place_id=PLACE_ID) + except Exception: + pass + teardown_logging() + +if __name__ == "__main__": + sys.exit(main()) +``` + +--- + +## 三、日志 + +### 3.1 两种模式(改 config.py 一行) + +| `LOG_LEVEL` | 输出 | +|---|---| +| `"info"`(默认) | 只展示 api 脚本的**运行情况和结果** | +| `"debug"` | 额外展示**向 api 发送的数据**和 **api 返回的数据**(含完整报文) | + +临时切换(不改 config): + +```bash +python upsert.py <二维码> --debug +``` + +> ★ DEBUG 会完整打印收发报文,一次结算流程能到 **十几 MB**。 +> 只想看流程就别开;想瘦身调 `config.LOG_VALUE_MAX`。 + +### 3.2 两个日志文件(同时写) + +| 文件 | 模式 | 内容 | +|---|---|---| +| `logs/latest.log` | 覆盖(`w`) | 只含**当次**主脚本运行 | +| `logs/YYYY-MM-DD.log` | 追加(`a`) | 当日**全部**日志 | + +### 3.3 想记自己的话(可选) + +```python +from api import log_info, log_warning, log_error, log_section, log_field + +log_section("阶段标题") # 带分隔线 +log_info("普通信息") +log_warning("要留意的情况") +log_error("出错了") +log_field("预览数据", preview) # INFO 一行概要;DEBUG 展开完整 JSON +``` + +### 3.4 嵌套调用也会自动记 + +`UpsertUserAll` 内部会调 `fetch_upsert_snapshot` / `UserNewItemList` / `UserData`, +这些**内部调用同样打印自己的开始/结束行**,日志层次完整嵌套: + +``` +=== UpsertUserAll 开始运行 === + === fetch_upsert_snapshot 开始运行 === + ... + === fetch_upsert_snapshot 运行结束 === + === UserNewItemList 开始运行 === + ... + === UserNewItemList 运行结束 === + ... +=== UpsertUserAll 运行结束 === +``` + +--- + +## 四、参数约定 + +| 类型 | 位置 | 例子 | +|---|---|---| +| **业务数据**(必需) | 位置参数 | `user_id` / `token` / `二维码` / `playlog_id` / `charge_id` | +| **配置项**(可省) | 关键字参数 | `client_id` / `region_id` / `place_id` / `timeout_ms` / `client` | + +**`client` 参数**:所有 api 都接受一个可选的 `MaimaiNetClient`。 +不传时走全局单例 `get_default_client()`,**连接和 Cookie(JSESSIONID)自动复用**。 + +> ### ★ 不要自己 `MaimaiNetClient()` 新建去发任何带 userId 的包 +> +> 源码 `Packet.cs:187-194`:**所有非 Ping 且 `userId != 0` 的请求都会 +> `Client.AddCookie(Query.UserId)`** —— **登出也不例外**。 +> +> ```csharp +> if (!IsPingPacket()) +> { +> Client.AddHeader("number", GameManager.PingMsec.ToString()); +> if (Query.UserId != 0L) { Client.AddCookie(Query.UserId); } // ← 登出也走这里 +> } +> ``` +> +> 那个 CookieContainer 是 **`UserLoginApi` 响应里的 `Set-Cookie: JSESSIONID=...`** +> 存下来的(`Packet.cs:228-234`)。 +> +> **为什么对登出尤其要命**:登出请求体里**没有 token**,只有 +> `userId` / `accessCode` / `regionId` / `placeId` / `clientId` / +> `loginDateTime` / `type` / `delayLog`。 +> 服务端能用来定位「哪个会话」的,除了 `userId + loginDateTime`,就剩这个 JSESSIONID。 +> **丢掉它有可能登出失败 → 账号卡在 `isLogin=True`(下次登录 returnCode=100)**。 +> +> 结论:**全程复用同一个 client**(不传 `client=` 即默认单例,自动满足)。 + +--- + +## 五、四个典型流程模板 + +### 5.1 只登录(探活 / 查状态) + +```python +user_id, token = ParseQRCode(qr) +UserPreview(user_id, token) +login = UserLogin(user_id, token, region_id=REGION_ID, place_id=PLACE_ID) +# ... 用 UserData / UserMusicDetailAll 等取数 ... +``` + +### 5.2 上传一局成绩(最常用) + +```python +login = UserLogin(user_id, token, region_id=REGION_ID, place_id=PLACE_ID) + +# ★ 一个函数跑完整条链路:抓快照 → 推角色 → 造成绩明细 → 前置接口 +# → 组 36 节点 → 合并 extra_data → 自检 → 冷却 → 发包 → 落库回查 +UpsertUserAll( + user_id, login.loginId, + login_date_time=login.loginDateTime, + auth_date_time=login.dateTime, + token=token, # 让内部自动抓基线快照 + dry_run=False, confirm=True, +) +``` + +**换歌 / 换成绩只改 `config.py` 的 `PLAY_*`**,不用动主脚本。 + +**想额外塞节点**用 `extra_data`: + +```python +UpsertUserAll(..., extra_data={ + "userKaleidxScopeList": [{"gateId": 1, "isGateFound": True, ...}], + "isNewKaleidxScopeList": "1", +}) +``` + +### 5.3 买一张功能票 + +见 `buy_ticket.py` 与 `docs/购买功能票流程.md`。核心就一句: + +```python +UpsertUserChargelog(user_id, charge_id=2, + login_date_time=login.loginDateTime, + dry_run=False, confirm=True) +``` + +### 5.4 只取数(不发任何写接口) + +```python +from api import UserData, UserMusicDetailAll, UserRating + +ud = UserData(user_id) +print(ud["userData"]["playCount"]) + +for m in (UserMusicDetailAll(user_id).get("userMusicList") or []): + if m.get("musicId") == 143: + print(m) +``` + +> 取数类 api 不需要 `confirm`,也没有副作用,可以随便调。 + +--- + +## 六、常见错误 + +| 现象 | 原因 | 解决 | +|---|---|---| +| 登录 `returnCode=100` | 账号卡在 `isLogin=True` | 上次没登出;等超时或用 `finally` 兜底 | +| `UpsertUserAll` 抛 `ConfirmRequiredError` | 只传了 `dry_run=False`,没传 `confirm=True` | 补 `confirm=True` | +| 扫码 `errorID=2` | 二维码**过期**了。它有**时效性**(**有效期 10 分钟**),**不是按次数计量的** | 重新生成一个 | +| `returnCode=1` 但数据没变 | 差分节点全空(见踩坑清单坑 2) | 检查 `PLAY_*` 增量配置 | +| 日志文件特别大 | 开了 DEBUG | 关掉 `--debug` 或调小 `LOG_VALUE_MAX` | +| `RuntimeError: 接口 xxx 返回 0 字节` | `Accept-Encoding` 被改过 | 不要动 `maimai_net` 的该头 | + +--- + +## 七、自己写一个新 api + +1. 在 `api/` 下新建脚本,定义一个能传参的函数 +2. 函数首行写 docstring(会变成日志的 `[接口说明]`) +3. 用 `from .maimai_net import request_dict` 发包 +4. 用 `from .log_setup import log_info` 记关键结果 +5. **在 `api/__init__.py` 里导入并加进 `_API_FUNCS`** ← 漏了这步就没有开始/结束提示 + +--- + +## 八、相关文档 + +| 文件 | 内容 | +|---|---| +| `docs/项目总览.md` | 工程结构与 api 清单 | +| `docs/日志与主脚本指南.md` | 日志模块完整参考 | +| `docs/上传成绩开发文档.md` | UpsertUserAll 的 36 节点 / 110 字段 / 差分语义 | +| `docs/UpsertUserAll踩坑清单.md` | 28 条坑 + 发包前 Checklist | +| `docs/购买功能票流程.md` | 登录 → 买票 → 登出 | +| `upsert.py` | 主脚本范例(极简版) | diff --git a/docs/实跑验证记录.md b/docs/实跑验证记录.md new file mode 100644 index 0000000..4a1e874 --- /dev/null +++ b/docs/实跑验证记录.md @@ -0,0 +1,133 @@ +# 实跑验证记录(真实发包 + 落库确认) + +> 本文记录本工程**第一次真实跑通**「扫码登录 → 取数 → 上传成绩 → 落库回查 → 登出」的完整证据。 +> 执行方式:`python upsert.py <二维码> --send`(等价于下面的驱动方式)。 + +--- + +## 一、结论 + +| 环节 | 结果 | +|---|---| +| 扫码登录 | ✅ user_id=12345678,token 获取成功 | +| 用户预览 | ✅ errorId=0、banState=0、isLogin=False | +| 正式登录 | ✅ returnCode=1,loginId=7693236821794227665 | +| 抓基线快照 | ✅ 19 个节点全部成功,失败 0 个 | +| 组包 + 发包前自检 | ✅ 0 问题 | +| 冷却 | ✅ 等待 60.0 秒(模拟真机节奏) | +| **上传成绩** | ✅ **returnCode=1** | +| **落库回查** | ✅ **userData.playCount 1260 → 1261** | +| 登出 | ✅ returnCode=1 | + +**这是关键突破**:之前的失败模式是「returnCode=1 但没落库」。 +本次是**回码成功 + 重新拉服务器数据确认数值真的变了**,两者同时成立。 + +--- + +## 二、时间线(2026-10-06 01:28) + +``` +01:28:01 扫码登录成功 user_id=12345678 +01:28:01 用户登录成功 loginId=7693236821794227665 + loginDateTime=1791250081 dateTime=1791221281 +01:28:03 结算快照抓取完成 成功 19 个节点,失败 0 个 +01:28:04 角色快照取自服务器 395:3803 / 101:4458 / 400402:137 / 400401:137 / 200401:137 +01:28:04 发包前自检通过 +01:28:04 上传成绩冷却 等待 60.0 秒后再发送(模拟真机节奏) +01:29:04 冷却结束 共等待 60.0 秒 +01:29:04 上传成功 returnCode=1 +01:29:04 落库回查: + playCount 1260 -> 1261 + currentPlayCount 188 -> 189 + lastPlayDate 2026-10-05 22:32:21 -> 2026-10-06 01:28:04 + musicId=143 level=4 playCount -> 11 +01:29:05 【落库成功】userData.playCount 已 +1 +01:29:05 用户登出成功 returnCode=1 +``` + +--- + +## 三、落库证据(上传后重新拉服务器数据) + +上传成功后**不登出、立刻**调 `GetUserDataApi` + `GetUserMusicApi` 回读,服务器返回: + +```json +{ + "userData": { + "playCount": 1261, + "currentPlayCount": 189, + "lastPlayDate": "2026-10-06 01:28:04", + "lastLoginDate": "2026-10-06 01:28:01", + "eventWatchedDate": "2026-10-06 01:28:01", + "lastPlaceId": 0, + "point": 4460, + "charaSlot": [395, 101, 400402, 400401, 200401] + } +} +``` + +``` +musicId=143 level=4 -> playCount = 11 +``` + +对照**上传前**的基线:`playCount=1260`、`currentPlayCount=188`、`(143,4).playCount=10`。 +三项全部 +1,**证明服务端真的把这份报文写进去了**。 + +同时确认: +- `point` 保持 4460 不变 —— 与「`userGetPointList` / `userLoginBonusList` 留空」的预期一致 +- `lastLoginDate` = 登录时刻(01:28:01),`lastPlayDate` = 上报时刻(01:28:04),两者分离正确 +- `charaSlot` 未被破坏 + +--- + +## 四、这次跑通依赖的关键实现点 + +1. **`number` 请求头**:先跑 `Ping()` 取得往返毫秒,之后所有请求带上(本次 47 ms) +2. **Cookie 复用**:全程同一个 `MaimaiNetClient`,`UserLoginApi` 的 `Set-Cookie: JSESSIONID` 自动带入后续请求 +3. **userData 整表覆盖**:先抓 19 节点快照作基线,再按本局演算 +1 后整表回传 +4. **差分节点只回传变化项**:`userMusicDetailList` 只回传 (143,4) 那条、`userMapList` 只回传 550003、 + `userCharacterList` 只回传 5 只组队角色 +5. **11 条位串与数组长度严格对齐**:`isNewFavoriteList="22212"` 等全部复刻真机 +6. **`playSpecial` 用 `CalcSpecialNum=1024`**:与真机位模式一致 +7. **`characterLevelN` 用游玩前等级**:playlog 3803/4458/137,userCharacterList 才是 3804/4459/138 + +--- + +## 五、复现方式 + +```bash +# 1) 预检(不发包,零副作用) +python upsert.py "<二维码>" --debug + +# 2) 真实上传(★ 会把成绩写进服务器,不可撤销) +python upsert.py "<二维码>" --send + +# 想跳过 60 秒冷却 +python upsert.py "<二维码>" --send --cooldown 0 + +# 想跳过上传后的落库回查 +python upsert.py "<二维码>" --send --no-verify +``` + +`--send` 会自动做落库回查:重新拉 `GetUserDataApi` + `GetUserMusicApi`, +对比 `playCount` 有没有 +1,并打印 `【落库成功】` 或 `【疑似未落库】`。 + +> ★ 建议先用 `--debug` 跑一次预检:DEBUG 日志会完整打印请求头、请求体、响应体, +> 便于逐字段核对。代价是日志文件会很大(本次 DEBUG 日志约 200 万行)。 + +--- + +## 六、账号状态变化(本次真实写入的内容) + +| 项 | 上传前 | 上传后 | +|---|---|---| +| `userData.playCount` | 1260 | **1261** | +| `userData.currentPlayCount` | 188 | **189** | +| `userData.lastPlayDate` | 2026-10-05 22:32:21 | **2026-10-06 01:28:04** | +| `userMusicDetailList` (143, Re:Master) playCount | 10 | **11** | +| `userMapList` 550003 distance | 1457000 | **1468000**(+11000) | +| `userCharacterList` 5 只组队角色 | 3803/4458/137/137/137 | **3804/4459/138/138/138**(+1) | +| `userData.point` | 4460 | 4460(不变) | + +写入的 `userPlaylogList[0]` 是 `musicId=143`(Re:Master)全 Miss 的失败局, +判定数 441/19/192/0/3,与 `config.PLAY_*` 一致。 diff --git a/docs/日志与主脚本指南.md b/docs/日志与主脚本指南.md new file mode 100644 index 0000000..b87f923 --- /dev/null +++ b/docs/日志与主脚本指南.md @@ -0,0 +1,380 @@ +# 日志与主脚本指南 + +> 模块:`api/log_setup.py` | 模式:INFO / DEBUG + +--- + +## 一、一句话理解 + +**api 调用会被自动识别并记录,主脚本不用写任何日志代码。** + +主脚本要写的只有两件: + +```python +setup_logging("脚本名") # 开头一句 +... # 业务代码,照常调 api +teardown_logging() # 结尾一句(不写也会在退出时自动收尾) +``` + +--- + +## 二、自动日志长什么样 + +调用了 `ParseQRCode` 与 `UserPreview`,日志自动产出: + +``` +================================================================== + 日志会话开始 —— main +================================================================== + 主脚本 : main + 开始时间 : 2026-10-05 17:37:42 + 日志模式 : INFO(仅运行情况与结果) + Python : 3.12.6 (CPython AMD64) + 工作目录 : D:\SDGBSource\杂乱的api\wahappy-v0-goal + 已挂载 api : 60 个(自动跟踪,主脚本无需写日志代码) + 当次日志 : ...\logs\latest.log + 日期日志 : ...\logs\2026-10-05.log +================================================================== + +=== ParseQRCode 开始运行 === + [接口说明] 解析二维码并换取 userId 与 token。 + [位置参数] SGWCMAID2610022219463A297AF4CAB863406AA91ED2D29FF3BE20BF1113AC03095D97BD1573EDD691B6 +解析二维码登录:chip_id=TESTCLIENT1 +发送登录请求:timestamp=261005173742 host=ai.sys-allnet.cn/wc_aime/api/get_data +扫码登录成功:user_id=12345678 token=t3WikM5n...(长度 20) + [运行结果] 成功 tuple(2 项)(耗时 412 ms) +=== ParseQRCode 运行结束 === + +=== UserPreview 开始运行 === + [接口说明] 获取用户预览信息。 + [位置参数] 12345678, 'TESTTOKEN0000000000' + [关键字参数] client_id='TESTCLIENT1' +获取用户预览:user_id=12345678 client_id=TESTCLIENT1 +用户预览获取完成:userName=☆Astral☆ playerRating=15000 isLogin=False isNetMember=1 + [运行结果] 成功 UserPreviewResponseVO(22 字段)(耗时 388 ms) +=== UserPreview 运行结束 === + +================================================================== + 本次运行调用的 api +================================================================== + 1. ParseQRCode + 2. UserPreview +================================================================== + 日志会话结束 —— main +================================================================== +``` + +自动带出来的东西: + +| 自动内容 | 来源 | +|---|---| +| `===函数名 开始运行===` / `===函数名 运行结束===` | 导入时自动包装 | +| `[接口说明]` | 函数 docstring 首行 | +| `[位置参数]` / `[关键字参数]` | 本次调用传入的值 | +| `[运行结果]` | 成功摘要或异常类型,附耗时 | +| 会话结束的 **api 汇总清单** | 运行时记录调用顺序 | + +--- + +## 三、两种模式 + +| 模式 | 你能看到什么 | +|---|---| +| **INFO**(默认) | 开始 → 接口说明 → 参数 → 结果 → 结束 | +| **DEBUG** | 上面全部 **+** 请求 URL、请求头、**请求体 JSON 全文**、状态码、耗时、响应头、**响应体 JSON 全文** | + +切换方式:改 `config.py` 一行。 + +```python +LOG_LEVEL = "info" # 日常运行 +LOG_LEVEL = "debug" # 排查协议问题 +``` + +DEBUG 下额外多出: + +``` +-> 请求 GetGameSettingApi + URL : https://maimai-gm.wahlap.com:42081/Maimai2Servlet/mE2s3Jhd/83a5d5a20b062c5c2ad817460b8f7f76 + 请求头 : {"Content-Type":"application/json","charset":"UTF-8","Mai-Encoding":"1.55","User-Agent":"83a5...#TESTCLIENT1","Accept-Encoding":"","Content-Encoding":"deflate"} + 请求体 : + { + "placeId": 1000, + "clientId": "TESTCLIENT1" + } + +<- 响应 GetGameSettingApi + 状态码 : 200 + 耗时 : 312 ms + 响应头 : {"Date":"...","Content-Type":"application/json"} + 响应体 : + { + "isAouAccession": false, + "gameSetting": { + "isMaintenance": false, + "requestInterval": 1200, + ... + } + } +``` + +> DEBUG 模式下**完整输出,不折叠、不截断** —— 调试时就是要能逐条核对 +> 1000+ 条曲目、104 条地图。如需限制,改 `config.py` 的 `LOG_VALUE_MAX`。 + +--- + +## 四、主脚本怎么写 + +### 4.1 ★ 核心原则:**不要为每个 api 调用写日志** + +日志全部写在 api 脚本内部。主脚本**只需要**: + +1. 开头 `setup_logging("脚本名")` +2. 照常调 api 函数 +3. 结尾 `teardown_logging()` + +**不要**在每次调用前写 `log_section`、调用后写 `log_info` —— 那是多余的, +api 函数自己会打印 `=== 函数名 开始运行 ===` / `[运行结果]` / `=== 函数名 运行结束 ===`。 + +> 完整范例见工程根目录的 `upsert.py`:整条「扫码 → 预览 → 登录 → 结算上传 → 登出」 +> 只有四行业务代码,**一行日志都没写**。 + +### 4.2 最小可用版本 + +```python +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import sys +from api import (setup_logging, teardown_logging, + ParseQRCode, UserPreview, UserLogin, UserLogout, LogoutType) + +def main() -> int: + setup_logging("我的脚本") # ← 只需要这一句 + try: + user_id, token = ParseQRCode(sys.argv[1]) + UserPreview(user_id, token) + login = UserLogin(user_id, token) + UserLogout(user_id, token, login.loginDateTime, + logout_type=LogoutType.TestIn) + return 0 + finally: + teardown_logging() +``` + +**就这些。** 没有装饰器,没有埋点,没有 log_section。 + +### 4.3 嵌套调用也会自动记日志 + +`UpsertUserAll` 内部会调 `fetch_upsert_snapshot` / `UserNewItemList` / `UserData`, +这些**内部调用同样会打印自己的开始/结束行**(见 `upsert_user_all._resolve_api_func`), +所以结算链路的日志层次是完整嵌套的: + +``` +=== UpsertUserAll 开始运行 === + [接口说明] 上传一局成绩(UpsertUserAllApi)—— 一个函数跑完整条结算链路。 + === fetch_upsert_snapshot 开始运行 === + ... + === fetch_upsert_snapshot 运行结束 === + === UserNewItemList 开始运行 === + ... + === UserNewItemList 运行结束 === + ... +=== UpsertUserAll 运行结束 === +``` + +### 4.4 想额外记点自己的话(可选) + +不写也完全不影响: + +```python +from api import log_info, log_warning, log_error, log_section, log_field + +log_section("阶段标题") # 带分隔线的分节 +log_info("普通信息") # 就当成「会进日志文件的 print」 +log_warning("需要留意的情况") +log_error("出错了") +log_field("预览数据", preview) # INFO 一行概要;DEBUG 展开完整 JSON +``` + +### 4.5 ★ 保证登出 + +账号若停留在 `isLogin=True`,下次登录会 `returnCode=100`。用这个模板: + +```python +session = {"user_id": 0, "token": "", "login_dt": 0, "logged_in": False} +try: + ... + login = UserLogin(user_id, token) + session.update(login_dt=login.loginDateTime, logged_in=True) + ... + UserLogout(...) + session["logged_in"] = False +finally: + if session["logged_in"]: + log_warning("[收尾] 异常中断,强制登出 ...") + try: + UserLogout(session["user_id"], session["token"], session["login_dt"], + logout_type=LogoutType.TestIn) + except Exception as e: + log_error(f"[收尾] 强制登出失败:{e}") +``` + +--- + +## 五、api 脚本怎么写 + +**不用加装饰器**,直接定义函数就行: + +```python +# api/userpreview.py +from .log_setup import log_info, log_debug, log_request, log_response +from .maimai_net import request_dict + +def UserPreview(user_id: int, token: str, *, client_id: str = CLIENT_ID): + """获取用户预览信息。""" # ← 首行成为 [接口说明] + log_info(f"获取用户预览:user_id={user_id}") # 可选 + + raw = request_dict("GetUserPreviewApi", req, user_id=user_id, client_id=client_id) + # ↑ maimai_net 内部已经调了 log_request / log_response, + # DEBUG 模式下会自动输出收发数据,不用在这里重复写 + + return parse(raw) +``` + +### 新增 api 必须登记 + +写完新函数后,在 `api/__init__.py` 做两步: + +```python +# 1) 导入 +from .xxx import MyNewApi + +# 2) 加进跟踪名单 +_API_FUNCS = ( + "ParseQRCode", + "UserPreview", + ... + "MyNewApi", # ← 加这里 +) +``` + +`autowrap(globals(), _API_FUNCS)` 会在导入时自动给它套上日志外壳。 +**漏了这步,该函数就不会输出 `===开始运行===`。** + +--- + +## 六、完整 API 参考 + +### 6.1 会话(主脚本用) + +```python +setup_logging(script_name, level=None) -> str + # 初始化会话:确定模式、打开两个日志文件、打印横幅 + # level=None 时读 config.LOG_LEVEL + # 同一进程重复调用安全(只初始化一次) + +teardown_logging() + # 收尾:打印「本次运行调用的 api」清单 + 结束横幅 + 关文件 + # 不调用也会在退出时自动执行 +``` + +### 6.2 自动跟踪 + +```python +autowrap(namespace, names) -> list[str] # api/__init__.py 调用,一般不用手写 +get_called_apis() -> list[str] # 本次会话调用过的 api,按首次调用顺序 +``` + +### 6.3 模式 + +```python +get_level() -> "info" | "debug" +set_level(v) -> "info" | "debug" +is_debug() -> bool +LEVEL_INFO = "info" +LEVEL_DEBUG = "debug" +``` + +### 6.4 流程日志(INFO 可见) + +```python +log_info("普通信息") +log_step("扫码登录") # → [步骤] 扫码登录 +log_step("扫码登录", index=1, total=5) # → [步骤 1/5] 扫码登录 +log_result("user_id=123") # → [结果] user_id=123 +log_warning("账号已登录") # → [警告] ... +log_error("网络不可达") # → [错误] ... +log_section("阶段标题") # 带分隔线的分节 +log_field("预览数据", preview) # INFO 一行;DEBUG 多行展开 +log_field("原始响应", text, debug_only=True) # 只在 DEBUG 出现 +``` + +### 6.5 收发数据日志(DEBUG 专属) + +```python +log_debug("只在 DEBUG 出现") +log_request(url="https://...", body=req, headers=hdr, api_name="XxxApi") +log_response(status=200, body=raw, headers=hdr, api_name="XxxApi", elapsed_ms=412) +log_payload("解密后明文", text) +``` + +**INFO 模式下这些函数第一行就 `return`**,不做序列化、不拼字符串,可以放心留在热路径里。 + +### 6.6 兼容写法 + +```python +from api import api_log, get_logger + +@api_log # 仍可用(会自动跳过重复包装) +def MyFunc(): ... + +logger = get_logger() +logger.info("..."); logger.warning("..."); logger.debug("...") +``` + +--- + +## 七、日志文件 + +| 文件 | 打开模式 | 说明 | +|---|---|---| +| `logs/latest.log` | `w`(覆盖) | 每次运行重写,**只保留最近一次** | +| `logs/YYYY-MM-DD.log` | `a`(追加) | **当日所有运行累积**,按天分文件 | + +两者**同时写入**。每行都带 `[YYYY-MM-DD HH:MM:SS]` 时间戳。 + +DEBUG 的收发数据同样写进文件,可以跑一次 DEBUG 再翻 `latest.log`。 + +--- + +## 八、常见问题 + +**Q: 为什么 api 调用没有 `===开始运行===`?** +A: 该函数没登记在 `api/__init__.py` 的 `_API_FUNCS` 里。补上即可。 + +**Q: 为什么 `log_debug` 什么都没输出?** +A: 当前是 INFO 模式。改 `config.py` 的 `LOG_LEVEL = "debug"`。 + +**Q: 改了 config.py 没生效?** +A: 模式在 `setup_logging()` 时读取。之前已初始化过就需重启脚本, +或显式 `setup_logging("名字", level="debug")`。 + +**Q: 主脚本没调用 `setup_logging` 会怎样?** +A: 仍会打印到控制台(自动跟踪在导入时就生效),但不写文件、没有横幅与汇总。 + +**Q: 写测试 / 单独跑 api 脚本时不想要日志?** +A: 不调用 `setup_logging` 就不会开文件;控制台输出仍在。 + +**Q: 能完全关掉吗?** +A: 可以 `set_level("info")` 抑制 DEBUG 部分。要连控制台也静音需改 `_emit` 的 `console` 参数。 + +--- + +## 九、相关文件 + +| 文件 | 作用 | +|---|---| +| `api/log_setup.py` | 日志模块本体(含自动包装引擎) | +| `api/__init__.py` | 统一导出 + `_API_FUNCS` 登记表 | +| `config.py` | `LOG_LEVEL` / `LOG_VALUE_MAX` 开关 | +| `upsert.py` | 主脚本范例(含完整的登出兜底) | +| `api/maimai_net.py` | 网络层,已接入 DEBUG 收发数据日志 | diff --git a/docs/真机Hook对照报告.md b/docs/真机Hook对照报告.md new file mode 100644 index 0000000..1f24f5a --- /dev/null +++ b/docs/真机Hook对照报告.md @@ -0,0 +1,215 @@ +# 真机 Hook 对照报告(MaimaiNetSpy 实测) + +> 本文记录用 MelonLoader Mod **MaimaiNetSpy** 在真机上抓取一整局(登录 → 游玩 → 结算上报 → 登出) +> 的完整网络行为,并与本工程的实现逐项对照后做的修正。 +> +> 抓包样本: +> - `D:\SDGB2026\Package\MaimaiNetSpy\2026-10-05_222919.log`(70 个请求的人类可读时间线) +> - `D:\SDGB2026\Package\MaimaiNetSpy\raw\*`(每个接口的请求/响应原文 JSON) +> - 关键样本:`raw/068_UpsertUserAllApiMaimaiChn_request.json`(17164 字节明文) +> +> Hook 挂载点(`gamehook/Main.cs`,8 个,全部 `[ok]`): +> `NetHttpClient.Create / AddHeader / AddCookie / Request / GetResponse`、 +> `NetPacketUtil.GetUserAgent`、`GameManager.CalcSpecialNum`、`NetHttpClient.SetError` + +--- + +## 一、结论速览 + +| 项 | 结论 | +|---|---| +| UpsertUserAll 报文内容 | **与真机逐字段一致**(顶层 7 键、36 节点、110 字段 playlog、11 条位串全部对齐) | +| 报文长度 | 真机 17164 B / 本工程 17164 B(同一基线重建) | +| 剩余差异 | 只有「随机数」和「时刻字符串」,见第五节 | +| HTTP 头 | `number` 已修正;`Cookie` 经实测为**无需处理**;其余一致 | +| `playSpecial` | 已按 `CalcSpecialNum = 1024` 修正 | +| `characterLevel1..5` | **发现并修掉一处回归**:应为游玩前等级,不加经验 | + +--- + +## 二、`number` 请求头:真机不是恒 0,也不是每包都变 + +抓到的 70 个请求里 `number` 只有两次取值变化: + +``` +#1 ~ #10 number = 0 ← 还没跑过心跳 +#11 ~ #17 这是 Ping 心跳包(按 Packet.cs:187 不带 number 头) +#18 ~ #70 number = 63 ← 心跳往返 63 ms,此后 53 个业务请求全部恒定 +``` + +**源码链路**(逐条可查): + +``` +Main/PingChecker.cs:166 PacketHelper.StartPacket(new PacketPing(PingSuccess, PingError)) +Net.Packet.Mai2/PacketPing.cs:34 + _onDone((int)sw.ElapsedMilliseconds) ← 值 = Ping 包往返毫秒 +Main/PingChecker.cs:227 GameManager.PingMsec = pingMsec +Net.Packet/Packet.cs:187-189 if (!IsPingPacket()) Client.AddHeader("number", GameManager.PingMsec.ToString()); +``` + +即:`number` = `GameManager.PingMsec`,**只由 Ping 心跳刷新**,普通业务请求不改动它。 + +### 本工程的修正 + +`api/maimai_net.py`: + +- 字段从 `last_ping_msec`(每个请求都更新)改成 **`ping_msec`(只有 Ping 包更新)**, + 并保留 `last_ping_msec` 只读属性兼容旧代码。 +- `request()` 里新增:`if api_name.startswith("Ping"): self.ping_msec = elapsed_ms`。 +- `_build_headers()` 的 `ping_msec` 参数默认 `None`(= 取 `self.ping_msec`)。 +- `upsert.py` 在取完服务器设置后加了一步 `Ping()`(真机也是在第一屏之后跑心跳)。 + +> 实测:本机到该服务器 Ping 往返约 **266 ms**,所以本脚本发出去的 `number` 会是那个值, +> 而不是真机的 63 —— 这是**网络环境差异,不是实现差异**。 + +--- + +## 三、`Cookie` 头:hook 显示的串是假的,但 Cookie 本身是真的 + +抓包日志里从 #18 起显示 `Cookie : userId=12345678`,一度被误认为「要手工带一个 userId Cookie」。 + +**核实过程(两步,第二步推翻了我自己的第一步结论)**: + +1. `gamehook/Main.cs:196-199` 的 `PreAddCookie(ulong userId)` 里写的是 + `_cookie = "userId=" + userId;` —— 这行是 **hook 自己拼的展示串**, + **不是真实的 HTTP Cookie 头**。 + 它出现的位置正好对应 `Packet.cs:190-193` 的 + `if (Query.UserId != 0L) Client.AddCookie(Query.UserId);`, + 只是「本次请求带了 userId」的意思。 + +2. **但 Cookie 机制本身是真实存在的**,而且很关键。 + 用 `Ping` 探针看不到 Set-Cookie(Ping 响应头只有 + `Date / Content-Type / Content-Length / Connection / Pragma / Cache-Control`), + 于是我先得出了「服务器从不下发 Cookie」的结论 —— **这是错的**。 + 后来跑完整登录链路时,`UserLoginApi` 的响应头里明确有: + ``` + Set-Cookie: JSESSIONID=FC9D0F122F7F24A522CD623BA3B76B74; Path=/Maimai2Servlet; HttpOnly + ``` + + ``` + Packet.cs:228-234 if (Query.Api.StartsWith("UserLogin")) { cookieContainer.Add(Client.GetCookie()); + SetCookie(Query.UserId, cookieContainer); } + Packet.cs:190-193 之后每个 userId != 0 的请求都 AddCookie(Query.UserId) 把容器挂回去 + ``` + + 即:**登录时拿到的 JSESSIONID 会被后续所有请求带着** —— 这是真实的会话粘滞, + 不是可有可无的装饰。 + +**结论**:`requests.Session` 会自动收下 `Set-Cookie` 并在后续请求自动带上, +行为与 C# 的 `CookieContainer` 完全一致,**因此仍然不需要写任何代码** —— +但前提是**必须复用同一个 `MaimaiNetClient`/`Session`**。 +本工程的 `api/` 各函数在 `client=None` 时都走 `get_default_client()`(全局单例), +所以自动满足。如果谁手动 new 一个 `MaimaiNetClient` 去发结算包,就会丢掉 JSESSIONID。 + +--- + +## 四、`playSpecial` 与 `CalcSpecialNum` + +Hook 抓到 `Manager.GameManager.CalcSpecialNum()` 的返回值: + +``` +[CalcSpecialNum] = 1024 (SpecialAP=False IsFreedomMode=False) +``` + +**源码**(`Manager/GameManager.cs:332-378`)中 `1024 = 0x400` 是**无条件置位**的那一位, +其余各位的条件在这台机台上恰好都不成立(ACA 机型、GTX 显卡、i3-8100 CPU 三条否定条件都为假)。 + +**反推验证**(`Net.VO.Mai2/VOExtensions.cs:846-855`): + +``` +真机 playSpecial = 892014272 +位反转32(892014272) = 57726124 = 27900 × 2069 + 1024 + └────┬────┘ └─┬─┘ + 随机系数 余数 = CalcSpecialNum ✅ +``` + +### 本工程的修正 + +- `config.py` 新增 `PLAY_SPECIAL_NUM = 1024`,注释里逐位列出 10 个标志位及源码行号。 +- `calc_play_special(calc_special_num=None)` 用它替换原来的写死 `0`。 +- `selftest.py` 新增反推断言:`位反转32(真机 playSpecial) % 2069 == 1024`。 + +--- + +## 五、逐字段比对的剩余差异(全部已解释) + +用真机 `068` 报文**反向重建基线**后再跑本工程组包,逐路径 diff: + +| 路径 | 真机 | 本工程 | 原因 | +|---|---|---|---| +| `upsertUserAll.userGamePlaylogList[0].playSpecial` | 892014272 | 随机 | **本来就是随机数**(`Random.Range(1,1037933)*2069+1024` 后位反转) | +| `upsertUserAll.userGamePlaylogList[0].playCount` | 10 | 8 | 机台**本地**计数器,服务器不返回,只能手填 `config.PLAY_LOCAL_PLAY_COUNT` | +| `userData[0].lastLoginDate` / `eventWatchedDate` | 22:31:23.0 | 22:31:22.0 | 差 1 秒:真机在「登录响应处理完那一刻」才写这个值,而 `loginDateTime` 是请求时刻 | +| `userPlaylogList[0].loginDate` | 1791210683 | 1791210682 | 同上,1 秒 | +| `userPlaylogList[0].userPlayDate` | 22:31:59.0 | 22:32:21.0 | 真机是「本局打完那一刻」,脚本没有真实游玩过程,用上报时刻代替 | + +除上表外,**顶层 7 键、36 个节点名、各节点条数、userData 全部键名、11 条位串,两个方向都是 0 差异。** + +> 1 秒级差异已由真机自身证明无害:同一账号两个会话里 +> `userPlaylog.loginDate - loginDateTime` 分别是 **-28798**(19:21 会话)和 **-28799**(22:31 会话), +> 服务端两次都返回 `{"returnCode":1}` 并正常落库 —— 它不对这几个时刻做等式校验。 + +--- + +## 六、本轮修正清单 + +| 文件 | 改动 | +|---|---| +| `api/maimai_net.py` | `number` 头改为只由 Ping 刷新;补 `last_ping_msec` 兼容属性;docstring 写清 number/Cookie 语义 | +| `api/upsert_user_all.py` | ① `calc_play_special` 支持 `CalcSpecialNum`(默认 1024)
② **修掉 `characterLevelN` 加经验的回归**,改为游玩前快照
③ 新增 `derive_play_characters(snapshot)`:从服务器快照推游玩前角色
④ 新增 `play_date_time` 参数,把「登录时刻」与「游玩/上报时刻」拆开
⑤ `build_favorite_delta` 新增 `assume_missing`,区分「原始基线」与「归一化基线」 | +| `config.py` | 新增 `PLAY_SPECIAL_NUM`;补 `PLAY_CHARACTERS` / `PLAY_LOCAL_PLAY_COUNT` 的用法与实测值 | +| `api/ping.py` | docstring 写清「Ping 是 number 头的唯一来源」 | +| `upsert.py` | 加 `Ping()` 步骤;用 `derive_play_characters` 覆盖手填角色;传 `play_date_time=login_date_time_now()` | +| `api/__init__.py` | 导出 `derive_play_characters` | +| `selftest.py` | 148 → 155 项;新增 CalcSpecialNum 反推、角色快照、登录/游玩时刻分离等断言 | + +--- + +## 七、关于 `characterLevelN` 的回归(重点) + +`Net.VO.Mai2/VOExtensions.cs:1361`: + +```csharp +result.characterLevel1 = (int)gameScore.CharaLevel[0]; +``` + +`gameScore.CharaLevel` 是**本次开始游玩时**灌进去的快照,整局不变 —— +所以 `userPlaylog.characterLevelN` 是**游玩前**等级,游玩后的等级只出现在 +`upsertUserAll.userCharacterList` 里。 + +**两个真机会话的三方对照**(Get 侧 / playlog / upsertUserCharacterList): + +| 会话 | GetUserCharacterApi | userPlaylogList[0] | userCharacterList | +|---|---|---|---| +| `source/2026-10-05-new.log`(19:21) | 395=**3801** 101=**4456** 135 135 135 | **3801 4456 135 135 135** | 395=**3802** 101=**4457** 136 136 136 | +| MaimaiNetSpy `2026-10-05_222919`(22:31) | 395=**3802** 101=**4457** 136 136 136 | **3802 4457 136 136 136** | 395=**3803** 101=**4458** 137 137 137 | + +**playlog 恒等于 Get 侧(游玩前),userCharacterList 恒为 +1(游玩后)。** + +代码里曾经是 `level + character_exp_gain`,现已改回 `level`。 + +为了避免手填的 `config.PLAY_CHARACTERS` 随账号升级而过期, +新增 `derive_play_characters(snapshot)`:直接读快照里的 +`userData.charaSlot`(5 个槽位,顺序即 characterId1..5)与 +`userCharacterList`(每只角色的 level / awakening),`upsert.py` 已接上。 + +--- + +## 八、真实发包验证(✅ 已完成,2026-10-06 01:28) + +`upsert.py <二维码> --send` 用上面这套实现真实上报了一局成绩, +**服务端返回 returnCode=1,且重新拉数据确认 playCount 1260→1261 —— 真正落库了**。 +完整证据见 [`docs/实跑验证记录.md`](实跑验证记录.md)。 + +流程与真机一致: + +``` +GetGameSetting -> Ping -> ParseQRCode -> GetUserPreview -> UserLogin + -> fetch_upsert_snapshot(19 个 Get 节点) + -> GetUserNewItemList(游玩后档案) + -> UpsertUserAll(★ 有副作用) + -> UserLogout +``` + +安全闸门保持默认关闭:不传 `--send` 时只构造报文(`dry_run`), +`UpsertUserAll(confirm=None)` 会读取 `config.UPSERT_CONFIRM = False` 并抛 `ConfirmRequiredError`。 diff --git a/docs/舞萌DX_扫码登录协议技术规范.md b/docs/舞萌DX_扫码登录协议技术规范.md new file mode 100644 index 0000000..6d80992 --- /dev/null +++ b/docs/舞萌DX_扫码登录协议技术规范.md @@ -0,0 +1,586 @@ +# 舞萌DX(maimai DX)扫码登录协议技术规范 + +> **来源文档**: +> - `docs-old/舞萌DX_aimedb调用链分析.md` —— 完整调用链、二维码格式、ChimeLib/aimedb 关系 +> - `docs-old/chimelib协议逆向.md` —— 纯网络实现细节、签名算法、抓包验证、关键坑点 +> +> **适用场景**:纯网络(纯 HTTP)复刻舞萌DX国服微信扫码登录,获取 userId 与 token +> **协议路径**:路径 A —— 微信扫码(HTTPS + JSON,`chimelib_dll.dll` + WinHTTP) +> **非适用**:路径 B —— 传统 Aime 物理卡(TCP 二进制,`amdaemon_api.dll` + IPC) + +--- + +## 一、架构总览 + +### 1.1 两条 aimedb 通信路径 +| 路径 | 名称 | 协议 | 核心组件 | 你实际用的 | +|------|------|------|----------|------------| +| **A** | 微信扫码 | HTTPS + JSON | `chimelib_dll.dll` (WinHTTP) | ✅ **是** | +| B | 传统 Aime 物理卡 | TCP 二进制 | `amdaemon_api.dll` (IPC) | ❌ 否 | + +### 1.2 调用链(路径 A) +``` +游戏客户端 Assembly-CSharp + │ ChimeReaderManager (驱动扫码、取结果) + ▼ +ChimeLib.NET.dll (托管封装) + │ Chime / ChimeUnit / ChimeResult / CCommGetUserData / CCommServAliveCheck + ▼ +chimelib_dll.dll (x64 原生,62KB,静态链接 WinHTTP) + │ CCommGetUserData_Create/Execute/IsEnd/GetUserID/GetToken + │ CCommServAliveCheck_Create/StartCheck/Execute/GetIndex/IsAlive + ▼ +aimedb 服务器集群 + │ https://ai.sys-all.cn/ (主) + │ https://ai.sys-allnet.cn/ (备) + ▼ +POST /wc_aime/api/get_data → 返回 userID + token +POST /wc_aime/api/alive_check → 返回 "alive" +``` + +### 1.3 关键数据流向 +``` +二维码串(SGWCMAID...) + → ChimeLib.NET.CCommQRCode.IsValid() 校验 + → EraseHashIdentifier() 取 [20:] 64位载荷 + → CCommGetUserData_Create(strGameID="MAID", strChipID, strCommonKey="", strQRData=载荷, strTitleKey="SDGB", serverURLIndex) + → WinHTTP HTTPS POST /wc_aime/api/get_data + → 响应 {errorID, userID, token, key, timestamp} + → ChimeResult.GetChimeId() → userId (uint) + → ChimeResult.GetToken() → token (string) + → OperationManager.SetToken(userId, token) 缓存 + → 后续游戏服务器 API 携带 token +``` + +--- + +## 二、二维码格式规范 + +### 2.1 完整二维码字符串(84 字符) +``` +结构:SGWC(4) + MAID(4) + timestamp(12) + payload(64 hex) = 84 字符 + +偏移 长度 字段 说明 示例 +0–3 4 微信标识 常量 "SGWC" SGWC +4–7 4 GameID "MAID"=舞萌DX MAID +8–19 12 时间戳 yymmddHHMMss (UTC+9) 260613133715 +20–83 64 载荷/哈希 64位十六进制(疑似SHA-256) 77503FD2...427759BCA5 +``` + +### 2.2 校验规则(`CCommQRCode.IsValid()`) +```python +def is_valid(qr: str) -> bool: + return len(qr) == 84 and qr[0:4] == "SGWC" and qr[4:8] == "MAID" +``` + +### 2.3 传给原生层的数据(`EraseHashIdentifier()`) +```python +def erase_hash_identifier(qr: str) -> str: + """去掉前 20 字符,返回 64 位载荷""" + return qr[20:] # 即 payload 部分 +``` + +### 2.4 二维码 URL ⇄ 字符串互转 +**URL 格式**: +``` +https://wq.wahlap.net/qrcode/req/{GameID+timestamp+payload}.html?l=...&t=...&d=... + └──────────── 80 字符 ────────────┘ +``` + +**提取规则**: +```python +from urllib.parse import urlparse +import re + +def url_to_qr_string(url: str) -> str: + """URL → 完整 84 字符二维码串""" + path = urlparse(url).path + match = re.search(r"/qrcode/req/([^/]+)\.html", path) + if not match: + raise ValueError("URL 路径格式不符") + return "SGWC" + match.group(1) # 前加 SGWC 前缀 + +def qr_string_to_url_body(qr: str) -> str: + """完整二维码串 → URL 路径段(80字符,无 SGWC)""" + return qr[4:] # 去掉 SGWC +``` + +**查询参数**(`l`/`t`/`d`):**不参与**机台协议,仅为微信侧生成二维码时的元数据。 + +--- + +## 三、服务器端点与网络协议 + +### 3.1 服务器地址 +| 环境 | 域名 | IP | 端口 | TLS | +|------|------|-----|------|-----| +| 主 | `ai.sys-all.cn` | 81.71.193.236 | 443 | TLSv1.2 | +| 备 | `ai.sys-allnet.cn` | (同解析) | 443 | TLSv1.2 | + +### 3.2 API 端点 +| 端点 | Method | Content-Type | User-Agent | 用途 | +|------|--------|--------------|------------|------| +| `/wc_aime/api/alive_check` | POST | `application/json` (body `{}`) | 无 | 探活,返回 `200 alive` | +| `/qrcode/api/alive_check` | POST | 无(空body) | `WC_AIME_LIB` | 探活变体,返回 `200 alive` | +| `/wc_aime/api/get_data` | POST | **无** | `WC_AIME_LIB` | **核心登录接口** | + +### 3.3 请求头(关键:无 Content-Type) +```http +POST /wc_aime/api/get_data HTTP/1.1 +Host: ai.sys-allnet.cn +User-Agent: WC_AIME_LIB +Connection: Keep-Alive +Content-Length: 243 + +{"chipID":"...","openGameID":"MAID","key":"...","qrCode":"...","timestamp":"...","titlekey":"SDGB"} +``` +> ⚠️ **严禁添加 `Content-Type: application/json`**,否则服务端返回 `errorID=57`(HTTP 200 + 合法 JSON,极易误判为签名错误)。 + +### 3.4 请求体 JSON 字段 +| 字段 | 类型 | 来源 | 说明 | +|------|------|------|------| +| `chipID` | string | Keychip ID | 机台唯一标识,如 `XXXX-XXXXXXXXXXX` | +| `openGameID` | string | 固定 | `"MAID"` | +| `key` | string | 签名计算 | SHA-256 大写 hex,**核心签名字段** | +| `qrCode` | string | 二维码[20:] | **64 位载荷,非完整 84 字符串** | +| `timestamp` | string | 本机本地时间 | yymmddHHMMss 格式 | +| `titlekey` | string | 固定 | `"SDGB"` | + +### 3.5 响应体 JSON 字段 +| 字段 | 类型 | 说明 | +|------|------|------| +| `errorID` | int | 0=成功,非0=失败 | +| `userID` | int | 成功时为正整数(如 12345678),失败时 -1 | +| `token` | string | 成功时 20 位临时凭据,失败时空串 | +| `key` | string | 服务端返回的签名(可忽略) | +| `timestamp` | string | 服务端时间戳 | + +--- + +## 四、签名算法(核心) + +### 4.1 算法规范 +```python +import hashlib + +SIGN_KEY = "XcW5FW4cPArBXEk4vzKz3CIrMuA5EVVW" # 32字符,含前导 X + +def calculate_key(chip_id: str, timestamp: str) -> str: + """ + key = SHA-256(chipID + timestamp + SIGN_KEY).hexdigest().upper() + + 参数: + chip_id: 如 "XXXX-XXXXXXXXXXX" + timestamp: 如 "261001004115" (yymmddHHMMss) + + 返回:64字符大写十六进制 + """ + sign_input = chip_id + timestamp + SIGN_KEY + return hashlib.sha256(sign_input.encode()).hexdigest().upper() +``` + +### 4.2 技术细节 +| 项目 | 值 | 验证来源 | +|------|-----|----------| +| 哈希算法 | SHA-256 | Hook `CryptCreateHash` ALGID=0x800C (CALG_SHA_256) | +| 密钥串 | `XcW5FW4cPArBXEk4vzKz3CIrMuA5EVVW` | .rdata UTF-16 @0x00B040,**含前导 X** | +| 拼接顺序 | `chipID + timestamp + KEY` | **不含 qrCode、不含 titlekey** | +| 输出编码 | 大写十六进制 | hex 表 `0123456789ABCDEF` @0x00A440 | + +### 4.3 抓包验证向量 +``` +输入: + chipID = "XXXX-XXXXXXXXXXX" + timestamp = "261001004115" + SIGN_KEY = "XcW5FW4cPArBXEk4vzKz3CIrMuA5EVVW" + +SHA256("XXXX-XXXXXXXXXXX" + "261001004115" + "XcW5FW4cPArBXEk4vzKz3CIrMuA5EVVW") += 67015F28CFC3C7FA5E629BECE54893B581A6DBD153426AE5E6BA1681C6D8E327 +``` +与 mitmproxy 抓包完全一致 ✓ + +--- + +## 五、完整请求流程(纯 Python 实现) + +### 5.1 最小可用代码 +```python +import hashlib, http.client, json, ssl +from datetime import datetime + +SIGN_KEY = "XcW5FW4cPArBXEk4vzKz3CIrMuA5EVVW" +CHIP_ID = "XXXX-XXXXXXXXXXX" # 可配置 +HOST = "ai.sys-allnet.cn" +PATH = "/wc_aime/api/get_data" + +def parse_qr_login(qr_input: str, chip_id: str = CHIP_ID) -> tuple[int, str]: + """ + 输入:二维码串(84字符)或 URL + 返回:(user_id: int, token: str) + """ + # 1. 统一输入 → 标准 84 字符串 + qr_string = normalize_qr_input(qr_input) + + # 2. 校验格式 + validate_qr_string(qr_string) + + # 3. 构造请求体 + ts = datetime.now().strftime("%y%m%d%H%M%S") + key = calculate_key(chip_id, ts) + qr_code = qr_string[20:] # 仅 64 位载荷 + + body_dict = { + "chipID": chip_id, + "openGameID": "MAID", + "key": key, + "qrCode": qr_code, + "timestamp": ts, + "titlekey": "SDGB", + } + body_bytes = json.dumps(body_dict, separators=(",", ":")).encode() + + # 4. 发送请求(关键:无 Content-Type) + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + + conn = http.client.HTTPSConnection(HOST, 443, context=ctx, timeout=20) + try: + conn.request("POST", PATH, body=body_bytes, headers={ + "Connection": "Keep-Alive", + "User-Agent": "WC_AIME_LIB", + "Content-Length": str(len(body_bytes)), + # ★ 绝不加 Content-Type + }) + resp = conn.getresponse() + data = json.loads(resp.read().decode()) + finally: + conn.close() + + # 5. 解析响应 + if data.get("errorID") != 0 or data.get("userID") == -1: + raise RuntimeError(f"登录失败: errorID={data.get('errorID')}, userID={data.get('userID')}") + + return data["userID"], data["token"] + +def normalize_qr_input(qr_input: str) -> str: + """URL 或字符串 → 标准 84 字符二维码串""" + qr = qr_input.strip() + if qr.startswith("http://") or qr.startswith("https://"): + qr = url_to_qr_string(qr) + return qr + +def validate_qr_string(qr: str) -> None: + """校验二维码格式,不通过抛 ValueError""" + if len(qr) != 84: + raise ValueError(f"长度应为84,实际{len(qr)}") + if not qr.startswith("SGWC"): + raise ValueError("必须以 SGWC 开头") + if qr[4:8] != "MAID": + raise ValueError(f"GameID 必须为 MAID,实际 {qr[4:8]}") + # 可选:校验 payload 为 64 位 hex + if not all(c in "0123456789ABCDEF" for c in qr[20:]): + raise ValueError("载荷必须为大写 hex") +``` + +### 5.2 关键实现要点清单 +| 要点 | 正确做法 | 错误做法后果 | +|------|----------|--------------| +| qrCode 字段 | `qr_string[20:]` (64位) | 传完整 84 字符 → 签名不匹配 | +| 签名拼接 | `chipID + timestamp + KEY` | 加入 qrCode/titlekey → 签名错误 | +| 密钥串 | 含前导 `X` (32字符) | 漏掉 X → 签名完全不同 | +| 请求头 | 无 `Content-Type` | 加上 → `errorID=57` | +| timestamp | 本机本地时间即可 | 纠结时区 → 其实服务端不强校验 | +| SSL 验证 | 关闭验证 | 开启 → 证书链可能不通过 | + +--- + +## 六、错误码对照 + +| errorID | 含义 | 处理建议 | +|---------|------|----------| +| 0 | 成功 | 正常返回 userID + token | +| 1-8 | 原生 ChimeErrorId | 读卡器/服务器/二维码无效等通用错误 | +| **57** | **二维码已失效/已被使用/请求头不符** | 检查:二维码是否过期(~10分钟)、是否重复提交、**请求头是否含 Content-Type** | +| `userID:-1` | 失败标志 | 配合 errorID 判断具体原因 | + +> ### ★ 实测补充(2026-10-06) +> +> 本工程用同一套参数实测到的失败响应是 **`errorID=2`**(不是 57): +> +> ```json +> {"errorID": 2, "key": "B744ADD5...", "timestamp": "261006125706", +> "userID": -1, "token": ""} +> ``` +> +> **触发条件是「二维码过期」,不是「用过一次」。** +> +> | 二维码生成时刻(timestamp 内嵌) | 使用时刻 | 结果 | +> |---|---|---| +> | `261006012047`(01:20:47) | 01:21:55(+68s) | ✅ 成功 | +> | `261006124637`(12:46:37) | 12:52:22(+5m45s) | ✅ 成功 | +> | `261006130621`(13:06:21) | 13:10:42(+4m21s) | ✅ 成功 | +> | 上面那个 12:46:37 的二维码 | 13:0x(+约 15min) | ❌ `errorID=2` | +> +> 即:**二维码是「有时效」的,不是「按次数计量」的**。 +> +> **有效期 = 10 分钟**(实测至少 5 分 45 秒内均可用,超时后返回 `errorID=2`)。 +> 所以报错时**不要怀疑「用过了」**,重新生成一个即可。 + +--- + +## 七、时间戳处理细节 + +| 时间戳位置 | 时区 | 格式 | 说明 | +|------------|------|------|------| +| 二维码内 (偏移8-19) | **UTC+9 (日本时间)** | yymmddHHMMss | 微信侧生成,约 10 分钟有效期 | +| 请求体 `timestamp` | **本机本地时间** | yymmddHHMMss | 实测 UTC+8 与 DLL 行为一致,服务端不强校验时区 | +| 响应 `timestamp` | 服务端时间 | yymmddHHMMss | 仅作参考 | + +> **注意**:本机时区非 UTC+8 时,请求体 timestamp 仍用本地时间,但需确保系统时间准确(NTP 同步)。 + +--- + +## 八、探活接口(可选,纯 Python 可独立实现) + +### 8.1 探活请求 +```python +def check_alive(host: str = "ai.sys-allnet.cn") -> bool: + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + + conn = http.client.HTTPSConnection(host, 443, context=ctx, timeout=10) + try: + conn.request("POST", "/wc_aime/api/alive_check", body=b"{}", headers={ + "Content-Type": "application/json", # 探活需加 Content-Type + "Connection": "Keep-Alive", + }) + resp = conn.getresponse() + return resp.status == 200 and resp.read().decode().strip() == "alive" + finally: + conn.close() +``` + +### 8.2 行为差异 +| 端点 | Content-Type | User-Agent | 响应 | +|------|--------------|------------|------| +| `/wc_aime/api/alive_check` | `application/json` | 无 | `200 alive` | +| `/qrcode/api/alive_check` | 无 | `WC_AIME_LIB` | `200 alive` | +| `/wc_aime/api/get_data` | **无** | `WC_AIME_LIB` | 业务响应 | + +> DLL 实测:`CCommServAliveCheck` 探活阶段**不发真实网络请求**(WinHTTP hook 不触发),纯 Python 可直接调用 alive_check 验证服务器存活。 + +--- + +## 九、原生 DLL 接口签名(供 P/Invoke 参考) + +### 9.1 CCommServAliveCheck 系列 +```c +// 创建探活会话 +HANDLE CCommServAliveCheck_Create(); + +// 设置连接权限 +void CCommServAliveCheck_setConnectPermission(HANDLE h, BOOL permit); + +// 开始探活 +void CCommServAliveCheck_startCheck(HANDLE h); + +// 执行轮询 +void CCommServAliveCheck_execute(HANDLE h); + +// 是否忙碌 +BOOL CCommServAliveCheck_isBusy(HANDLE h); + +// 获取存活服务器索引 +int CCommServAliveCheck_getIndex(HANDLE h); + +// 是否存活 +BOOL CCommServAliveCheck_isAlive(HANDLE h); + +// 销毁 +void CCommServAliveCheck_Destroy(HANDLE h); +``` + +### 9.2 CCommGetUserData 系列 +```c +// 创建登录会话 +// strGameID="MAID", strChipID=KeychipID, strCommonKey="", strQRData=二维码[20:], strTitleKey="SDGB", serverURLIndex=探活返回索引 +HANDLE CCommGetUserData_Create( + LPCSTR strGameID, + LPCSTR strChipID, + LPCSTR strCommonKey, + LPCSTR strQRData, + LPCSTR strTitleKey, + int serverURLIndex +); + +// 执行请求 +void CCommGetUserData_execute(HANDLE h); + +// 是否结束 +BOOL CCommGetUserData_isEnd(HANDLE h); + +// 获取错误码 (0=成功) +int CCommGetUserData_getErrorID(HANDLE h); + +// 获取 userID (uint) +unsigned int CCommGetUserData_getUserID(HANDLE h); + +// 获取 token (ANSI 字符串) +LPCSTR CCommGetUserData_getToken(HANDLE h); + +// 销毁 +void CCommGetUserData_Destroy(HANDLE h); +``` + +### 9.3 托管层调用序列(ChimeUnit.Execute 状态机) +```csharp +// 1. 探活 +var alive = CCommServAliveCheck_Create(); +CCommServAliveCheck_setConnectPermission(alive, true); +CCommServAliveCheck_startCheck(alive); +while (CCommServAliveCheck_isBusy(alive)) CCommServAliveCheck_execute(alive); +int urlIndex = CCommServAliveCheck_getIndex(alive); +bool isAlive = CCommServAliveCheck_isAlive(alive); +CCommServAliveCheck_Destroy(alive); + +// 2. 登录 +var login = CCommGetUserData_Create( + "MAID", // gameID + keychipId, // chipID (如 XXXX-XXXXXXXXXXX) + "", // commonKey (托管层传空,原生层内部处理) + qrString.Substring(20), // qrData (64位载荷) + "SDGB", // titleKey + urlIndex // 探活返回的服务器索引 +); +while (!CCommGetUserData_isEnd(login)) CCommGetUserData_execute(login); +if (CCommGetUserData_getErrorID(login) == 0) { + uint userId = CCommGetUserData_getUserID(login); + string token = CCommGetUserData_getToken(login); // PtrToStringAnsi +} +CCommGetUserData_Destroy(login); +``` + +--- + +## 十、常量汇总表 + +```python +# ===== 签名与密钥 ===== +SIGN_KEY = "XcW5FW4cPArBXEk4vzKz3CIrMuA5EVVW" # 含前导 X,32字符 + +# ===== 默认机台标识 ===== +DEFAULT_CHIP_ID = "XXXX-XXXXXXXXXXX" + +# ===== 服务器 ===== +PRIMARY_HOST = "ai.sys-all.cn" +BACKUP_HOST = "ai.sys-allnet.cn" +PORT = 443 +LOGIN_PATH = "/wc_aime/api/get_data" +ALIVE_PATH = "/wc_aime/api/alive_check" + +# ===== 固定请求字段 ===== +OPEN_GAME_ID = "MAID" +TITLE_KEY = "SDGB" +USER_AGENT = "WC_AIME_LIB" + +# ===== 二维码常量 ===== +QR_PREFIX = "SGWC" +QR_GAME_ID = "MAID" +QR_PREFIX_LEN = 20 # SGWC(4) + MAID(4) + timestamp(12) +QR_PAYLOAD_LEN = 64 +QR_TOTAL_LEN = 84 + +# ===== HTTP 头(登录接口) ===== +LOGIN_HEADERS = { + "Connection": "Keep-Alive", + "User-Agent": USER_AGENT, + # "Content-Type": "application/json", # ★ 绝不加这一行 +} +``` + +--- + +## 十一、抓包调试方法论 + +### 11.1 强制走代理 +```csharp +// Hook WinHttpOpen +// dwAccessType = 3 (WINHTTP_ACCESS_TYPE_NAMED_PROXY) +// pwszProxy = "127.0.0.1:8890" +``` + +### 11.2 mitmproxy CA 证书安装 +```powershell +# 必须用 X509Store 静默导入,Import-Certificate 会因 UI 限制失败 +$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("Root", "CurrentUser") +$store.Open("ReadWrite") +$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("mitmproxy-ca-cert.pem") +$store.Add($cert) +$store.Close() +``` + +### 11.3 落盘与读取 +```bash +mitmdump -w flow.mitm +# Python 读取 +from mitmproxy.io import FlowReader +with open("flow.mitm", "rb") as f: + for flow in FlowReader(f).stream(): + print(flow.request.pretty_url) + print(flow.request.content) + print(flow.response.content) +``` + +### 11.4 捕获签名输入 +```csharp +// Hook CryptHashData 导出入口 +// 捕获 pbData 指针指向的字节数组 → 即签名原文 +// 对比:chipID + timestamp + KEY +``` + +### 11.5 常见 Hook 坑点 +| 坑点 | 原因 | 解决 | +|------|------|------| +| IAT hook 全失效 | pefile `imp.address` 已是完整 VA,再加 ImageBase 导致地址错误 | 直接用 `imp.address` + ASLR_delta | +| IAT 写入后还原 | CrackProof 驱动写保护页面 | 改用全局 inline hook:改写 advapi32 导出函数入口 + capstone 精确 trampoline | +| x64 trampoline 崩 | 指令切碎不完整 | capstone 逐条解析,累计 >=14 字节再跳转 | +| 误判加壳 | Hook 全失效以为加壳 | 实测:.text 熵 6.2、465 个 FF 15、入口点可正常反汇编 → **未加壳** | + +--- + +## 十二、实测验证记录 + +| # | 二维码时间戳 | userID | token (20位) | 备注 | +|---|--------------|--------|--------------|------| +| 1 | 260925205225 | 12345678 | TESTTOKEN0000000000 | DLL 验证成功 | +| 2 | 260930235204 | 12345678 | e1Tsql1aP1SHLUthRdYI | | +| 3 | 261001001304 | 12345678 | rI48n34Ttne1qR9FDFnY | 同一时间戳多次请求 token 各异 | +| 4 | 261001001304 | 12345678 | znoWwYW1bMpwlNUzcTpX | | +| 5 | 261001001304 | 12345678 | 8Cp6IztEGvLlYt5SRjxw | | + +**结论**: +- userID 固定(同一账号) +- token 每次请求生成新的 20 位临时凭据(一次性) +- 探活+登录总耗时 ~800ms(网络延迟主导) + +--- + +## 十三、最小复刻检查清单 + +实现纯网络扫码登录,必须覆盖: +- [ ] 二维码输入归一化(URL → 84字符串) +- [ ] 格式校验(长度84、前缀SGWC、GameID=MAID、载荷64位hex) +- [ ] 载荷提取(`qr_string[20:]`) +- [ ] 时间戳生成(本地时间 `%y%m%d%H%M%S`) +- [ ] 签名计算(SHA256(chipID+timestamp+KEY) 大写hex) +- [ ] 请求体构造(紧凑JSON,字段顺序固定) +- [ ] HTTPS POST(无Content-Type,UA=WC_AIME_LIB,Keep-Alive) +- [ ] SSL 不验证证书 +- [ ] 响应解析(errorID=0、userID>0、token非空) +- [ ] 错误处理(errorID=57→请求头问题,errorID=2→二维码过期) + +--- + +*本文档仅包含技术协议实现细节,不含项目结构、代码规范、文件路径等工程化内容。* \ No newline at end of file diff --git a/docs/购买功能票流程.md b/docs/购买功能票流程.md new file mode 100644 index 0000000..d70a06a --- /dev/null +++ b/docs/购买功能票流程.md @@ -0,0 +1,477 @@ +# 购买功能票流程(登录 → 买票 → 登出) + +> 对应 `api/upsert_user_chargelog.py` 与主脚本范例 `buy_ticket.py`。 +> **判据 = `source/Assembly-CSharp/` 反编译源码 + 游戏本地主数据 Ticket.xml。** +> +> ⚠ 本文的实现**全部来自源码推导**,还**没有真机 NetworkLog 对照**。 +> 文末列出「需要一次抓包确认」的点。 + +--- + +## 一、一句话 + +在机台买一张功能票 = 往服务器发一个 `UpsertUserChargelogApi`, +把「买了哪张票、多少钱、什么时候买的、有效期到什么时候、买完还剩几张」写进去。 + +``` +ParseQRCode -> UserPreview -> UserLogin -> UpsertUserChargelog -> UserLogout +``` + +--- + +## 二、接口 + +| 项目 | 值 | +|---|---| +| 逻辑 API 名 | `UpsertUserChargelogApi` | +| 源码 | `Net.Packet.Mai2/PacketUploadUserChargelog.cs:19` | +| 请求 VO | `Net.VO.Mai2/UserChargelogRequestVO.cs`(4 字段) | +| 响应 | `{returnCode, apiName}` | +| 副作用 | ★ 有,会写入一条购买记录 | + +### 2.1 请求体(字段顺序照 C# 声明) + +```jsonc +{ + "userId": 12345678, + "userChargelog": { // ← UserChargelog.cs,8 字段 + "chargeId": 2, // 买的哪张票 + "price": 1, // ★ = ticket.creditNum,不是 money price + "purchaseDate": "2026-10-06 13:01:22", + "playCount": 1260, // 玩家总游玩次数 + "playerRating": 15000, // 玩家 Rating + "placeId": 1000, + "regionId": 1, + "clientId": "TESTCLIENT1" + }, + "userCharge": { // ← UserCharge.cs,4 字段 + "chargeId": 2, + "stock": 1, // ★ 购买后的库存 + "purchaseDate": "2026-10-06 13:01:22", + "validDate": "2027-01-04 04:00:00" + }, + "loginDateTime": 1791291143 +} +``` + +--- + +## 三、源码流程(逐行可查) + +``` +Manager/TicketManager.cs:130 UseTicketPrepare(playerId, ticketId) + │ + ├─ ticket.ticketKind.id == 1 ? ← 只有 Paid 票才走购买 + │ (ticketKind: 1=Paid 2=Event 3=Free 4=Link 5=ShopWeekly 6=ShopChara) + │ + ├─ 在 OperationManager.GetGameChargeDataList() 里找该 chargeId 的 price + │ (= GetGameChargeApi 的响应,含 orderId/chargeId/price/startDate/endDate) + │ + ├─ TicketManager.cs:207 SetBuyPaidTicketData(playerId, ticketId) + │ ├─ ChargeList 里已有该 chargeId -> stock++、更新 purchaseDate / validDate + │ └─ 没有 -> 新增一条 stock=1 + │ + └─ TicketManager.cs:234 RequestUserCharge(playerId) + ├─ VOExtensions.cs:436 ExportEnableUserCharge(ticketId) + │ -> 取**购买后**(stock > 0)的那条 UserCharge + │ + ├─ VOExtensions.cs:403 ExportUserChargelog(ticketId) + │ chargeId = ticketId + │ price = DataManager.GetTicket(ticketId).creditNum ★ + │ purchaseDate = TimeManager.GetNowDateString() + │ playCount = src.Detail.PlayCount + │ playerRating = (int)src.Detail.Rating + │ placeId = Auth.LocationId + │ regionId = Auth.RegionCode + │ clientId = AMDaemon.System.KeychipId.ShortValue + │ + └─ 发 UpsertUserChargelogApi + returnCode == 1 -> RequestSuccess(本地 stock 再 --,因为票马上被用掉) + 否则 -> RequestFail +``` + +### 3.1 ★ `price` 不是「花的钱」 + +`VOExtensions.cs:410`: + +```csharp +result.price = ticket.creditNum; +``` + +`creditNum` 是**票的信用点倍数**,来自游戏本地主数据,**不是** `GetGameChargeApi` 的 money price。 + +| chargeId | 票名 | `creditNum`(= 上报的 price) | `GetGameChargeApi.price`(投币数) | +|---|---|---|---| +| 2 | 2倍チケット | **1** | 1 | +| 3 | 3倍チケット | **2** | 2 | +| 4 | 4倍チケット | **3** | 未上架 | +| 5 | 5倍チケット | **4** | 未上架 | +| 6 | 6倍チケット | **5** | 未上架 | + +> 2/3 号票两者数值恰好相同,别被误导 —— 源码取的是 `creditNum`。 +> 数据已抄进 `config.TICKET_CREDIT_NUM`,来源: +> `<游戏目录>\Sinmai_Data\StreamingAssets\A000\ticket\ticketXXXXXX\Ticket.xml` + +### 3.2 ★ `validDate` 算法 + +`Manager/TicketManager.cs:564`: + +```csharp +DateTime.Now.AddHours(-4.0).AddDays(90.0).ToString("yyyy-MM-dd 04:00:00") +``` + +**真机双向验证**(`source/2026-10-05.log:123` 的 `userChargeList`): + +| chargeId | purchaseDate | 减 4h | 加 90d | validDate(真机) | 吻合 | +|---|---|---|---|---|---| +| 5 | 2026-10-04 18:22:10 | 10-04 14:22 | 2027-01-02 | `2027-01-02 04:00:00` | ✅ | +| 3 | 2026-10-02 10:49:23 | 10-02 06:49 | 2026-12-31 | `2026-12-31 04:00:00` | ✅ | + +--- + +## 四、怎么用 + +### 4.1 主脚本(`buy_ticket.py`) + +```bash +# 预检:只看报文,零副作用 +python buy_ticket.py "<二维码>" --charge-id 2 + +# 先看看现在有什么票、能买什么 +python buy_ticket.py "<二维码>" --list + +# ★ 真实购买 +python buy_ticket.py "<二维码>" --charge-id 2 --send +``` + +### 4.2 在代码里调 + +```python +from api import (setup_logging, teardown_logging, + ParseQRCode, UserLogin, UserLogout, LogoutType, + UpsertUserChargelog) + +setup_logging("买票") +try: + user_id, token = ParseQRCode(qr) + login = UserLogin(user_id, token) + + # ★ 一个函数搞定:取当前票券 -> 取档案 -> 算 validDate -> 算 price -> 闸门 -> 发包 + UpsertUserChargelog(user_id, 2, login.loginDateTime, + dry_run=False, confirm=True) + + UserLogout(user_id, token, login.loginDateTime, + logout_type=LogoutType.TestIn) +finally: + teardown_logging() +``` + +### 4.3 参数 + +| 参数 | 默认 | 说明 | +|---|---|---| +| `user_id` / `charge_id` / `login_date_time` | 必填 | 后两个必须与 `UserLoginApi` 一致 | +| `charge_list` | 自动抓 | 当前票券列表(`GetUserChargeApi`),用来算购买后库存 | +| `user_data` | 自动抓 | 当前档案(`GetUserDataApi`),用来填 `playCount`/`playerRating` | +| `stock` | 现有 + 1 | 购买后该票的库存 | +| `price` | `TICKET_CREDIT_NUM[charge_id]` | = `ticket.creditNum` | +| `purchase_date` | 现在 | `YYYY-MM-DD HH:MM:SS` | +| `valid_date` | 由 `purchase_date` 推 | 现在 -4h +90d,取日期补 `04:00:00` | +| `play_count` / `player_rating` | 取自 `user_data` | | +| `confirm` | `config.UPSERT_CHARGELOG_CONFIRM`(False) | ★ 不开不发包 | +| `dry_run` | `False` | `True` = 只构造报文 | + +--- + +## 五、买完之后票会怎样? + +按源码,**买票接口自己就把 `userCharge`(含新库存)写进去了**, +不需要额外再发 `UpsertUserAll`。 + +真机的完整顺序是「买票 → 立刻用掉这一张」: + +``` +SetBuyPaidTicketData: stock++ (本地 +1) +RequestUserCharge: 发 stock(购买后的值) +RequestSuccess: stock-- (票被本局用掉了) +``` + +所以 `userChargeList` 里的 `stock` 平时大多是 **0** —— +真机 22:31 那次的 `userChargeList` 三条全是 `stock: 0`,就是这个原因。 + +> **本模块只负责「买」**,默认上报的是**购买后**的库存(现有 + 1)。 +> 如果你要复刻「买完立刻用掉」的完整语义,买完再发一次 +> `UpsertUserAll(..., extra_data={"userChargeList": [...]})` 把 `stock` 减回去。 + +--- + +## 六、★ 真机抓包对照(已修正,报文逐字节一致) + +### 6.0 结论:唯一差异是 `purchaseDate` 少了一个 `.0` + +真机抓包(`MaimaiNetSpy` `raw/061_UpsertUserChargelogApiMaimaiChn_request.json`,328 字节): + +```json +{"userId":12345678, + "userChargelog":{"chargeId":2,"price":1,"purchaseDate":"2026-10-06 13:20:10.0", + "playCount":1262,"playerRating":15000,"placeId":1000, + "regionId":1,"clientId":"TESTCLIENT1"}, + "userCharge":{"chargeId":2,"stock":1,"purchaseDate":"2026-10-06 13:20:10.0", + "validDate":"2027-01-04 04:00:00"}, + "loginDateTime":1791292785} +``` + +**14 个字段逐项对照:** + +| 字段 | 真机 | 修正前 | 结论 | +|---|---|---|---| +| `userChargelog.chargeId` | 2 | 2 | ✅ | +| `userChargelog.price` | **1** | 1(= `creditNum`) | ✅ **源码推导正确** | +| `userChargelog.purchaseDate` | **`2026-10-06 13:20:10.0`** | `2026-10-06 13:10:42` | ❌ **少 `.0`** | +| `userChargelog.playCount` | 1262 | 1262 | ✅ | +| `userChargelog.playerRating` | 15000 | 15000 | ✅ | +| `userChargelog.placeId` / `regionId` / `clientId` | 1000 / 5 / `TESTCLIENT1` | 同 | ✅ | +| `userCharge.chargeId` | 2 | 2 | ✅ | +| `userCharge.stock` | **1** | 1(**加 1 后**) | ✅ **源码推导正确** | +| `userCharge.purchaseDate` | `2026-10-06 13:20:10.0` | 少 `.0` | ❌ | +| `userCharge.validDate` | **`2027-01-04 04:00:00`** | 同 | ✅ **算法完全正确** | +| `loginDateTime` | 1791292785 | 同 | ✅ | +| 字段顺序 | — | 同 | ✅ | + +**修正后逐字节比对:真机 328 字节 / 本工程 328 字节,完全相同。** + +### 6.0.1 根因:`TimeManager.DateTimeFormat` 带一位小数 + +`Manager/TimeManager.cs:7,62-70`: + +```csharp +public const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss.f"; // ← .f = 一位小数 + +public static string GetNowDateString() + => GetDateString(GetNowUnixTime()); + +public static string GetDateString(long unixTime) + => GetDateTime(unixTime).ToString("yyyy-MM-dd HH:mm:ss.f"); +``` + +我原来用了 `%Y-%m-%d %H:%M:%S`(无小数),所以服务端 `returnCode=0`。 + +> ★ 两个格式别搞混: +> | 字段 | 格式 | 例子 | +> |---|---|---| +> | `purchaseDate` | `yyyy-MM-dd HH:mm:ss.f` | `2026-10-06 13:20:10.0` | +> | `validDate` | `yyyy-MM-dd 04:00:00`(显式串) | `2027-01-04 04:00:00` | +> +> **一个带小数一个不带**,这是最容易踩的地方。 + +> ★ 另一个细节:`GetNowTime()` 返回的是 **`DateTime.UtcNow`**, +> `GetDateString` 再 `Add(CSToffset)` —— 所以游戏里的日期串**恒是北京时间**, +> 与本机时区无关。脚本跑在非东八区机器上时 `datetime.now()` 会错, +> 所以本模块用 `now_cst()`(UTC+8)显式计算。 + +### 6.1 修正前的实跑记录(2026-10-06 13:10,已废弃) + +``` +[购买前] 当前票券 3 条: + chargeId=2 stock=0 validDate=2026-10-12 04:00:00 + chargeId=3 stock=0 validDate=2026-12-31 04:00:00 + chargeId=5 stock=0 validDate=2027-01-02 04:00:00 +[购买前] 持有中的功能票:0 张 ← 安全检查通过,可以买 +安全检查通过:账号当前没有持有任何功能票 + 票名 : 2倍チケット + 库存 : 0 -> 1 + price : 1(= ticket.creditNum) + purchaseDate: 2026-10-06 13:10:42 + validDate : 2027-01-04 04:00:00 +闸门已放行,开始上传购买记录 ... +★ 购买失败:returnCode=0 apiName=com.sega.maimai.api.UpsertUserChargelogApi +``` + +**账号无恙**(已只读复查):`userChargeList` 仍是原来 3 条、 +`playCount=1262`、无封禁。 + +### 6.2 这次失败排除了什么 + +| 结论 | 依据 | +|---|---| +| **URL / 混淆名正确** | 服务端回了 `apiName=com.sega.maimai.api.UpsertUserChargelogApi` | +| **报文格式被接受** | 不是 0 字节响应、不是解密解压失败,是**业务层拒绝**(`returnCode=0`) | +| **不是闸门问题** | 闸门已放行,确实发了包 | +| **不是「已持票」问题** | 购买前确认 3 条票 stock 全是 0 | +| **就是 `purchaseDate` 格式** | 抓包对照后确认(见 6.0) | + +### 6.3 剩下的未验证点 + +| # | 待验证 | 现状 | +|---|---|---| +| 1 | 买票后是否**还要**发 `UpsertUserAll` 才持久化库存 | 源码流程里没有;抓包只抓到这一条请求,**推测不需要** | +| 2 | `validDate` 是否会被服务端按本地时区重算 | 真机发的是 `2027-01-04 04:00:00`,与本工程算法一致 | +| 3 | 服务端是否对「有效期未过的同一 chargeId」有额外限制 | 真机在 `chargeId=2`(validDate 2026-10-12 未过)的情况下照样买了,**说明没有这个限制** | + +### 6.4 抓包时确认过的时序 + +抓到的这一次只发了 **`UpsertUserChargelogApi` 一条写请求**, +请求体里同时带了 `userCharge`(新库存)和 `userChargelog`(购买记录)—— +印证了「买票接口自己就把库存写进去了」。 + +--- + +## 六点五、★ 第二次实跑:`chargeId=5` 又被 `returnCode=0`(2026-10-06 13:41) + +修完 `.f` 格式后再跑一次(这次买 **5 倍券**),**还是 `returnCode=0`**: + +``` +[购买前] 持有中的功能票:0 张 ← 安全检查通过 +安全检查通过:账号当前没有持有任何功能票 + 票名 : 5倍チケット + 库存 : 0 -> 1 + price : 4(= ticket.creditNum) + purchaseDate: 2026-10-06 13:41:43.3 ← .f 格式已正确 + validDate : 2027-01-04 04:00:00 +闸门已放行,开始上传购买记录 ... +★ 购买失败:returnCode=0 apiName=com.sega.maimai.api.UpsertUserChargelogApi +``` + +### 6.5.1 根因:`chargeId=5` 根本没上架 + +只读查 `GetGameChargeApi`: + +```json +{"length":2,"gameChargeList":[ + {"orderId":1,"chargeId":2,"price":1,...}, ← 只有 2 和 3 + {"orderId":2,"chargeId":3,"price":2,...}]} +``` + +**chargeId=5 不在清单里 → 服务端直接拒。** + +### 6.5.2 源码里本来就有这道检查(我漏了) + +`Manager/TicketManager.cs:137-150`: + +```csharp +if (ticket.ticketKind.id == 1) +{ + GameCharge[] gameChargeDataList = Singleton.Instance.GetGameChargeDataList(); + for (int i = 0; i < gameChargeDataList.Length; i++) + { + GameCharge gameCharge = gameChargeDataList[i]; + if (gameCharge.chargeId == ticketId) // ★ 必须在清单里找到 + { + ... + RequestUserCharge(playerId); // 才发购买请求 + return true; + } + } +} +return false; // ★ 找不到 -> 不买 +``` + +**真机也是「先查清单,找到才买」** —— 我第一版实现直接跳到发请求,漏了这一步。 + +### 6.5.3 已补的守卫 + +`UpsertUserChargelog` 新增 `guard_purchasable=True`(默认开): + +- 不传 `game_charge_list` 就自动调 `GetGameChargeApi` +- `charge_id` 不在清单里 → 抛 `ChargelogGuardError`,**未发包** + +`buy_ticket.py` 更把这道检查放到了**扫码之前**(`GetGameChargeApi` 不需要登录), +不满足就直接退出 —— **不浪费二维码、不产生登录会话**: + +``` +当前可购买 chargeId:[2, 3] + chargeId=2 2倍チケット money price=1 有效期 2021-03-18 07:00:00 ~ 2029-12-31 00:00:00 + chargeId=3 3倍チケット money price=2 有效期 2021-03-18 07:00:00 ~ 2029-12-31 00:00:00 +[错误] chargeId=5(5倍チケット)**不在当前可购买清单里** —— 连登录都不做,直接退出。 +``` + +### 6.5.4 本机台到底能买什么 + +| chargeId | 票名 | 上架 | `creditNum`(上报的 price) | money price | +|---|---|---|---|---| +| 2 | 2倍チケット | ✅ | 1 | 1 | +| 3 | 3倍チケット | ✅ | 2 | 2 | +| 4 | 4倍チケット | ❌ | 3 | — | +| 5 | 5倍チケット | ❌ | 4 | — | +| 6 | 6倍チケット | ❌ | 5 | — | + +> ★ 上架清单是**机台/店铺配置**,不同店铺可能不一样。 +> 每次买之前都该先看 `GetGameChargeApi`。 + +### 6.5.5 账号状态 + +两次失败都**没有写入任何东西**:`userChargeList` 三条 `stock` 全是 0。 +服务端的 `returnCode=0` 是「干净拒绝」。 + +--- + +## 六点六、★★ 第三、四次实跑:`chargeId=2`(真机验证过的配置)**也失败** + +### 6.6.1 做了什么 + +第 3 次(13:50,chargeId=3)和第 4 次(14:03,**chargeId=2**)分别补齐了: + +| 补齐项 | 说明 | +|---|---| +| `number` 头 | 加了 `Ping()`,从 `"0"` 变成 `"61"`(真机 75) | +| 入场全量下载 | 登录后先拉 18~19 个节点,复刻真机 [14]~[60] | +| 买票前等待 | 加 5 秒,贴近真机 login→买票 的 25 秒节奏 | + +**结果仍然是 `returnCode=0`。** + +### 6.6.2 与真机报文的最终并排对比 + +第 4 次的报文 vs 真机抓包: + +| 路径 | 真机 | 本工程 | +|---|---|---| +| 键集合 | — | **完全相同** | +| `userChargelog` 键序 | — | **完全相同** | +| `userCharge` 键序 | — | **完全相同** | +| `userChargelog.purchaseDate` | `2026-10-06 13:20:10.0` | `2026-10-06 14:03:14.6` | +| `userChargelog.playCount` | 1262 | 1263 | +| `userCharge.purchaseDate` | `2026-10-06 13:20:10.0` | `2026-10-06 14:03:14.6` | +| `loginDateTime` | 1791292785 | 1791295385 | + +**唯一不同的就是这 3 个「当下时刻」类的值。** 其余 11 个字段逐字节相同。 + +### 6.6.3 已逐项排除的可能 + +| # | 假设 | 排除依据 | +|---|---|---| +| 1 | URL / 混淆名错 | `4411a4c8f7f5c0e95a3ac17f1746aad3` 与真机一致;服务端回正确 `apiName` | +| 2 | User-Agent 错 | 与真机逐字符相同 | +| 3 | Cookie 缺失 | 登录响应确实下发 `Set-Cookie: JSESSIONID=...`,Session 自动带 | +| 4 | 报文字段/顺序/类型错 | 与真机逐字节同构 | +| 5 | `purchaseDate` 格式错 | 已补 `.f`(`14:03:14.6`) | +| 6 | 票未上架 | `chargeId=2` 在 `GetGameChargeApi` 清单里 | +| 7 | 已持有功能票 | 购买前确认 3 条 `stock` 全 0 | +| 8 | `number` 头为 0 | 已加 `Ping()` → `"61"` | +| 9 | 缺少入场数据下载 | 已补(18~19 节点,0 失败) | +| 10 | 节奏太快 | 已加 5 秒等待 | +| 11 | `chargeId` 本身有问题 | **改用真机验证过的 `chargeId=2` 仍然失败** | + +### 6.6.4 剩余假设 + +请求体已经被证明「结构上完全正确」,所以问题只可能在**请求之外**: + +| # | 假设 | 怎么验证 | +|---|---|---| +| **A** | ★ **服务端有「购买频率/每日上限」规则** —— 账号在 **13:20 刚买过同一张票**,43 分钟后再买被拒 | **在真机上再买一次 2 倍券**:若真机也失败 → 规则成立,本工程实现正确;若真机成功 → 本工程有 bug | +| B | 服务端对**金钱相关接口**做了 TLS/HTTP 指纹校验(非游戏客户端特征) | 需要本地 MITM 代理对比完整 HTTP 请求头 | +| C | 服务端要求某个本工程不知道的前置状态 | 同上 | + +**★ 假设 A 是最可能、也最容易验证的**:`returnCode=0` 只用了 **47 ms** 就返回, +像是命中了一条规则检查,而不是超时或异常。 + +--- + +## 七、安全闸门 + +| 调用方式 | 行为 | +|---|---| +| `UpsertUserChargelog(...)` | 抛 `ChargelogConfirmError`,**未发包** | +| `UpsertUserChargelog(..., dry_run=True)` | 只构造并返回报文 | +| `UpsertUserChargelog(..., confirm=True)` | 真实发送 | + +全局开关:`config.UPSERT_CHARGELOG_CONFIRM = False`(改成 `True` 会永久放行,不建议)。 diff --git a/docs/项目总览.md b/docs/项目总览.md new file mode 100644 index 0000000..bfb1cc8 --- /dev/null +++ b/docs/项目总览.md @@ -0,0 +1,255 @@ +# 舞萌DX 纯网络脚本工程 · 项目总览 + +> 项目名 **WaHappy** —— 舞萌DX 的游戏助手。 +> 面向使用者的说明见根目录 [`README.md`](../README.md); +> 本文件是**开发向的主文档**,开工前先读它;遇到「该放哪、该怎么写」的问题以本文件为准。 + +--- + +## 一、这个工程是什么 + +用 **Python 脚本**,通过**纯网络(纯 HTTP)** 形式直接与舞萌DX(SDGB 国服)的**游戏服务器**交互, +复刻游戏客户端的协议行为。 + +| 对象 | 是什么 | 对应反编译源码 | +|---|---|---| +| **游戏服务器** | 玩家数据读写:扫码登录、取数、上传成绩、登出 | `source/Assembly-CSharp/` | +| **纯网络形式** | 脚本**直接收发 HTTP 报文**(AES 加密 JSON),不依赖运行中的游戏客户端 | `source/Assembly-CSharp/Net/` | +| **扫码登录** | 微信二维码换 userId + token,走 aimedb | `source/ChimeLib.NET/` | + +--- + +## 二、目录结构 + +``` +wahappy-v0-goal/ +├── config.py ★ 运行时可配置项(密钥/设备/区域/歌曲数据/日志级别) +├── upsert.py ★ 主脚本范例:扫码登录 → 上传成绩 → 登出 +├── buy_ticket.py ★ 主脚本范例:扫码登录 → 购买功能票 → 登出 +├── selftest.py 零网络自检(220 项,判据=源码+真机日志+真机抓包) +│ +├── api/ ★ 所有与服务器交互的脚本(一个 api 一个脚本) +│ ├── __init__.py 统一导出 + 日志跟踪登记 +│ ├── log_setup.py 统一日志(INFO / DEBUG 双模式) +│ ├── maimai_net.py 网络核心(AES / deflate / URL 混淆 / Cookie) +│ ├── user_getter_common.py 取数脚本公共底座 +│ ├── chime.py 扫码登录 +│ ├── upsert_user_all.py ★ 上传成绩 +│ └── ... 其余见第六节 +│ +├── source/ ★ 反编译源码 + 网络日志,只读查证用 +├── docs/ ★ 文档 +└── logs/ ★ 日志输出(latest.log + 日期.log) +``` + +--- + +## 三、api/ 脚本契约 + +`api/` 里的每个脚本是一个**功能模块**,对外暴露**函数**;函数**能接收参数**, +内部完成「组包 → 发包 → 解析 → 返回结果」的全过程。 + +```python +def 某Api函数(必填参数, *, 可选参数...) -> 结果: + """一句话说明(会出现在日志的 [接口说明] 里)""" + ... +``` + +参数形态规律: + +- **业务数据**(user_id / token / 二维码 / playlog_id)→ **位置参数** +- **配置项**(client_id / region_id / timeout_ms)→ **关键字参数**,可省略走默认值 + +--- + +## 四、日志 + +### 4.1 两种模式 + +| 模式 | 输出内容 | +|---|---| +| **INFO**(默认) | 只展示 api 脚本的**运行情况和结果** | +| **DEBUG** | 在 INFO 基础上,额外展示**向 api 发送的数据**和**api 返回的数据** | + +切换只改 `config.py` 一行: + +```python +LOG_LEVEL = "info" # 只看流程 +LOG_LEVEL = "debug" # 连收发数据一起看 +``` + +### 4.2 运行提示 + +每个 api 函数工作时会提示开始,结束时提示结束: + +``` +=== ParseQRCode 开始运行 === + [接口说明] 解析二维码并换取 userId 与 token。 + [位置参数] 'SGWCMAID2610022219463A297AF4CA...' + [运行结果] 成功 tuple(2 项)(耗时 412 ms) +=== ParseQRCode 运行结束 === +``` + +DEBUG 模式额外输出: + +``` +-> 请求 GetGameSettingApi + URL : https://maimai-gm.wahlap.com:42081/Maimai2Servlet/mE2s3Jhd/83a5... + 请求头 : {"Content-Type":"application/json","Mai-Encoding":"1.55"} + 请求体 : + { + "placeId": 1000, + "clientId": "TESTCLIENT1" + } + +<- 响应 GetGameSettingApi + 状态码 : 200 + 耗时 : 312 ms + 响应体 : + { + "isAouAccession": false, + "gameSetting": { ... } + } +``` + +### 4.3 日志文件(两种形式同时存在、同时写入) + +| 文件 | 模式 | 说明 | +|---|---|---| +| `logs/latest.log` | **覆盖**(`w`) | 只包含**当次**主脚本运行产出的日志,下次运行被覆盖 | +| `logs/YYYY-MM-DD.log` | **追加**(`a`) | 存放**当日**产生的所有日志 | + +每行都带 `[YYYY-MM-DD HH:MM:SS]` 时间戳。 + +### 4.4 主脚本怎么写 + +```python +from api import setup_logging, teardown_logging, ParseQRCode, UserLogin + +def main(): + setup_logging("我的主脚本") # 开头一句;api 调用从此自动记录 + try: + user_id, token = ParseQRCode(qr) + login = UserLogin(user_id, token) + finally: + teardown_logging() # 结尾一句(不写也会在退出时自动收尾) +``` + +**不需要**写装饰器,**不需要**自己埋点 —— `api/__init__.py` 在导入时就统一套好了日志外壳。 + +--- + +## 五、协议实现要点(全部有源码依据) + +| 环节 | 依据 | 要点 | +|---|---|---| +| **URL 生成** | `Packet.cs:485` + `NetQuery.cs:14` | BASE_URL + md5(接口名 + "MaimaiChn" + "8bF76dE9") | +| **请求封装** | `NetHttpClient.cs:262-300` | JSON → 原始 deflate → 0x78 0x9C + Adler32(大端) → AES-256-CBC | +| **响应解封装** | `NetHttpClient.cs:355-380` | AES 解密 → 去 2 字节头 / 4 字节尾 → deflate → JSON | +| **AES 参数** | `CipherAES.cs:11-12` | Key 32B / IV 16B / CBC / PKCS7 | +| **请求头** | `NetHttpClient.cs:174-190` | Mai-Encoding: 1.55、Content-Encoding: deflate、UA = 混淆名#userId | +| **number 头** | `Packet.cs:187-189` + `PingChecker.cs:227` | = Ping 心跳的往返毫秒(`GameManager.PingMsec`),**只由 Ping 刷新**;除 Ping 外每个接口都带 | +| **Cookie** | `Packet.cs:190-193,228-234` | ★ **UserLoginApi 响应会下发 `Set-Cookie: JSESSIONID=...`**,之后每个带 userId 的请求都会带上;`requests.Session` 自动处理,但**必须复用同一个 client**(`get_default_client()`) | +| **playSpecial** | `VOExtensions.cs:846-855` + `GameManager.cs:332-378` | `位反转32(Random(1,1037933)*2069 + CalcSpecialNum)`;标准 ACA 机台 `CalcSpecialNum = 1024 = 0x400` | +| **扫码签名** | 技术规范 §4 | SHA256(chipID + timestamp + KEY) 大写;**不带 Content-Type** | +| **loginDateTime** | `PacketUserLogin.cs:29` | 「本地墙上时间当 UTC」= 标准 Unix 秒 + 时区偏移 | + +### ★ 一个必须注意的坑:Accept-Encoding 必须为空 + +`requests` 默认发 `Accept-Encoding: gzip, deflate`。本协议响应体是 AES 密文(二进制), +服务端若据此做内容编码会返回**空 body**。C# 端不需要是因为 `HttpWebRequest` +默认 `AutomaticDecompression = None`。所以 `maimai_net.py` 固定置空该头。 + +--- + +## 六、API 清单 + +### 6.1 会话链路(6 个) + +| 脚本 | 函数 | 对应接口 | +|---|---|---| +| `chime.py` | `ParseQRCode(qr, *, chip_id)` | aimedb /wc_aime/api/get_data | +| `gamesettings.py` | `GetGameSettings(*, place_id, client_id)` | GetGameSettingApi | +| `ping.py` | `Ping(*, client_id)` | Ping | +| `userpreview.py` | `UserPreview(user_id, token, *, ...)` | GetUserPreviewApi | +| `userlogin.py` | `UserLogin(user_id, token, *, region_id, place_id)` | UserLoginApi | +| `userlogout.py` | `UserLogout(user_id, token, login_dt, *, logout_type)` | UserLogoutApi | + +### 6.2 上传成绩(2 个) + +| 脚本 | 函数 | 说明 | +|---|---|---| +| `upsert_user_all.py` | `UpsertUserAll(user_id, playlog_id, *, login_date_time, auth_date_time, token, snapshot, extra_data, play, ...)` | ★ **一个函数跑完整条结算链路**:抓快照 → 组包 → 前置接口 → 自检 → 60 秒冷却 → 发包 → 落库回查。唯一有副作用的接口 | +| `upsert_user_all.py` | `derive_play_characters(snapshot)` | 从服务器快照推「本局 5 只角色 + 游玩前等级」,免得手填的 `config.PLAY_CHARACTERS` 过期 | +| `upsert_user_all.py` | `load_extra_data(extra)` / `merge_extra_data(user_all, extra)` | 把外部 JSON(dict / JSON 串 / 文件路径)自动匹配插入 36 节点 | +| `upsert_user_all.py` | `verify_upsert_landing(user_id, snapshot, play)` | 发包后重新拉服务器数据,确认真的落库 | +| `upsert_snapshot.py` | `fetch_upsert_snapshot(user_id, ...)` | 一键抓结算基线快照(`UpsertUserAll` 内部会按需自动调) | +| `upsert_user_chargelog.py` | `UpsertUserChargelog(user_id, charge_id, login_date_time, ...)` | ★ **购买功能票**(UpsertUserChargelogApi):自动取当前票券/档案、算 validDate 与 price、闸门、发包 | +| `upsert_user_chargelog.py` | `calc_valid_date(now)` / `ticket_price(id)` / `ticket_name(id)` | 有效期算法(-4h+90d)、票的 creditNum、票名 | + +### 6.3 取数(一个接口一个脚本) + +| 脚本 | 函数 | 对应接口 | +|---|---|---| +| `userdata.py` | UserData | GetUserDataApi | +| `user_extend.py` | UserExtend | GetUserExtendApi | +| `user_option.py` | UserOption | GetUserOptionApi | +| `user_character.py` | UserCharacter | GetUserCharacterApi | +| `user_ghost.py` | UserGhost | GetUserGhostApi | +| `user_map.py` | UserMap / UserMapAll | GetUserMapApi | +| `user_login_bonus.py` | UserLoginBonus / UserLoginBonusAll | GetUserLoginBonusApi | +| `user_rating.py` | UserRating | GetUserRatingApi | +| `user_item.py` | UserItem / UserItemAll | GetUserItemApi | +| `user_music.py` | UserMusicDetail / UserMusicDetailAll | GetUserMusicApi | +| `user_course.py` | UserCourse / UserCourseAll | GetUserCourseApi | +| `user_charge.py` | UserCharge | GetUserChargeApi | +| `user_favorite.py` | UserFavorite / UserFavoriteAll | GetUserFavoriteApi | +| `user_activity.py` | UserActivity | GetUserActivityApi | +| `user_mission.py` | UserMissionData | GetUserMissionDataApi | +| `user_intimate.py` | UserIntimate | GetUserIntimateApi | +| `user_shop_stock.py` | UserShopStock | GetUserShopStockApi | +| `user_favorite_item.py` | UserFavoriteItem / UserFavoriteItemAll | GetUserFavoriteItemApi | +| `user_rival.py` | UserRivalData / UserRivalMusic(All) | GetUserRivalDataApi / GetUserRivalMusicApi | +| `user_friend_bonus.py` | UserFriendBonus | GetUserFriendBonusApi | +| `user_kaleidx_scope.py` | UserKaleidxScope / GameKaleidxScope | GetUserKaleidxScopeApi / GetGameKaleidxScopeApi | +| `user_region.py` | UserRegion | GetUserRegionApi | +| `user_recommend_music.py` | UserRecommendRateMusic / UserRecommendSelectMusic | GetUserRecommendRateMusicApi / GetUserRecommendSelectMusicApi | +| `user_new_item.py` | UserNewItemList | GetUserNewItemListApi | +| `game_ranking.py` | GetGameRanking | GetGameRankingApi | +| `game_event.py` | GetGameEvent | GetGameEventApi | +| `game_charge.py` | GetGameCharge | GetGameChargeApi | +| `game_weekly_data.py` | GetGameWeeklyData | GetGameWeeklyDataApi | +| `game_tournament_info.py` | GetGameTournamentInfo | GetGameTournamentInfoApi | +| `game_ng_music_id.py` | GetGameNgMusicId | GetGameNgMusicIdApi | + +--- + +## 七、新增一个 api 要做什么 + +1. 在 `api/` 下新建脚本,定义一个能传参的函数 +2. 函数首行写 docstring(会变成日志的 `[接口说明]`) +3. 用 `from .log_setup import log_info, log_request, log_response` 记日志 +4. 用 `from .maimai_net import request_dict` 发包 +5. 在 `api/__init__.py` 里**导入**并**加进 `_API_FUNCS`** ← 漏了这步就不会有运行提示 + +--- + +## 八、相关文档 + +| 文件 | 内容 | +|---|---| +| `docs/上传成绩开发文档.md` | UpsertUserAll 的 36 节点 / 110 字段 / 差分语义 / 真机对照 | +| `docs/主脚本编写指南.md` | ★ **写自己的主脚本**:三条铁律 / 最小骨架 / 四个流程模板 / 常见错误 | +| `docs/购买功能票流程.md` | ★ 登录 → 买票 → 登出:接口结构 / 源码流程 / validDate 算法 / 待抓包确认项 | +| `docs/UpsertUserAll踩坑清单.md` | ★ **28 条坑的逐条记录**:现象 / 根因 / 源码依据 / 正确做法 / 自检项 + 发包前 Checklist | +| `docs/实跑验证记录.md` | ★ **真实跑通记录**:returnCode=1 + 回读确认 playCount 1260→1261,含完整时间线与落库证据 | +| `docs/真机Hook对照报告.md` | ★ MelonLoader Mod 真机抓包(70 请求)与本实现的逐项对照:number / Cookie / CalcSpecialNum / 剩余差异说明 | +| `docs/UpsertUserAll实跑对比.md` | 逐字段对比明细(110 字段 × 真机 vs 本工程) | +| `docs/UpsertUserAll落库排查报告.md` | 「returnCode=1 但没落库」的根因分析 | +| `docs/日志与主脚本指南.md` | 日志模块完整参考 + 主脚本写法 | +| `docs/舞萌DX_扫码登录协议技术规范.md` | 扫码登录协议(上一代整理) | +| `source/2026-10-05.log` | 真机网络日志(本工程最重要的判据) | + +--- + +*新增 api 后请同步更新第六节清单。*