gaokao-pro 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/yifenyiduan/jilin-2026-physics.json +1 -1
- package/dist/gaokao-cn.d.ts +19 -2
- package/dist/gaokao-cn.js +332 -7
- package/dist/selftest.js +20 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"province": "jilin", "province_name": "吉林", "year": 2026, "track": "physics", "track_cn": "物理类", "source": "吉林省教育考试院 官方PDF《2026年吉林省普通高校招生考试物理-普通1分段表(含照顾分)》(经 eol.cn 入口页发现,pdftotext 文本层提取)", "source_url": "https://www.jleea.com.cn/u/cms/www/2026/06/25/2069968590488035329.pdf", "note": "源自吉林省教育考试院官方PDF《2026年吉林省普通高校招生考试物理-普通1分段表(含照顾分)》(https://www.jleea.com.cn/u/cms/www/2026/06/25/2069968590488035329.pdf),经eol.cn入口页(https://gaokao.eol.cn/ji_lin/dongtai/202606/t20260625_2749028.shtml)发现。PDF含文本层(非扫描),用pdftotext -layout提取tens×ones累计矩阵,按score=tens+ones逐分还原为[分数,累计人数]两列表,cumulative逐格取自官方PDF原值。顶部707=12为官方合并段(≥707累计12人),0分行=75551为官方0分/照顾分末段。本科线物理321→累计67422,特控线473→累计31914。;count 由 cumulative(位次) 反推(官方表为累计制/顶部分段合并)", "count": 708, "rows": [{"score": 707, "count": 12, "cumulative": 12}, {"score": 706, "count": 0, "cumulative": 12}, {"score": 705, "count": 2, "cumulative": 14}, {"score": 704, "count": 1, "cumulative": 15}, {"score": 703, "count": 3, "cumulative": 18}, {"score": 702, "count": 6, "cumulative": 24}, {"score": 701, "count": 6, "cumulative": 30}, {"score": 700, "count": 2, "cumulative": 32}, {"score": 699, "count": 6, "cumulative": 38}, {"score": 698, "count": 4, "cumulative": 42}, {"score": 697, "count": 4, "cumulative": 46}, {"score": 696, "count": 7, "cumulative": 53}, {"score": 695, "count": 4, "cumulative": 57}, {"score": 694, "count": 13, "cumulative": 70}, {"score": 693, "count": 9, "cumulative": 79}, {"score": 692, "count": 7, "cumulative": 86}, {"score": 691, "count": 15, "cumulative": 101}, {"score": 690, "count": 7, "cumulative": 108}, {"score": 689, "count": 12, "cumulative": 120}, {"score": 688, "count": 13, "cumulative": 133}, {"score": 687, "count": 16, "cumulative": 149}, {"score": 686, "count": 13, "cumulative": 162}, {"score": 685, "count": 21, "cumulative": 183}, {"score": 684, "count": 14, "cumulative": 197}, {"score": 683, "count": 10, "cumulative": 207}, {"score": 682, "count": 23, "cumulative": 230}, {"score": 681, "count": 15, "cumulative": 245}, {"score": 680, "count": 23, "cumulative": 268}, {"score": 679, "count": 21, "cumulative": 289}, {"score": 678, "count": 21, "cumulative": 310}, {"score": 677, "count": 21, "cumulative": 331}, {"score": 676, "count": 19, "cumulative": 350}, {"score": 675, "count": 19, "cumulative": 369}, {"score": 674, "count": 15, "cumulative": 384}, {"score": 673, "count": 21, "cumulative": 405}, {"score": 672, "count": 19, "cumulative": 424}, {"score": 671, "count": 25, "cumulative": 449}, {"score": 670, "count": 31, "cumulative": 480}, {"score": 669, "count": 30, "cumulative": 510}, {"score": 668, "count": 41, "cumulative": 551}, {"score": 667, "count": 22, "cumulative": 573}, {"score": 666, "count": 32, "cumulative": 605}, {"score": 665, "count": 33, "cumulative": 638}, {"score": 664, "count": 34, "cumulative": 672}, {"score": 663, "count": 31, "cumulative": 703}, {"score": 662, "count": 34, "cumulative": 737}, {"score": 661, "count": 45, "cumulative": 782}, {"score": 660, "count": 40, "cumulative": 822}, {"score": 659, "count": 45, "cumulative": 867}, {"score": 658, "count": 53, "cumulative": 920}, {"score": 657, "count": 41, "cumulative": 961}, {"score": 656, "count": 56, "cumulative": 1017}, {"score": 655, "count": 50, "cumulative": 1067}, {"score": 654, "count": 45, "cumulative": 1112}, {"score": 653, "count": 57, "cumulative": 1169}, {"score": 652, "count": 40, "cumulative": 1209}, {"score": 651, "count": 47, "cumulative": 1256}, {"score": 650, "count": 70, "cumulative": 1326}, {"score": 649, "count": 52, "cumulative": 1378}, {"score": 648, "count": 51, "cumulative": 1429}, {"score": 647, "count": 70, "cumulative": 1499}, {"score": 646, "count": 57, "cumulative": 1556}, {"score": 645, "count": 80, "cumulative": 1636}, {"score": 644, "count": 55, "cumulative": 1691}, {"score": 643, "count": 75, "cumulative": 1766}, {"score": 642, "count": 74, "cumulative": 1840}, {"score": 641, "count": 65, "cumulative": 1905}, {"score": 640, "count": 77, "cumulative": 1982}, {"score": 639, "count": 81, "cumulative": 2063}, {"score": 638, "count": 84, "cumulative": 2147}, {"score": 637, "count": 96, "cumulative": 2243}, {"score": 636, "count": 82, "cumulative": 2325}, {"score": 635, "count": 83, "cumulative": 2408}, {"score": 634, "count": 83, "cumulative": 2491}, {"score": 633, "count": 83, "cumulative": 2574}, {"score": 632, "count": 81, "cumulative": 2655}, {"score": 631, "count": 89, "cumulative": 2744}, {"score": 630, "count": 109, "cumulative": 2853}, {"score": 629, "count": 86, "cumulative": 2939}, {"score": 628, "count": 88, "cumulative": 3027}, {"score": 627, "count": 94, "cumulative": 3121}, {"score": 626, "count": 84, "cumulative": 3205}, {"score": 625, "count": 84, "cumulative": 3289}, {"score": 624, "count": 98, "cumulative": 3387}, {"score": 623, "count": 105, "cumulative": 3492}, {"score": 622, "count": 106, "cumulative": 3598}, {"score": 621, "count": 89, "cumulative": 3687}, {"score": 620, "count": 100, "cumulative": 3787}, {"score": 619, "count": 103, "cumulative": 3890}, {"score": 618, "count": 87, "cumulative": 3977}, {"score": 617, "count": 103, "cumulative": 4080}, {"score": 616, "count": 99, "cumulative": 4179}, {"score": 615, "count": 92, "cumulative": 4271}, {"score": 614, "count": 110, "cumulative": 4381}, {"score": 613, "count": 109, "cumulative": 4490}, {"score": 612, "count": 113, "cumulative": 4603}, {"score": 611, "count": 99, "cumulative": 4702}, {"score": 610, "count": 123, "cumulative": 4825}, {"score": 609, "count": 114, "cumulative": 4939}, {"score": 608, "count": 134, "cumulative": 5073}, {"score": 607, "count": 134, "cumulative": 5207}, {"score": 606, "count": 130, "cumulative": 5337}, {"score": 605, "count": 136, "cumulative": 5473}, {"score": 604, "count": 127, "cumulative": 5600}, {"score": 603, "count": 118, "cumulative": 5718}, {"score": 602, "count": 127, "cumulative": 5845}, {"score": 601, "count": 115, "cumulative": 5960}, {"score": 600, "count": 132, "cumulative": 6092}, {"score": 599, "count": 131, "cumulative": 6223}, {"score": 598, "count": 133, "cumulative": 6356}, {"score": 597, "count": 141, "cumulative": 6497}, {"score": 596, "count": 152, "cumulative": 6649}, {"score": 595, "count": 126, "cumulative": 6775}, {"score": 594, "count": 111, "cumulative": 6886}, {"score": 593, "count": 144, "cumulative": 7030}, {"score": 592, "count": 144, "cumulative": 7174}, {"score": 591, "count": 138, "cumulative": 7312}, {"score": 590, "count": 150, "cumulative": 7462}, {"score": 589, "count": 167, "cumulative": 7629}, {"score": 588, "count": 151, "cumulative": 7780}, {"score": 587, "count": 130, "cumulative": 7910}, {"score": 586, "count": 139, "cumulative": 8049}, {"score": 585, "count": 148, "cumulative": 8197}, {"score": 584, "count": 134, "cumulative": 8331}, {"score": 583, "count": 154, "cumulative": 8485}, {"score": 582, "count": 148, "cumulative": 8633}, {"score": 581, "count": 135, "cumulative": 8768}, {"score": 580, "count": 145, "cumulative": 8913}, {"score": 579, "count": 166, "cumulative": 9079}, {"score": 578, "count": 153, "cumulative": 9232}, {"score": 577, "count": 155, "cumulative": 9387}, {"score": 576, "count": 168, "cumulative": 9555}, {"score": 575, "count": 151, "cumulative": 9706}, {"score": 574, "count": 155, "cumulative": 9861}, {"score": 573, "count": 157, "cumulative": 10018}, {"score": 572, "count": 152, "cumulative": 10170}, {"score": 571, "count": 160, "cumulative": 10330}, {"score": 570, "count": 166, "cumulative": 10496}, {"score": 569, "count": 163, "cumulative": 10659}, {"score": 568, "count": 168, "cumulative": 10827}, {"score": 567, "count": 168, "cumulative": 10995}, {"score": 566, "count": 159, "cumulative": 11154}, {"score": 565, "count": 177, "cumulative": 11331}, {"score": 564, "count": 187, "cumulative": 11518}, {"score": 563, "count": 181, "cumulative": 11699}, {"score": 562, "count": 187, "cumulative": 11886}, {"score": 561, "count": 178, "cumulative": 12064}, {"score": 560, "count": 191, "cumulative": 12255}, {"score": 559, "count": 175, "cumulative": 12430}, {"score": 558, "count": 204, "cumulative": 12634}, {"score": 557, "count": 183, "cumulative": 12817}, {"score": 556, "count": 172, "cumulative": 12989}, {"score": 555, "count": 170, "cumulative": 13159}, {"score": 554, "count": 186, "cumulative": 13345}, {"score": 553, "count": 221, "cumulative": 13566}, {"score": 552, "count": 190, "cumulative": 13756}, {"score": 551, "count": 178, "cumulative": 13934}, {"score": 550, "count": 173, "cumulative": 14107}, {"score": 549, "count": 166, "cumulative": 14273}, {"score": 548, "count": 213, "cumulative": 14486}, {"score": 547, "count": 195, "cumulative": 14681}, {"score": 546, "count": 210, "cumulative": 14891}, {"score": 545, "count": 212, "cumulative": 15103}, {"score": 544, "count": 217, "cumulative": 15320}, {"score": 543, "count": 207, "cumulative": 15527}, {"score": 542, "count": 172, "cumulative": 15699}, {"score": 541, "count": 216, "cumulative": 15915}, {"score": 540, "count": 246, "cumulative": 16161}, {"score": 539, "count": 214, "cumulative": 16375}, {"score": 538, "count": 227, "cumulative": 16602}, {"score": 537, "count": 246, "cumulative": 16848}, {"score": 536, "count": 202, "cumulative": 17050}, {"score": 535, "count": 237, "cumulative": 17287}, {"score": 534, "count": 225, "cumulative": 17512}, {"score": 533, "count": 206, "cumulative": 17718}, {"score": 532, "count": 221, "cumulative": 17939}, {"score": 531, "count": 211, "cumulative": 18150}, {"score": 530, "count": 220, "cumulative": 18370}, {"score": 529, "count": 217, "cumulative": 18587}, {"score": 528, "count": 205, "cumulative": 18792}, {"score": 527, "count": 213, "cumulative": 19005}, {"score": 526, "count": 213, "cumulative": 19218}, {"score": 525, "count": 208, "cumulative": 19426}, {"score": 524, "count": 201, "cumulative": 19627}, {"score": 523, "count": 234, "cumulative": 19861}, {"score": 522, "count": 224, "cumulative": 20085}, {"score": 521, "count": 209, "cumulative": 20294}, {"score": 520, "count": 225, "cumulative": 20519}, {"score": 519, "count": 222, "cumulative": 20741}, {"score": 518, "count": 228, "cumulative": 20969}, {"score": 517, "count": 205, "cumulative": 21174}, {"score": 516, "count": 207, "cumulative": 21381}, {"score": 515, "count": 234, "cumulative": 21615}, {"score": 514, "count": 242, "cumulative": 21857}, {"score": 513, "count": 245, "cumulative": 22102}, {"score": 512, "count": 269, "cumulative": 22371}, {"score": 511, "count": 265, "cumulative": 22636}, {"score": 510, "count": 212, "cumulative": 22848}, {"score": 509, "count": 242, "cumulative": 23090}, {"score": 508, "count": 230, "cumulative": 23320}, {"score": 507, "count": 259, "cumulative": 23579}, {"score": 506, "count": 262, "cumulative": 23841}, {"score": 505, "count": 215, "cumulative": 24056}, {"score": 504, "count": 221, "cumulative": 24277}, {"score": 503, "count": 239, "cumulative": 24516}, {"score": 502, "count": 251, "cumulative": 24767}, {"score": 501, "count": 223, "cumulative": 24990}, {"score": 500, "count": 274, "cumulative": 25264}, {"score": 499, "count": 236, "cumulative": 25500}, {"score": 498, "count": 240, "cumulative": 25740}, {"score": 497, "count": 239, "cumulative": 25979}, {"score": 496, "count": 214, "cumulative": 26193}, {"score": 495, "count": 204, "cumulative": 26397}, {"score": 494, "count": 243, "cumulative": 26640}, {"score": 493, "count": 226, "cumulative": 26866}, {"score": 492, "count": 262, "cumulative": 27128}, {"score": 491, "count": 241, "cumulative": 27369}, {"score": 490, "count": 242, "cumulative": 27611}, {"score": 489, "count": 251, "cumulative": 27862}, {"score": 488, "count": 225, "cumulative": 28087}, {"score": 487, "count": 287, "cumulative": 28374}, {"score": 486, "count": 245, "cumulative": 28619}, {"score": 485, "count": 242, "cumulative": 28861}, {"score": 484, "count": 247, "cumulative": 29108}, {"score": 483, "count": 277, "cumulative": 29385}, {"score": 482, "count": 254, "cumulative": 29639}, {"score": 481, "count": 221, "cumulative": 29860}, {"score": 480, "count": 248, "cumulative": 30108}, {"score": 479, "count": 260, "cumulative": 30368}, {"score": 478, "count": 263, "cumulative": 30631}, {"score": 477, "count": 250, "cumulative": 30881}, {"score": 476, "count": 211, "cumulative": 31092}, {"score": 475, "count": 268, "cumulative": 31360}, {"score": 474, "count": 284, "cumulative": 31644}, {"score": 473, "count": 270, "cumulative": 31914}, {"score": 472, "count": 256, "cumulative": 32170}, {"score": 471, "count": 222, "cumulative": 32392}, {"score": 470, "count": 235, "cumulative": 32627}, {"score": 469, "count": 255, "cumulative": 32882}, {"score": 468, "count": 283, "cumulative": 33165}, {"score": 467, "count": 264, "cumulative": 33429}, {"score": 466, "count": 268, "cumulative": 33697}, {"score": 465, "count": 265, "cumulative": 33962}, {"score": 464, "count": 257, "cumulative": 34219}, {"score": 463, "count": 259, "cumulative": 34478}, {"score": 462, "count": 272, "cumulative": 34750}, {"score": 461, "count": 265, "cumulative": 35015}, {"score": 460, "count": 276, "cumulative": 35291}, {"score": 459, "count": 249, "cumulative": 35540}, {"score": 458, "count": 265, "cumulative": 35805}, {"score": 457, "count": 265, "cumulative": 36070}, {"score": 456, "count": 267, "cumulative": 36337}, {"score": 455, "count": 270, "cumulative": 36607}, {"score": 454, "count": 260, "cumulative": 36867}, {"score": 453, "count": 276, "cumulative": 37143}, {"score": 452, "count": 280, "cumulative": 37423}, {"score": 451, "count": 241, "cumulative": 37664}, {"score": 450, "count": 283, "cumulative": 37947}, {"score": 449, "count": 238, "cumulative": 38185}, {"score": 448, "count": 250, "cumulative": 38435}, {"score": 447, "count": 291, "cumulative": 38726}, {"score": 446, "count": 261, "cumulative": 38987}, {"score": 445, "count": 288, "cumulative": 39275}, {"score": 444, "count": 268, "cumulative": 39543}, {"score": 443, "count": 248, "cumulative": 39791}, {"score": 442, "count": 285, "cumulative": 40076}, {"score": 441, "count": 245, "cumulative": 40321}, {"score": 440, "count": 305, "cumulative": 40626}, {"score": 439, "count": 283, "cumulative": 40909}, {"score": 438, "count": 275, "cumulative": 41184}, {"score": 437, "count": 283, "cumulative": 41467}, {"score": 436, "count": 278, "cumulative": 41745}, {"score": 435, "count": 277, "cumulative": 42022}, {"score": 434, "count": 294, "cumulative": 42316}, {"score": 433, "count": 267, "cumulative": 42583}, {"score": 432, "count": 266, "cumulative": 42849}, {"score": 431, "count": 281, "cumulative": 43130}, {"score": 430, "count": 267, "cumulative": 43397}, {"score": 429, "count": 271, "cumulative": 43668}, {"score": 428, "count": 285, "cumulative": 43953}, {"score": 427, "count": 281, "cumulative": 44234}, {"score": 426, "count": 236, "cumulative": 44470}, {"score": 425, "count": 256, "cumulative": 44726}, {"score": 424, "count": 270, "cumulative": 44996}, {"score": 423, "count": 262, "cumulative": 45258}, {"score": 422, "count": 273, "cumulative": 45531}, {"score": 421, "count": 275, "cumulative": 45806}, {"score": 420, "count": 281, "cumulative": 46087}, {"score": 419, "count": 251, "cumulative": 46338}, {"score": 418, "count": 281, "cumulative": 46619}, {"score": 417, "count": 274, "cumulative": 46893}, {"score": 416, "count": 291, "cumulative": 47184}, {"score": 415, "count": 264, "cumulative": 47448}, {"score": 414, "count": 255, "cumulative": 47703}, {"score": 413, "count": 250, "cumulative": 47953}, {"score": 412, "count": 252, "cumulative": 48205}, {"score": 411, "count": 273, "cumulative": 48478}, {"score": 410, "count": 277, "cumulative": 48755}, {"score": 409, "count": 268, "cumulative": 49023}, {"score": 408, "count": 263, "cumulative": 49286}, {"score": 407, "count": 255, "cumulative": 49541}, {"score": 406, "count": 247, "cumulative": 49788}, {"score": 405, "count": 266, "cumulative": 50054}, {"score": 404, "count": 270, "cumulative": 50324}, {"score": 403, "count": 232, "cumulative": 50556}, {"score": 402, "count": 275, "cumulative": 50831}, {"score": 401, "count": 271, "cumulative": 51102}, {"score": 400, "count": 242, "cumulative": 51344}, {"score": 399, "count": 220, "cumulative": 51564}, {"score": 398, "count": 270, "cumulative": 51834}, {"score": 397, "count": 246, "cumulative": 52080}, {"score": 396, "count": 255, "cumulative": 52335}, {"score": 395, "count": 221, "cumulative": 52556}, {"score": 394, "count": 240, "cumulative": 52796}, {"score": 393, "count": 293, "cumulative": 53089}, {"score": 392, "count": 223, "cumulative": 53312}, {"score": 391, "count": 222, "cumulative": 53534}, {"score": 390, "count": 270, "cumulative": 53804}, {"score": 389, "count": 248, "cumulative": 54052}, {"score": 388, "count": 252, "cumulative": 54304}, {"score": 387, "count": 259, "cumulative": 54563}, {"score": 386, "count": 255, "cumulative": 54818}, {"score": 385, "count": 250, "cumulative": 55068}, {"score": 384, "count": 240, "cumulative": 55308}, {"score": 383, "count": 249, "cumulative": 55557}, {"score": 382, "count": 251, "cumulative": 55808}, {"score": 381, "count": 246, "cumulative": 56054}, {"score": 380, "count": 225, "cumulative": 56279}, {"score": 379, "count": 257, "cumulative": 56536}, {"score": 378, "count": 256, "cumulative": 56792}, {"score": 377, "count": 213, "cumulative": 57005}, {"score": 376, "count": 219, "cumulative": 57224}, {"score": 375, "count": 237, "cumulative": 57461}, {"score": 374, "count": 236, "cumulative": 57697}, {"score": 373, "count": 209, "cumulative": 57906}, {"score": 372, "count": 251, "cumulative": 58157}, {"score": 371, "count": 223, "cumulative": 58380}, {"score": 370, "count": 189, "cumulative": 58569}, {"score": 369, "count": 213, "cumulative": 58782}, {"score": 368, "count": 209, "cumulative": 58991}, {"score": 367, "count": 196, "cumulative": 59187}, {"score": 366, "count": 222, "cumulative": 59409}, {"score": 365, "count": 211, "cumulative": 59620}, {"score": 364, "count": 204, "cumulative": 59824}, {"score": 363, "count": 218, "cumulative": 60042}, {"score": 362, "count": 213, "cumulative": 60255}, {"score": 361, "count": 209, "cumulative": 60464}, {"score": 360, "count": 200, "cumulative": 60664}, {"score": 359, "count": 196, "cumulative": 60860}, {"score": 358, "count": 197, "cumulative": 61057}, {"score": 357, "count": 202, "cumulative": 61259}, {"score": 356, "count": 224, "cumulative": 61483}, {"score": 355, "count": 203, "cumulative": 61686}, {"score": 354, "count": 191, "cumulative": 61877}, {"score": 353, "count": 191, "cumulative": 62068}, {"score": 352, "count": 184, "cumulative": 62252}, {"score": 351, "count": 174, "cumulative": 62426}, {"score": 350, "count": 199, "cumulative": 62625}, {"score": 349, "count": 196, "cumulative": 62821}, {"score": 348, "count": 189, "cumulative": 63010}, {"score": 347, "count": 216, "cumulative": 63226}, {"score": 346, "count": 173, "cumulative": 63399}, {"score": 345, "count": 172, "cumulative": 63571}, {"score": 344, "count": 178, "cumulative": 63749}, {"score": 343, "count": 200, "cumulative": 63949}, {"score": 342, "count": 161, "cumulative": 64110}, {"score": 341, "count": 180, "cumulative": 64290}, {"score": 340, "count": 146, "cumulative": 64436}, {"score": 339, "count": 160, "cumulative": 64596}, {"score": 338, "count": 167, "cumulative": 64763}, {"score": 337, "count": 188, "cumulative": 64951}, {"score": 336, "count": 173, "cumulative": 65124}, {"score": 335, "count": 165, "cumulative": 65289}, {"score": 334, "count": 156, "cumulative": 65445}, {"score": 333, "count": 161, "cumulative": 65606}, {"score": 332, "count": 156, "cumulative": 65762}, {"score": 331, "count": 155, "cumulative": 65917}, {"score": 330, "count": 154, "cumulative": 66071}, {"score": 329, "count": 174, "cumulative": 66245}, {"score": 328, "count": 150, "cumulative": 66395}, {"score": 327, "count": 171, "cumulative": 66566}, {"score": 326, "count": 162, "cumulative": 66728}, {"score": 325, "count": 144, "cumulative": 66872}, {"score": 324, "count": 161, "cumulative": 67033}, {"score": 323, "count": 143, "cumulative": 67176}, {"score": 322, "count": 137, "cumulative": 67313}, {"score": 321, "count": 109, "cumulative": 67422}, {"score": 320, "count": 146, "cumulative": 67568}, {"score": 319, "count": 136, "cumulative": 67704}, {"score": 318, "count": 138, "cumulative": 67842}, {"score": 317, "count": 143, "cumulative": 67985}, {"score": 316, "count": 127, "cumulative": 68112}, {"score": 315, "count": 134, "cumulative": 68246}, {"score": 314, "count": 129, "cumulative": 68375}, {"score": 313, "count": 112, "cumulative": 68487}, {"score": 312, "count": 121, "cumulative": 68608}, {"score": 311, "count": 111, "cumulative": 68719}, {"score": 310, "count": 120, "cumulative": 68839}, {"score": 309, "count": 106, "cumulative": 68945}, {"score": 308, "count": 127, "cumulative": 69072}, {"score": 307, "count": 107, "cumulative": 69179}, {"score": 306, "count": 114, "cumulative": 69293}, {"score": 305, "count": 110, "cumulative": 69403}, {"score": 304, "count": 109, "cumulative": 69512}, {"score": 303, "count": 109, "cumulative": 69621}, {"score": 302, "count": 97, "cumulative": 69718}, {"score": 301, "count": 87, "cumulative": 69805}, {"score": 300, "count": 96, "cumulative": 69901}, {"score": 299, "count": 89, "cumulative": 69990}, {"score": 298, "count": 113, "cumulative": 70103}, {"score": 297, "count": 101, "cumulative": 70204}, {"score": 296, "count": 108, "cumulative": 70312}, {"score": 295, "count": 84, "cumulative": 70396}, {"score": 294, "count": 87, "cumulative": 70483}, {"score": 293, "count": 91, "cumulative": 70574}, {"score": 292, "count": 81, "cumulative": 70655}, {"score": 291, "count": 82, "cumulative": 70737}, {"score": 290, "count": 76, "cumulative": 70813}, {"score": 289, "count": 90, "cumulative": 70903}, {"score": 288, "count": 80, "cumulative": 70983}, {"score": 287, "count": 74, "cumulative": 71057}, {"score": 286, "count": 69, "cumulative": 71126}, {"score": 285, "count": 75, "cumulative": 71201}, {"score": 284, "count": 72, "cumulative": 71273}, {"score": 283, "count": 92, "cumulative": 71365}, {"score": 282, "count": 66, "cumulative": 71431}, {"score": 281, "count": 79, "cumulative": 71510}, {"score": 280, "count": 60, "cumulative": 71570}, {"score": 279, "count": 58, "cumulative": 71628}, {"score": 278, "count": 60, "cumulative": 71688}, {"score": 277, "count": 64, "cumulative": 71752}, {"score": 276, "count": 62, "cumulative": 71814}, {"score": 275, "count": 62, "cumulative": 71876}, {"score": 274, "count": 56, "cumulative": 71932}, {"score": 273, "count": 59, "cumulative": 71991}, {"score": 272, "count": 48, "cumulative": 72039}, {"score": 271, "count": 54, "cumulative": 72093}, {"score": 270, "count": 67, "cumulative": 72160}, {"score": 269, "count": 51, "cumulative": 72211}, {"score": 268, "count": 57, "cumulative": 72268}, {"score": 267, "count": 41, "cumulative": 72309}, {"score": 266, "count": 43, "cumulative": 72352}, {"score": 265, "count": 47, "cumulative": 72399}, {"score": 264, "count": 61, "cumulative": 72460}, {"score": 263, "count": 44, "cumulative": 72504}, {"score": 262, "count": 51, "cumulative": 72555}, {"score": 261, "count": 60, "cumulative": 72615}, {"score": 260, "count": 46, "cumulative": 72661}, {"score": 259, "count": 47, "cumulative": 72708}, {"score": 258, "count": 46, "cumulative": 72754}, {"score": 257, "count": 34, "cumulative": 72788}, {"score": 256, "count": 43, "cumulative": 72831}, {"score": 255, "count": 36, "cumulative": 72867}, {"score": 254, "count": 41, "cumulative": 72908}, {"score": 253, "count": 36, "cumulative": 72944}, {"score": 252, "count": 40, "cumulative": 72984}, {"score": 251, "count": 45, "cumulative": 73029}, {"score": 250, "count": 40, "cumulative": 73069}, {"score": 249, "count": 28, "cumulative": 73097}, {"score": 248, "count": 32, "cumulative": 73129}, {"score": 247, "count": 44, "cumulative": 73173}, {"score": 246, "count": 36, "cumulative": 73209}, {"score": 245, "count": 30, "cumulative": 73239}, {"score": 244, "count": 33, "cumulative": 73272}, {"score": 243, "count": 36, "cumulative": 73308}, {"score": 242, "count": 25, "cumulative": 73333}, {"score": 241, "count": 26, "cumulative": 73359}, {"score": 240, "count": 22, "cumulative": 73381}, {"score": 239, "count": 36, "cumulative": 73417}, {"score": 238, "count": 28, "cumulative": 73445}, {"score": 237, "count": 32, "cumulative": 73477}, {"score": 236, "count": 20, "cumulative": 73497}, {"score": 235, "count": 14, "cumulative": 73511}, {"score": 234, "count": 24, "cumulative": 73535}, {"score": 233, "count": 24, "cumulative": 73559}, {"score": 232, "count": 22, "cumulative": 73581}, {"score": 231, "count": 14, "cumulative": 73595}, {"score": 230, "count": 24, "cumulative": 73619}, {"score": 229, "count": 18, "cumulative": 73637}, {"score": 228, "count": 32, "cumulative": 73669}, {"score": 227, "count": 21, "cumulative": 73690}, {"score": 226, "count": 18, "cumulative": 73708}, {"score": 225, "count": 16, "cumulative": 73724}, {"score": 224, "count": 21, "cumulative": 73745}, {"score": 223, "count": 20, "cumulative": 73765}, {"score": 222, "count": 14, "cumulative": 73779}, {"score": 221, "count": 20, "cumulative": 73799}, {"score": 220, "count": 21, "cumulative": 73820}, {"score": 219, "count": 13, "cumulative": 73833}, {"score": 218, "count": 12, "cumulative": 73845}, {"score": 217, "count": 16, "cumulative": 73861}, {"score": 216, "count": 12, "cumulative": 73873}, {"score": 215, "count": 8, "cumulative": 73881}, {"score": 214, "count": 15, "cumulative": 73896}, {"score": 213, "count": 16, "cumulative": 73912}, {"score": 212, "count": 11, "cumulative": 73923}, {"score": 211, "count": 13, "cumulative": 73936}, {"score": 210, "count": 8, "cumulative": 73944}, {"score": 209, "count": 8, "cumulative": 73952}, {"score": 208, "count": 12, "cumulative": 73964}, {"score": 207, "count": 11, "cumulative": 73975}, {"score": 206, "count": 9, "cumulative": 73984}, {"score": 205, "count": 7, "cumulative": 73991}, {"score": 204, "count": 5, "cumulative": 73996}, {"score": 203, "count": 6, "cumulative": 74002}, {"score": 202, "count": 16, "cumulative": 74018}, {"score": 201, "count": 5, "cumulative": 74023}, {"score": 200, "count": 8, "cumulative": 74031}, {"score": 199, "count": 13, "cumulative": 74044}, {"score": 198, "count": 4, "cumulative": 74048}, {"score": 197, "count": 5, "cumulative": 74053}, {"score": 196, "count": 7, "cumulative": 74060}, {"score": 195, "count": 7, "cumulative": 74067}, {"score": 194, "count": 0, "cumulative": 74067}, {"score": 193, "count": 4, "cumulative": 74071}, {"score": 192, "count": 2, "cumulative": 74073}, {"score": 191, "count": 7, "cumulative": 74080}, {"score": 190, "count": 1, "cumulative": 74081}, {"score": 189, "count": 7, "cumulative": 74088}, {"score": 188, "count": 4, "cumulative": 74092}, {"score": 187, "count": 6, "cumulative": 74098}, {"score": 186, "count": 4, "cumulative": 74102}, {"score": 185, "count": 4, "cumulative": 74106}, {"score": 184, "count": 2, "cumulative": 74108}, {"score": 183, "count": 5, "cumulative": 74113}, {"score": 182, "count": 0, "cumulative": 74113}, {"score": 181, "count": 3, "cumulative": 74116}, {"score": 180, "count": 4, "cumulative": 74120}, {"score": 179, "count": 0, "cumulative": 74120}, {"score": 178, "count": 3, "cumulative": 74123}, {"score": 177, "count": 4, "cumulative": 74127}, {"score": 176, "count": 4, "cumulative": 74131}, {"score": 175, "count": 9, "cumulative": 74140}, {"score": 174, "count": 3, "cumulative": 74143}, {"score": 173, "count": 9, "cumulative": 74152}, {"score": 172, "count": 3, "cumulative": 74155}, {"score": 171, "count": 0, "cumulative": 74155}, {"score": 170, "count": 1, "cumulative": 74156}, {"score": 169, "count": 1, "cumulative": 74157}, {"score": 168, "count": 4, "cumulative": 74161}, {"score": 167, "count": 2, "cumulative": 74163}, {"score": 166, "count": 3, "cumulative": 74166}, {"score": 165, "count": 3, "cumulative": 74169}, {"score": 164, "count": 4, "cumulative": 74173}, {"score": 163, "count": 2, "cumulative": 74175}, {"score": 162, "count": 3, "cumulative": 74178}, {"score": 161, "count": 2, "cumulative": 74180}, {"score": 160, "count": 1, "cumulative": 74181}, {"score": 159, "count": 2, "cumulative": 74183}, {"score": 158, "count": 2, "cumulative": 74185}, {"score": 157, "count": 1, "cumulative": 74186}, {"score": 156, "count": 4, "cumulative": 74190}, {"score": 155, "count": 0, "cumulative": 74190}, {"score": 154, "count": 3, "cumulative": 74193}, {"score": 153, "count": 3, "cumulative": 74196}, {"score": 152, "count": 1, "cumulative": 74197}, {"score": 151, "count": 2, "cumulative": 74199}, {"score": 150, "count": 3, "cumulative": 74202}, {"score": 149, "count": 2, "cumulative": 74204}, {"score": 148, "count": 0, "cumulative": 74204}, {"score": 147, "count": 1, "cumulative": 74205}, {"score": 146, "count": 1, "cumulative": 74206}, {"score": 145, "count": 2, "cumulative": 74208}, {"score": 144, "count": 2, "cumulative": 74210}, {"score": 143, "count": 3, "cumulative": 74213}, {"score": 142, "count": 3, "cumulative": 74216}, {"score": 141, "count": 2, "cumulative": 74218}, {"score": 140, "count": 1, "cumulative": 74219}, {"score": 139, "count": 1, "cumulative": 74220}, {"score": 138, "count": 0, "cumulative": 74220}, {"score": 137, "count": 1, "cumulative": 74221}, {"score": 136, "count": 3, "cumulative": 74224}, {"score": 135, "count": 3, "cumulative": 74227}, {"score": 134, "count": 0, "cumulative": 74227}, {"score": 133, "count": 0, "cumulative": 74227}, {"score": 132, "count": 1, "cumulative": 74228}, {"score": 131, "count": 1, "cumulative": 74229}, {"score": 130, "count": 1, "cumulative": 74230}, {"score": 129, "count": 1, "cumulative": 74231}, {"score": 128, "count": 0, "cumulative": 74231}, {"score": 127, "count": 0, "cumulative": 74231}, {"score": 126, "count": 0, "cumulative": 74231}, {"score": 125, "count": 1, "cumulative": 74232}, {"score": 124, "count": 0, "cumulative": 74232}, {"score": 123, "count": 1, "cumulative": 74233}, {"score": 122, "count": 1, "cumulative": 74234}, {"score": 121, "count": 1, "cumulative": 74235}, {"score": 120, "count": 0, "cumulative": 74235}, {"score": 119, "count": 0, "cumulative": 74235}, {"score": 118, "count": 1, "cumulative": 74236}, {"score": 117, "count": 1, "cumulative": 74237}, {"score": 116, "count": 1, "cumulative": 74238}, {"score": 115, "count": 0, "cumulative": 74238}, {"score": 114, "count": 1, "cumulative": 74239}, {"score": 113, "count": 3, "cumulative": 74242}, {"score": 112, "count": 1, "cumulative": 74243}, {"score": 111, "count": 1, "cumulative": 74244}, {"score": 110, "count": 1, "cumulative": 74245}, {"score": 109, "count": 1, "cumulative": 74246}, {"score": 108, "count": 1, "cumulative": 74247}, {"score": 107, "count": 0, "cumulative": 74247}, {"score": 106, "count": 1, "cumulative": 74248}, {"score": 105, "count": 0, "cumulative": 74248}, {"score": 104, "count": 3, "cumulative": 74251}, {"score": 103, "count": 2, "cumulative": 74253}, {"score": 102, "count": 0, "cumulative": 74253}, {"score": 101, "count": 0, "cumulative": 74253}, {"score": 100, "count": 0, "cumulative": 74253}, {"score": 99, "count": 1, "cumulative": 74254}, {"score": 98, "count": 0, "cumulative": 74254}, {"score": 97, "count": 0, "cumulative": 74254}, {"score": 96, "count": 0, "cumulative": 74254}, {"score": 95, "count": 1, "cumulative": 74255}, {"score": 94, "count": 1, "cumulative": 74256}, {"score": 93, "count": 0, "cumulative": 74256}, {"score": 92, "count": 0, "cumulative": 74256}, {"score": 91, "count": 1, "cumulative": 74257}, {"score": 90, "count": 2, "cumulative": 74259}, {"score": 89, "count": 1, "cumulative": 74260}, {"score": 88, "count": 0, "cumulative": 74260}, {"score": 87, "count": 0, "cumulative": 74260}, {"score": 86, "count": 1, "cumulative": 74261}, {"score": 85, "count": 1, "cumulative": 74262}, {"score": 84, "count": 0, "cumulative": 74262}, {"score": 83, "count": 0, "cumulative": 74262}, {"score": 82, "count": 1, "cumulative": 74263}, {"score": 81, "count": 0, "cumulative": 74263}, {"score": 80, "count": 1, "cumulative": 74264}, {"score": 79, "count": 1, "cumulative": 74265}, {"score": 78, "count": 0, "cumulative": 74265}, {"score": 77, "count": 2, "cumulative": 74267}, {"score": 76, "count": 1, "cumulative": 74268}, {"score": 75, "count": 0, "cumulative": 74268}, {"score": 74, "count": 0, "cumulative": 74268}, {"score": 73, "count": 0, "cumulative": 74268}, {"score": 72, "count": 0, "cumulative": 74268}, {"score": 71, "count": 0, "cumulative": 74268}, {"score": 70, "count": 1, "cumulative": 74269}, {"score": 69, "count": 0, "cumulative": 74269}, {"score": 68, "count": 0, "cumulative": 74269}, {"score": 67, "count": 0, "cumulative": 74269}, {"score": 66, "count": 0, "cumulative": 74269}, {"score": 65, "count": 1, "cumulative": 74270}, {"score": 64, "count": 0, "cumulative": 74270}, {"score": 63, "count": 0, "cumulative": 74270}, {"score": 62, "count": 0, "cumulative": 74270}, {"score": 61, "count": 0, "cumulative": 74270}, {"score": 60, "count": 0, "cumulative": 74270}, {"score": 59, "count": 0, "cumulative": 74270}, {"score": 58, "count": 0, "cumulative": 74270}, {"score": 57, "count": 0, "cumulative": 74270}, {"score": 56, "count": 2, "cumulative": 74272}, {"score": 55, "count": 1, "cumulative": 74273}, {"score": 54, "count": 0, "cumulative": 74273}, {"score": 53, "count": 0, "cumulative": 74273}, {"score": 52, "count": 1, "cumulative": 74274}, {"score": 51, "count": 1, "cumulative": 74275}, {"score": 50, "count": 1, "cumulative": 74276}, {"score": 49, "count": 0, "cumulative": 74276}, {"score": 48, "count": 0, "cumulative": 74276}, {"score": 47, "count": 1, "cumulative": 74277}, {"score": 46, "count": 0, "cumulative": 74277}, {"score": 45, "count": 0, "cumulative": 74277}, {"score": 44, "count": 0, "cumulative": 74277}, {"score": 43, "count": 1, "cumulative": 74278}, {"score": 42, "count": 0, "cumulative": 74278}, {"score": 41, "count": 0, "cumulative": 74278}, {"score": 40, "count": 1, "cumulative": 74279}, {"score": 39, "count": 0, "cumulative": 74279}, {"score": 38, "count": 0, "cumulative": 74279}, {"score": 37, "count": 0, "cumulative": 74279}, {"score": 36, "count": 0, "cumulative": 74279}, {"score": 35, "count": 0, "cumulative": 74279}, {"score": 34, "count": 2, "cumulative": 74281}, {"score": 33, "count": 1, "cumulative": 74282}, {"score": 32, "count": 1, "cumulative": 74283}, {"score": 31, "count": 1, "cumulative": 74284}, {"score": 30, "count": 1, "cumulative": 74285}, {"score": 29, "count": 0, "cumulative": 74285}, {"score": 28, "count": 0, "cumulative": 74285}, {"score": 27, "count": 0, "cumulative": 74285}, {"score": 26, "count": 1, "cumulative": 74286}, {"score": 25, "count": 1, "cumulative": 74287}, {"score": 24, "count": 1, "cumulative": 74288}, {"score": 23, "count": 0, "cumulative": 74288}, {"score": 22, "count": 0, "cumulative": 74288}, {"score": 21, "count": 1, "cumulative": 74289}, {"score": 20, "count": 1, "cumulative": 74290}, {"score": 19, "count": 0, "cumulative": 74290}, {"score": 18, "count": 0, "cumulative": 74290}, {"score": 17, "count": 0, "cumulative": 74290}, {"score": 16, "count": 2, "cumulative": 74292}, {"score": 15, "count": 0, "cumulative": 74292}, {"score": 14, "count": 0, "cumulative": 74292}, {"score": 13, "count": 0, "cumulative": 74292}, {"score": 12, "count": 0, "cumulative": 74292}, {"score": 11, "count": 0, "cumulative": 74292}, {"score": 10, "count": 0, "cumulative": 74292}, {"score": 9, "count": 1, "cumulative": 74293}, {"score": 8, "count": 0, "cumulative": 74293}, {"score": 7, "count": 1, "cumulative": 74294}, {"score": 6, "count": 0, "cumulative": 74294}, {"score": 5, "count": 2, "cumulative": 74296}, {"score": 4, "count": 0, "cumulative": 74296}, {"score": 3, "count": 0, "cumulative": 74296}, {"score": 2, "count": 0, "cumulative": 74296}, {"score": 1, "count": 1, "cumulative": 74297}, {"score": 0, "count": 1254, "cumulative": 75551}]}
|
|
1
|
+
{"province": "jilin", "province_name": "吉林", "year": 2026, "track": "physics", "track_cn": "物理类", "source": "吉林省教育考试院 官方PDF《2026年吉林省普通高校招生考试物理-普通1分段表(含照顾分)》(经 eol.cn 入口页发现,pdftotext 文本层提取)", "source_url": "https://www.jleea.com.cn/u/cms/www/2026/06/25/2069968279602028546.pdf", "note": "源自吉林省教育考试院官方PDF《2026年吉林省普通高校招生考试物理-普通1分段表(含照顾分)》(https://www.jleea.com.cn/u/cms/www/2026/06/25/2069968279602028546.pdf),经eol.cn入口页(https://gaokao.eol.cn/ji_lin/dongtai/202606/t20260625_2749028.shtml)发现。PDF含文本层(非扫描),用pdftotext -layout提取tens×ones累计矩阵,按score=tens+ones逐分还原为[分数,累计人数]两列表,cumulative逐格取自官方PDF原值。顶部707=12为官方合并段(≥707累计12人),0分行=75551为官方0分/照顾分末段。本科线物理321→累计67422,特控线473→累计31914。;count 由 cumulative(位次) 反推(官方表为累计制/顶部分段合并)", "count": 708, "rows": [{"score": 707, "count": 12, "cumulative": 12}, {"score": 706, "count": 0, "cumulative": 12}, {"score": 705, "count": 2, "cumulative": 14}, {"score": 704, "count": 1, "cumulative": 15}, {"score": 703, "count": 3, "cumulative": 18}, {"score": 702, "count": 6, "cumulative": 24}, {"score": 701, "count": 6, "cumulative": 30}, {"score": 700, "count": 2, "cumulative": 32}, {"score": 699, "count": 6, "cumulative": 38}, {"score": 698, "count": 4, "cumulative": 42}, {"score": 697, "count": 4, "cumulative": 46}, {"score": 696, "count": 7, "cumulative": 53}, {"score": 695, "count": 4, "cumulative": 57}, {"score": 694, "count": 13, "cumulative": 70}, {"score": 693, "count": 9, "cumulative": 79}, {"score": 692, "count": 7, "cumulative": 86}, {"score": 691, "count": 15, "cumulative": 101}, {"score": 690, "count": 7, "cumulative": 108}, {"score": 689, "count": 12, "cumulative": 120}, {"score": 688, "count": 13, "cumulative": 133}, {"score": 687, "count": 16, "cumulative": 149}, {"score": 686, "count": 13, "cumulative": 162}, {"score": 685, "count": 21, "cumulative": 183}, {"score": 684, "count": 14, "cumulative": 197}, {"score": 683, "count": 10, "cumulative": 207}, {"score": 682, "count": 23, "cumulative": 230}, {"score": 681, "count": 15, "cumulative": 245}, {"score": 680, "count": 23, "cumulative": 268}, {"score": 679, "count": 21, "cumulative": 289}, {"score": 678, "count": 21, "cumulative": 310}, {"score": 677, "count": 21, "cumulative": 331}, {"score": 676, "count": 19, "cumulative": 350}, {"score": 675, "count": 19, "cumulative": 369}, {"score": 674, "count": 15, "cumulative": 384}, {"score": 673, "count": 21, "cumulative": 405}, {"score": 672, "count": 19, "cumulative": 424}, {"score": 671, "count": 25, "cumulative": 449}, {"score": 670, "count": 31, "cumulative": 480}, {"score": 669, "count": 30, "cumulative": 510}, {"score": 668, "count": 41, "cumulative": 551}, {"score": 667, "count": 22, "cumulative": 573}, {"score": 666, "count": 32, "cumulative": 605}, {"score": 665, "count": 33, "cumulative": 638}, {"score": 664, "count": 34, "cumulative": 672}, {"score": 663, "count": 31, "cumulative": 703}, {"score": 662, "count": 34, "cumulative": 737}, {"score": 661, "count": 45, "cumulative": 782}, {"score": 660, "count": 40, "cumulative": 822}, {"score": 659, "count": 45, "cumulative": 867}, {"score": 658, "count": 53, "cumulative": 920}, {"score": 657, "count": 41, "cumulative": 961}, {"score": 656, "count": 56, "cumulative": 1017}, {"score": 655, "count": 50, "cumulative": 1067}, {"score": 654, "count": 45, "cumulative": 1112}, {"score": 653, "count": 57, "cumulative": 1169}, {"score": 652, "count": 40, "cumulative": 1209}, {"score": 651, "count": 47, "cumulative": 1256}, {"score": 650, "count": 70, "cumulative": 1326}, {"score": 649, "count": 52, "cumulative": 1378}, {"score": 648, "count": 51, "cumulative": 1429}, {"score": 647, "count": 70, "cumulative": 1499}, {"score": 646, "count": 57, "cumulative": 1556}, {"score": 645, "count": 80, "cumulative": 1636}, {"score": 644, "count": 55, "cumulative": 1691}, {"score": 643, "count": 75, "cumulative": 1766}, {"score": 642, "count": 74, "cumulative": 1840}, {"score": 641, "count": 65, "cumulative": 1905}, {"score": 640, "count": 77, "cumulative": 1982}, {"score": 639, "count": 81, "cumulative": 2063}, {"score": 638, "count": 84, "cumulative": 2147}, {"score": 637, "count": 96, "cumulative": 2243}, {"score": 636, "count": 82, "cumulative": 2325}, {"score": 635, "count": 83, "cumulative": 2408}, {"score": 634, "count": 83, "cumulative": 2491}, {"score": 633, "count": 83, "cumulative": 2574}, {"score": 632, "count": 81, "cumulative": 2655}, {"score": 631, "count": 89, "cumulative": 2744}, {"score": 630, "count": 109, "cumulative": 2853}, {"score": 629, "count": 86, "cumulative": 2939}, {"score": 628, "count": 88, "cumulative": 3027}, {"score": 627, "count": 94, "cumulative": 3121}, {"score": 626, "count": 84, "cumulative": 3205}, {"score": 625, "count": 84, "cumulative": 3289}, {"score": 624, "count": 98, "cumulative": 3387}, {"score": 623, "count": 105, "cumulative": 3492}, {"score": 622, "count": 106, "cumulative": 3598}, {"score": 621, "count": 89, "cumulative": 3687}, {"score": 620, "count": 100, "cumulative": 3787}, {"score": 619, "count": 103, "cumulative": 3890}, {"score": 618, "count": 87, "cumulative": 3977}, {"score": 617, "count": 103, "cumulative": 4080}, {"score": 616, "count": 99, "cumulative": 4179}, {"score": 615, "count": 92, "cumulative": 4271}, {"score": 614, "count": 110, "cumulative": 4381}, {"score": 613, "count": 109, "cumulative": 4490}, {"score": 612, "count": 113, "cumulative": 4603}, {"score": 611, "count": 99, "cumulative": 4702}, {"score": 610, "count": 123, "cumulative": 4825}, {"score": 609, "count": 114, "cumulative": 4939}, {"score": 608, "count": 134, "cumulative": 5073}, {"score": 607, "count": 134, "cumulative": 5207}, {"score": 606, "count": 130, "cumulative": 5337}, {"score": 605, "count": 136, "cumulative": 5473}, {"score": 604, "count": 127, "cumulative": 5600}, {"score": 603, "count": 118, "cumulative": 5718}, {"score": 602, "count": 127, "cumulative": 5845}, {"score": 601, "count": 115, "cumulative": 5960}, {"score": 600, "count": 132, "cumulative": 6092}, {"score": 599, "count": 131, "cumulative": 6223}, {"score": 598, "count": 133, "cumulative": 6356}, {"score": 597, "count": 141, "cumulative": 6497}, {"score": 596, "count": 152, "cumulative": 6649}, {"score": 595, "count": 126, "cumulative": 6775}, {"score": 594, "count": 111, "cumulative": 6886}, {"score": 593, "count": 144, "cumulative": 7030}, {"score": 592, "count": 144, "cumulative": 7174}, {"score": 591, "count": 138, "cumulative": 7312}, {"score": 590, "count": 150, "cumulative": 7462}, {"score": 589, "count": 167, "cumulative": 7629}, {"score": 588, "count": 151, "cumulative": 7780}, {"score": 587, "count": 130, "cumulative": 7910}, {"score": 586, "count": 139, "cumulative": 8049}, {"score": 585, "count": 148, "cumulative": 8197}, {"score": 584, "count": 134, "cumulative": 8331}, {"score": 583, "count": 154, "cumulative": 8485}, {"score": 582, "count": 148, "cumulative": 8633}, {"score": 581, "count": 135, "cumulative": 8768}, {"score": 580, "count": 145, "cumulative": 8913}, {"score": 579, "count": 166, "cumulative": 9079}, {"score": 578, "count": 153, "cumulative": 9232}, {"score": 577, "count": 155, "cumulative": 9387}, {"score": 576, "count": 168, "cumulative": 9555}, {"score": 575, "count": 151, "cumulative": 9706}, {"score": 574, "count": 155, "cumulative": 9861}, {"score": 573, "count": 157, "cumulative": 10018}, {"score": 572, "count": 152, "cumulative": 10170}, {"score": 571, "count": 160, "cumulative": 10330}, {"score": 570, "count": 166, "cumulative": 10496}, {"score": 569, "count": 163, "cumulative": 10659}, {"score": 568, "count": 168, "cumulative": 10827}, {"score": 567, "count": 168, "cumulative": 10995}, {"score": 566, "count": 159, "cumulative": 11154}, {"score": 565, "count": 177, "cumulative": 11331}, {"score": 564, "count": 187, "cumulative": 11518}, {"score": 563, "count": 181, "cumulative": 11699}, {"score": 562, "count": 187, "cumulative": 11886}, {"score": 561, "count": 178, "cumulative": 12064}, {"score": 560, "count": 191, "cumulative": 12255}, {"score": 559, "count": 175, "cumulative": 12430}, {"score": 558, "count": 204, "cumulative": 12634}, {"score": 557, "count": 183, "cumulative": 12817}, {"score": 556, "count": 172, "cumulative": 12989}, {"score": 555, "count": 170, "cumulative": 13159}, {"score": 554, "count": 186, "cumulative": 13345}, {"score": 553, "count": 221, "cumulative": 13566}, {"score": 552, "count": 190, "cumulative": 13756}, {"score": 551, "count": 178, "cumulative": 13934}, {"score": 550, "count": 173, "cumulative": 14107}, {"score": 549, "count": 166, "cumulative": 14273}, {"score": 548, "count": 213, "cumulative": 14486}, {"score": 547, "count": 195, "cumulative": 14681}, {"score": 546, "count": 210, "cumulative": 14891}, {"score": 545, "count": 212, "cumulative": 15103}, {"score": 544, "count": 217, "cumulative": 15320}, {"score": 543, "count": 207, "cumulative": 15527}, {"score": 542, "count": 172, "cumulative": 15699}, {"score": 541, "count": 216, "cumulative": 15915}, {"score": 540, "count": 246, "cumulative": 16161}, {"score": 539, "count": 214, "cumulative": 16375}, {"score": 538, "count": 227, "cumulative": 16602}, {"score": 537, "count": 246, "cumulative": 16848}, {"score": 536, "count": 202, "cumulative": 17050}, {"score": 535, "count": 237, "cumulative": 17287}, {"score": 534, "count": 225, "cumulative": 17512}, {"score": 533, "count": 206, "cumulative": 17718}, {"score": 532, "count": 221, "cumulative": 17939}, {"score": 531, "count": 211, "cumulative": 18150}, {"score": 530, "count": 220, "cumulative": 18370}, {"score": 529, "count": 217, "cumulative": 18587}, {"score": 528, "count": 205, "cumulative": 18792}, {"score": 527, "count": 213, "cumulative": 19005}, {"score": 526, "count": 213, "cumulative": 19218}, {"score": 525, "count": 208, "cumulative": 19426}, {"score": 524, "count": 201, "cumulative": 19627}, {"score": 523, "count": 234, "cumulative": 19861}, {"score": 522, "count": 224, "cumulative": 20085}, {"score": 521, "count": 209, "cumulative": 20294}, {"score": 520, "count": 225, "cumulative": 20519}, {"score": 519, "count": 222, "cumulative": 20741}, {"score": 518, "count": 228, "cumulative": 20969}, {"score": 517, "count": 205, "cumulative": 21174}, {"score": 516, "count": 207, "cumulative": 21381}, {"score": 515, "count": 234, "cumulative": 21615}, {"score": 514, "count": 242, "cumulative": 21857}, {"score": 513, "count": 245, "cumulative": 22102}, {"score": 512, "count": 269, "cumulative": 22371}, {"score": 511, "count": 265, "cumulative": 22636}, {"score": 510, "count": 212, "cumulative": 22848}, {"score": 509, "count": 242, "cumulative": 23090}, {"score": 508, "count": 230, "cumulative": 23320}, {"score": 507, "count": 259, "cumulative": 23579}, {"score": 506, "count": 262, "cumulative": 23841}, {"score": 505, "count": 215, "cumulative": 24056}, {"score": 504, "count": 221, "cumulative": 24277}, {"score": 503, "count": 239, "cumulative": 24516}, {"score": 502, "count": 251, "cumulative": 24767}, {"score": 501, "count": 223, "cumulative": 24990}, {"score": 500, "count": 274, "cumulative": 25264}, {"score": 499, "count": 236, "cumulative": 25500}, {"score": 498, "count": 240, "cumulative": 25740}, {"score": 497, "count": 239, "cumulative": 25979}, {"score": 496, "count": 214, "cumulative": 26193}, {"score": 495, "count": 204, "cumulative": 26397}, {"score": 494, "count": 243, "cumulative": 26640}, {"score": 493, "count": 226, "cumulative": 26866}, {"score": 492, "count": 262, "cumulative": 27128}, {"score": 491, "count": 241, "cumulative": 27369}, {"score": 490, "count": 242, "cumulative": 27611}, {"score": 489, "count": 251, "cumulative": 27862}, {"score": 488, "count": 225, "cumulative": 28087}, {"score": 487, "count": 287, "cumulative": 28374}, {"score": 486, "count": 245, "cumulative": 28619}, {"score": 485, "count": 242, "cumulative": 28861}, {"score": 484, "count": 247, "cumulative": 29108}, {"score": 483, "count": 277, "cumulative": 29385}, {"score": 482, "count": 254, "cumulative": 29639}, {"score": 481, "count": 221, "cumulative": 29860}, {"score": 480, "count": 248, "cumulative": 30108}, {"score": 479, "count": 260, "cumulative": 30368}, {"score": 478, "count": 263, "cumulative": 30631}, {"score": 477, "count": 250, "cumulative": 30881}, {"score": 476, "count": 211, "cumulative": 31092}, {"score": 475, "count": 268, "cumulative": 31360}, {"score": 474, "count": 284, "cumulative": 31644}, {"score": 473, "count": 270, "cumulative": 31914}, {"score": 472, "count": 256, "cumulative": 32170}, {"score": 471, "count": 222, "cumulative": 32392}, {"score": 470, "count": 235, "cumulative": 32627}, {"score": 469, "count": 255, "cumulative": 32882}, {"score": 468, "count": 283, "cumulative": 33165}, {"score": 467, "count": 264, "cumulative": 33429}, {"score": 466, "count": 268, "cumulative": 33697}, {"score": 465, "count": 265, "cumulative": 33962}, {"score": 464, "count": 257, "cumulative": 34219}, {"score": 463, "count": 259, "cumulative": 34478}, {"score": 462, "count": 272, "cumulative": 34750}, {"score": 461, "count": 265, "cumulative": 35015}, {"score": 460, "count": 276, "cumulative": 35291}, {"score": 459, "count": 249, "cumulative": 35540}, {"score": 458, "count": 265, "cumulative": 35805}, {"score": 457, "count": 265, "cumulative": 36070}, {"score": 456, "count": 267, "cumulative": 36337}, {"score": 455, "count": 270, "cumulative": 36607}, {"score": 454, "count": 260, "cumulative": 36867}, {"score": 453, "count": 276, "cumulative": 37143}, {"score": 452, "count": 280, "cumulative": 37423}, {"score": 451, "count": 241, "cumulative": 37664}, {"score": 450, "count": 283, "cumulative": 37947}, {"score": 449, "count": 238, "cumulative": 38185}, {"score": 448, "count": 250, "cumulative": 38435}, {"score": 447, "count": 291, "cumulative": 38726}, {"score": 446, "count": 261, "cumulative": 38987}, {"score": 445, "count": 288, "cumulative": 39275}, {"score": 444, "count": 268, "cumulative": 39543}, {"score": 443, "count": 248, "cumulative": 39791}, {"score": 442, "count": 285, "cumulative": 40076}, {"score": 441, "count": 245, "cumulative": 40321}, {"score": 440, "count": 305, "cumulative": 40626}, {"score": 439, "count": 283, "cumulative": 40909}, {"score": 438, "count": 275, "cumulative": 41184}, {"score": 437, "count": 283, "cumulative": 41467}, {"score": 436, "count": 278, "cumulative": 41745}, {"score": 435, "count": 277, "cumulative": 42022}, {"score": 434, "count": 294, "cumulative": 42316}, {"score": 433, "count": 267, "cumulative": 42583}, {"score": 432, "count": 266, "cumulative": 42849}, {"score": 431, "count": 281, "cumulative": 43130}, {"score": 430, "count": 267, "cumulative": 43397}, {"score": 429, "count": 271, "cumulative": 43668}, {"score": 428, "count": 285, "cumulative": 43953}, {"score": 427, "count": 281, "cumulative": 44234}, {"score": 426, "count": 236, "cumulative": 44470}, {"score": 425, "count": 256, "cumulative": 44726}, {"score": 424, "count": 270, "cumulative": 44996}, {"score": 423, "count": 262, "cumulative": 45258}, {"score": 422, "count": 273, "cumulative": 45531}, {"score": 421, "count": 275, "cumulative": 45806}, {"score": 420, "count": 281, "cumulative": 46087}, {"score": 419, "count": 251, "cumulative": 46338}, {"score": 418, "count": 281, "cumulative": 46619}, {"score": 417, "count": 274, "cumulative": 46893}, {"score": 416, "count": 291, "cumulative": 47184}, {"score": 415, "count": 264, "cumulative": 47448}, {"score": 414, "count": 255, "cumulative": 47703}, {"score": 413, "count": 250, "cumulative": 47953}, {"score": 412, "count": 252, "cumulative": 48205}, {"score": 411, "count": 273, "cumulative": 48478}, {"score": 410, "count": 277, "cumulative": 48755}, {"score": 409, "count": 268, "cumulative": 49023}, {"score": 408, "count": 263, "cumulative": 49286}, {"score": 407, "count": 255, "cumulative": 49541}, {"score": 406, "count": 247, "cumulative": 49788}, {"score": 405, "count": 266, "cumulative": 50054}, {"score": 404, "count": 270, "cumulative": 50324}, {"score": 403, "count": 232, "cumulative": 50556}, {"score": 402, "count": 275, "cumulative": 50831}, {"score": 401, "count": 271, "cumulative": 51102}, {"score": 400, "count": 242, "cumulative": 51344}, {"score": 399, "count": 220, "cumulative": 51564}, {"score": 398, "count": 270, "cumulative": 51834}, {"score": 397, "count": 246, "cumulative": 52080}, {"score": 396, "count": 255, "cumulative": 52335}, {"score": 395, "count": 221, "cumulative": 52556}, {"score": 394, "count": 240, "cumulative": 52796}, {"score": 393, "count": 293, "cumulative": 53089}, {"score": 392, "count": 223, "cumulative": 53312}, {"score": 391, "count": 222, "cumulative": 53534}, {"score": 390, "count": 270, "cumulative": 53804}, {"score": 389, "count": 248, "cumulative": 54052}, {"score": 388, "count": 252, "cumulative": 54304}, {"score": 387, "count": 259, "cumulative": 54563}, {"score": 386, "count": 255, "cumulative": 54818}, {"score": 385, "count": 250, "cumulative": 55068}, {"score": 384, "count": 240, "cumulative": 55308}, {"score": 383, "count": 249, "cumulative": 55557}, {"score": 382, "count": 251, "cumulative": 55808}, {"score": 381, "count": 246, "cumulative": 56054}, {"score": 380, "count": 225, "cumulative": 56279}, {"score": 379, "count": 257, "cumulative": 56536}, {"score": 378, "count": 256, "cumulative": 56792}, {"score": 377, "count": 213, "cumulative": 57005}, {"score": 376, "count": 219, "cumulative": 57224}, {"score": 375, "count": 237, "cumulative": 57461}, {"score": 374, "count": 236, "cumulative": 57697}, {"score": 373, "count": 209, "cumulative": 57906}, {"score": 372, "count": 251, "cumulative": 58157}, {"score": 371, "count": 223, "cumulative": 58380}, {"score": 370, "count": 189, "cumulative": 58569}, {"score": 369, "count": 213, "cumulative": 58782}, {"score": 368, "count": 209, "cumulative": 58991}, {"score": 367, "count": 196, "cumulative": 59187}, {"score": 366, "count": 222, "cumulative": 59409}, {"score": 365, "count": 211, "cumulative": 59620}, {"score": 364, "count": 204, "cumulative": 59824}, {"score": 363, "count": 218, "cumulative": 60042}, {"score": 362, "count": 213, "cumulative": 60255}, {"score": 361, "count": 209, "cumulative": 60464}, {"score": 360, "count": 200, "cumulative": 60664}, {"score": 359, "count": 196, "cumulative": 60860}, {"score": 358, "count": 197, "cumulative": 61057}, {"score": 357, "count": 202, "cumulative": 61259}, {"score": 356, "count": 224, "cumulative": 61483}, {"score": 355, "count": 203, "cumulative": 61686}, {"score": 354, "count": 191, "cumulative": 61877}, {"score": 353, "count": 191, "cumulative": 62068}, {"score": 352, "count": 184, "cumulative": 62252}, {"score": 351, "count": 174, "cumulative": 62426}, {"score": 350, "count": 199, "cumulative": 62625}, {"score": 349, "count": 196, "cumulative": 62821}, {"score": 348, "count": 189, "cumulative": 63010}, {"score": 347, "count": 216, "cumulative": 63226}, {"score": 346, "count": 173, "cumulative": 63399}, {"score": 345, "count": 172, "cumulative": 63571}, {"score": 344, "count": 178, "cumulative": 63749}, {"score": 343, "count": 200, "cumulative": 63949}, {"score": 342, "count": 161, "cumulative": 64110}, {"score": 341, "count": 180, "cumulative": 64290}, {"score": 340, "count": 146, "cumulative": 64436}, {"score": 339, "count": 160, "cumulative": 64596}, {"score": 338, "count": 167, "cumulative": 64763}, {"score": 337, "count": 188, "cumulative": 64951}, {"score": 336, "count": 173, "cumulative": 65124}, {"score": 335, "count": 165, "cumulative": 65289}, {"score": 334, "count": 156, "cumulative": 65445}, {"score": 333, "count": 161, "cumulative": 65606}, {"score": 332, "count": 156, "cumulative": 65762}, {"score": 331, "count": 155, "cumulative": 65917}, {"score": 330, "count": 154, "cumulative": 66071}, {"score": 329, "count": 174, "cumulative": 66245}, {"score": 328, "count": 150, "cumulative": 66395}, {"score": 327, "count": 171, "cumulative": 66566}, {"score": 326, "count": 162, "cumulative": 66728}, {"score": 325, "count": 144, "cumulative": 66872}, {"score": 324, "count": 161, "cumulative": 67033}, {"score": 323, "count": 143, "cumulative": 67176}, {"score": 322, "count": 137, "cumulative": 67313}, {"score": 321, "count": 109, "cumulative": 67422}, {"score": 320, "count": 146, "cumulative": 67568}, {"score": 319, "count": 136, "cumulative": 67704}, {"score": 318, "count": 138, "cumulative": 67842}, {"score": 317, "count": 143, "cumulative": 67985}, {"score": 316, "count": 127, "cumulative": 68112}, {"score": 315, "count": 134, "cumulative": 68246}, {"score": 314, "count": 129, "cumulative": 68375}, {"score": 313, "count": 112, "cumulative": 68487}, {"score": 312, "count": 121, "cumulative": 68608}, {"score": 311, "count": 111, "cumulative": 68719}, {"score": 310, "count": 120, "cumulative": 68839}, {"score": 309, "count": 106, "cumulative": 68945}, {"score": 308, "count": 127, "cumulative": 69072}, {"score": 307, "count": 107, "cumulative": 69179}, {"score": 306, "count": 114, "cumulative": 69293}, {"score": 305, "count": 110, "cumulative": 69403}, {"score": 304, "count": 109, "cumulative": 69512}, {"score": 303, "count": 109, "cumulative": 69621}, {"score": 302, "count": 97, "cumulative": 69718}, {"score": 301, "count": 87, "cumulative": 69805}, {"score": 300, "count": 96, "cumulative": 69901}, {"score": 299, "count": 89, "cumulative": 69990}, {"score": 298, "count": 113, "cumulative": 70103}, {"score": 297, "count": 101, "cumulative": 70204}, {"score": 296, "count": 108, "cumulative": 70312}, {"score": 295, "count": 84, "cumulative": 70396}, {"score": 294, "count": 87, "cumulative": 70483}, {"score": 293, "count": 91, "cumulative": 70574}, {"score": 292, "count": 81, "cumulative": 70655}, {"score": 291, "count": 82, "cumulative": 70737}, {"score": 290, "count": 76, "cumulative": 70813}, {"score": 289, "count": 90, "cumulative": 70903}, {"score": 288, "count": 80, "cumulative": 70983}, {"score": 287, "count": 74, "cumulative": 71057}, {"score": 286, "count": 69, "cumulative": 71126}, {"score": 285, "count": 75, "cumulative": 71201}, {"score": 284, "count": 72, "cumulative": 71273}, {"score": 283, "count": 92, "cumulative": 71365}, {"score": 282, "count": 66, "cumulative": 71431}, {"score": 281, "count": 79, "cumulative": 71510}, {"score": 280, "count": 60, "cumulative": 71570}, {"score": 279, "count": 58, "cumulative": 71628}, {"score": 278, "count": 60, "cumulative": 71688}, {"score": 277, "count": 64, "cumulative": 71752}, {"score": 276, "count": 62, "cumulative": 71814}, {"score": 275, "count": 62, "cumulative": 71876}, {"score": 274, "count": 56, "cumulative": 71932}, {"score": 273, "count": 59, "cumulative": 71991}, {"score": 272, "count": 48, "cumulative": 72039}, {"score": 271, "count": 54, "cumulative": 72093}, {"score": 270, "count": 67, "cumulative": 72160}, {"score": 269, "count": 51, "cumulative": 72211}, {"score": 268, "count": 57, "cumulative": 72268}, {"score": 267, "count": 41, "cumulative": 72309}, {"score": 266, "count": 43, "cumulative": 72352}, {"score": 265, "count": 47, "cumulative": 72399}, {"score": 264, "count": 61, "cumulative": 72460}, {"score": 263, "count": 44, "cumulative": 72504}, {"score": 262, "count": 51, "cumulative": 72555}, {"score": 261, "count": 60, "cumulative": 72615}, {"score": 260, "count": 46, "cumulative": 72661}, {"score": 259, "count": 47, "cumulative": 72708}, {"score": 258, "count": 46, "cumulative": 72754}, {"score": 257, "count": 34, "cumulative": 72788}, {"score": 256, "count": 43, "cumulative": 72831}, {"score": 255, "count": 36, "cumulative": 72867}, {"score": 254, "count": 41, "cumulative": 72908}, {"score": 253, "count": 36, "cumulative": 72944}, {"score": 252, "count": 40, "cumulative": 72984}, {"score": 251, "count": 45, "cumulative": 73029}, {"score": 250, "count": 40, "cumulative": 73069}, {"score": 249, "count": 28, "cumulative": 73097}, {"score": 248, "count": 32, "cumulative": 73129}, {"score": 247, "count": 44, "cumulative": 73173}, {"score": 246, "count": 36, "cumulative": 73209}, {"score": 245, "count": 30, "cumulative": 73239}, {"score": 244, "count": 33, "cumulative": 73272}, {"score": 243, "count": 36, "cumulative": 73308}, {"score": 242, "count": 25, "cumulative": 73333}, {"score": 241, "count": 26, "cumulative": 73359}, {"score": 240, "count": 22, "cumulative": 73381}, {"score": 239, "count": 36, "cumulative": 73417}, {"score": 238, "count": 28, "cumulative": 73445}, {"score": 237, "count": 32, "cumulative": 73477}, {"score": 236, "count": 20, "cumulative": 73497}, {"score": 235, "count": 14, "cumulative": 73511}, {"score": 234, "count": 24, "cumulative": 73535}, {"score": 233, "count": 24, "cumulative": 73559}, {"score": 232, "count": 22, "cumulative": 73581}, {"score": 231, "count": 14, "cumulative": 73595}, {"score": 230, "count": 24, "cumulative": 73619}, {"score": 229, "count": 18, "cumulative": 73637}, {"score": 228, "count": 32, "cumulative": 73669}, {"score": 227, "count": 21, "cumulative": 73690}, {"score": 226, "count": 18, "cumulative": 73708}, {"score": 225, "count": 16, "cumulative": 73724}, {"score": 224, "count": 21, "cumulative": 73745}, {"score": 223, "count": 20, "cumulative": 73765}, {"score": 222, "count": 14, "cumulative": 73779}, {"score": 221, "count": 20, "cumulative": 73799}, {"score": 220, "count": 21, "cumulative": 73820}, {"score": 219, "count": 13, "cumulative": 73833}, {"score": 218, "count": 12, "cumulative": 73845}, {"score": 217, "count": 16, "cumulative": 73861}, {"score": 216, "count": 12, "cumulative": 73873}, {"score": 215, "count": 8, "cumulative": 73881}, {"score": 214, "count": 15, "cumulative": 73896}, {"score": 213, "count": 16, "cumulative": 73912}, {"score": 212, "count": 11, "cumulative": 73923}, {"score": 211, "count": 13, "cumulative": 73936}, {"score": 210, "count": 8, "cumulative": 73944}, {"score": 209, "count": 8, "cumulative": 73952}, {"score": 208, "count": 12, "cumulative": 73964}, {"score": 207, "count": 11, "cumulative": 73975}, {"score": 206, "count": 9, "cumulative": 73984}, {"score": 205, "count": 7, "cumulative": 73991}, {"score": 204, "count": 5, "cumulative": 73996}, {"score": 203, "count": 6, "cumulative": 74002}, {"score": 202, "count": 16, "cumulative": 74018}, {"score": 201, "count": 5, "cumulative": 74023}, {"score": 200, "count": 8, "cumulative": 74031}, {"score": 199, "count": 13, "cumulative": 74044}, {"score": 198, "count": 4, "cumulative": 74048}, {"score": 197, "count": 5, "cumulative": 74053}, {"score": 196, "count": 7, "cumulative": 74060}, {"score": 195, "count": 7, "cumulative": 74067}, {"score": 194, "count": 0, "cumulative": 74067}, {"score": 193, "count": 4, "cumulative": 74071}, {"score": 192, "count": 2, "cumulative": 74073}, {"score": 191, "count": 7, "cumulative": 74080}, {"score": 190, "count": 1, "cumulative": 74081}, {"score": 189, "count": 7, "cumulative": 74088}, {"score": 188, "count": 4, "cumulative": 74092}, {"score": 187, "count": 6, "cumulative": 74098}, {"score": 186, "count": 4, "cumulative": 74102}, {"score": 185, "count": 4, "cumulative": 74106}, {"score": 184, "count": 2, "cumulative": 74108}, {"score": 183, "count": 5, "cumulative": 74113}, {"score": 182, "count": 0, "cumulative": 74113}, {"score": 181, "count": 3, "cumulative": 74116}, {"score": 180, "count": 4, "cumulative": 74120}, {"score": 179, "count": 0, "cumulative": 74120}, {"score": 178, "count": 3, "cumulative": 74123}, {"score": 177, "count": 4, "cumulative": 74127}, {"score": 176, "count": 4, "cumulative": 74131}, {"score": 175, "count": 9, "cumulative": 74140}, {"score": 174, "count": 3, "cumulative": 74143}, {"score": 173, "count": 9, "cumulative": 74152}, {"score": 172, "count": 3, "cumulative": 74155}, {"score": 171, "count": 0, "cumulative": 74155}, {"score": 170, "count": 1, "cumulative": 74156}, {"score": 169, "count": 1, "cumulative": 74157}, {"score": 168, "count": 4, "cumulative": 74161}, {"score": 167, "count": 2, "cumulative": 74163}, {"score": 166, "count": 3, "cumulative": 74166}, {"score": 165, "count": 3, "cumulative": 74169}, {"score": 164, "count": 4, "cumulative": 74173}, {"score": 163, "count": 2, "cumulative": 74175}, {"score": 162, "count": 3, "cumulative": 74178}, {"score": 161, "count": 2, "cumulative": 74180}, {"score": 160, "count": 1, "cumulative": 74181}, {"score": 159, "count": 2, "cumulative": 74183}, {"score": 158, "count": 2, "cumulative": 74185}, {"score": 157, "count": 1, "cumulative": 74186}, {"score": 156, "count": 4, "cumulative": 74190}, {"score": 155, "count": 0, "cumulative": 74190}, {"score": 154, "count": 3, "cumulative": 74193}, {"score": 153, "count": 3, "cumulative": 74196}, {"score": 152, "count": 1, "cumulative": 74197}, {"score": 151, "count": 2, "cumulative": 74199}, {"score": 150, "count": 3, "cumulative": 74202}, {"score": 149, "count": 2, "cumulative": 74204}, {"score": 148, "count": 0, "cumulative": 74204}, {"score": 147, "count": 1, "cumulative": 74205}, {"score": 146, "count": 1, "cumulative": 74206}, {"score": 145, "count": 2, "cumulative": 74208}, {"score": 144, "count": 2, "cumulative": 74210}, {"score": 143, "count": 3, "cumulative": 74213}, {"score": 142, "count": 3, "cumulative": 74216}, {"score": 141, "count": 2, "cumulative": 74218}, {"score": 140, "count": 1, "cumulative": 74219}, {"score": 139, "count": 1, "cumulative": 74220}, {"score": 138, "count": 0, "cumulative": 74220}, {"score": 137, "count": 1, "cumulative": 74221}, {"score": 136, "count": 3, "cumulative": 74224}, {"score": 135, "count": 3, "cumulative": 74227}, {"score": 134, "count": 0, "cumulative": 74227}, {"score": 133, "count": 0, "cumulative": 74227}, {"score": 132, "count": 1, "cumulative": 74228}, {"score": 131, "count": 1, "cumulative": 74229}, {"score": 130, "count": 1, "cumulative": 74230}, {"score": 129, "count": 1, "cumulative": 74231}, {"score": 128, "count": 0, "cumulative": 74231}, {"score": 127, "count": 0, "cumulative": 74231}, {"score": 126, "count": 0, "cumulative": 74231}, {"score": 125, "count": 1, "cumulative": 74232}, {"score": 124, "count": 0, "cumulative": 74232}, {"score": 123, "count": 1, "cumulative": 74233}, {"score": 122, "count": 1, "cumulative": 74234}, {"score": 121, "count": 1, "cumulative": 74235}, {"score": 120, "count": 0, "cumulative": 74235}, {"score": 119, "count": 0, "cumulative": 74235}, {"score": 118, "count": 1, "cumulative": 74236}, {"score": 117, "count": 1, "cumulative": 74237}, {"score": 116, "count": 1, "cumulative": 74238}, {"score": 115, "count": 0, "cumulative": 74238}, {"score": 114, "count": 1, "cumulative": 74239}, {"score": 113, "count": 3, "cumulative": 74242}, {"score": 112, "count": 1, "cumulative": 74243}, {"score": 111, "count": 1, "cumulative": 74244}, {"score": 110, "count": 1, "cumulative": 74245}, {"score": 109, "count": 1, "cumulative": 74246}, {"score": 108, "count": 1, "cumulative": 74247}, {"score": 107, "count": 0, "cumulative": 74247}, {"score": 106, "count": 1, "cumulative": 74248}, {"score": 105, "count": 0, "cumulative": 74248}, {"score": 104, "count": 3, "cumulative": 74251}, {"score": 103, "count": 2, "cumulative": 74253}, {"score": 102, "count": 0, "cumulative": 74253}, {"score": 101, "count": 0, "cumulative": 74253}, {"score": 100, "count": 0, "cumulative": 74253}, {"score": 99, "count": 1, "cumulative": 74254}, {"score": 98, "count": 0, "cumulative": 74254}, {"score": 97, "count": 0, "cumulative": 74254}, {"score": 96, "count": 0, "cumulative": 74254}, {"score": 95, "count": 1, "cumulative": 74255}, {"score": 94, "count": 1, "cumulative": 74256}, {"score": 93, "count": 0, "cumulative": 74256}, {"score": 92, "count": 0, "cumulative": 74256}, {"score": 91, "count": 1, "cumulative": 74257}, {"score": 90, "count": 2, "cumulative": 74259}, {"score": 89, "count": 1, "cumulative": 74260}, {"score": 88, "count": 0, "cumulative": 74260}, {"score": 87, "count": 0, "cumulative": 74260}, {"score": 86, "count": 1, "cumulative": 74261}, {"score": 85, "count": 1, "cumulative": 74262}, {"score": 84, "count": 0, "cumulative": 74262}, {"score": 83, "count": 0, "cumulative": 74262}, {"score": 82, "count": 1, "cumulative": 74263}, {"score": 81, "count": 0, "cumulative": 74263}, {"score": 80, "count": 1, "cumulative": 74264}, {"score": 79, "count": 1, "cumulative": 74265}, {"score": 78, "count": 0, "cumulative": 74265}, {"score": 77, "count": 2, "cumulative": 74267}, {"score": 76, "count": 1, "cumulative": 74268}, {"score": 75, "count": 0, "cumulative": 74268}, {"score": 74, "count": 0, "cumulative": 74268}, {"score": 73, "count": 0, "cumulative": 74268}, {"score": 72, "count": 0, "cumulative": 74268}, {"score": 71, "count": 0, "cumulative": 74268}, {"score": 70, "count": 1, "cumulative": 74269}, {"score": 69, "count": 0, "cumulative": 74269}, {"score": 68, "count": 0, "cumulative": 74269}, {"score": 67, "count": 0, "cumulative": 74269}, {"score": 66, "count": 0, "cumulative": 74269}, {"score": 65, "count": 1, "cumulative": 74270}, {"score": 64, "count": 0, "cumulative": 74270}, {"score": 63, "count": 0, "cumulative": 74270}, {"score": 62, "count": 0, "cumulative": 74270}, {"score": 61, "count": 0, "cumulative": 74270}, {"score": 60, "count": 0, "cumulative": 74270}, {"score": 59, "count": 0, "cumulative": 74270}, {"score": 58, "count": 0, "cumulative": 74270}, {"score": 57, "count": 0, "cumulative": 74270}, {"score": 56, "count": 2, "cumulative": 74272}, {"score": 55, "count": 1, "cumulative": 74273}, {"score": 54, "count": 0, "cumulative": 74273}, {"score": 53, "count": 0, "cumulative": 74273}, {"score": 52, "count": 1, "cumulative": 74274}, {"score": 51, "count": 1, "cumulative": 74275}, {"score": 50, "count": 1, "cumulative": 74276}, {"score": 49, "count": 0, "cumulative": 74276}, {"score": 48, "count": 0, "cumulative": 74276}, {"score": 47, "count": 1, "cumulative": 74277}, {"score": 46, "count": 0, "cumulative": 74277}, {"score": 45, "count": 0, "cumulative": 74277}, {"score": 44, "count": 0, "cumulative": 74277}, {"score": 43, "count": 1, "cumulative": 74278}, {"score": 42, "count": 0, "cumulative": 74278}, {"score": 41, "count": 0, "cumulative": 74278}, {"score": 40, "count": 1, "cumulative": 74279}, {"score": 39, "count": 0, "cumulative": 74279}, {"score": 38, "count": 0, "cumulative": 74279}, {"score": 37, "count": 0, "cumulative": 74279}, {"score": 36, "count": 0, "cumulative": 74279}, {"score": 35, "count": 0, "cumulative": 74279}, {"score": 34, "count": 2, "cumulative": 74281}, {"score": 33, "count": 1, "cumulative": 74282}, {"score": 32, "count": 1, "cumulative": 74283}, {"score": 31, "count": 1, "cumulative": 74284}, {"score": 30, "count": 1, "cumulative": 74285}, {"score": 29, "count": 0, "cumulative": 74285}, {"score": 28, "count": 0, "cumulative": 74285}, {"score": 27, "count": 0, "cumulative": 74285}, {"score": 26, "count": 1, "cumulative": 74286}, {"score": 25, "count": 1, "cumulative": 74287}, {"score": 24, "count": 1, "cumulative": 74288}, {"score": 23, "count": 0, "cumulative": 74288}, {"score": 22, "count": 0, "cumulative": 74288}, {"score": 21, "count": 1, "cumulative": 74289}, {"score": 20, "count": 1, "cumulative": 74290}, {"score": 19, "count": 0, "cumulative": 74290}, {"score": 18, "count": 0, "cumulative": 74290}, {"score": 17, "count": 0, "cumulative": 74290}, {"score": 16, "count": 2, "cumulative": 74292}, {"score": 15, "count": 0, "cumulative": 74292}, {"score": 14, "count": 0, "cumulative": 74292}, {"score": 13, "count": 0, "cumulative": 74292}, {"score": 12, "count": 0, "cumulative": 74292}, {"score": 11, "count": 0, "cumulative": 74292}, {"score": 10, "count": 0, "cumulative": 74292}, {"score": 9, "count": 1, "cumulative": 74293}, {"score": 8, "count": 0, "cumulative": 74293}, {"score": 7, "count": 1, "cumulative": 74294}, {"score": 6, "count": 0, "cumulative": 74294}, {"score": 5, "count": 2, "cumulative": 74296}, {"score": 4, "count": 0, "cumulative": 74296}, {"score": 3, "count": 0, "cumulative": 74296}, {"score": 2, "count": 0, "cumulative": 74296}, {"score": 1, "count": 1, "cumulative": 74297}, {"score": 0, "count": 1254, "cumulative": 75551}]}
|
package/dist/gaokao-cn.d.ts
CHANGED
|
@@ -128,9 +128,26 @@ export type AdmissionScoreResponse = {
|
|
|
128
128
|
item: AdmissionScoreItem[];
|
|
129
129
|
};
|
|
130
130
|
};
|
|
131
|
+
export declare class GaokaoDynamicError extends Error {
|
|
132
|
+
uri: string;
|
|
133
|
+
apiCode: string;
|
|
134
|
+
apiMessage: string;
|
|
135
|
+
constructor(uri: string, apiCode: string, apiMessage: string);
|
|
136
|
+
}
|
|
131
137
|
export declare function getSchoolInfo(schoolId: number | string): Promise<SchoolInfo>;
|
|
132
|
-
export
|
|
133
|
-
|
|
138
|
+
export type FetchListOpts = {
|
|
139
|
+
noCache?: boolean;
|
|
140
|
+
};
|
|
141
|
+
export declare function getAdmissionPlan(schoolId: number | string, year: number, provinceId: number | string, opts?: FetchListOpts): Promise<AdmissionPlanItem[]>;
|
|
142
|
+
export declare function getAdmissionScores(schoolId: number | string, year: number, provinceId: number | string, opts?: FetchListOpts): Promise<AdmissionScoreItem[]>;
|
|
143
|
+
export declare function checkSourceHealth(): Promise<{
|
|
144
|
+
ok: boolean;
|
|
145
|
+
checks: Array<{
|
|
146
|
+
name: string;
|
|
147
|
+
ok: boolean;
|
|
148
|
+
detail: string;
|
|
149
|
+
}>;
|
|
150
|
+
}>;
|
|
134
151
|
export declare function extractHistoricalScores(info: SchoolInfo, provinceId: number | string): Array<{
|
|
135
152
|
year: number;
|
|
136
153
|
track: string;
|
package/dist/gaokao-cn.js
CHANGED
|
@@ -232,18 +232,343 @@ function isTransientNetworkError(err) {
|
|
|
232
232
|
// undici surfaces these as TypeError("fetch failed") with a .cause.
|
|
233
233
|
return err.name === "TypeError" && /fetch failed|network|ECONN|ENOTFOUND|EAI_AGAIN|socket/i.test(`${err.message} ${err.cause?.code ?? ""} ${err.cause?.message ?? ""}`);
|
|
234
234
|
}
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// Dynamic API tier — api.zjzw.cn (掌上高考's app/web backend).
|
|
237
|
+
//
|
|
238
|
+
// WHY THIS EXISTS: as of 2026-06 the free static tier retired the per-school
|
|
239
|
+
// admission-plan and admission-score objects. Every
|
|
240
|
+
// static-data.gaokao.cn/www/2.0/schoolspecialplan/{id}/{year}/{prov}.json
|
|
241
|
+
// static-data.gaokao.cn/www/2.0/schoolspecialscore/{id}/{year}/{prov}.json
|
|
242
|
+
// now 404s at the OSS layer ("NoSuchKey"), for ALL years — not just 2026. Only
|
|
243
|
+
// /school/{id}/info.json survived (so the min-score corpus in school-index.json.gz,
|
|
244
|
+
// and therefore recommend/top/paiming, are unaffected). The granular per-major
|
|
245
|
+
// plan & score data moved to the dynamic host below, which:
|
|
246
|
+
// • is UNSIGNED for GET (no signsafe/md5 needed — a version param actually breaks it),
|
|
247
|
+
// • is keyed by local_province_id (the STUDENT's province), NOT the school's,
|
|
248
|
+
// • paginates via size/page and reports the total in data.numFound,
|
|
249
|
+
// • rate-limits aggressively → we serialize requests through a min-gap throttle.
|
|
250
|
+
//
|
|
251
|
+
// The item shapes come back field-compatible with the old static ones, modulo a
|
|
252
|
+
// few renames (score uses sp_scode not spcode; no top-level track `type`; num is
|
|
253
|
+
// a string) which mapPlanItem/mapScoreItem below normalize back to our types.
|
|
254
|
+
const DYNAMIC_BASE = "https://api.zjzw.cn/web/api/";
|
|
255
|
+
const DYNAMIC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36";
|
|
256
|
+
const PLAN_URI = "apidata/api/gkv3/plan/school";
|
|
257
|
+
const SCORE_URI = "apidata/api/gk/score/special";
|
|
258
|
+
const DYNAMIC_PAGE_SIZE = 50;
|
|
259
|
+
// Cap on pages fetched per (school, year, province) — a backstop against a
|
|
260
|
+
// runaway numFound. 50 pages × 50 = 2500 majors, far above any real school.
|
|
261
|
+
const DYNAMIC_MAX_PAGES = 50;
|
|
262
|
+
// Minimum gap between dynamic requests (ms). The host returns empty bodies under
|
|
263
|
+
// load (a silent rate-limit), which would masquerade as "school has no plan" —
|
|
264
|
+
// exactly the kind of silent miss we must never ship. Override via env.
|
|
265
|
+
const DYNAMIC_MIN_GAP_MS = (() => {
|
|
266
|
+
const env = Number(process.env.GAOKAO_CN_DYNAMIC_GAP_MS);
|
|
267
|
+
return Number.isFinite(env) && env >= 0 ? env : 250;
|
|
268
|
+
})();
|
|
269
|
+
// Raised when the dynamic host answers with a non-success application code
|
|
270
|
+
// (e.g. 1064 "接口请求版本不存在" = the endpoint moved again). Distinct type so
|
|
271
|
+
// callers/health-checks can tell "the API changed" apart from "no data".
|
|
272
|
+
export class GaokaoDynamicError extends Error {
|
|
273
|
+
uri;
|
|
274
|
+
apiCode;
|
|
275
|
+
apiMessage;
|
|
276
|
+
constructor(uri, apiCode, apiMessage) {
|
|
277
|
+
super(`gaokao.cn dynamic endpoint '${uri}' returned code=${apiCode} (${apiMessage}). ` +
|
|
278
|
+
`The upstream API path likely changed again — update DYNAMIC_BASE/PLAN_URI/SCORE_URI in gaokao-cn.ts.`);
|
|
279
|
+
this.uri = uri;
|
|
280
|
+
this.apiCode = apiCode;
|
|
281
|
+
this.apiMessage = apiMessage;
|
|
282
|
+
this.name = "GaokaoDynamicError";
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Global serializing throttle. Every dynamic request awaits the previous one plus
|
|
286
|
+
// a min gap, so a fan-out (the bulk pull runs concurrency 8) can't stampede the host.
|
|
287
|
+
let dynamicChain = Promise.resolve();
|
|
288
|
+
let lastDynamicAt = 0;
|
|
289
|
+
function throttleDynamic() {
|
|
290
|
+
dynamicChain = dynamicChain.then(async () => {
|
|
291
|
+
const wait = lastDynamicAt + DYNAMIC_MIN_GAP_MS - Date.now();
|
|
292
|
+
if (wait > 0)
|
|
293
|
+
await sleep(wait);
|
|
294
|
+
lastDynamicAt = Date.now();
|
|
295
|
+
});
|
|
296
|
+
return dynamicChain;
|
|
297
|
+
}
|
|
298
|
+
// Fetch one page of a dynamic list endpoint. Returns { item, numFound }.
|
|
299
|
+
// `data: []` (as opposed to `{ item, numFound }`) is the host's shape for an
|
|
300
|
+
// empty result — mapped to numFound 0.
|
|
301
|
+
async function fetchDynamicPage(uri, params, opts = {}) {
|
|
302
|
+
const qs = new URLSearchParams();
|
|
303
|
+
for (const [k, v] of Object.entries(params))
|
|
304
|
+
qs.set(k, String(v));
|
|
305
|
+
qs.set("uri", uri);
|
|
306
|
+
const url = `${DYNAMIC_BASE}?${qs.toString()}`;
|
|
307
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
308
|
+
const retries = opts.retries ?? DEFAULT_RETRIES;
|
|
309
|
+
let lastErr;
|
|
310
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
311
|
+
await throttleDynamic();
|
|
312
|
+
const controller = new AbortController();
|
|
313
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
314
|
+
let timedOut = false;
|
|
315
|
+
try {
|
|
316
|
+
const res = await fetch(url, {
|
|
317
|
+
headers: { "User-Agent": DYNAMIC_UA, Referer: "https://www.gaokao.cn/" },
|
|
318
|
+
signal: controller.signal
|
|
319
|
+
});
|
|
320
|
+
if (!res.ok)
|
|
321
|
+
throw new RetryableError(`gaokao.cn dynamic ${res.status} ${res.statusText} for ${url}`);
|
|
322
|
+
const text = await res.text();
|
|
323
|
+
let body;
|
|
324
|
+
try {
|
|
325
|
+
body = JSON.parse(text);
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
throw new RetryableError(`gaokao.cn dynamic returned non-JSON for ${url}: ${text.slice(0, 160)}`);
|
|
329
|
+
}
|
|
330
|
+
if (body.code !== "0000") {
|
|
331
|
+
// Application-level error — deterministic for this uri, don't retry.
|
|
332
|
+
throw new GaokaoDynamicError(uri, body.code ?? "?", body.message ?? "");
|
|
333
|
+
}
|
|
334
|
+
const data = body.data;
|
|
335
|
+
if (Array.isArray(data))
|
|
336
|
+
return { item: [], numFound: 0 };
|
|
337
|
+
const item = Array.isArray(data?.item)
|
|
338
|
+
? (data.item)
|
|
339
|
+
: [];
|
|
340
|
+
const numFound = Number(data?.numFound) || item.length;
|
|
341
|
+
return { item, numFound };
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
345
|
+
timedOut = true;
|
|
346
|
+
lastErr = new GaokaoTimeoutError(url, timeoutMs);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
lastErr = err;
|
|
350
|
+
}
|
|
351
|
+
const retryable = timedOut || lastErr instanceof RetryableError || isTransientNetworkError(err);
|
|
352
|
+
if (!retryable || attempt === retries)
|
|
353
|
+
throw lastErr;
|
|
354
|
+
await sleep(RETRY_BACKOFF_MS * (attempt + 1) + Math.floor(Math.random() * 100));
|
|
355
|
+
}
|
|
356
|
+
finally {
|
|
357
|
+
clearTimeout(timer);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));
|
|
361
|
+
}
|
|
362
|
+
// Fetch every page of a dynamic list endpoint and concatenate the raw items.
|
|
363
|
+
async function fetchDynamicAll(uri, params) {
|
|
364
|
+
const first = await fetchDynamicPage(uri, { ...params, size: DYNAMIC_PAGE_SIZE, page: 1 });
|
|
365
|
+
const out = first.item.slice();
|
|
366
|
+
const total = first.numFound;
|
|
367
|
+
const pages = Math.min(DYNAMIC_MAX_PAGES, Math.ceil(total / DYNAMIC_PAGE_SIZE));
|
|
368
|
+
for (let page = 2; page <= pages && out.length < total; page++) {
|
|
369
|
+
const next = await fetchDynamicPage(uri, { ...params, size: DYNAMIC_PAGE_SIZE, page });
|
|
370
|
+
if (next.item.length === 0) {
|
|
371
|
+
// An empty page WHILE items are still missing is the host's silent
|
|
372
|
+
// rate-limit truncation, NOT a clean end-of-list. Surfacing it as an error
|
|
373
|
+
// (rather than returning a short list) stops an undercounted result from
|
|
374
|
+
// being cached/shipped as if the school simply had fewer majors.
|
|
375
|
+
throw new GaokaoDynamicError(uri, "EMPTY_MID_PAGE", `page ${page} came back empty while only ${out.length}/${total} items fetched — suspected rate-limit truncation`);
|
|
376
|
+
}
|
|
377
|
+
out.push(...next.item);
|
|
378
|
+
}
|
|
379
|
+
return out;
|
|
380
|
+
}
|
|
381
|
+
const str = (v) => (v == null ? "" : String(v));
|
|
382
|
+
const int = (v) => {
|
|
383
|
+
const n = Number(v);
|
|
384
|
+
return Number.isFinite(n) ? n : 0;
|
|
385
|
+
};
|
|
386
|
+
// 掌上高考's dynamic items carry local_type_name ("文科"/"物理"/…) rather than the
|
|
387
|
+
// numeric track `type` code the static tier used. Map it back so TRACK_NAMES lookups
|
|
388
|
+
// (and any track-based filtering) keep working.
|
|
389
|
+
const TRACK_CODE_BY_NAME = {
|
|
390
|
+
理工: "1", 理科: "1",
|
|
391
|
+
文史: "2", 文科: "2",
|
|
392
|
+
综合改革: "3", 综合: "3", 不分文理: "3",
|
|
393
|
+
物理类: "2073", 物理: "2073",
|
|
394
|
+
历史类: "2074", 历史: "2074"
|
|
395
|
+
};
|
|
396
|
+
function trackCodeFromName(name) {
|
|
397
|
+
return TRACK_CODE_BY_NAME[str(name).trim()] ?? str(name);
|
|
398
|
+
}
|
|
399
|
+
// The dynamic tier writes "-" (and occasionally "") for 普通类/无特殊招生类型, whereas
|
|
400
|
+
// the old static tier returned the literal "普通类". Normalize it for DISPLAY so
|
|
401
|
+
// consumers don't surface a bare "-" (e.g. the pull's byZslx map keying 普通类 under
|
|
402
|
+
// "-"). The raw classification field (`zslx`) keeps "-" so isPutong() still matches.
|
|
403
|
+
function normZslxName(raw) {
|
|
404
|
+
const s = str(raw).trim();
|
|
405
|
+
return s === "" || s === "-" ? "普通类" : s;
|
|
406
|
+
}
|
|
407
|
+
// provinceId is the query key (the student's 生源省) — the dynamic payload carries
|
|
408
|
+
// only local_province_name, no numeric id, so we thread the queried id in to keep
|
|
409
|
+
// the item's `province` field populated the way the static tier's was.
|
|
410
|
+
function mapPlanItem(r, provinceId) {
|
|
411
|
+
const rawZslx = str(r.zslx ?? r.zslx_name);
|
|
412
|
+
return {
|
|
413
|
+
school_id: str(r.school_id),
|
|
414
|
+
special_id: str(r.special_id),
|
|
415
|
+
province: str(provinceId),
|
|
416
|
+
year: r.year != null ? str(r.year) : undefined,
|
|
417
|
+
type: trackCodeFromName(r.local_type_name ?? r.type),
|
|
418
|
+
// Keep the raw "-" in zslx (the zhaosheng pull's isPutong() keys off zslx === "-");
|
|
419
|
+
// expose a human label in zslx_name.
|
|
420
|
+
zslx: rawZslx,
|
|
421
|
+
zslx_name: normZslxName(r.zslx_name ?? rawZslx),
|
|
422
|
+
batch: str(r.local_batch_id ?? r.batch),
|
|
423
|
+
local_batch_name: str(r.local_batch_name),
|
|
424
|
+
num: int(r.num),
|
|
425
|
+
length: str(r.length),
|
|
426
|
+
tuition: str(r.tuition),
|
|
427
|
+
spcode: str(r.spcode ?? r.sp_scode),
|
|
428
|
+
spname: str(r.spname),
|
|
429
|
+
sp_name: str(r.sp_name),
|
|
430
|
+
info: str(r.info),
|
|
431
|
+
remark: str(r.remark),
|
|
432
|
+
level1_name: str(r.level1_name),
|
|
433
|
+
level2_name: str(r.level2_name),
|
|
434
|
+
level3_name: str(r.level3_name),
|
|
435
|
+
// API returns a NUMBER (0 or a group id). Old code compares `!== "0"`, so a raw
|
|
436
|
+
// numeric 0 would be mis-read as a real group — always stringify.
|
|
437
|
+
special_group: str(r.special_group ?? "0"),
|
|
438
|
+
sp_xuanke: str(r.sp_xuanke),
|
|
439
|
+
sp_fxk: str(r.sp_fxk),
|
|
440
|
+
sp_sxk: str(r.sp_sxk),
|
|
441
|
+
sp_info: str(r.sp_info),
|
|
442
|
+
sg_xuanke: str(r.sg_xuanke),
|
|
443
|
+
sg_fxk: str(r.sg_fxk),
|
|
444
|
+
sg_sxk: str(r.sg_sxk),
|
|
445
|
+
sg_info: str(r.sg_info),
|
|
446
|
+
sg_name: str(r.sg_name),
|
|
447
|
+
first_km: str(r.first_km)
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
function mapScoreItem(r, provinceId) {
|
|
451
|
+
const min = int(r.min);
|
|
452
|
+
const proscore = Number(r.proscore); // 批次控制线; used to derive 分差 (the old `diff`)
|
|
453
|
+
const rawZslx = str(r.zslx ?? r.zslx_name);
|
|
454
|
+
return {
|
|
455
|
+
school_id: str(r.school_id),
|
|
456
|
+
special_id: str(r.special_id),
|
|
457
|
+
province: str(provinceId),
|
|
458
|
+
type: trackCodeFromName(r.local_type_name ?? r.type),
|
|
459
|
+
zslx: rawZslx,
|
|
460
|
+
zslx_name: normZslxName(r.zslx_name ?? rawZslx),
|
|
461
|
+
batch: str(r.local_batch_id ?? r.batch),
|
|
462
|
+
local_batch_name: str(r.local_batch_name),
|
|
463
|
+
// dynamic score tier names it sp_scode, not spcode.
|
|
464
|
+
spcode: r.sp_scode != null ? str(r.sp_scode) : r.spcode != null ? str(r.spcode) : undefined,
|
|
465
|
+
spname: str(r.spname),
|
|
466
|
+
sp_name: str(r.sp_name),
|
|
467
|
+
info: str(r.info),
|
|
468
|
+
remark: str(r.remark),
|
|
469
|
+
level1_name: str(r.level1_name),
|
|
470
|
+
level2_name: str(r.level2_name),
|
|
471
|
+
level3_name: str(r.level3_name),
|
|
472
|
+
special_group: str(r.special_group ?? "0"),
|
|
473
|
+
max: int(r.max),
|
|
474
|
+
min,
|
|
475
|
+
average: int(r.average),
|
|
476
|
+
lq_num: str(r.lq_num), // 录取人数 — not exposed by the dynamic tier; blank → downstream treats as 0
|
|
477
|
+
min_section: str(r.min_section ?? "-"),
|
|
478
|
+
min_range: str(r.min_range),
|
|
479
|
+
min_rank_range: str(r.min_rank_range),
|
|
480
|
+
range_max_rank: str(r.range_max_rank),
|
|
481
|
+
is_score_range: str(r.is_score_range),
|
|
482
|
+
diff: Number.isFinite(proscore) && proscore > 0 ? min - proscore : int(r.diff),
|
|
483
|
+
first_km: str(r.first_km),
|
|
484
|
+
sp_type: str(r.sp_type),
|
|
485
|
+
sp_fxk: str(r.sp_fxk),
|
|
486
|
+
sp_sxk: str(r.sp_sxk),
|
|
487
|
+
sp_info: str(r.sp_info),
|
|
488
|
+
sp_xuanke: str(r.sp_xuanke),
|
|
489
|
+
sg_fxk: str(r.sg_fxk),
|
|
490
|
+
sg_sxk: str(r.sg_sxk),
|
|
491
|
+
sg_type: str(r.sg_type),
|
|
492
|
+
sg_name: str(r.sg_name),
|
|
493
|
+
sg_info: str(r.sg_info),
|
|
494
|
+
sg_xuanke: str(r.sg_xuanke)
|
|
495
|
+
};
|
|
496
|
+
}
|
|
235
497
|
// ---- Client ----
|
|
236
498
|
export async function getSchoolInfo(schoolId) {
|
|
237
499
|
return fetchJson(`/school/${schoolId}/info.json`);
|
|
238
500
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
501
|
+
// NOTE ON EMPTY RESULTS: the dynamic host silently degrades to an empty result
|
|
502
|
+
// (`code:0000, data:[]`) under rate-limiting, indistinguishable from a genuine
|
|
503
|
+
// "this school has no plan here". We therefore NEVER write an empty array to the
|
|
504
|
+
// cache — freezing a throttle-induced empty for 24h would durably poison the data
|
|
505
|
+
// (and read as 缩招). A real empty is rare and cheap to re-fetch.
|
|
506
|
+
// Per-school × per-year × per-province admission plan. Sourced from the dynamic
|
|
507
|
+
// tier (see the block above); non-empty results are cached under a synthetic key
|
|
508
|
+
// so the on-disk response cache still shares hits across CLI invocations.
|
|
509
|
+
export async function getAdmissionPlan(schoolId, year, provinceId, opts = {}) {
|
|
510
|
+
const cacheKey = `dyn/plan/${schoolId}/${year}/${provinceId}`;
|
|
511
|
+
if (!opts.noCache) {
|
|
512
|
+
const hit = readCache(cacheKey);
|
|
513
|
+
if (hit !== undefined)
|
|
514
|
+
return hit;
|
|
515
|
+
}
|
|
516
|
+
const raw = await fetchDynamicAll(PLAN_URI, {
|
|
517
|
+
school_id: schoolId,
|
|
518
|
+
year,
|
|
519
|
+
local_province_id: provinceId
|
|
520
|
+
});
|
|
521
|
+
const items = raw.map((r) => mapPlanItem(r, provinceId));
|
|
522
|
+
if (!opts.noCache && items.length > 0)
|
|
523
|
+
writeCache(cacheKey, items);
|
|
524
|
+
return items;
|
|
525
|
+
}
|
|
526
|
+
export async function getAdmissionScores(schoolId, year, provinceId, opts = {}) {
|
|
527
|
+
const cacheKey = `dyn/score/${schoolId}/${year}/${provinceId}`;
|
|
528
|
+
if (!opts.noCache) {
|
|
529
|
+
const hit = readCache(cacheKey);
|
|
530
|
+
if (hit !== undefined)
|
|
531
|
+
return hit;
|
|
532
|
+
}
|
|
533
|
+
const raw = await fetchDynamicAll(SCORE_URI, {
|
|
534
|
+
school_id: schoolId,
|
|
535
|
+
year,
|
|
536
|
+
local_province_id: provinceId
|
|
537
|
+
});
|
|
538
|
+
const items = raw.map((r) => mapScoreItem(r, provinceId));
|
|
539
|
+
if (!opts.noCache && items.length > 0)
|
|
540
|
+
writeCache(cacheKey, items);
|
|
541
|
+
return items;
|
|
243
542
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
543
|
+
// End-to-end source health probe. Verifies the surviving static endpoint AND the
|
|
544
|
+
// two dynamic endpoints we now depend on, so a future upstream move is caught by a
|
|
545
|
+
// single command rather than by silently-empty query results.
|
|
546
|
+
export async function checkSourceHealth() {
|
|
547
|
+
const checks = [];
|
|
548
|
+
const errMsg = (e) => (e instanceof Error ? e.message : String(e));
|
|
549
|
+
try {
|
|
550
|
+
const info = await getSchoolInfo(31);
|
|
551
|
+
const ok = info.name === "北京大学" && !!info.pro_type_min;
|
|
552
|
+
checks.push({ name: "static school/info.json (min-score corpus)", ok, detail: info.name });
|
|
553
|
+
}
|
|
554
|
+
catch (e) {
|
|
555
|
+
checks.push({ name: "static school/info.json (min-score corpus)", ok: false, detail: errMsg(e) });
|
|
556
|
+
}
|
|
557
|
+
try {
|
|
558
|
+
const plan = await getAdmissionPlan(31, 2024, 41); // 北大 × 河南 × 2024 — must be non-empty
|
|
559
|
+
checks.push({ name: `dynamic 招生计划 (${PLAN_URI})`, ok: plan.length > 0, detail: `${plan.length} 专业` });
|
|
560
|
+
}
|
|
561
|
+
catch (e) {
|
|
562
|
+
checks.push({ name: `dynamic 招生计划 (${PLAN_URI})`, ok: false, detail: errMsg(e) });
|
|
563
|
+
}
|
|
564
|
+
try {
|
|
565
|
+
const scores = await getAdmissionScores(31, 2024, 41); // 北大 × 河南 × 2024 — must be non-empty
|
|
566
|
+
checks.push({ name: `dynamic 录取分 (${SCORE_URI})`, ok: scores.length > 0, detail: `${scores.length} 专业分` });
|
|
567
|
+
}
|
|
568
|
+
catch (e) {
|
|
569
|
+
checks.push({ name: `dynamic 录取分 (${SCORE_URI})`, ok: false, detail: errMsg(e) });
|
|
570
|
+
}
|
|
571
|
+
return { ok: checks.every((c) => c.ok), checks };
|
|
247
572
|
}
|
|
248
573
|
// Convenience: historical min-score series for a given (school, province).
|
|
249
574
|
// Returns [{ year, track, minScore }] sorted by year descending.
|
package/dist/selftest.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
// selftest —
|
|
2
|
-
// Stage 1: upstream
|
|
3
|
-
// Stage 2:
|
|
4
|
-
//
|
|
1
|
+
// selftest — end-to-end smoke that confirms the whole stack works.
|
|
2
|
+
// Stage 1: static upstream works (school/31/info.json — the min-score corpus).
|
|
3
|
+
// Stage 2: dynamic upstream works (per-major 招生计划 — api.zjzw.cn). This is the
|
|
4
|
+
// tier that broke in 2026-06 when the static schoolspecialplan objects were
|
|
5
|
+
// retired; a dedicated stage means a future move surfaces here, not as
|
|
6
|
+
// silently-empty query results.
|
|
7
|
+
// Stage 3: local school index loads and has expected shape.
|
|
8
|
+
// Stage 4: 一分一段 table loads and looks up correctly.
|
|
5
9
|
//
|
|
6
10
|
// Designed to be the single command a new install runs to know it's healthy.
|
|
7
|
-
import { getSchoolInfo } from "./gaokao-cn.js";
|
|
11
|
+
import { getSchoolInfo, getAdmissionPlan } from "./gaokao-cn.js";
|
|
8
12
|
import { loadIndex } from "./index-loader.js";
|
|
9
13
|
import { loadRankTable, scoreToRank } from "./rank-table.js";
|
|
10
14
|
async function timed(stage, fn) {
|
|
@@ -27,6 +31,17 @@ export async function runSelftest() {
|
|
|
27
31
|
throw new Error("pro_type_min missing");
|
|
28
32
|
}
|
|
29
33
|
}));
|
|
34
|
+
results.push(await timed("dynamic 招生计划 (api.zjzw.cn)", async () => {
|
|
35
|
+
// 北大 × 河南 × 2024 reliably carries ~50 majors. Empty here means the plan
|
|
36
|
+
// source is down/relocated or rate-limiting — the exact 2026-06 breakage.
|
|
37
|
+
const plan = await getAdmissionPlan(31, 2024, 41);
|
|
38
|
+
if (plan.length === 0) {
|
|
39
|
+
throw new Error("empty plan (source down/relocated or rate-limited) — see gaokao-cn.ts DYNAMIC_BASE/PLAN_URI");
|
|
40
|
+
}
|
|
41
|
+
if (!plan.some((p) => /^\d{6}[A-Z]?$/.test(p.spcode))) {
|
|
42
|
+
throw new Error("plan rows carry no valid 专业代码 — item shape may have changed");
|
|
43
|
+
}
|
|
44
|
+
}));
|
|
30
45
|
results.push(await timed("local school index", () => {
|
|
31
46
|
const idx = loadIndex();
|
|
32
47
|
if (idx.rows.length < 2000)
|