commit 349a78484027d81ae69d21540497114625c11c92 Author: kekami Date: Sat Feb 19 17:36:39 2022 -0500 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..72b8ed3 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# IIDX + +Plugin Version: **v1.4.1** + +This is A Core IIDX Plugin. + +Supported Versions: + +- HEROIC VERSE diff --git a/data/27customlist.ts b/data/27customlist.ts new file mode 100644 index 0000000..7da0bb3 --- /dev/null +++ b/data/27customlist.ts @@ -0,0 +1,352 @@ +// 参考:bemaniwiki +export const frame_list: string[] = ["デフォルト"]; + +export const menumusic_list: string[] = ["デフォルト"]; + +export const noteburst_list: string[] = [ + "デフォルト", + "初代", + "9th style", + "IIDX RED(オレンジ爆発)", + "HAPPY SKY", + "DistorteD", + "GOLD", + "DJ TROOPERS", + "EMPRESS", + "SIRIUS", + "Resort Anthem", + "Lincle", + "tricoro", + "SPADA", + "オンリーワンボム", + "PENDUAL", + "copula", + "SINOBUZ", + "キャノンスパーク", + "Rootage", + "HEROIC VERSE", +]; + +export const turntable_list: string[] = [ + "デフォルト", + "トラン", + "JOJO", + "デルタ", + "オレンジディスク", + "DistorteD", + "GOLD", + "DJ TROOPERS", + "EMPRESS", + "SIRIUS", + "Resort Anthem", + "Lincle", + "tricoro", + "SPADA", + "灼熱", + "オンリーワンレコード", + "PENDUAL", + "copula", + "SINOBUZ", + "キャノンボーラーズ", + "Rootage", + "HEROIC VERSE", + "BPL", + "BPL ROUND1", + "BPL APINA VRAMeS", + "BPL SILKHAT", + "BPL レジャーランド", + "BPL SUPER NOVA Tohoku", + "BPL GAME PANIC", +]; + +export const lanecover_list: string[] = [ + "デフォルト", + "sigsig", + "内部フレーム", + "空", + "KAMAITACHI", + "タオル", + "コスモス", + "度胸兄弟", + "Blind Justice", + "迷彩", + "bloomin' feeling", + "Marie Antoinette(AC未使用)", //削除曲のため + "Elisha", + "Kung-fu Empire", + "Tune of beat#3", + "EMPRESS", + "Programmed World", + "3y3s", + "UMEGIRI", + "KANZAKI", + "Rock Da House", + "THE DOOR INTO RAINBOW", + "Aegis", + "Vermilion", + "Phoenix", + "Lucky Days", + "Almace", + "DIAMOND CROSSING", + "Mamonis", + "Ashemu", + "Bulluvegola", + "Beridzebeth", + "Levaslater", + "STN", + "Rche", + "Neulakyussra", + "Cybele", + "Cuvelia", + "Liberation", + "Praludium", + "少女アリスと箱庭幻想コンチェルト", + "Re:GENERATION", + "20 system bg", + "旋律のドグマ~Miserables~/TYPE A", + "旋律のドグマ~Miserables~/TYPE B", + "Elektric U-Phoria", + "MAGIC & LOVE", + "スパーダレリーフ", + "S!ck", + "CONCEPTUAL", + "ΕΛΠΙΣ", + "rumrum triplets", + "SYNC-ANTHEM", + "Thor's Hammer", + "Plan 8", + "仮想空間の旅人たち", + "8bit Princess", + "planarian", + "Dynamite1", + "龍と少女とデコヒーレンス", + "トリカゴノ鳳凰", + "Proof of the existence", + "BRAVE GLOW/機動怪獣リングール", + "BRAVE GLOW/トリコロイダー", + "VEGA/VEGAうさぎ", + "VEGA/中のひと", + "カジノファイヤーことみちゃん", + "New Lights", + "灼熱くんやきそば", + "即席!脳直★ミュージックシステム", + "キャトられ恋はモ~モク", + "オンリーワンカバー", + "ジザル", + "ジャックティーロ", + "ジャックハンス", + "イェンス", + "アムドゥシアン", + "マクスウェリオン", + "ラプラシア", + "ルシェ", + "スモモ", + "ファウラ", + "ベリゼベス", + "エルピス・キラ", + "フェリーラ", + "オールパトナ", + "あいむちゃん", + "人魚のPrim", + "アヤカシ二人", + "SHELTER OF THE MIND", + "Acid Pumper", + "X", + "ハーティー", + "Nightmare before oversleep", + "Highcharge Divolt", + "Godspeed(少年)", + "車掌イージス", + "GENERATE", + "Dynamite2", + "格闘乙女", + "レル DX2300系", + "つゆ太", + "La dolce primavera", + "AO-1", + "真 地獄超特急 -HELL or HELL-", + "モード", + "ミニョンヌ鉄道兄弟", + "冬椿", + "PAPAYAPA BASS", + "鴉", + "AsiaN distractive", + "TOGAKUSHI", + "Modular Technology", + "獅子霞麗ノ舞", + "Music is The Answer", + "!Viva!", + "SINOBUZ UI", + "ChaserXX", + "Amor De Verao", + "エディブルフラワーの独白", + "ハイ*ビスカス ft. Kanae Asaba", + "Midnight Lady", + "FUTURE is Dead", + "Break Stasis", + "草原の王女-軌跡を辿って-", + "Exhaust Hype", + "25UI", + "焔極OVERKILL", + "Breakin' Chain", + "津軽雪", + "Yellow Sketch(RX-Ver.S.P.L.)", + "Steel Edge", + "Go Ahead!!", + "Sky High(AC未使用)", + "イザナミノナゲキ", + "GuNGNiR", + "ディッシュウォッシャー◎彡おいわちゃん(AC未使用)", + "BroGamer", + "FUZIN RIZIN(AC未使用)", + "Mare Nectaris(AC未使用)", + "Quakes", + "Rave Cannon(AC未使用)", + "ECHIDNA", + "Snakey Kung-fu", + "刃図羅", + "忍恋花", + "法具「バズラ」", + "HADES", + "DEATH†ZIGOQ", + "東京神話", + "Initiation", + "EMERALDAS", + "Chemical Cookie", + "ナイトシティー・アヴァンチュール", + "シムルグの目醒め", + "n'pa pa BBQ", + "ANCHOR", + "IIDX AIR RACE", + "THE DAY OF JUBILATIONS", + "HEISEI", + "IDC feat.REVERBEE (Mo'Cuts Ver)", + "Yum Yum Jelly", + "夏の匂い。キミの残像。 ft. Kanae Asaba", + "Hurry Hurry", + "OVERTIME", + "ミストレス・アンに花束を", + "Ember Lights", + "Rootage", + "Urban Constellations", + "金野火織の金色提言", + "龍王の霊廟(Mausoleum Of The Primal Dragon)", + "Painful Fate", + "Drastic Dramatic", + "抱きしめてモナムール", + "Trill auf G", + "Lethal Weapon", + "HEROIC VERSE", + "Primitive Vibes", + "Calvados Queen", + "Ska-sh All Neurons!!", + "Moving on", + "Hyper Drive feat. ぷにぷに電機", + "THE BRAVE MUST DIE", + "曼荼羅恋々", + "Silly Love", + "Change Yourself", + "Virus Funk", + "BPL", + "BPL ROUND1", + "BPL APINA VRAMeS", + "BPL SILKHAT", + "BPL レジャーランド", + "BPL SUPER NOVA Tohoku", + "BPL GAME PANIC", +]; + +export const judge_list: string[] = [ + "デフォルト", + "デジタル", + "スマート", + "メタリックブルー", + "テクノ", + "ワイヤー", + "ABYSS", + "SPADA", + "ANCIENT", + "オンリーワンジャッジ", + "電光掲示板風", + "SINOBUZ", + "セグメント", + "Rootage", + "HEROIC VERSE", +]; + +export const notes_list: string[] = [ + "デフォルト", + "細いノーツ", + "極細ノーツ", + "ゴージャス", + "アクア", + "ギャル", + "フォトン", + "パステル", + "シンプルカラー", + "ライト", + "tricoro", + "バブル", +]; + +export const keybeam_list: string[] = [ + "デフォルト", + "ショート", + "ロング", + "オレンジ", + "ピンク", + "モノクロ", + "ベリーショート", + "ライトニング", + "オンリーワンビーム", + "コピュライト", + "CBビーム", + "HVビーム(AC未使用)", +]; + +export const fullcombo_list: string[] = [ + "デフォルト", + "IIDX RED", + "HAPPY SKY", + "DistorteD", + "GOLD", + "DJ TROOPERS", + "EMPRESS", + "SIRIUS", + "Resort Anthem", + "Lincle", + "tricoro", + "SPADA", + "オンリーワンフルコンボ", + "PENDUAL", + "copula", + "SINOBUZ", + "キャノンフィニッシュ", + "Rootage", + "HEROIC VERSE", +]; + +export const effect_list: string[] = [ + "OFF", + "ECHO / REVERB", + "COMPRESSOR / REVERB EX", + "CHORUS / FLANGER", + "GARGLE / DISTORTION", + "EQ ONLY" +]; + +export const bombsize_list: string[] = [ + "100%", + "70%", + "80%", + "90%", + "110%", + "120%", + "130%", +]; + +export const first_note_preview_list: string[] = [ + "default", + "Always ON", + "Always OFF", +]; \ No newline at end of file diff --git a/data/settingslist.ts b/data/settingslist.ts new file mode 100644 index 0000000..cae9c31 --- /dev/null +++ b/data/settingslist.ts @@ -0,0 +1 @@ +export const ShopRanking_list: string[] = ["PersonalBest","AllProfilesRanking"]; \ No newline at end of file diff --git a/handlers/IIDXgrade.ts b/handlers/IIDXgrade.ts new file mode 100644 index 0000000..57f1931 --- /dev/null +++ b/handlers/IIDXgrade.ts @@ -0,0 +1,92 @@ +import { grade } from "../models/grade"; +import { GetVersion, IIDXidTorefid } from "../util"; +import { pc_data } from "../models/pc_data"; + +export const graderaised: EPR = async (info, data, send) => { + const iidxid = parseInt($(data).attr().iidxid); + const refid = await IIDXidTorefid(iidxid); + const version = GetVersion(info); + const style = parseInt($(data).attr().gtype); + const gid = parseInt($(data).attr().gid); + const cstage = parseInt($(data).attr().cstage); + const achi = parseInt($(data).attr().achi); + const grade = await DB.FindOne(refid, { + collection: "grade", + version: version, + style: style, + grade: gid, + }); + const pc_data = await DB.FindOne(refid, { + collection: "pc_data", + version: version, + }); + if (grade) { + if (cstage <= grade.dArray[2]) { + let archmax = Math.max(achi, grade.dArray[3]); + let cstagemax = Math.max(cstage, grade.dArray[2]); + await DB.Upsert( + refid, + { + collection: "grade", + version: version, + style: style, + grade: gid, + }, + { + $set: { + version: version, + style: style, + grade: gid, + dArray: [style, gid, cstagemax, archmax], + }, + } + ); + } + } else { + await DB.Upsert( + refid, + { + collection: "grade", + version: version, + style: style, + grade: gid, + }, + { + $set: { + version: version, + style: style, + grade: gid, + dArray: [style, gid, cstage, achi], + }, + } + ); + } + if (cstage == 4 && style == 0 && pc_data.sgid < gid) { + await DB.Upsert( + refid, + { + collection: "pc_data", + version: version, + }, + { + $set: { + sgid: gid, + }, + } + ); + } else if (cstage == 4 && style == 1 && pc_data.dgid < gid) { + await DB.Upsert( + refid, + { + collection: "pc_data", + version: version, + }, + { + $set: { + dgid: gid, + }, + } + ); + } + send.object(K.ATTR({ pnum: "1337" })); +}; diff --git a/handlers/IIDXmusic.ts b/handlers/IIDXmusic.ts new file mode 100644 index 0000000..2768a02 --- /dev/null +++ b/handlers/IIDXmusic.ts @@ -0,0 +1,493 @@ +import { score, score_detail } from "../models/score"; +import { profile } from "../models/profile"; +import { shop_data } from "../models/shop_data"; +import { + base64decode, + ClidToRank, + GetVersion, + IIDXidTorefid, + DateToName, + refidToName, +} from "../util"; +import { pc_data } from "../models/pc_data"; +import { ShopRanking_list } from "../data/settingslist"; + +export const musicreg: EPR = async (info, data, send) => { + const iidxid = parseInt($(data).attr().iidxid); + const version = GetVersion(info); + const refid = await IIDXidTorefid(iidxid); + const profile = await DB.FindOne(refid, { + collection: "profile", + }); + const shop_data = await DB.FindOne({ + collection: "shop_data", + }); + const pc_data = await DB.FindOne(refid, { + collection: "pc_data", + version: version, + }); + const qpro = { + head: U.GetConfig("qpro_head"), + hair: U.GetConfig("qpro_hair"), + hand: U.GetConfig("qpro_hand"), + face: U.GetConfig("qpro_face"), + body: U.GetConfig("qpro_body"), + }; + + //譜面難易度(0がSPビギナー 4がSPレジェンダリア 5がDPビギナー(該当曲無し) 9がDPレジェンダリア) + const clid = parseInt($(data).attr().clid); + //musicid + const music_id = parseInt($(data).element("music_play_log").attr().music_id); + //SPが0 DPが1 + const style = parseInt($(data).element("music_play_log").attr().play_style); + //譜面難易度(0がビギナー 4がレジェンダリア) + const rank = parseInt($(data).element("music_play_log").attr().note_id); + //クリア(0:noplay 1:failed 2:assisted 3:easy 4:normal 5:hard 6:exhard 7:fc) + const clear = parseInt($(data).element("music_play_log").attr().clear_flg); + //exscore + const exscore = parseInt($(data).element("music_play_log").attr().ex_score); + //ミスカウント + const miss = parseInt($(data).element("music_play_log").attr().miss_num); + //途中落ちかどうか(途中落ち:0 完走:1) + const is_sudden_death = !$(data) + .element("music_play_log") + .bool("is_sudden_death"); + //ゴースト(base64) + const ghost = $(data) + .element("music_play_log") + .buffer("ghost") + .toString("base64"); + + let mArray = [-1, music_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1]; + let dbflg = 0; + let update = 1; + + const music_data: score | null = await DB.FindOne(refid, { + collection: "score", + music_id: music_id, + }); + + const score_temp: score_detail | null = await DB.FindOne( + refid, + { + collection: "score_detail", + music_id: music_id, + + clid: clid, + } + ); + + //mArrayがDB内に見つかったら代入 + + if (music_data) { + if (style == 0 && music_data.spmArray) { + mArray = music_data.spmArray; + dbflg = 1; + if ( + _.isNil(score_temp) && + (music_data.spmArray[rank + 2] != 0 || + music_data.spmArray[rank + 7] != 0) + ) { + await DB.Insert(refid, { + collection: "score_detail", + + music_id: music_id, + clid: clid, + + score: music_data.spmArray[rank + 7], + clflg: music_data.spmArray[rank + 2], + miss: music_data.spmArray[rank + 12], + time: Date.now() - 86400000, + }); + } + } else if (style == 1 && music_data.dpmArray) { + mArray = music_data.dpmArray; + dbflg = 1; + if ( + _.isNil(score_temp) && + (music_data.dpmArray[rank + 2] != 0 || + music_data.spmArray[rank + 7] != 0) + ) { + await DB.Insert(refid, { + collection: "score_detail", + + music_id: music_id, + clid: clid, + + score: music_data.dpmArray[rank + 7], + clflg: music_data.dpmArray[rank + 2], + miss: music_data.dpmArray[rank + 12], + time: Date.now() - 86400000, + }); + } + } + } + + //クリアランプ + mArray[rank + 2] = Math.max(clear, mArray[rank + 2]); + // 完走の場合ミスカウントセーブ + if (is_sudden_death) { + // -1の場合大小比較出来ない為 + if (mArray[rank + 12] == -1) { + mArray[rank + 12] = miss; + } else { + mArray[rank + 12] = Math.min(mArray[rank + 12], miss); + } + } + if (style == 0) { + if (mArray[rank + 7] < exscore || dbflg == 0) { + //スコア + mArray[rank + 7] = Math.max(exscore, mArray[rank + 7]); + await DB.Upsert( + refid, + { + collection: "score", + music_id: music_id, + }, + { + $set: { + music_id: music_id, + spmArray: mArray, + [clid]: ghost, + }, + } + ); + } else { + mArray[rank + 7] = Math.max(exscore, mArray[rank + 7]); + update = 0; + await DB.Upsert( + refid, + { + collection: "score", + music_id: music_id, + }, + { + $set: { + music_id: music_id, + spmArray: mArray, + }, + } + ); + } + } else if (style == 1) { + if (mArray[rank + 7] < exscore || dbflg == 0) { + mArray[rank + 7] = Math.max(exscore, mArray[rank + 7]); + await DB.Upsert( + refid, + { + collection: "score", + music_id: music_id, + }, + { + $set: { + music_id: music_id, + dpmArray: mArray, + [clid]: ghost, + }, + } + ); + } else { + mArray[rank + 7] = Math.max(exscore, mArray[rank + 7]); + update = 0; + await DB.Upsert( + refid, + { + collection: "score", + music_id: music_id, + }, + { + $set: { + music_id: music_id, + dpmArray: mArray, + }, + } + ); + } + } + + //スコア詳細 + await DB.Insert(refid, { + collection: "score_detail", + + music_id: music_id, + clid: clid, + + score: exscore, + clflg: clear, + miss: miss, + + time: Date.now(), + }); + + const result = { + shopdata: K.ATTR({ rank: "1" }), + LDJ: K.ATTR({ + clid: "1", + crate: "1000", + frate: "0", + mid: String(music_id), + }), + ranklist: { + data: [], + }, + }; + //スコア詳細ロード[スコア,クリアランプ] + const scores = ( + await DB.Find(refid, { + collection: "score_detail", + music_id: music_id, + + clid: clid, + }) + ).map((r) => [r.score, r.clflg, r.time]); + + scores.sort((a, b) => b[0] - a[0] || a[1] - b[1]); + + //スコアが5つの時削除(仮) + if (scores.length >= 5) { + const dscore = scores[4][0]; + const dclflg = scores[4][1]; + const dtime = scores[4][2]; + await DB.Remove(refid, { + collection: "score_detail", + + music_id: music_id, + clid: clid, + + score: dscore, + clflg: dclflg, + time: dtime, + }); + } + + if (ShopRanking_list.indexOf(U.GetConfig("ShopRanking")) == 0) { + //今プレイした順位を計算 + const currentrank = scores.findIndex( + (item) => item[0] == exscore && item[1] == clear + ); + + const now = Date.now(); + + scores.forEach((rankscore, index) => { + if (index == currentrank) { + result.ranklist.data.push( + K.ATTR({ + body: qpro.body, + clflg: String(rankscore[1]), + dgrade: String(pc_data.dgid), + face: qpro.face, + hair: qpro.hair, + hand: qpro.hand, + head: qpro.head, + iidx_id: String(profile.iidxid), + myFlg: "1", + name: profile.name, + opname: shop_data.shop_name, + pid: String(profile.pid), + rnum: String(index + 1), + score: String(rankscore[0]), + sgrade: String(pc_data.sgid), + update: String(update), + }) + ); + } else { + result.ranklist.data.push( + K.ATTR({ + body: qpro.body, + clflg: String(rankscore[1]), + dgrade: String(pc_data.dgid), + face: qpro.face, + hair: qpro.hair, + hand: qpro.hand, + head: qpro.head, + iidx_id: String(profile.iidxid), + myFlg: "0", + name: DateToName(now, rankscore[2]), + opname: shop_data.shop_name, + pid: String(profile.pid), + rnum: String(index + 1), + score: String(rankscore[0]), + sgrade: String(pc_data.sgid), + update: "0", + }) + ); + } + }); + } else if (ShopRanking_list.indexOf(U.GetConfig("ShopRanking")) == 1) { + let pscores: any[][]; + if (style == 0) { + pscores = ( + await DB.Find(null, { + collection: "score", + music_id: music_id, + spmArray: { $exists: true }, + }) + ).map((r) => [r.spmArray[rank + 7], r.spmArray[rank + 2], r.__refid]); + } else if (style == 1) { + pscores = ( + await DB.Find(null, { + collection: "score", + music_id: music_id, + dpmArray: { $exists: true }, + }) + ).map((r) => [r.dpmArray[rank + 7], r.dpmArray[rank + 2], r.__refid]); + } + pscores.sort((a, b) => b[0] - a[0]); + const currentrank = pscores.findIndex((item) => item[2] == refid); + + pscores = await Promise.all( + pscores.map(async (r) => [r[0], r[1], await refidToName(r[2])]) + ); + + pscores.forEach((rankscore, index) => { + if (index == currentrank) { + result.ranklist.data.push( + K.ATTR({ + body: qpro.body, + clflg: String(rankscore[1]), + dgrade: String(pc_data.dgid), + face: qpro.face, + hair: qpro.hair, + hand: qpro.hand, + head: qpro.head, + iidx_id: String(profile.iidxid), + myFlg: "1", + name: profile.name, + opname: shop_data.shop_name, + pid: String(profile.pid), + rnum: String(index + 1), + score: String(rankscore[0]), + sgrade: String(pc_data.sgid), + update: String(update), + }) + ); + } else if (rankscore[0] != 0 || rankscore[1] != 0) { + result.ranklist.data.push( + K.ATTR({ + body: qpro.body, + clflg: String(rankscore[1]), + dgrade: String(pc_data.dgid), + face: qpro.face, + hair: qpro.hair, + hand: qpro.hand, + head: qpro.head, + iidx_id: String(profile.iidxid), + myFlg: "0", + name: rankscore[2], + opname: shop_data.shop_name, + pid: String(profile.pid), + rnum: String(index + 1), + score: String(rankscore[0]), + sgrade: String(pc_data.sgid), + update: "0", + }) + ); + } + }); + } + + send.object(result); +}; + +export const musicgetrank: EPR = async (info, data, send) => { + const cltype = $(data).attr().cltype; + const iidxid = parseInt($(data).attr().iidxid); + const refid = await IIDXidTorefid(iidxid); + + const spmArray: any = ( + await DB.Find(refid, { + collection: "score", + spmArray: { $exists: true }, + }) + ).map((r) => r.spmArray); + spmArray.sort((a: number, b: number) => a[1] - b[1]); + + const dpmArray: any = ( + await DB.Find(refid, { + collection: "score", + dpmArray: { $exists: true }, + }) + ).map((r) => r.dpmArray); + dpmArray.sort((a: number, b: number) => a[1] - b[1]); + + const result: any = { + style: K.ATTR({ type: cltype }), + m: [], + best: K.ARRAY( + "u16", + [ + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + 65535, + ], + { rno: "-1" } + ), + }; + if (cltype == "0") { + spmArray.forEach((m: number[]) => { + result.m.push(K.ARRAY("s16", m)); + }); + } else if (cltype == "1") { + dpmArray.forEach((m: number[]) => { + result.m.push(K.ARRAY("s16", m)); + }); + } + send.object(result); +}; + +export const musicappoint: EPR = async (info, data, send) => { + const iidxid = parseInt($(data).attr().iidxid); + const refid = await IIDXidTorefid(iidxid); + const music_id = parseInt($(data).attr().mid); + const clid = parseInt($(data).attr().clid); + const rank = ClidToRank(clid).rank; + const style = ClidToRank(clid).style; + let ghost: string, + score = 0; + const music_data_sp = await DB.FindOne(refid, { + collection: "score", + music_id: music_id, + spmArray: { $exists: true }, + [clid]: { $exists: true }, + }); + const music_data_dp = await DB.FindOne(refid, { + collection: "score", + music_id: music_id, + dpmArray: { $exists: true }, + [clid]: { $exists: true }, + }); + + if (style == 0 && music_data_sp) { + score = music_data_sp.spmArray[rank + 7]; + ghost = base64decode(music_data_sp[clid]); + send.object({ mydata: K.ITEM("bin", ghost, { score: String(score) }) }); + } else if (style == 1 && music_data_dp) { + score = music_data_dp.dpmArray[rank + 7]; + ghost = base64decode(music_data_dp[clid]); + send.object({ mydata: K.ITEM("bin", ghost, { score: String(score) }) }); + } else { + send.success(); + } +}; + +export const musiccrate: EPR = async (info, data, send) => { + const version = info.module; + send.pugFile("pug/crate.pug", { version }); +}; diff --git a/handlers/IIDXpc.ts b/handlers/IIDXpc.ts new file mode 100644 index 0000000..c9b3cdd --- /dev/null +++ b/handlers/IIDXpc.ts @@ -0,0 +1,446 @@ +import { settings } from "../models/settings"; +import { pc_data, IIDX27_pc_data} from "../models/pc_data"; +import { shop_data } from "../models/shop_data"; +import { profile } from "../models/profile"; +import { grade } from "../models/grade"; +import { GetVersion, IDToCode, AppendSettingConverter } from "../util"; +import { + first_note_preview_list, + bombsize_list, + effect_list, +} from "../data/27customlist"; +import { + frame_list, + fullcombo_list, + judge_list, + keybeam_list, + lanecover_list, + menumusic_list, + noteburst_list, + notes_list, + turntable_list, +} from "../data/27customlist"; + +export const pccommon: EPR = async (info, data, send) => { + const version = GetVersion(info); + if (version == 27) { + send.pugFile("pug/27pccommon.pug"); + } +}; + +export const pcoldget: EPR = async (info, data, send) => { + const refid = $(data).attr().rid; + const profile = await DB.FindOne(refid, { collection: "profile" }); + if (profile) { + send.success(); + } else { + send.deny(); + } +}; + +export const pcgetname: EPR = async (info, data, send) => { + const refid = $(data).attr().rid; + const profile = await DB.FindOne(refid, { collection: "profile" }); + send.object( + K.ATTR({ + idstr: profile.iidxidstr, + name: profile.name, + pid: String(profile.pid), + }) + ); +}; + +export const pctakeover: EPR = async (info, data, send) => { + const refid = $(data).attr().rid; + const profile = await DB.FindOne(refid, { collection: "profile" }); + const version = GetVersion(info); + let pc_data: object; + + if (version == 27) { + pc_data = IIDX27_pc_data; + } + + await DB.Upsert( + refid, + { + collection: "profile", + }, + { + $set: { + name: $(data).attr().name, + pid: parseInt($(data).attr().pid), + iidxid: profile.iidxid, + iidxidstr: profile.iidxidstr, + refid: refid, + }, + } + ); + await DB.Upsert( + refid, + { + collection: "pc_data", + version: version, + }, + { + $set: pc_data, + } + ); + send.object( + K.ATTR({ + id: String(profile.iidxid), + }) + ); +}; + +export const pcreg: EPR = async (info, data, send) => { + const id = _.random(10000000, 99999999); + const id_str = IDToCode(id); + const refid = $(data).attr().cid.split('|')[0]; + const version = GetVersion(info); + let pc_data: object; + + if (version == 27) { + pc_data = IIDX27_pc_data; + } + + await DB.Upsert( + refid, + { + collection: "profile", + }, + { + $set: { + name: $(data).attr().name, + pid: parseInt($(data).attr().pid), + iidxid: id, + iidxidstr: id_str, + refid: refid, + }, + } + ); + await DB.Upsert( + refid, + { + collection: "pc_data", + version: version, + }, + { + $set: pc_data, + } + ); + + send.object( + K.ATTR({ + id: id, + id_str: id_str, + // status: "0", + }) + ); +}; + +export const pcget: EPR = async (info, data, send) => { + const refid = $(data).attr().rid; + const version = GetVersion(info); + const pc_data = await DB.FindOne(refid, { + collection: "pc_data", + version: version, + }); + if (_.isNil(pc_data)) { + send.deny(); + } else { + const profile = await DB.FindOne(refid, { collection: "profile" }); + const shop_data = await DB.FindOne({ + collection: "shop_data", + }); + const dArray = ( + await DB.Find(refid, { + collection: "grade", + version: version, + }) + ).map((r) => r.dArray); + dArray.sort((a, b) => a[0] - b[0] || a[1] - b[1]); + const settings: settings = { + frame: frame_list.indexOf(U.GetConfig("frame")), + menu_music: menumusic_list.indexOf(U.GetConfig("menu_music")), + note_burst: noteburst_list.indexOf(U.GetConfig("note_burst")), + turntable: turntable_list.indexOf(U.GetConfig("turntable")), + lane_cover: lanecover_list.indexOf(U.GetConfig("lane_cover")), + pacemaker_cover: lanecover_list.indexOf(U.GetConfig("pacemaker_cover")), + note_skin: notes_list.indexOf(U.GetConfig("note_skin")), + judge_font: judge_list.indexOf(U.GetConfig("judge_font")), + note_beam: keybeam_list.indexOf(U.GetConfig("note_beam")), + full_combo_splash: fullcombo_list.indexOf( + U.GetConfig("full_combo_splash") + ), + score_folders: Boolean(U.GetConfig("score_folders")), + clear_folders: Boolean(U.GetConfig("clear_folders")), + difficulty_folders: Boolean(U.GetConfig("difficulty_folders")), + alphabet_folders: Boolean(U.GetConfig("alphabet_folders")), + hide_playcount: Boolean(U.GetConfig("hide_playcount")), + disable_graphcutin: Boolean(U.GetConfig("disable_graphcutin")), + classic_hispeed: Boolean(U.GetConfig("classic_hispeed")), + hide_iidxid: Boolean(U.GetConfig("hide_iidxid")), + disable_musicpreview: Number(U.GetConfig("disable_musicpreview")), + vefx_lock: Number(U.GetConfig("vefx_lock")), + effect: effect_list.indexOf(U.GetConfig("effect")), + bomb_size: bombsize_list.indexOf(U.GetConfig("bomb_size")), + disable_hcn_color: Number(U.GetConfig("disable_hcn_color")), + first_note_preview: first_note_preview_list.indexOf( + U.GetConfig("first_note_preview") + ), + qpro_head: U.GetConfig("qpro_head"), + qpro_hair: U.GetConfig("qpro_hair"), + qpro_hand: U.GetConfig("qpro_hand"), + qpro_face: U.GetConfig("qpro_face"), + qpro_body: U.GetConfig("qpro_body"), + }; + + const appendsetting = AppendSettingConverter( + settings.score_folders, + settings.clear_folders, + settings.difficulty_folders, + settings.alphabet_folders, + settings.hide_playcount, + settings.disable_graphcutin, + settings.classic_hispeed, + settings.hide_iidxid + ); + + if (version == 27) { + send.pugFile("pug/27get.pug", { + settings, + profile, + appendsetting, + pc_data, + shop_data, + dArray, + }); + } + } +}; + +export const pcsave: EPR = async (info, data, send) => { + const refid = $(data).attr().cid.split('|')[0]; + const cltype = parseInt($(data).attr().cltype); + const version = GetVersion(info); + const pc_data = await DB.FindOne(refid, { + collection: "pc_data", + version: version, + }); + let spnum = pc_data.spnum, + dpnum = pc_data.dpnum, + sprank = pc_data.sprank, + sppoint = pc_data.sppoint, + dprank = pc_data.dprank, + dppoint = pc_data.dppoint, + spradar = pc_data.spradar, + dpradar = pc_data.dpradar, + dp_clear_mission_clear = pc_data.dp_clear_mission_clear, + dp_clear_mission_level = pc_data.dp_clear_mission_level, + dp_dj_mission_clear = pc_data.dp_dj_mission_clear, + dp_dj_mission_level = pc_data.dp_dj_mission_level, + dp_level = pc_data.dp_level, + dp_mission_point = pc_data.dp_mission_point, + dp_mplay = pc_data.dp_mplay, + enemy_damage = pc_data.enemy_damage, + progress = pc_data.progress, + sp_clear_mission_clear = pc_data.sp_clear_mission_clear, + sp_clear_mission_level = pc_data.sp_clear_mission_level, + sp_dj_mission_clear = pc_data.sp_dj_mission_clear, + sp_dj_mission_level = pc_data.sp_dj_mission_level, + sp_level = pc_data.sp_level, + sp_mission_point = pc_data.sp_mission_point, + sp_mplay = pc_data.sp_mplay, + tips_read_list = pc_data.tips_read_list; + + let d_liflen = 0, + s_liflen = 0, + ngrade = 0; + if (cltype == 0) { + spnum = pc_data.spnum + 1; + dpnum = pc_data.dpnum; + } + if (cltype == 1) { + spnum = pc_data.spnum + 1; + //dpnumって何 + dpnum = pc_data.dpnum + 1; + } + //liflenが存在したとき + if ($(data).attr().d_lift) { + d_liflen = parseInt($(data).attr().d_lift); + } + if ($(data).attr().s_lift) { + s_liflen = parseInt($(data).attr().s_lift); + } + + if (!_.isNil($(data).attr("step").dp_clear_mission_clear)) { + dp_clear_mission_clear = parseInt( + $(data).attr("step").dp_clear_mission_clear + ); + dp_clear_mission_level = parseInt( + $(data).attr("step").dp_clear_mission_level + ); + dp_dj_mission_clear = parseInt($(data).attr("step").dp_dj_mission_clear); + dp_dj_mission_level = parseInt($(data).attr("step").dp_dj_mission_level); + dp_level = parseInt($(data).attr("step").dp_level); + dp_mission_point = parseInt($(data).attr("step").dp_mission_point); + dp_mplay = parseInt($(data).attr("step").dp_mplay); + enemy_damage = parseInt($(data).attr("step").enemy_damage); + progress = parseInt($(data).attr("step").progress); + sp_clear_mission_clear = parseInt( + $(data).attr("step").sp_clear_mission_clear + ); + sp_clear_mission_level = parseInt( + $(data).attr("step").sp_clear_mission_level + ); + sp_dj_mission_clear = parseInt($(data).attr("step").sp_dj_mission_clear); + sp_dj_mission_level = parseInt($(data).attr("step").sp_dj_mission_level); + sp_level = parseInt($(data).attr("step").sp_level); + sp_mission_point = parseInt($(data).attr("step").sp_mission_point); + sp_mplay = parseInt($(data).attr("step").sp_mplay); + tips_read_list = parseInt($(data).attr("step").tips_read_list); + } + + if ($(data).attr("dj_rank.1").style == "1") { + sprank = $(data).element("dj_rank").numbers("rank"); + sppoint = $(data).element("dj_rank").numbers("point"); + dprank = $(data).element("dj_rank.1").numbers("rank"); + dppoint = $(data).element("dj_rank.1").numbers("point"); + } else if ($(data).attr("dj_rank").style == "0") { + sprank = $(data).element("dj_rank").numbers("rank"); + sppoint = $(data).element("dj_rank").numbers("point"); + dprank = pc_data.dprank; + dppoint = pc_data.dppoint; + } else if ($(data).attr("dj_rank").style == "1") { + sprank = pc_data.sprank; + sppoint = pc_data.sppoint; + dprank = $(data).element("dj_rank").numbers("rank"); + dppoint = $(data).element("dj_rank").numbers("point"); + } else { + sprank = pc_data.sprank; + sppoint = pc_data.sppoint; + dprank = pc_data.dprank; + dppoint = pc_data.dppoint; + } + + if ($(data).attr("notes_radar.1").style == "1") { + spradar = $(data).element("notes_radar").numbers("radar_score"); + dpradar = $(data).element("notes_radar.1").numbers("radar_score"); + } else if ($(data).attr("notes_radar").style == "0") { + spradar = $(data).element("notes_radar").numbers("radar_score"); + dpradar = pc_data.dpradar; + } else if ($(data).attr("notes_radar").style == "1") { + spradar = pc_data.spradar; + dpradar = $(data).element("notes_radar").numbers("radar_score"); + } else { + spradar = pc_data.spradar; + dpradar = pc_data.dpradar; + } + if (version == 27) { + await DB.Upsert( + refid, + { + collection: "pc_data", + version: version, + }, + { + $set: { + deller: + pc_data.deller + parseInt($(data).element("deller").attr().deller), + + trophy: $(data) + .element("achievements") + .bigints("trophy") + .slice(0, 10) + .map(String), + + sprank: sprank, + sppoint: sppoint, + dprank: dprank, + dppoint: dppoint, + + spradar: spradar, + dpradar: dpradar, + + dp_clear_mission_clear: dp_clear_mission_clear, + dp_clear_mission_level: dp_clear_mission_level, + dp_dj_mission_clear: dp_dj_mission_clear, + dp_dj_mission_level: dp_dj_mission_level, + dp_level: dp_level, + dp_mission_point: dp_mission_point, + dp_mplay: dp_mplay, + enemy_damage: enemy_damage, + progress: progress, + sp_clear_mission_clear: sp_clear_mission_clear, + sp_clear_mission_level: sp_clear_mission_level, + sp_dj_mission_clear: sp_dj_mission_clear, + sp_dj_mission_level: sp_dj_mission_level, + sp_level: sp_level, + sp_mission_point: sp_mission_point, + sp_mplay: sp_mplay, + tips_read_list: tips_read_list, + + dpnum: dpnum, + d_auto_scrach: parseInt($(data).attr().d_auto_scrach), + d_camera_layout: parseInt($(data).attr().d_camera_layout), + d_disp_judge: parseInt($(data).attr().d_disp_judge), + d_gauge_disp: parseInt($(data).attr().d_gauge_disp), + d_ghost_score: parseInt($(data).attr().d_ghost_score), + d_gno: parseInt($(data).attr().d_gno), + d_graph_score: parseInt($(data).attr().d_graph_score), + d_gtype: parseInt($(data).attr().d_gtype), + d_hispeed: parseFloat($(data).attr().d_hispeed), + d_judge: parseInt($(data).attr().d_judge), + d_judgeAdj: parseInt($(data).attr().d_judgeAdj), + d_lane_brignt: parseInt($(data).attr().d_lane_brignt), + d_liflen: d_liflen, + d_notes: parseFloat($(data).attr().d_notes), + d_opstyle: parseInt($(data).attr().d_opstyle), + d_pace: parseInt($(data).attr().d_pace), + d_sdlen: parseInt($(data).attr().d_sdlen), + d_sdtype: parseInt($(data).attr().d_sdtype), + d_sorttype: parseInt($(data).attr().d_sorttype), + d_timing: parseInt($(data).attr().d_timing), + d_tsujigiri_disp: parseInt($(data).attr().d_tsujigiri_disp), + dach: parseInt($(data).attr().d_achi), + dp_opt: $(data).attr().dp_opt, + dp_opt2: $(data).attr().dp_opt2, + d_sub_gno: parseInt($(data).attr().d_sub_gno), + + gpos: parseInt($(data).attr().gpos), + mode: parseInt($(data).attr().mode), + pmode: parseInt($(data).attr().pmode), + rtype: parseInt($(data).attr().rtype), + + spnum: spnum, + s_auto_scrach: parseInt($(data).attr().s_auto_scrach), + s_camera_layout: parseInt($(data).attr().s_camera_layout), + s_disp_judge: parseInt($(data).attr().s_disp_judge), + s_gauge_disp: parseInt($(data).attr().s_gauge_disp), + s_ghost_score: parseInt($(data).attr().s_ghost_score), + s_gno: parseInt($(data).attr().s_gno), + s_graph_score: parseInt($(data).attr().s_graph_score), + s_gtype: parseInt($(data).attr().s_gtype), + s_hispeed: parseFloat($(data).attr().s_hispeed), + s_judge: parseInt($(data).attr().s_judge), + s_judgeAdj: parseInt($(data).attr().s_judgeAdj), + s_lane_brignt: parseInt($(data).attr().s_lane_brignt), + s_liflen: s_liflen, + s_notes: parseFloat($(data).attr().s_notes), + s_opstyle: parseInt($(data).attr().s_opstyle), + s_pace: parseInt($(data).attr().s_pace), + s_sdlen: parseInt($(data).attr().s_sdlen), + s_sdtype: parseInt($(data).attr().s_sdtype), + s_sorttype: parseInt($(data).attr().s_sorttype), + s_timing: parseInt($(data).attr().s_timing), + s_tsujigiri_disp: parseInt($(data).attr().s_tsujigiri_disp), + sach: parseInt($(data).attr().s_achi), + sp_opt: $(data).attr().sp_opt, + s_sub_gno: parseInt($(data).attr().s_sub_gno), + }, + } + ); + } + + send.success(); +}; diff --git a/handlers/IIDXshop.ts b/handlers/IIDXshop.ts new file mode 100644 index 0000000..675da55 --- /dev/null +++ b/handlers/IIDXshop.ts @@ -0,0 +1,77 @@ +import { shop_data } from "../models/shop_data"; +export const shopgetname: EPR = async (info, data, send) => { + // バージョン + console.debug(`Version:${info.module.substr(0, 6)}`); + const shop_data = await DB.FindOne({ + collection: "shop_data", + }); + const shop_data_old = await DB.FindOne(null, { + collection: "shop_data", + }); + if(shop_data_old){ + await DB.Remove(null, { + collection: "shop_data", + }); + } + if (_.isNil(shop_data)) { + await DB.Insert({ + collection: "shop_data", + + shop_name: "Asphyxia", + }); + send.object( + K.ATTR({ + cls_opt: "0", + hr: "0", + mi: "0", + opname: "Asphyxia", + pid: "57", + // status: "0", + }) + ); + } else { + send.object( + K.ATTR({ + cls_opt: "0", + hr: "0", + mi: "0", + opname: shop_data.shop_name, + pid: "57", + // status: "0", + }) + ); + } +}; + +export const shopgetconvention: EPR = async (info, data, send) => { + send.object( + K.ATTR( + { + end_time: "0", + music_0: "23051", + music_1: "24010", + music_2: "12004", + music_3: "26007", + start_time: "0", + // status: "0", + }, + { + valid: K.ITEM("bool", 0), + } + ) + ); +}; + +export const shopsavename: EPR = async (info, data, send) => { + await DB.Upsert( + { + collection: "shop_data", + }, + { + $set: { + shop_name: $(data).attr().opname, + }, + } + ); + send.success(); +}; diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..2f8a9e7 --- /dev/null +++ b/index.ts @@ -0,0 +1,199 @@ +import { + shopgetname, + shopgetconvention, + shopsavename, +} from "./handlers/IIDXshop"; +import { + pccommon, + pcoldget, + pcreg, + pcget, + pcsave, + pctakeover, + pcgetname, +} from "./handlers/IIDXpc"; +import { + effect_list, + frame_list, + fullcombo_list, + judge_list, + keybeam_list, + lanecover_list, + menumusic_list, + noteburst_list, + notes_list, + turntable_list, +} from "./data/27customlist"; +import { + musicreg, + musicgetrank, + musicappoint, + musiccrate, +} from "./handlers/IIDXmusic"; +import { graderaised } from "./handlers/IIDXgrade"; +import { bombsize_list, first_note_preview_list } from "./data/27customlist"; +import { ShopRanking_list } from "./data/settingslist"; + +export function register() { + R.Contributor("sol#1207", "https://twitter.com/0x1F5"); + + R.Config("ShopRanking", { + type: "string", + default: "PersonalBest", + options: ShopRanking_list, + }); + R.Config("frame", { + type: "string", + default: "デフォルト", + options: frame_list, + }); + R.Config("menu_music", { + type: "string", + default: "デフォルト", + options: menumusic_list, + }); + R.Config("note_burst", { + type: "string", + default: "デフォルト", + options: noteburst_list, + }); + + R.Config("turntable", { + type: "string", + default: "デフォルト", + options: turntable_list, + }); + + R.Config("lane_cover", { + type: "string", + default: "デフォルト", + options: lanecover_list, + }); + R.Config("pacemaker_cover", { + type: "string", + default: "デフォルト", + options: lanecover_list, + }); + R.Config("note_skin", { + type: "string", + default: "デフォルト", + options: notes_list, + }); + R.Config("judge_font", { + type: "string", + default: "デフォルト", + options: judge_list, + }); + R.Config("note_beam", { + type: "string", + default: "デフォルト", + options: keybeam_list, + }); + R.Config("full_combo_splash", { + type: "string", + default: "デフォルト", + options: fullcombo_list, + }); + R.Config("score_folders", { type: "boolean", default: true }); + R.Config("clear_folders", { type: "boolean", default: true }); + R.Config("difficulty_folders", { type: "boolean", default: true }); + R.Config("alphabet_folders", { type: "boolean", default: true }); + R.Config("hide_playcount", { type: "boolean", default: false }); + R.Config("disable_graphcutin", { type: "boolean", default: false }); + R.Config("classic_hispeed", { type: "boolean", default: false }); + R.Config("hide_iidxid", { type: "boolean", default: false }); + R.Config("disable_musicpreview", { type: "boolean", default: false }); + R.Config("vefx_lock", { type: "boolean", default: false }); + R.Config("effect", { + type: "string", + default: "OFF", + options: effect_list, + }); + R.Config("bomb_size", { + type: "string", + default: "100%", + options: bombsize_list, + }); + R.Config("disable_hcn_color", { type: "boolean", default: false }); + R.Config("first_note_preview", { + type: "string", + default: "default", + options: first_note_preview_list, + }); + + R.Config("qpro_head", { type: "integer", default: 0 }); + R.Config("qpro_hair", { type: "integer", default: 0 }); + R.Config("qpro_hand", { type: "integer", default: 0 }); + R.Config("qpro_face", { type: "integer", default: 0 }); + R.Config("qpro_body", { type: "integer", default: 0 }); + + R.GameCode("LDJ"); + const MultiRoute = (method: string, handler: EPR | boolean) => { + // Helper for register multiple versions. + R.Route(`IIDX27${method}`, handler); + //R.Route(`IIDXのバージョン${method}`, handler); + }; + + //pc + MultiRoute("pc.get", pcget); + MultiRoute("pc.reg", pcreg); + //MultiRoute("pc.lcommon", true); + MultiRoute("pc.save", pcsave); + MultiRoute("pc.getname", pcgetname); + //MultiRoute("pc.locaend", true); + MultiRoute("pc.common", pccommon); + MultiRoute("pc.takeover", pctakeover); + //MultiRoute("pc.playstart", true); + //MultiRoute("pc.playend", true); + MultiRoute("pc.delete", true); + //MultiRoute("pc.visit", true); + //MultiRoute("pc.shopregister", true); + MultiRoute("pc.oldget", pcoldget); + MultiRoute("pc.eaappliresult", true); + MultiRoute("pc.eaappliexpert", true); + MultiRoute("pc.logout", true); + //MultiRoute("pc.qrreward", true); + //MultiRoute("pc.qrcompe", true); + //MultiRoute("pc.qrfollow", true); + + //music + MultiRoute("music.getrank", musicgetrank); + //MultiRoute("music.lplay", true); + //MultiRoute("music.play", true); + MultiRoute("music.reg", musicreg); + MultiRoute("music.crate", musiccrate); + MultiRoute("music.appoint", musicappoint); + //MultiRoute("music.nosave", true); + //MultiRoute("music.arenaCPU", true); + + //grade + MultiRoute("grade.raised", graderaised); + + //shop + MultiRoute("shop.sentinfo", true); + //MultiRoute("shop.keepalive", true); + MultiRoute("shop.savename", shopsavename); + MultiRoute("shop.getname", shopgetname); + //MultiRoute("shop.setconvention", true); + MultiRoute("shop.getconvention", shopgetconvention); + //MultiRoute("shop.sendpcbdetail", true); + MultiRoute("shop.sendescapepackageinfo", true); + //MultiRoute("shop.recoveryfilelog", true); + + //ranking + //MultiRoute("ranking.entry", true); + //MultiRoute("ranking.oentry", true); + MultiRoute("ranking.getranker", true); + //MultiRoute("ranking.classicentry", true); + //MultiRoute("ranking.conventionentry", true); + + //lobby + //MultiRoute("lobby.entry", true); + //MultiRoute("lobby.update", true); + //MultiRoute("lobby.delete", true); + + //gameSystem + MultiRoute("gameSystem.systemInfo", true); + + R.Unhandled(); +} diff --git a/models/grade.ts b/models/grade.ts new file mode 100644 index 0000000..d5cf621 --- /dev/null +++ b/models/grade.ts @@ -0,0 +1,8 @@ +export interface grade { + collection: "grade"; + + version: number; + style: number, + grade: number, + dArray: number[]; +} diff --git a/models/pc_data.ts b/models/pc_data.ts new file mode 100644 index 0000000..9b99cc1 --- /dev/null +++ b/models/pc_data.ts @@ -0,0 +1,194 @@ +export interface pc_data { + collection: "pc_data"; + + version: number; + + sgid: number; + dgid: number; + + deller: number; + trophy: string[]; + + sprank: number[]; + sppoint: number[]; + dprank: number[]; + dppoint: number[]; + + spradar: number[]; + dpradar: number[]; + + dp_clear_mission_clear: number; + dp_clear_mission_level: number; + dp_dj_mission_clear: number; + dp_dj_mission_level: number; + dp_level: number; + dp_mission_point: number; + dp_mplay: number; + enemy_damage: number; + progress: number; + sp_clear_mission_clear: number; + sp_clear_mission_level: number; + sp_dj_mission_clear: number; + sp_dj_mission_level: number; + sp_level: number; + sp_mission_point: number; + sp_mplay: number; + tips_read_list: number; + + dpnum: number; + d_auto_scrach: number; + d_camera_layout: number; + d_disp_judge: number; + d_gauge_disp: number; + d_ghost_score: number; + d_gno: number; + d_graph_score: number; + d_gtype: number; + d_hispeed: number; + d_judge: number; + d_judgeAdj: number; + d_lane_brignt: number; + d_liflen: number; + d_notes: number; + d_opstyle: number; + d_pace: number; + d_sdlen: number; + d_sdtype: number; + d_sorttype: number; + d_timing: number; + d_tsujigiri_disp: number; + dach: number; + dp_opt: string; + dp_opt2: string; + d_exscore: number; + d_sub_gno: number; + d_tune: number; + + gpos: number; + mode: number; + pmode: number; + rtype: number; + ngrade: number; + + spnum: number; + s_auto_scrach: number; + s_camera_layout: number; + s_disp_judge: number; + s_gauge_disp: number; + s_ghost_score: number; + s_gno: number; + s_graph_score: number; + s_gtype: number; + s_hispeed: number; + s_judge: number; + s_judgeAdj: number; + s_lane_brignt: number; + s_liflen: number; + s_notes: number; + s_opstyle: number; + s_pace: number; + s_sdlen: number; + s_sdtype: number; + s_sorttype: number; + s_timing: number; + s_tsujigiri_disp: number; + sach: number; + sp_opt: string; + s_exscore: number; + s_sub_gno: number; + s_tune: number; +} + +export const IIDX27_pc_data = { + version: 27, + + deller: 0, + sgid: -1, + dgid: -1, + trophy: ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"], + sprank: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + sppoint: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + dprank: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + dppoint: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + + spradar: [0, 0, 0, 0, 0, 0], + dpradar: [0, 0, 0, 0, 0, 0], + + dp_clear_mission_clear: 0, + dp_clear_mission_level: 0, + dp_dj_mission_clear: 0, + dp_dj_mission_level: 0, + dp_level: 0, + dp_mission_point: 0, + dp_mplay: 0, + enemy_damage: 0, + progress: 0, + sp_clear_mission_clear: 0, + sp_clear_mission_level: 0, + sp_dj_mission_clear: 0, + sp_dj_mission_level: 0, + sp_level: 0, + sp_mission_point: 0, + sp_mplay: 0, + tips_read_list: 0, + + dpnum: 0, + d_auto_scrach: 0, + d_camera_layout: 0, + d_disp_judge: 0, + d_gauge_disp: 0, + d_ghost_score: 0, + d_gno: 0, + d_graph_score: 0, + d_gtype: 0, + d_hispeed: 0, + d_judge: 0, + d_judgeAdj: 0, + d_lane_brignt: 0, + d_liflen: 0, + d_notes: 0, + d_opstyle: 0, + d_pace: 0, + d_sdlen: 0, + d_sdtype: 0, + d_sorttype: 0, + d_timing: 0, + d_tsujigiri_disp: 0, + dach: 0, + dp_opt: "0", + dp_opt2: "0", + d_sub_gno: 0, + d_tune: 0, + + gpos: 0, + mode: 0, + pmode: 0, + rtype: 0, + + spnum: 0, + s_auto_scrach: 0, + s_camera_layout: 0, + s_disp_judge: 0, + s_gauge_disp: 0, + s_ghost_score: 0, + s_gno: 0, + s_graph_score: 0, + s_gtype: 0, + s_hispeed: 0, + s_judge: 0, + s_judgeAdj: 0, + s_lane_brignt: 0, + s_liflen: 0, + s_notes: 0, + s_opstyle: 0, + s_pace: 0, + s_sdlen: 0, + s_sdtype: 0, + s_sorttype: 0, + s_timing: 0, + s_tsujigiri_disp: 0, + sach: 0, + sp_opt: "0", + s_sub_gno: 0, + s_tune: 0, +}; diff --git a/models/profile.ts b/models/profile.ts new file mode 100644 index 0000000..b618cbd --- /dev/null +++ b/models/profile.ts @@ -0,0 +1,9 @@ +export interface profile { + collection: "profile"; + + name: string; + pid: number; + iidxid: number; + iidxidstr: string; + refid: string; +} diff --git a/models/score.ts b/models/score.ts new file mode 100644 index 0000000..32b03ae --- /dev/null +++ b/models/score.ts @@ -0,0 +1,21 @@ +export interface score { + collection: "score"; + + music_id: number; + + spmArray: number[]; + dpmArray: number[]; +} + +export interface score_detail { + collection: "score_detail"; + + music_id: number; + clid: number; + + score: number; + clflg: number; + miss: number; + + time: number; +} diff --git a/models/settings.ts b/models/settings.ts new file mode 100644 index 0000000..b7278f2 --- /dev/null +++ b/models/settings.ts @@ -0,0 +1,32 @@ +export interface settings { + frame: number; + menu_music: number; + note_burst: number; + turntable: number; + lane_cover: number; + pacemaker_cover: number; + note_skin: number; + judge_font: number; + note_beam: number; + full_combo_splash: number; + score_folders: boolean; + clear_folders: boolean; + difficulty_folders: boolean; + alphabet_folders: boolean; + hide_playcount: boolean; + disable_graphcutin: boolean; + classic_hispeed: boolean; + hide_iidxid: boolean; + disable_musicpreview: number; + vefx_lock: number; + effect: number; + bomb_size: number; + disable_hcn_color: number; + first_note_preview: number; + + qpro_head: number; + qpro_hair: number; + qpro_hand: number; + qpro_face: number; + qpro_body: number; +} diff --git a/models/shop_data.ts b/models/shop_data.ts new file mode 100644 index 0000000..0082cbe --- /dev/null +++ b/models/shop_data.ts @@ -0,0 +1,5 @@ +export interface shop_data { + collection: "shop_data"; + + shop_name: string; +} diff --git a/pug/27get.pug b/pug/27get.pug new file mode 100644 index 0000000..58c684b --- /dev/null +++ b/pug/27get.pug @@ -0,0 +1,58 @@ +IIDX27pc(status="0") + pcdata(d_auto_scrach=pc_data.d_auto_scrach d_camera_layout=pc_data.d_camera_layout d_disp_judge=pc_data.d_disp_judge d_gauge_disp=pc_data.d_gauge_disp d_ghost_score=pc_data.d_ghost_score d_gno=pc_data.d_gno d_graph_score=pc_data.d_graph_score d_gtype=pc_data.d_gtype d_hispeed=pc_data.d_hispeed d_judge=pc_data.d_judge d_judgeAdj=pc_data.d_judgeAdj d_lane_brignt=pc_data.d_lane_brignt d_liflen=pc_data.d_liflen d_notes=pc_data.d_notes d_opstyle=pc_data.d_opstyle d_pace=pc_data.d_pace d_sdlen=pc_data.d_sdlen d_sdtype=pc_data.d_sdtype d_sorttype=pc_data.d_sorttype d_sub_gno=pc_data.d_sub_gno d_timing=pc_data.d_timing d_tsujigiri_disp=pc_data.d_tsujigiri_disp d_tune=pc_data.d_tune dach=pc_data.dach dp_opt=pc_data.dp_opt dp_opt2=pc_data.dp_opt2 dpnum=0 gpos=pc_data.gpos id=profile.iidxid idstr=profile.iidxidstr mode=pc_data.mode name=profile.name pid=profile.pid pmode=pc_data.pmode rtype=pc_data.rtype s_auto_scrach=pc_data.s_auto_scrach s_camera_layout=pc_data.s_camera_layout s_disp_judge=pc_data.s_disp_judge s_gauge_disp=pc_data.s_gauge_disp s_ghost_score=pc_data.s_ghost_score s_gno=pc_data.s_gno s_graph_score=pc_data.s_graph_score s_gtype=pc_data.s_gtype s_hispeed=pc_data.s_hispeed s_judge=pc_data.s_judge s_judgeAdj=pc_data.s_judgeAdj s_lane_brignt=pc_data.s_lane_brignt s_liflen=pc_data.s_liflen s_notes=pc_data.s_notes s_opstyle=pc_data.s_opstyle s_pace=pc_data.s_pace s_sdlen=pc_data.s_sdlen s_sdtype=pc_data.s_sdtype s_sorttype=pc_data.s_sorttype s_sub_gno=pc_data.s_sub_gno s_timing=pc_data.s_timing s_tsujigiri_disp=pc_data.s_tsujigiri_disp s_tune=pc_data.s_tune sach=pc_data.sach sp_opt=pc_data.sp_opt spnum=pc_data.spnum) + join_shop(join_cflg="1" join_id="ea" join_name=shop_data.shop_name joinflg="1") + grade(sgid=pc_data.sgid dgid=pc_data.dgid) + - for (let d of dArray) + g(__type="u8" __count="4") #{d[0]} #{d[1]} #{d[2]} #{d[3]} + deller(deller=pc_data.deller rate="0") + rlist + ir_data + secret_course_data + secret + flg1(__type="s64" __count="3") 0 0 0 + flg2(__type="s64" __count="3") 0 0 0 + flg3(__type="s64" __count="3") 0 0 0 + flg4(__type="s64" __count="3") 0 0 0 + achievements(last_weekly="0" pack="0" pack_comp="0" rival_crush="0" visit_flg="0" weekly_num="0") + trophy(__type="s64" __count="20") #{pc_data.trophy[0]} #{pc_data.trophy[1]} #{pc_data.trophy[2]} #{pc_data.trophy[3]} #{pc_data.trophy[4]} #{pc_data.trophy[5]} #{pc_data.trophy[6]} #{pc_data.trophy[7]} #{pc_data.trophy[8]} #{pc_data.trophy[9]} + expert_point + classic_course_data + qprodata(__type="u32" __count="5") #{settings.qpro_head} #{settings.qpro_hair} #{settings.qpro_face} #{settings.qpro_hand} #{settings.qpro_body} + step(dp_clear_mission_clear=pc_data.dp_clear_mission_clear dp_clear_mission_level=pc_data.dp_clear_mission_level dp_dj_mission_clear=pc_data.dp_dj_mission_clear dp_dj_mission_level=pc_data.dp_dj_mission_level dp_level=pc_data.dp_level dp_mission_point=pc_data.dp_mission_point dp_mplay=pc_data.dp_mplay enemy_damage=pc_data.enemy_damage progress=pc_data.progress sp_clear_mission_clear=pc_data.sp_clear_mission_clear sp_clear_mission_level=pc_data.sp_clear_mission_level sp_dj_mission_clear=pc_data.sp_dj_mission_clear sp_dj_mission_level=pc_data.sp_dj_mission_level sp_level=pc_data.sp_level sp_mission_point=pc_data.sp_mission_point sp_mplay=pc_data.sp_mplay tips_read_list=pc_data.tips_read_list) + is_track_ticket(__type="bool") 1 + dj_rank(style="0") + rank(__type="s32" __count="15") #{pc_data.sprank[0]} #{pc_data.sprank[1]} #{pc_data.sprank[2]} #{pc_data.sprank[3]} #{pc_data.sprank[4]} #{pc_data.sprank[5]} #{pc_data.sprank[6]} #{pc_data.sprank[7]} #{pc_data.sprank[8]} #{pc_data.sprank[9]} #{pc_data.sprank[10]} #{pc_data.sprank[11]} #{pc_data.sprank[12]} #{pc_data.sprank[13]} #{pc_data.sprank[14]} + point(__type="s32" __count="15") #{pc_data.sppoint[0]} #{pc_data.sppoint[1]} #{pc_data.sppoint[2]} #{pc_data.sppoint[3]} #{pc_data.sppoint[4]} #{pc_data.sppoint[5]} #{pc_data.sppoint[6]} #{pc_data.sppoint[7]} #{pc_data.sppoint[8]} #{pc_data.sppoint[9]} #{pc_data.sppoint[10]} #{pc_data.sppoint[11]} #{pc_data.sppoint[12]} #{pc_data.sppoint[13]} #{pc_data.sppoint[14]} + dj_rank(style="1") + rank(__type="s32" __count="15") #{pc_data.dprank[0]} #{pc_data.dprank[1]} #{pc_data.dprank[2]} #{pc_data.dprank[3]} #{pc_data.dprank[4]} #{pc_data.dprank[5]} #{pc_data.dprank[6]} #{pc_data.dprank[7]} #{pc_data.dprank[8]} #{pc_data.dprank[9]} #{pc_data.dprank[10]} #{pc_data.dprank[11]} #{pc_data.dprank[12]} #{pc_data.dprank[13]} #{pc_data.dprank[14]} + point(__type="s32" __count="15") #{pc_data.dppoint[0]} #{pc_data.dppoint[1]} #{pc_data.dppoint[2]} #{pc_data.dppoint[3]} #{pc_data.dppoint[4]} #{pc_data.dppoint[5]} #{pc_data.dppoint[6]} #{pc_data.dppoint[7]} #{pc_data.dppoint[8]} #{pc_data.dppoint[9]} #{pc_data.dppoint[10]} #{pc_data.dppoint[11]} #{pc_data.dppoint[12]} #{pc_data.dppoint[13]} #{pc_data.dppoint[14]} + notes_radar(style="0") + radar_score(__type="s32" __count="6") #{pc_data.spradar[0]} #{pc_data.spradar[1]} #{pc_data.spradar[2]} #{pc_data.spradar[3]} #{pc_data.spradar[4]} #{pc_data.spradar[5]} + notes_radar(style="1") + radar_score(__type="s32" __count="6") #{pc_data.dpradar[0]} #{pc_data.dpradar[1]} #{pc_data.dpradar[2]} #{pc_data.dpradar[3]} #{pc_data.dpradar[4]} #{pc_data.dpradar[5]} + arena_data(play_num="0" play_num_dp="1" play_num_sp="1") + achieve_data(arena_class="19" best_top_class_continuing="0" now_top_class_continuing="0" play_style="0" rating_value="0") + achieve_data(arena_class="19" best_top_class_continuing="0" now_top_class_continuing="0" play_style="1" rating_value="0") + cube_data(cube="0" season_id="0") + ea_premium_course + bind_eaappli + leggendaria_open + pay_per_use(item_num="99") + playlist(encrypt_playlist="0" index="0" play_style="0") + spdp_rival(flg="0") + enable_qr_reward + visitor(anum="0" pnum="0" snum="0" vs_flg="0") + konami_stytle(skip_flg="0") + arena_penalty + defeat(defeat_flg="0") + bemani_vote(music_list="-1") + floor_infection3(music_list="-1") + language_setting(language="-1") + leggendaria_semi_open(flg="0") + kac_entry_info + enable_kac_deller + disp_kac_mark + is_kac_entry + is_kac_evnet_entry + kac_secret_music + skin(__type="s16" __count="20") #{settings.frame} #{settings.turntable} #{settings.note_burst} #{settings.menu_music} #{appendsetting} #{settings.lane_cover} 0 0 #{settings.note_skin} #{settings.full_combo_splash} #{settings.note_beam} #{settings.judge_font} 0 #{settings.disable_musicpreview} #{settings.pacemaker_cover} #{settings.vefx_lock} #{settings.effect} #{settings.bomb_size} #{settings.disable_hcn_color} #{settings.first_note_preview} diff --git a/pug/27pccommon.pug b/pug/27pccommon.pug new file mode 100644 index 0000000..abc523f --- /dev/null +++ b/pug/27pccommon.pug @@ -0,0 +1,42 @@ +IIDX27pc(status="0") + monthly_mranking(__type="u16" __count="1") 65535 + total_mranking(__type="u16" __count="1") 65535 + internet_ranking + secret_ex_course + kac_mid(__type="s32" __count="1") 65535 + kac_clid(__type="s32" __count="1") 0 + ir(beat="3") + cm(compo="cm_ultimate" folder="cm_ultimate" id="0") + tdj_cm + cm(filename="cm_bn_001" id="0") + cm(filename="cm_bn_002" id="1") + cm(filename="event_bn_001" id="2") + cm(filename="event_bn_004" id="3") + cm(filename="event_bn_006" id="4") + cm(filename="fipb_001" id="5") + cm(filename="year_bn_004" id="6") + cm(filename="year_bn_005" id="7") + cm(filename="year_bn_006_2" id="8") + cm(filename="year_bn_007" id="9") + license + string(__type="str") Asphyxia + file_recovery(url="https://example.com") + button_release_frame( frame="0") + escape_package_info + list(apply_file_name="XXX" apply_release_code="XXX") + expert(phase="1") + expert_random_secret(phase="2") + boss(phase="0") + vip_pass_black + deller_bonus(open="1") + newsong_another(open="1") + pcb_check(flg="0") + expert_secret_full_open + eaorder_phase(phase="2") + common_evnet(flg="65535") + system_voice_phase(phase="0") + extra_boss_event(phase="0") + event1_phase(phase="0") + premium_area_news(open="1") + premium_area_qpro(open="1") + ignore_button_mashing \ No newline at end of file diff --git a/pug/crate.pug b/pug/crate.pug new file mode 100644 index 0000000..bee931d --- /dev/null +++ b/pug/crate.pug @@ -0,0 +1,362 @@ +//- + crateはSPクリアレート5つ(Begginer~Leddendaria)DPクリアレート5つ + SPフルコンボレート5つDPフルコンボレート5つの20項目で表されます + クリアレートはMax1000(100%)で小数点第一位まで設定できます + + 書式例 + Numbers + + 今回は12のみレートを実装します + レートはCPI難易度表(2020/10/20)を参考にしています + https://cpi.makecir.com/scores/tables#clear + https://cpi.makecir.com/scores/tables#hard + 2250-曲レートをレートとして表示しています + クリアレートがノマゲレートでフルコンボレートがハードクリアレートになっています + +#{version}(status="0") + c(__type="s32" __count="20" mid="5021") -1 -1 -1 793 -1 -1 -1 -1 -1 -1 -1 -1 -1 746 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="6005") -1 -1 -1 799 -1 -1 -1 -1 -1 -1 -1 -1 -1 718 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="7002") -1 -1 -1 905 -1 -1 -1 -1 -1 -1 -1 -1 -1 811 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="8031") -1 -1 -1 715 -1 -1 -1 -1 -1 -1 -1 -1 -1 698 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="8048") -1 -1 -1 736 -1 -1 -1 -1 -1 -1 -1 -1 -1 661 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="9012") -1 -1 -1 799 -1 -1 -1 -1 -1 -1 -1 -1 -1 749 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="9038") -1 -1 -1 828 -1 -1 -1 -1 -1 -1 -1 -1 -1 736 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="10022") -1 -1 -1 845 -1 -1 -1 -1 -1 -1 -1 -1 -1 788 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="10028") -1 -1 838 802 -1 -1 -1 -1 -1 -1 -1 -1 702 690 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="10049") -1 -1 -1 698 -1 -1 -1 -1 -1 -1 -1 -1 -1 692 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="11012") -1 -1 -1 -1 738 -1 -1 -1 -1 -1 -1 -1 -1 -1 720 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="11026") -1 -1 -1 603 -1 -1 -1 -1 -1 -1 -1 -1 -1 581 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="11030") -1 -1 -1 682 -1 -1 -1 -1 -1 -1 -1 -1 -1 672 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="11032") -1 -1 -1 -1 834 -1 -1 -1 -1 -1 -1 -1 -1 -1 769 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="11037") -1 -1 899 817 -1 -1 -1 -1 -1 -1 -1 -1 880 803 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="11040") -1 -1 -1 829 -1 -1 -1 -1 -1 -1 -1 -1 -1 767 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="12002") -1 -1 -1 -1 688 -1 -1 -1 -1 -1 -1 -1 -1 -1 672 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="12004") -1 -1 -1 594 -1 -1 -1 -1 -1 -1 -1 -1 -1 231 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="12007") -1 -1 -1 665 -1 -1 -1 -1 -1 -1 -1 -1 -1 550 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="12016") -1 -1 -1 -1 632 -1 -1 -1 -1 -1 -1 -1 -1 -1 603 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="12045") -1 -1 -1 807 -1 -1 -1 -1 -1 -1 -1 -1 -1 750 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="12054") -1 -1 -1 755 -1 -1 -1 -1 -1 -1 -1 -1 -1 685 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="13005") -1 -1 -1 531 -1 -1 -1 -1 -1 -1 -1 -1 -1 516 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="13010") -1 -1 -1 -1 546 -1 -1 -1 -1 -1 -1 -1 -1 -1 542 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="13031") -1 -1 -1 691 -1 -1 -1 -1 -1 -1 -1 -1 -1 645 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="13038") -1 -1 -1 -1 592 -1 -1 -1 -1 -1 -1 -1 -1 -1 585 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="13054") -1 -1 -1 806 -1 -1 -1 -1 -1 -1 -1 -1 -1 715 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="13055") -1 -1 -1 814 -1 -1 -1 -1 -1 -1 -1 -1 -1 791 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14004") -1 -1 -1 -1 425 -1 -1 -1 -1 -1 -1 -1 -1 -1 408 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14005") -1 -1 -1 726 -1 -1 -1 -1 -1 -1 -1 -1 -1 711 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14009") -1 -1 -1 830 484 -1 -1 -1 -1 -1 -1 -1 -1 757 453 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14021") -1 -1 -1 845 -1 -1 -1 -1 -1 -1 -1 -1 -1 762 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14022") -1 -1 -1 -1 811 -1 -1 -1 -1 -1 -1 -1 -1 -1 737 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14029") -1 -1 -1 777 -1 -1 -1 -1 -1 -1 -1 -1 -1 720 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14030") -1 -1 -1 802 -1 -1 -1 -1 -1 -1 -1 -1 -1 753 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14035") -1 -1 -1 692 -1 -1 -1 -1 -1 -1 -1 -1 -1 659 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14046") -1 -1 -1 -1 348 -1 -1 -1 -1 -1 -1 -1 -1 -1 328 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14052") -1 -1 -1 627 -1 -1 -1 -1 -1 -1 -1 -1 -1 410 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="14053") -1 -1 -1 -1 880 -1 -1 -1 -1 -1 -1 -1 -1 -1 835 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15001") -1 -1 -1 622 -1 -1 -1 -1 -1 -1 -1 -1 -1 586 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15004") -1 -1 -1 -1 610 -1 -1 -1 -1 -1 -1 -1 -1 -1 598 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15007") -1 -1 -1 -1 680 -1 -1 -1 -1 -1 -1 -1 -1 -1 652 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15013") -1 -1 -1 769 -1 -1 -1 -1 -1 -1 -1 -1 -1 722 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15014") -1 -1 -1 900 -1 -1 -1 -1 -1 -1 -1 -1 -1 820 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15016") -1 -1 -1 795 -1 -1 -1 -1 -1 -1 -1 -1 -1 760 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15023") -1 -1 -1 782 335 -1 -1 -1 -1 -1 -1 -1 -1 652 34 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15039") -1 -1 -1 763 -1 -1 -1 -1 -1 -1 -1 -1 -1 703 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15049") -1 -1 -1 587 -1 -1 -1 -1 -1 -1 -1 -1 -1 529 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="15061") -1 -1 -1 -1 665 -1 -1 -1 -1 -1 -1 -1 -1 -1 628 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16002") -1 -1 -1 -1 559 -1 -1 -1 -1 -1 -1 -1 -1 -1 537 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16003") -1 -1 -1 715 -1 -1 -1 -1 -1 -1 -1 -1 -1 666 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16006") -1 -1 -1 703 -1 -1 -1 -1 -1 -1 -1 -1 -1 684 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16009") -1 -1 -1 702 -1 -1 -1 -1 -1 -1 -1 -1 -1 671 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16015") -1 -1 -1 -1 757 -1 -1 -1 -1 -1 -1 -1 -1 -1 707 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16020") -1 -1 -1 349 -1 -1 -1 -1 -1 -1 -1 -1 -1 275 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16026") -1 -1 -1 567 -1 -1 -1 -1 -1 -1 -1 -1 -1 406 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16028") -1 -1 -1 542 -1 -1 -1 -1 -1 -1 -1 -1 -1 399 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16045") -1 -1 -1 -1 678 -1 -1 -1 -1 -1 -1 -1 -1 -1 631 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="16051") -1 -1 -1 739 -1 -1 -1 -1 -1 -1 -1 -1 -1 414 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17006") -1 -1 -1 644 -1 -1 -1 -1 -1 -1 -1 -1 -1 629 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17007") -1 -1 -1 748 -1 -1 -1 -1 -1 -1 -1 -1 -1 665 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17009") -1 -1 -1 646 -1 -1 -1 -1 -1 -1 -1 -1 -1 637 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17016") -1 -1 -1 581 -1 -1 -1 -1 -1 -1 -1 -1 -1 526 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17017") -1 -1 -1 756 -1 -1 -1 -1 -1 -1 -1 -1 -1 674 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17022") -1 -1 -1 644 -1 -1 -1 -1 -1 -1 -1 -1 -1 609 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17028") -1 -1 -1 -1 589 -1 -1 -1 -1 -1 -1 -1 -1 -1 580 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17032") -1 -1 -1 729 -1 -1 -1 -1 -1 -1 -1 -1 -1 623 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17044") -1 -1 -1 850 -1 -1 -1 -1 -1 -1 -1 -1 -1 778 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17054") -1 -1 -1 733 -1 -1 -1 -1 -1 -1 -1 -1 -1 696 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17056") -1 -1 -1 727 -1 -1 -1 -1 -1 -1 -1 -1 -1 672 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17059") -1 -1 -1 627 -1 -1 -1 -1 -1 -1 -1 -1 -1 610 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17060") -1 -1 -1 798 608 -1 -1 -1 -1 -1 -1 -1 -1 728 587 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="17061") -1 -1 -1 757 -1 -1 -1 -1 -1 -1 -1 -1 -1 712 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18001") -1 -1 -1 732 -1 -1 -1 -1 -1 -1 -1 -1 -1 637 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18004") -1 -1 -1 483 -1 -1 -1 -1 -1 -1 -1 -1 -1 477 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18007") -1 -1 -1 698 -1 -1 -1 -1 -1 -1 -1 -1 -1 663 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18009") -1 -1 -1 576 -1 -1 -1 -1 -1 -1 -1 -1 -1 559 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18017") -1 -1 -1 686 -1 -1 -1 -1 -1 -1 -1 -1 -1 655 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18026") -1 -1 -1 627 -1 -1 -1 -1 -1 -1 -1 -1 -1 611 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18032") -1 -1 -1 414 -1 -1 -1 -1 -1 -1 -1 -1 -1 305 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18039") -1 -1 -1 684 -1 -1 -1 -1 -1 -1 -1 -1 -1 632 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18050") -1 -1 -1 680 -1 -1 -1 -1 -1 -1 -1 -1 -1 595 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18059") -1 -1 -1 780 -1 -1 -1 -1 -1 -1 -1 -1 -1 734 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18060") -1 -1 -1 853 -1 -1 -1 -1 -1 -1 -1 -1 -1 785 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18061") -1 -1 -1 936 -1 -1 -1 -1 -1 -1 -1 -1 -1 833 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18068") -1 -1 -1 810 -1 -1 -1 -1 -1 -1 -1 -1 -1 757 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="18071") -1 -1 -1 983 -1 -1 -1 -1 -1 -1 -1 -1 -1 861 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19001") -1 -1 -1 665 -1 -1 -1 -1 -1 -1 -1 -1 -1 576 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19002") -1 -1 -1 625 -1 -1 -1 -1 -1 -1 -1 -1 -1 594 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19003") -1 -1 -1 853 -1 -1 -1 -1 -1 -1 -1 -1 -1 793 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19005") -1 -1 -1 813 -1 -1 -1 -1 -1 -1 -1 -1 -1 749 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19007") -1 -1 -1 644 -1 -1 -1 -1 -1 -1 -1 -1 -1 621 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19008") -1 -1 -1 430 -1 -1 -1 -1 -1 -1 -1 -1 -1 415 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19016") -1 -1 -1 866 -1 -1 -1 -1 -1 -1 -1 -1 -1 778 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19026") -1 -1 -1 855 -1 -1 -1 -1 -1 -1 -1 -1 -1 786 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19028") -1 -1 -1 794 -1 -1 -1 -1 -1 -1 -1 -1 -1 735 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19030") -1 -1 -1 781 -1 -1 -1 -1 -1 -1 -1 -1 -1 730 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19033") -1 -1 -1 678 -1 -1 -1 -1 -1 -1 -1 -1 -1 657 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19037") -1 -1 -1 591 -1 -1 -1 -1 -1 -1 -1 -1 -1 528 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19042") -1 -1 -1 712 -1 -1 -1 -1 -1 -1 -1 -1 -1 631 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19063") -1 -1 -1 -1 660 -1 -1 -1 -1 -1 -1 -1 -1 -1 637 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19064") -1 -1 -1 768 -1 -1 -1 -1 -1 -1 -1 -1 -1 688 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19065") -1 -1 -1 692 -1 -1 -1 -1 -1 -1 -1 -1 -1 631 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19068") -1 -1 -1 749 -1 -1 -1 -1 -1 -1 -1 -1 -1 715 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19071") -1 -1 -1 667 -1 -1 -1 -1 -1 -1 -1 -1 -1 654 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19074") -1 -1 -1 -1 485 -1 -1 -1 -1 -1 -1 -1 -1 -1 437 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="19075") -1 -1 -1 622 -1 -1 -1 -1 -1 -1 -1 -1 -1 604 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20002") -1 -1 -1 783 -1 -1 -1 -1 -1 -1 -1 -1 -1 722 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20003") -1 -1 -1 883 -1 -1 -1 -1 -1 -1 -1 -1 -1 825 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20004") -1 -1 -1 771 -1 -1 -1 -1 -1 -1 -1 -1 -1 714 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20006") -1 -1 -1 739 -1 -1 -1 -1 -1 -1 -1 -1 -1 693 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20007") -1 -1 -1 647 -1 -1 -1 -1 -1 -1 -1 -1 -1 603 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20008") -1 -1 -1 488 -1 -1 -1 -1 -1 -1 -1 -1 -1 472 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20012") -1 -1 -1 707 -1 -1 -1 -1 -1 -1 -1 -1 -1 672 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20019") -1 -1 -1 -1 682 -1 -1 -1 -1 -1 -1 -1 -1 -1 660 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20020") -1 -1 -1 471 -1 -1 -1 -1 -1 -1 -1 -1 -1 453 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20029") -1 -1 -1 525 -1 -1 -1 -1 -1 -1 -1 -1 -1 401 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20038") -1 -1 -1 398 -1 -1 -1 -1 -1 -1 -1 -1 -1 393 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20039") -1 -1 -1 -1 645 -1 -1 -1 -1 -1 -1 -1 -1 -1 640 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20041") -1 -1 -1 677 -1 -1 -1 -1 -1 -1 -1 -1 -1 664 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20043") -1 -1 -1 491 -1 -1 -1 -1 -1 -1 -1 -1 -1 441 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20047") -1 -1 -1 660 -1 -1 -1 -1 -1 -1 -1 -1 -1 615 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20048") -1 -1 -1 849 -1 -1 -1 -1 -1 -1 -1 -1 -1 783 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20049") -1 -1 -1 679 -1 -1 -1 -1 -1 -1 -1 -1 -1 652 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20051") -1 -1 -1 708 -1 -1 -1 -1 -1 -1 -1 -1 -1 674 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20054") -1 -1 -1 784 -1 -1 -1 -1 -1 -1 -1 -1 -1 727 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20058") -1 -1 -1 776 -1 -1 -1 -1 -1 -1 -1 -1 -1 746 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20062") -1 -1 -1 626 -1 -1 -1 -1 -1 -1 -1 -1 -1 603 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20063") -1 -1 -1 678 -1 -1 -1 -1 -1 -1 -1 -1 -1 627 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20067") -1 -1 -1 667 -1 -1 -1 -1 -1 -1 -1 -1 -1 619 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20070") -1 -1 -1 636 -1 -1 -1 -1 -1 -1 -1 -1 -1 548 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20071") -1 -1 -1 614 -1 -1 -1 -1 -1 -1 -1 -1 -1 536 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20073") -1 -1 -1 646 -1 -1 -1 -1 -1 -1 -1 -1 -1 613 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20074") -1 -1 -1 666 -1 -1 -1 -1 -1 -1 -1 -1 -1 648 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20083") -1 -1 -1 686 -1 -1 -1 -1 -1 -1 -1 -1 -1 661 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20093") -1 -1 -1 782 -1 -1 -1 -1 -1 -1 -1 -1 -1 726 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20094") -1 -1 -1 587 -1 -1 -1 -1 -1 -1 -1 -1 -1 581 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20097") -1 -1 -1 723 -1 -1 -1 -1 -1 -1 -1 -1 -1 670 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20099") -1 -1 -1 549 -1 -1 -1 -1 -1 -1 -1 -1 -1 516 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="20101") -1 -1 -1 746 -1 -1 -1 -1 -1 -1 -1 -1 -1 701 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21002") -1 -1 -1 754 -1 -1 -1 -1 -1 -1 -1 -1 -1 706 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21005") -1 -1 -1 745 -1 -1 -1 -1 -1 -1 -1 -1 -1 683 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21012") -1 -1 -1 741 607 -1 -1 -1 -1 -1 -1 -1 -1 685 574 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21019") -1 -1 -1 766 -1 -1 -1 -1 -1 -1 -1 -1 -1 734 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21029") -1 -1 -1 -1 655 -1 -1 -1 -1 -1 -1 -1 -1 -1 609 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21032") -1 -1 -1 546 -1 -1 -1 -1 -1 -1 -1 -1 -1 499 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21033") -1 -1 -1 654 -1 -1 -1 -1 -1 -1 -1 -1 -1 611 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21044") -1 -1 -1 671 -1 -1 -1 -1 -1 -1 -1 -1 -1 623 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21045") -1 -1 -1 721 -1 -1 -1 -1 -1 -1 -1 -1 -1 683 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21047") -1 -1 -1 654 -1 -1 -1 -1 -1 -1 -1 -1 -1 611 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21048") -1 -1 -1 719 314 -1 -1 -1 -1 -1 -1 -1 -1 681 304 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21050") -1 -1 -1 632 372 -1 -1 -1 -1 -1 -1 -1 -1 572 309 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21052") -1 -1 -1 786 570 -1 -1 -1 -1 -1 -1 -1 -1 730 431 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21055") -1 -1 -1 777 -1 -1 -1 -1 -1 -1 -1 -1 -1 714 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21059") -1 -1 -1 526 404 -1 -1 -1 -1 -1 -1 -1 -1 519 399 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21062") -1 -1 -1 613 -1 -1 -1 -1 -1 -1 -1 -1 -1 544 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21069") -1 -1 -1 774 570 -1 -1 -1 -1 -1 -1 -1 -1 736 556 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21073") -1 -1 -1 874 579 -1 -1 -1 -1 -1 -1 -1 -1 792 570 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21076") -1 -1 -1 772 -1 -1 -1 -1 -1 -1 -1 -1 -1 713 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21081") -1 -1 -1 701 -1 -1 -1 -1 -1 -1 -1 -1 -1 639 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21082") -1 -1 -1 489 -1 -1 -1 -1 -1 -1 -1 -1 -1 479 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21088") -1 -1 -1 758 -1 -1 -1 -1 -1 -1 -1 -1 -1 705 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="21089") -1 -1 -1 597 429 -1 -1 -1 -1 -1 -1 -1 -1 565 410 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22001") -1 -1 -1 697 -1 -1 -1 -1 -1 -1 -1 -1 -1 684 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22003") -1 -1 -1 692 -1 -1 -1 -1 -1 -1 -1 -1 -1 559 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22004") -1 -1 -1 662 -1 -1 -1 -1 -1 -1 -1 -1 -1 653 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22005") -1 -1 -1 771 -1 -1 -1 -1 -1 -1 -1 -1 -1 703 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22006") -1 -1 -1 -1 691 -1 -1 -1 -1 -1 -1 -1 -1 -1 661 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22007") -1 -1 -1 600 -1 -1 -1 -1 -1 -1 -1 -1 -1 565 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22008") -1 -1 -1 -1 553 -1 -1 -1 -1 -1 -1 -1 -1 -1 539 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22009") -1 -1 -1 832 -1 -1 -1 -1 -1 -1 -1 -1 -1 756 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22011") -1 -1 -1 724 -1 -1 -1 -1 -1 -1 -1 -1 -1 649 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22012") -1 -1 -1 552 -1 -1 -1 -1 -1 -1 -1 -1 -1 523 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22015") -1 -1 -1 623 -1 -1 -1 -1 -1 -1 -1 -1 -1 604 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22016") -1 -1 -1 686 -1 -1 -1 -1 -1 -1 -1 -1 -1 624 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22017") -1 -1 -1 885 -1 -1 -1 -1 -1 -1 -1 -1 -1 798 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22018") -1 -1 -1 747 -1 -1 -1 -1 -1 -1 -1 -1 -1 670 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22027") -1 -1 -1 -1 771 -1 -1 -1 -1 -1 -1 -1 -1 -1 724 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22031") -1 -1 -1 -1 569 -1 -1 -1 -1 -1 -1 -1 -1 -1 551 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22032") -1 -1 -1 708 -1 -1 -1 -1 -1 -1 -1 -1 -1 671 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22033") -1 -1 -1 713 -1 -1 -1 -1 -1 -1 -1 -1 -1 659 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22038") -1 -1 -1 889 -1 -1 -1 -1 -1 -1 -1 -1 -1 799 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22039") -1 -1 -1 663 -1 -1 -1 -1 -1 -1 -1 -1 -1 576 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22043") -1 -1 -1 679 -1 -1 -1 -1 -1 -1 -1 -1 -1 642 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22053") -1 -1 -1 751 -1 -1 -1 -1 -1 -1 -1 -1 -1 708 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22054") -1 -1 -1 466 -1 -1 -1 -1 -1 -1 -1 -1 -1 438 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22055") -1 -1 -1 800 -1 -1 -1 -1 -1 -1 -1 -1 -1 749 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22065") -1 -1 -1 719 -1 -1 -1 -1 -1 -1 -1 -1 -1 693 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22069") -1 -1 -1 767 -1 -1 -1 -1 -1 -1 -1 -1 -1 709 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22070") -1 -1 -1 647 -1 -1 -1 -1 -1 -1 -1 -1 -1 621 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22073") -1 -1 -1 662 -1 -1 -1 -1 -1 -1 -1 -1 -1 621 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22074") -1 -1 -1 672 -1 -1 -1 -1 -1 -1 -1 -1 -1 640 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22077") -1 -1 -1 760 -1 -1 -1 -1 -1 -1 -1 -1 -1 732 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22079") -1 -1 -1 804 -1 -1 -1 -1 -1 -1 -1 -1 -1 755 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22080") -1 -1 -1 720 -1 -1 -1 -1 -1 -1 -1 -1 -1 660 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22083") -1 -1 -1 907 530 -1 -1 -1 -1 -1 -1 -1 -1 858 525 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22087") -1 -1 -1 756 -1 -1 -1 -1 -1 -1 -1 -1 -1 708 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22089") -1 -1 -1 715 507 -1 -1 -1 -1 -1 -1 -1 -1 656 469 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22091") -1 -1 -1 744 -1 -1 -1 -1 -1 -1 -1 -1 -1 706 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22093") -1 -1 -1 683 -1 -1 -1 -1 -1 -1 -1 -1 -1 638 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22095") -1 -1 -1 735 -1 -1 -1 -1 -1 -1 -1 -1 -1 686 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="22099") -1 -1 -1 712 -1 -1 -1 -1 -1 -1 -1 -1 -1 646 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23000") -1 -1 -1 642 -1 -1 -1 -1 -1 -1 -1 -1 -1 560 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23001") -1 -1 -1 497 -1 -1 -1 -1 -1 -1 -1 -1 -1 477 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23005") -1 -1 -1 747 -1 -1 -1 -1 -1 -1 -1 -1 -1 710 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23007") -1 -1 -1 830 -1 -1 -1 -1 -1 -1 -1 -1 -1 760 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23009") -1 -1 -1 762 -1 -1 -1 -1 -1 -1 -1 -1 -1 719 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23013") -1 -1 -1 707 -1 -1 -1 -1 -1 -1 -1 -1 -1 684 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23018") -1 -1 -1 677 -1 -1 -1 -1 -1 -1 -1 -1 -1 626 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23027") -1 -1 -1 627 -1 -1 -1 -1 -1 -1 -1 -1 -1 560 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23031") -1 -1 -1 -1 664 -1 -1 -1 -1 -1 -1 -1 -1 -1 641 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23037") -1 -1 -1 701 -1 -1 -1 -1 -1 -1 -1 -1 -1 666 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23041") -1 -1 -1 571 -1 -1 -1 -1 -1 -1 -1 -1 -1 535 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23045") -1 -1 -1 760 -1 -1 -1 -1 -1 -1 -1 -1 -1 721 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23051") -1 -1 -1 296 -1 -1 -1 -1 -1 -1 -1 -1 -1 253 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23055") -1 -1 -1 682 -1 -1 -1 -1 -1 -1 -1 -1 -1 622 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23061") -1 -1 -1 612 -1 -1 -1 -1 -1 -1 -1 -1 -1 601 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23063") -1 -1 -1 565 -1 -1 -1 -1 -1 -1 -1 -1 -1 560 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23070") -1 -1 -1 -1 662 -1 -1 -1 -1 -1 -1 -1 -1 -1 632 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23072") -1 -1 -1 722 -1 -1 -1 -1 -1 -1 -1 -1 -1 652 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23074") -1 -1 -1 791 -1 -1 -1 -1 -1 -1 -1 -1 -1 670 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23075") -1 -1 -1 712 -1 -1 -1 -1 -1 -1 -1 -1 -1 641 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23079") -1 -1 -1 891 -1 -1 -1 -1 -1 -1 -1 -1 -1 772 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23083") -1 -1 -1 884 -1 -1 -1 -1 -1 -1 -1 -1 -1 774 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23085") -1 -1 -1 696 -1 -1 -1 -1 -1 -1 -1 -1 -1 661 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23088") -1 -1 -1 575 -1 -1 -1 -1 -1 -1 -1 -1 -1 546 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23090") -1 -1 -1 664 -1 -1 -1 -1 -1 -1 -1 -1 -1 628 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23092") -1 -1 -1 665 -1 -1 -1 -1 -1 -1 -1 -1 -1 636 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23094") -1 -1 -1 645 -1 -1 -1 -1 -1 -1 -1 -1 -1 609 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="23095") -1 -1 -1 -1 595 -1 -1 -1 -1 -1 -1 -1 -1 -1 582 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24001") -1 -1 -1 513 -1 -1 -1 -1 -1 -1 -1 -1 -1 502 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24003") -1 -1 -1 758 -1 -1 -1 -1 -1 -1 -1 -1 -1 694 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24005") -1 -1 -1 733 -1 -1 -1 -1 -1 -1 -1 -1 -1 697 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24006") -1 -1 -1 826 -1 -1 -1 -1 -1 -1 -1 -1 -1 756 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24007") -1 -1 -1 775 -1 -1 -1 -1 -1 -1 -1 -1 -1 690 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24010") -1 -1 -1 235 -1 -1 -1 -1 -1 -1 -1 -1 -1 231 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24012") -1 -1 -1 759 -1 -1 -1 -1 -1 -1 -1 -1 -1 695 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24014") -1 -1 -1 667 -1 -1 -1 -1 -1 -1 -1 -1 -1 629 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24018") -1 -1 -1 629 -1 -1 -1 -1 -1 -1 -1 -1 -1 603 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24020") -1 -1 -1 565 -1 -1 -1 -1 -1 -1 -1 -1 -1 527 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24021") -1 -1 -1 595 -1 -1 -1 -1 -1 -1 -1 -1 -1 584 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24023") -1 -1 -1 734 -1 -1 -1 -1 -1 -1 -1 -1 -1 657 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24024") -1 -1 -1 756 -1 -1 -1 -1 -1 -1 -1 -1 -1 690 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24034") -1 -1 -1 415 -1 -1 -1 -1 -1 -1 -1 -1 -1 346 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24036") -1 -1 -1 750 -1 -1 -1 -1 -1 -1 -1 -1 -1 712 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24039") -1 -1 -1 919 -1 -1 -1 -1 -1 -1 -1 -1 -1 817 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24041") -1 -1 -1 -1 707 -1 -1 -1 -1 -1 -1 -1 -1 -1 659 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24044") -1 -1 -1 741 -1 -1 -1 -1 -1 -1 -1 -1 -1 700 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24050") -1 -1 -1 569 -1 -1 -1 -1 -1 -1 -1 -1 -1 530 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24051") -1 -1 -1 645 -1 -1 -1 -1 -1 -1 -1 -1 -1 632 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24065") -1 -1 -1 692 -1 -1 -1 -1 -1 -1 -1 -1 -1 657 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24070") -1 -1 -1 791 -1 -1 -1 -1 -1 -1 -1 -1 -1 735 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24072") -1 -1 -1 677 -1 -1 -1 -1 -1 -1 -1 -1 -1 658 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24073") -1 -1 -1 659 -1 -1 -1 -1 -1 -1 -1 -1 -1 631 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24076") -1 -1 -1 742 -1 -1 -1 -1 -1 -1 -1 -1 -1 716 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24077") -1 -1 -1 806 -1 -1 -1 -1 -1 -1 -1 -1 -1 759 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24078") -1 -1 -1 833 -1 -1 -1 -1 -1 -1 -1 -1 -1 743 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24086") -1 -1 -1 819 -1 -1 -1 -1 -1 -1 -1 -1 -1 746 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24089") -1 -1 -1 838 -1 -1 -1 -1 -1 -1 -1 -1 -1 779 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24094") -1 -1 -1 737 -1 -1 -1 -1 -1 -1 -1 -1 -1 709 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="24095") -1 -1 -1 872 -1 -1 -1 -1 -1 -1 -1 -1 -1 806 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25000") -1 -1 -1 689 -1 -1 -1 -1 -1 -1 -1 -1 -1 659 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25003") -1 -1 -1 572 -1 -1 -1 -1 -1 -1 -1 -1 -1 523 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25004") -1 -1 -1 587 -1 -1 -1 -1 -1 -1 -1 -1 -1 544 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25007") -1 -1 -1 468 -1 -1 -1 -1 -1 -1 -1 -1 -1 407 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25008") -1 -1 -1 655 -1 -1 -1 -1 -1 -1 -1 -1 -1 627 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25009") -1 -1 -1 700 -1 -1 -1 -1 -1 -1 -1 -1 -1 669 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25015") -1 -1 -1 601 -1 -1 -1 -1 -1 -1 -1 -1 -1 586 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25017") -1 -1 -1 568 -1 -1 -1 -1 -1 -1 -1 -1 -1 536 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25019") -1 -1 -1 693 -1 -1 -1 -1 -1 -1 -1 -1 -1 626 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25021") -1 -1 -1 624 -1 -1 -1 -1 -1 -1 -1 -1 -1 582 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25025") -1 -1 -1 687 -1 -1 -1 -1 -1 -1 -1 -1 -1 640 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25027") -1 -1 -1 619 -1 -1 -1 -1 -1 -1 -1 -1 -1 567 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25029") -1 -1 -1 636 -1 -1 -1 -1 -1 -1 -1 -1 -1 612 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25040") -1 -1 -1 654 -1 -1 -1 -1 -1 -1 -1 -1 -1 629 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25049") -1 -1 -1 667 -1 -1 -1 -1 -1 -1 -1 -1 -1 639 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25052") -1 -1 -1 783 -1 -1 -1 -1 -1 -1 -1 -1 -1 745 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25058") -1 -1 -1 547 -1 -1 -1 -1 -1 -1 -1 -1 -1 488 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25063") -1 -1 -1 739 -1 -1 -1 -1 -1 -1 -1 -1 -1 640 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25074") -1 -1 -1 651 -1 -1 -1 -1 -1 -1 -1 -1 -1 628 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25075") -1 -1 -1 808 -1 -1 -1 -1 -1 -1 -1 -1 -1 760 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25080") -1 -1 -1 891 -1 -1 -1 -1 -1 -1 -1 -1 -1 820 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25083") -1 -1 -1 632 -1 -1 -1 -1 -1 -1 -1 -1 -1 584 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25085") -1 -1 -1 664 -1 -1 -1 -1 -1 -1 -1 -1 -1 625 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25088") -1 -1 -1 855 -1 -1 -1 -1 -1 -1 -1 -1 -1 785 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25091") -1 -1 -1 820 -1 -1 -1 -1 -1 -1 -1 -1 -1 782 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="25093") -1 -1 -1 656 -1 -1 -1 -1 -1 -1 -1 -1 -1 593 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26000") -1 -1 -1 701 -1 -1 -1 -1 -1 -1 -1 -1 -1 658 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26001") -1 -1 -1 686 -1 -1 -1 -1 -1 -1 -1 -1 -1 666 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26003") -1 -1 -1 664 -1 -1 -1 -1 -1 -1 -1 -1 -1 638 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26007") -1 -1 -1 327 -1 -1 -1 -1 -1 -1 -1 -1 -1 196 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26010") -1 -1 -1 786 -1 -1 -1 -1 -1 -1 -1 -1 -1 739 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26011") -1 -1 -1 712 -1 -1 -1 -1 -1 -1 -1 -1 -1 683 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26012") -1 -1 -1 625 -1 -1 -1 -1 -1 -1 -1 -1 -1 610 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26025") -1 -1 -1 613 -1 -1 -1 -1 -1 -1 -1 -1 -1 573 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26029") -1 -1 -1 625 -1 -1 -1 -1 -1 -1 -1 -1 -1 596 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26033") -1 -1 -1 765 -1 -1 -1 -1 -1 -1 -1 -1 -1 715 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26034") -1 -1 -1 745 -1 -1 -1 -1 -1 -1 -1 -1 -1 716 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26037") -1 -1 -1 432 -1 -1 -1 -1 -1 -1 -1 -1 -1 417 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26038") -1 -1 -1 721 -1 -1 -1 -1 -1 -1 -1 -1 -1 696 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26039") -1 -1 -1 611 -1 -1 -1 -1 -1 -1 -1 -1 -1 596 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26043") -1 -1 -1 717 -1 -1 -1 -1 -1 -1 -1 -1 -1 697 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26047") -1 -1 -1 511 -1 -1 -1 -1 -1 -1 -1 -1 -1 435 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26059") -1 -1 -1 682 -1 -1 -1 -1 -1 -1 -1 -1 -1 632 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26070") -1 -1 -1 646 -1 -1 -1 -1 -1 -1 -1 -1 -1 601 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26072") -1 -1 -1 537 -1 -1 -1 -1 -1 -1 -1 -1 -1 417 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26078") -1 -1 -1 580 -1 -1 -1 -1 -1 -1 -1 -1 -1 566 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26079") -1 -1 -1 755 -1 -1 -1 -1 -1 -1 -1 -1 -1 709 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26080") -1 -1 -1 689 -1 -1 -1 -1 -1 -1 -1 -1 -1 660 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26083") -1 -1 -1 729 -1 -1 -1 -1 -1 -1 -1 -1 -1 691 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26085") -1 -1 -1 761 -1 -1 -1 -1 -1 -1 -1 -1 -1 688 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26086") -1 -1 -1 484 -1 -1 -1 -1 -1 -1 -1 -1 -1 483 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26087") -1 -1 -1 607 -1 -1 -1 -1 -1 -1 -1 -1 -1 561 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26093") -1 -1 -1 677 -1 -1 -1 -1 -1 -1 -1 -1 -1 656 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26095") -1 -1 -1 879 -1 -1 -1 -1 -1 -1 -1 -1 -1 796 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26102") -1 -1 -1 826 -1 -1 -1 -1 -1 -1 -1 -1 -1 739 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26104") -1 -1 -1 705 -1 -1 -1 -1 -1 -1 -1 -1 -1 692 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26106") -1 -1 -1 681 -1 -1 -1 -1 -1 -1 -1 -1 -1 656 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26107") -1 -1 -1 709 -1 -1 -1 -1 -1 -1 -1 -1 -1 634 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26108") -1 -1 -1 547 -1 -1 -1 -1 -1 -1 -1 -1 -1 529 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="26110") -1 -1 -1 725 -1 -1 -1 -1 -1 -1 -1 -1 -1 686 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27000") -1 -1 -1 631 -1 -1 -1 -1 -1 -1 -1 -1 -1 611 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27003") -1 -1 -1 562 -1 -1 -1 -1 -1 -1 -1 -1 -1 535 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27007") -1 -1 -1 826 -1 -1 -1 -1 -1 -1 -1 -1 -1 754 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27009") -1 -1 -1 736 -1 -1 -1 -1 -1 -1 -1 -1 -1 688 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27012") -1 -1 -1 631 -1 -1 -1 -1 -1 -1 -1 -1 -1 612 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27018") -1 -1 -1 606 -1 -1 -1 -1 -1 -1 -1 -1 -1 589 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27019") -1 -1 -1 740 -1 -1 -1 -1 -1 -1 -1 -1 -1 688 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27020") -1 -1 -1 456 -1 -1 -1 -1 -1 -1 -1 -1 -1 429 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27030") -1 -1 -1 750 -1 -1 -1 -1 -1 -1 -1 -1 -1 733 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27034") -1 -1 -1 713 -1 -1 -1 -1 -1 -1 -1 -1 -1 664 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27035") -1 -1 -1 601 -1 -1 -1 -1 -1 -1 -1 -1 -1 573 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27039") -1 -1 -1 499 -1 -1 -1 -1 -1 -1 -1 -1 -1 456 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27043") -1 -1 -1 991 -1 -1 -1 -1 -1 -1 -1 -1 -1 852 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27044") -1 -1 -1 816 -1 -1 -1 -1 -1 -1 -1 -1 -1 732 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27052") -1 -1 -1 628 -1 -1 -1 -1 -1 -1 -1 -1 -1 597 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27054") -1 -1 -1 687 -1 -1 -1 -1 -1 -1 -1 -1 -1 645 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27056") -1 -1 -1 783 -1 -1 -1 -1 -1 -1 -1 -1 -1 743 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27059") -1 -1 -1 631 -1 -1 -1 -1 -1 -1 -1 -1 -1 604 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27060") -1 -1 -1 625 -1 -1 -1 -1 -1 -1 -1 -1 -1 597 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27064") -1 -1 -1 767 -1 -1 -1 -1 -1 -1 -1 -1 -1 715 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27078") -1 -1 -1 689 -1 -1 -1 -1 -1 -1 -1 -1 -1 618 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27084") -1 -1 -1 605 -1 -1 -1 -1 -1 -1 -1 -1 -1 567 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27088") -1 -1 -1 572 -1 -1 -1 -1 -1 -1 -1 -1 -1 566 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27094") -1 -1 -1 560 -1 -1 -1 -1 -1 -1 -1 -1 -1 557 -1 -1 -1 -1 -1 -1 + c(__type="s32" __count="20" mid="27102") -1 -1 -1 729 -1 -1 -1 -1 -1 -1 -1 -1 -1 686 -1 -1 -1 -1 -1 -1 \ No newline at end of file diff --git a/util.ts b/util.ts new file mode 100644 index 0000000..5ce9a05 --- /dev/null +++ b/util.ts @@ -0,0 +1,109 @@ +import { profile } from "./models/profile"; +import { Profile } from "../sdvx@asphyxia/models/profile"; + +export function IDToCode(id: number) { + const padded = _.padStart(id.toString(), 8); + return `${padded.slice(0, 4)}-${padded.slice(4)}`; +} + +export function base64decode(s: string) { + const base64list = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let t = "", + p = -8, + a = 0, + c: number, + d: number; + + for (let i = 0; i < s.length; i++) { + if ((c = base64list.indexOf(s.charAt(i))) < 0) continue; + a = (a << 6) | (c & 63); + if ((p += 6) >= 0) { + d = (a >> p) & 255; + if (c != 64) t += String.fromCharCode(d); + a &= 63; + p -= 8; + } + } + return t; +} + +export function GetVersion(info: EamuseInfo) { + return parseInt(info.module.substr(4, 2)); +} + +export async function IIDXidTorefid(iidxid: number) { + const profile = await DB.FindOne(null, { + collection: "profile", + iidxid: iidxid, + }); + return profile.refid; +} + +export function ClidToRank(clid: number) { + let style: number, rank: number; + if (clid >= 5) { + style = 1; + rank = clid - 5; + } else { + style = 0; + rank = clid; + } + return { + style: style, + rank: rank, + }; +} + +export function AppendSettingConverter( + sf: boolean, + cf: boolean, + df: boolean, + af: boolean, + hp: boolean, + dg: boolean, + ch: boolean, + hi: boolean +) { + const result = + Number(sf) * 1 + + Number(cf) * 2 + + Number(df) * 4 + + Number(af) * 8 + + Number(hp) * 256 + + Number(dg) * 512 + + Number(ch) * 1024 + + Number(hi) * 4196; + return result; +} + +export function DateToName(now: number, score_time: number) { + const msPerMinute = 60 * 1000; + const msPerHour = msPerMinute * 60; + const msPerDay = msPerHour * 24; + const msPerMonth = msPerDay * 30; + const msPerYear = msPerDay * 365; + + const elapsed = now - score_time; + + if (elapsed < msPerMinute) { + return "-" + Math.round(elapsed / 1000) + "s"; + } else if (elapsed < msPerHour) { + return "-" + Math.round(elapsed / msPerMinute) + "m"; + } else if (elapsed < msPerDay) { + return "-" + Math.round(elapsed / msPerHour) + "h"; + } else if (elapsed < msPerMonth) { + return "-" + Math.round(elapsed / msPerDay) + "d"; + } else if (elapsed < msPerYear) { + return "-" + Math.round(elapsed / msPerMonth) + "mo"; + } else { + return "-" + Math.round(elapsed / msPerYear) + "yr"; + } +} + +export async function refidToName(refid: string) { + const profile = await DB.FindOne(refid, { + collection: "profile", + }); + return profile.name; +} diff --git a/webui/profile_detail.pug b/webui/profile_detail.pug new file mode 100644 index 0000000..8a2908c --- /dev/null +++ b/webui/profile_detail.pug @@ -0,0 +1,58 @@ +//DATA// + profile: DB.FindOne(refid, { collection: "profile" }) + pc_data: DB.FindOne(refid, { collection: "pc_data" }) + +- + const gradelist=[ + "七級", + "六級", + "五級", + "四級", + "三級", + "二級", + "一級", + "初段", + "二段", + "三段", + "四段", + "五段", + "六段", + "七段", + "八段", + "九段", + "十段", + "中伝", + "皆伝"] + +div + .card + .card-header + p.card-header-title + span.icon + i.mdi.mdi-account-edit + | Detail + .card-content + .field + label.label Name + .body + body #{profile.name} + .field + label.label IIDX ID + .body + body #{profile.iidxidstr} + .field + label.label SP Grade + .body + - const a = pc_data.sgid + if a==-1 + body ---- + else + body #{gradelist[pc_data.sgid]} + .field + label.label DP Grade + .body + - const b = pc_data.dgid + if b==-1 + body ---- + else + body #{gradelist[pc_data.dgid]} \ No newline at end of file