commit 8354c7c6775838d31f15fa98344fa45c4068c6c1
Author: yuuko <2576724631@qq.com>
Date: Wed Aug 20 16:52:27 2025 +0800
第一次
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..7d05e99
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,10 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# 依赖于环境的 Maven 主目录路径
+/mavenHomeManager.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/jzd.iml b/.idea/jzd.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/jzd.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..93e367c
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..7548cb0
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Data/json/1/0003.json b/Data/json/1/0003.json
new file mode 100644
index 0000000..df90dc7
--- /dev/null
+++ b/Data/json/1/0003.json
@@ -0,0 +1 @@
+{"FileName": "0003", "ContentType": "image/jpeg", "Width": 3075, "Height": 6030, "Size": 1504099, "Layout": 0, "Area": "[]", "Compact": 1, "CharNumber": 481, "LineNumber": 53, "chars": ["安", "從", "來", "恬", "憺", "虚", "无", "靜", "也", "法", "道", "清", "靜", "精", "氣", "内", "持", "故", "其", "虚", "邪", "不", "能", "為", "害", "恬", "蹄", "廉", "反", "舊", "音", "淡", "是", "以", "志", "閑", "而", "少", "欲", "心", "安", "而", "不", "懼", "形", "勞", "而", "不", "倦", "䢿", "機", "息", "故", "少", "欲", "外", "紛", "靜", "故", "心", "然", "情", "欲", "两", "亡", "是", "非", "一", "貫", "起", "居", "皆", "適", "故", "不", "倦", "也", "氣", "從", "以", "順", "各", "從", "其", "欲", "皆", "得", "所", "願", "志", "不", "貪", "故", "所", "欲", "皆", "順", "心", "易", "足", "故", "所", "願", "必", "從", "以", "不", "異", "求", "故", "无", "難", "得", "他", "老", "子", "曰", "知", "足", "不", "辱", "知", "止", "還", "殆", "回", "以", "長", "乆", "故", "美", "其", "食", "順", "精", "麄", "也", "髮", "新", "校", "正", "云", "按", "别", "本", "美", "一", "作", "甘", "任", "其", "服", "隨", "美", "惡", "也", "樂", "其", "俗", "去", "傾", "慕", "也", "髙", "下", "不", "相", "慕", "其", "民", "故", "曰", "朴", "无", "末", "也", "是", "所", "謂", "心", "足", "也", "老", "子", "曰", "禍", "莫", "大", "於", "不", "知", "足", "咎", "莫", "大", "於", "欲", "得", "故", "知", "足", "之", "足", "常", "足", "矣", "盖", "非", "謂", "物", "足", "者", "為", "知", "足", "錢", "足", "者", "乃", "為", "知", "足", "矣", "不", "恣", "於", "欲", "是", "則", "朴", "同", "故", "聖", "人", "云", "我", "無", "欲", "而", "民", "自", "朴", "矣", "新", "校", "集", "云", "按", "别", "本", "日", "作", "日", "是", "以", "嗜", "欲", "不", "能", "目", "不", "妄", "視", "故", "嗜", "欲", "不", "能", "勞", "心", "与", "玄", "勞", "其", "目", "淫", "邪", "不", "能", "惑", "其", "心", "同", "故", "淫", "邪", "不", "能", "惑", "老", "子", "曰", "不", "見", "可", "情", "計", "两", "欲", "使", "心", "不", "乱", "又", "昍", "愚", "智", "賢", "不", "肖", "不", "懼", "於", "物", "故", "合", "於", "道", "亡", "不", "為", "人", "為", "腹", "不", "為", "聖", "謀", "府", "冥", "心", "一", "觀", "勝", "𧴥", "俱", "捐", "故", "心", "志", "保", "安", "合", "同", "於", "道", "庚", "桑", "楚", "田", "汝", "形", "抱", "汝", "生", "无", "使", "汝", "思", "慮", "營", "營", "字", "新", "校", "正", "云", "按", "全", "元", "起", "註", "云", "合", "於", "道", "数", "所", "以", "能", "年", "皆", "度", "百", "歲", "而", "動", "作", "不", "衰", "者", "以", "其", "德", "全", "不", "危", "不", "渉", "於", "危", "故", "德", "全", "也", "莊", "子", "曰", "執", "道", "者", "德", "全", "德", "全", "者", "形", "全", "形", "也", "全", "者", "聖", "人", "之", "道", "也", "又", "曰", "无", "為", "而", "性", "命", "不", "全", "者", "未", "之", "有", "也", "材", "謂", "材", "幹", "可", "帝", "曰", "人", "年", "老", "而", "無", "子", "者", "材", "力", "盡", "邪", "將", "天", "數", "然", "也", "以", "立", "身", "者", "伯", "曰", "女", "子", "七", "歲", "腎", "氣", "盛", "齒", "更", "髮", "長"], "coors": [[2574, 1430, 2771, 1631], [2578, 1623, 2774, 1799], [2578, 1790, 2783, 1966], [2668, 1959, 2786, 2135], [2682, 2132, 2788, 2313], [2687, 2318, 2791, 2499], [2663, 2506, 2788, 2665], [2670, 2665, 2791, 2849], [2670, 2853, 2791, 3029], [2689, 3032, 2793, 3210], [2701, 3213, 2800, 3384], [2704, 3384, 2800, 3565], [2699, 3577, 2800, 3748], [2699, 3758, 2805, 3934], [2701, 3939, 2805, 4098], [2706, 4108, 2810, 4272], [2704, 4272, 2812, 4448], [2687, 4448, 2817, 4631], [2578, 1959, 2699, 2132], [2583, 2137, 2692, 2318], [2588, 2325, 2699, 2499], [2593, 2506, 2689, 2660], [2590, 2680, 2692, 2846], [2590, 2873, 2692, 3039], [2600, 3039, 2699, 3215], [2593, 3220, 2706, 3391], [2600, 3401, 2711, 3565], [2607, 3572, 2706, 3748], [2615, 3758, 2709, 3917], [2603, 3922, 2706, 4110], [2617, 4112, 2706, 4267], [2610, 4281, 2714, 4445], [2622, 4633, 2812, 4829], [2619, 4826, 2805, 4990], [2619, 4981, 2798, 5171], [2617, 5176, 2791, 5352], [2617, 5347, 2786, 5528], [2393, 1438, 2562, 1594], [2385, 1604, 2576, 1802], [2395, 1795, 2571, 1963], [2393, 1963, 2576, 2147], [2395, 2149, 2571, 2330], [2398, 2325, 2578, 2494], [2407, 2492, 2586, 2714], [2400, 2704, 2583, 2863], [2405, 2856, 2586, 3063], [2412, 3051, 2586, 3232], [2414, 3230, 2586, 3389], [2419, 3384, 2598, 3577], [2417, 3572, 2583, 3753], [2508, 3746, 2617, 3917], [2518, 3927, 2607, 4098], [2511, 4100, 2615, 4272], [2511, 4269, 2610, 4440], [2511, 4445, 2622, 4617], [2511, 4619, 2627, 4802], [2506, 4817, 2610, 4976], [2496, 4981, 2612, 5164], [2504, 5171, 2612, 5340], [2511, 5359, 2619, 5511], [2412, 3753, 2518, 3907], [2422, 3922, 2523, 4093], [2419, 4100, 2525, 4272], [2417, 4279, 2530, 4448], [2422, 4465, 2523, 4629], [2419, 4638, 2530, 4814], [2426, 4826, 2528, 5002], [2424, 5034, 2504, 5111], [2417, 5152, 2513, 5318], [2412, 5335, 2528, 5523], [2272, 1440, 2383, 1604], [2277, 1616, 2381, 1778], [2267, 1792, 2388, 1971], [2272, 1963, 2390, 2132], [2183, 1440, 2284, 1599], [2183, 1614, 2291, 1790], [2188, 1809, 2284, 1971], [2197, 2130, 2383, 2340], [2205, 2332, 2393, 2518], [2212, 2516, 2393, 2675], [2212, 2675, 2390, 2861], [2221, 2858, 2398, 3046], [2212, 3044, 2393, 3232], [2224, 3218, 2400, 3406], [2219, 3401, 2402, 3584], [2234, 3577, 2395, 3753], [2226, 3748, 2407, 3944], [2219, 3934, 2405, 4105], [2226, 4093, 2412, 4281], [2318, 4281, 2417, 4453], [2330, 4465, 2419, 4605], [2316, 4626, 2422, 4802], [2316, 4814, 2419, 4986], [2323, 4993, 2419, 5152], [2316, 5159, 2417, 5318], [2311, 5326, 2410, 5502], [2229, 4286, 2332, 4457], [2231, 4472, 2328, 4614], [2236, 4631, 2335, 4802], [2219, 4824, 2330, 4981], [2226, 4981, 2332, 5152], [2226, 5162, 2328, 5321], [2226, 5333, 2335, 5521], [2079, 1440, 2190, 1604], [2077, 1626, 2193, 1790], [2106, 1821, 2200, 1963], [2094, 1978, 2200, 2137], [2089, 2144, 2205, 2320], [2096, 2323, 2209, 2504], [2098, 2499, 2209, 2677], [2096, 2687, 2214, 2846], [2106, 2853, 2229, 3032], [2103, 3044, 2217, 3220], [2098, 3232, 2217, 3399], [2115, 3399, 2219, 3567], [2118, 3577, 2219, 3743], [2000, 1459, 2094, 1609], [1995, 1626, 2096, 1785], [2004, 1809, 2137, 1973], [2000, 1980, 2106, 2132], [2000, 2139, 2113, 2323], [2004, 2332, 2108, 2494], [2012, 2513, 2108, 2675], [2016, 2682, 2123, 2853], [2014, 2858, 2120, 3037], [2016, 3051, 2110, 3215], [2026, 3225, 2123, 3389], [2028, 3401, 2132, 3572], [2038, 3575, 2137, 3734], [2038, 3736, 2217, 3920], [2038, 3917, 2214, 4093], [2038, 4084, 2209, 4267], [2045, 4260, 2219, 4460], [2127, 4457, 2231, 4612], [2120, 4626, 2238, 4814], [2118, 4819, 2224, 5002], [2118, 5015, 2224, 5174], [2130, 5188, 2224, 5318], [2101, 5323, 2226, 5523], [2031, 4460, 2139, 4626], [2031, 4638, 2132, 4797], [2031, 4819, 2135, 4986], [2036, 4990, 2135, 5167], [2038, 5174, 2137, 5326], [2038, 5328, 2132, 5511], [1881, 1445, 2000, 1631], [1891, 1672, 1997, 1732], [1787, 1440, 1905, 1623], [1799, 1628, 1903, 1790], [1809, 1799, 2000, 1980], [1811, 1966, 2000, 2152], [1819, 2139, 2000, 2332], [1908, 2330, 2014, 2504], [1901, 2504, 2012, 2682], [1811, 2330, 1920, 2504], [1814, 2506, 1922, 2677], [1816, 2672, 2002, 2870], [1826, 2858, 2014, 3054], [1831, 3042, 2021, 3225], [1910, 3225, 2031, 3394], [1925, 3403, 2028, 3563], [1826, 3225, 1939, 3401], [1831, 3413, 1937, 3572], [1843, 3575, 2019, 3763], [1845, 3758, 2016, 3922], [1850, 3927, 2016, 4081], [1838, 4084, 2024, 4272], [1843, 4255, 2036, 4460], [1852, 4453, 2031, 4641], [1852, 4629, 2024, 4812], [1855, 4800, 2031, 4993], [1857, 4998, 2019, 5154], [1850, 5152, 2024, 5340], [1850, 5345, 1956, 5514], [1676, 1452, 1797, 1638], [1693, 1647, 1802, 1811], [1696, 1816, 1811, 1987], [1698, 1990, 1811, 2147], [1710, 2152, 1816, 2337], [1717, 2349, 1809, 2494], [1705, 2506, 1816, 2682], [1703, 2680, 1823, 2865], [1720, 2870, 1826, 3032], [1722, 3044, 1823, 3220], [1729, 3227, 1819, 3386], [1737, 3403, 1831, 3575], [1734, 3579, 1833, 3758], [1734, 3758, 1840, 3917], [1725, 3920, 1838, 4096], [1729, 4110, 1833, 4269], [1727, 4279, 1836, 4443], [1732, 4455, 1843, 4626], [1729, 4614, 1845, 4790], [1725, 4800, 1845, 4988], [1725, 4981, 1840, 5159], [1725, 5152, 1850, 5311], [1722, 5323, 1848, 5519], [1597, 1450, 1703, 1633], [1604, 1633, 1717, 1819], [1609, 1821, 1708, 1980], [1611, 1995, 1715, 2154], [1611, 2164, 1720, 2328], [1618, 2330, 1722, 2489], [1616, 2496, 1725, 2692], [1618, 2692, 1725, 2865], [1618, 2865, 1732, 3042], [1626, 3032, 1751, 3210], [1626, 3210, 1768, 3391], [1631, 3401, 1770, 3584], [1633, 3584, 1749, 3760], [1638, 3763, 1741, 3922], [1633, 3924, 1737, 4091], [1633, 4105, 1737, 4274], [1643, 4279, 1739, 4443], [1638, 4467, 1741, 4631], [1638, 4641, 1739, 4800], [1640, 4805, 1744, 4976], [1638, 4978, 1737, 5154], [1633, 5167, 1732, 5326], [1631, 5335, 1734, 5507], [1503, 1462, 1604, 1643], [1512, 1657, 1609, 1831], [1510, 1826, 1609, 1997], [1510, 1997, 1611, 2156], [1512, 2166, 1618, 2330], [1512, 2332, 1626, 2492], [1517, 2496, 1631, 2689], [1529, 2692, 1626, 2865], [1529, 2870, 1626, 3039], [1522, 3044, 1628, 3220], [1539, 3237, 1631, 3394], [1534, 3411, 1638, 3579], [1532, 3577, 1643, 3753], [1536, 3768, 1626, 3922], [1539, 3936, 1638, 4084], [1524, 4098, 1635, 4269], [1524, 4272, 1645, 4448], [1409, 1452, 1534, 1640], [1411, 1645, 1524, 1823], [1418, 1819, 1524, 1983], [1430, 1983, 1520, 2147], [1425, 2166, 1520, 2337], [1435, 2354, 1522, 2489], [1425, 2511, 1536, 2689], [1430, 2694, 1544, 2878], [1435, 2878, 1539, 3037], [1442, 3051, 1541, 3215], [1440, 3227, 1549, 3399], [1442, 3406, 1546, 3577], [1450, 3575, 1551, 3751], [1454, 3768, 1551, 3922], [1452, 3927, 1551, 4098], [1459, 4112, 1536, 4267], [1464, 4455, 1626, 4643], [1462, 4638, 1631, 4797], [1459, 4785, 1633, 4990], [1462, 4981, 1635, 5171], [1466, 5167, 1623, 5326], [1466, 5321, 1633, 5526], [1356, 3230, 1440, 3389], [1358, 3406, 1450, 3560], [1356, 3584, 1454, 3753], [1358, 3760, 1452, 3920], [1358, 3932, 1457, 4096], [1363, 4096, 1459, 4267], [1356, 4279, 1469, 4448], [1363, 4453, 1459, 4605], [1358, 4619, 1459, 4790], [1358, 4797, 1459, 4986], [1363, 5005, 1457, 5159], [1356, 5154, 1454, 5333], [1346, 5328, 1457, 5507], [1240, 1442, 1401, 1647], [1240, 1645, 1411, 1823], [1271, 1819, 1399, 1990], [1242, 1987, 1425, 2166], [1242, 2164, 1423, 2352], [1252, 2344, 1425, 2513], [1259, 2506, 1423, 2711], [1249, 2704, 1425, 2885], [1252, 2873, 1430, 3070], [1261, 3068, 1421, 3215], [1259, 3230, 1360, 3389], [1259, 3399, 1365, 3567], [1264, 3577, 1368, 3743], [1269, 3758, 1368, 3922], [1271, 3934, 1365, 4081], [1269, 4086, 1368, 4269], [1266, 4272, 1368, 4448], [1261, 4453, 1368, 4617], [1269, 4629, 1365, 4800], [1269, 4807, 1365, 4978], [1276, 4990, 1365, 5154], [1271, 5159, 1363, 5328], [1271, 5335, 1360, 5499], [1163, 4990, 1264, 5154], [1160, 5152, 1266, 5318], [1167, 5328, 1266, 5507], [1129, 1457, 1249, 1643], [1129, 1645, 1242, 1819], [1138, 1823, 1245, 1973], [1141, 1987, 1240, 2147], [1129, 2156, 1235, 2330], [1138, 2340, 1242, 2506], [1085, 2518, 1245, 2680], [1081, 2680, 1242, 2882], [1069, 2873, 1242, 3054], [1071, 3051, 1247, 3244], [1078, 3244, 1249, 3391], [1088, 3399, 1249, 3599], [1085, 3591, 1257, 3751], [1085, 3746, 1254, 3951], [1081, 3939, 1257, 4117], [1076, 4108, 1254, 4291], [1081, 4284, 1259, 4455], [1100, 4448, 1242, 4614], [1085, 4614, 1252, 4802], [1085, 4793, 1259, 4993], [1069, 4990, 1172, 5145], [1071, 5152, 1167, 5299], [1076, 5335, 1163, 5487], [1054, 1650, 1141, 1804], [1054, 1816, 1153, 1978], [1056, 1983, 1153, 2152], [1059, 2159, 1146, 2330], [1059, 2337, 1153, 2506], [1042, 1447, 1141, 1640], [946, 1442, 1059, 1640], [946, 1638, 1059, 1811], [953, 1816, 1056, 1985], [958, 2000, 1056, 2152], [960, 2214, 1054, 2270], [953, 2325, 1066, 2518], [965, 2518, 1073, 2689], [960, 2689, 1066, 2875], [972, 2873, 1073, 3039], [965, 3044, 1069, 3227], [970, 3232, 1076, 3411], [979, 3413, 1076, 3577], [974, 3579, 1076, 3746], [965, 3753, 1076, 3920], [974, 3934, 1081, 4105], [974, 4100, 1073, 4248], [977, 4279, 1071, 4443], [970, 4453, 1083, 4617], [972, 4629, 1083, 4800], [974, 4812, 1083, 4981], [972, 4988, 1069, 5152], [972, 5154, 1076, 5333], [943, 5340, 1061, 5495], [851, 1643, 958, 1799], [856, 1807, 967, 1983], [856, 1985, 967, 2154], [863, 2166, 970, 2340], [861, 2340, 962, 2513], [861, 2523, 972, 2677], [866, 2689, 972, 2870], [878, 2875, 979, 3042], [873, 3051, 982, 3220], [871, 3220, 982, 3399], [873, 3403, 987, 3575], [876, 3579, 989, 3768], [876, 3784, 962, 3900], [871, 3927, 982, 4093], [866, 4100, 984, 4279], [876, 4281, 982, 4440], [885, 4457, 979, 4605], [880, 4633, 987, 4805], [885, 4819, 984, 4978], [883, 4990, 987, 5150], [871, 5154, 977, 5326], [866, 5328, 970, 5487], [753, 1645, 849, 1797], [757, 1814, 854, 1973], [649, 1440, 750, 1611], [658, 1633, 762, 1804], [658, 1804, 774, 1990], [666, 1983, 849, 2180], [671, 2178, 854, 2337], [673, 2330, 851, 2528], [680, 2530, 849, 2697], [692, 2699, 849, 2885], [687, 2885, 854, 3068], [695, 3068, 835, 3220], [687, 3215, 849, 3415], [697, 3413, 859, 3577], [695, 3577, 859, 3760], [699, 3758, 866, 3939], [709, 3934, 863, 4093], [707, 4093, 873, 4281], [704, 4269, 873, 4465], [712, 4460, 871, 4626], [712, 4617, 871, 4800], [712, 4788, 880, 4993], [719, 4986, 878, 5154], [728, 5162, 866, 5314], [716, 5318, 868, 5507], [552, 1633, 656, 1785], [562, 1792, 663, 1968], [557, 1971, 663, 2135], [557, 2144, 666, 2313], [564, 2318, 673, 2496], [572, 2494, 678, 2680], [579, 2680, 683, 2849], [576, 2856, 680, 3017], [569, 3027, 680, 3210], [579, 3220, 680, 3386], [586, 3401, 683, 3565], [589, 3575, 690, 3746], [593, 3751, 692, 3917], [593, 3920, 692, 4084], [589, 4091, 702, 4272], [601, 4272, 707, 4438], [593, 4443, 707, 4619], [598, 4619, 709, 4790], [601, 4793, 707, 4964], [596, 4981, 707, 5135], [598, 5147, 712, 5311], [576, 5321, 704, 5497], [466, 1450, 646, 1626], [466, 1633, 569, 1795], [463, 1804, 564, 1971], [468, 1973, 569, 2149], [478, 2159, 572, 2325], [478, 2325, 574, 2499], [478, 2506, 584, 2687], [485, 2692, 589, 2853], [490, 2870, 589, 3027], [497, 3044, 589, 3203], [492, 3218, 591, 3377], [492, 3403, 596, 3575], [504, 3584, 598, 3736], [499, 3753, 601, 3912], [504, 3920, 603, 4096], [509, 4100, 598, 4255], [504, 4272, 608, 4438], [507, 4443, 603, 4619], [511, 4619, 610, 4790], [516, 4800, 613, 4959], [516, 4954, 601, 5138], [519, 5154, 605, 5309], [415, 4619, 507, 4785], [415, 4793, 511, 4959], [412, 4966, 511, 5133], [415, 5140, 521, 5311], [405, 5318, 516, 5482], [258, 1442, 451, 1643], [268, 1635, 446, 1816], [273, 1811, 449, 1973], [260, 1968, 451, 2149], [268, 2137, 461, 2337], [280, 2340, 458, 2516], [292, 2508, 475, 2694], [289, 2689, 475, 2868], [287, 2853, 475, 3046], [294, 3039, 478, 3232], [306, 3225, 463, 3394], [299, 3389, 490, 3589], [297, 3587, 485, 3751], [302, 3743, 485, 3936], [306, 3932, 485, 4091], [306, 4079, 499, 4272], [309, 4264, 490, 4453], [311, 4445, 492, 4624], [314, 4629, 427, 4781], [316, 4788, 420, 4940], [323, 4952, 422, 5128], [321, 5140, 422, 5306], [5, 1604, 77, 1770], [0, 1773, 72, 1942], [0, 1963, 87, 2125], [0, 2125, 89, 2294], [0, 2299, 84, 2470], [0, 2465, 87, 2646], [0, 2651, 82, 2824], [0, 2837, 80, 3015], [0, 3010, 80, 3179], [0, 3213, 77, 3377], [0, 3389, 80, 3560], [0, 3560, 82, 3748], [0, 3748, 84, 3912]], "char_probs": [0.9922, 0.9702, 0.9961, 0.9893, 0.9927, 0.5717, 0.9728, 0.5629, 0.6837, 0.9961, 0.9937, 0.8303, 0.6413, 0.9937, 0.9951, 0.6779, 0.9013, 0.9883, 0.9922, 0.6389, 0.999, 0.9849, 0.9961, 0.6703, 0.998, 0.999, 0.999, 0.9824, 0.9946, 0.3685, 0.998, 0.9907, 0.9966, 0.6151, 0.9976, 0.9406, 0.999, 0.6131, 0.9971, 0.998, 0.9961, 0.9985, 0.9956, 0.9985, 0.999, 0.9985, 0.999, 0.9966, 0.999, 0.3693, 0.999, 0.9971, 0.9937, 0.9567, 0.9971, 0.9639, 0.9844, 0.6704, 0.967, 0.9678, 0.9819, 0.9985, 0.9961, 0.9937, 0.8452, 0.9826, 0.9353, 0.9756, 0.9971, 0.9785, 0.9907, 0.9246, 0.9941, 0.9956, 0.9937, 0.9893, 0.6968, 0.9951, 0.9868, 0.9907, 0.9897, 0.9932, 0.9883, 0.9956, 0.9966, 0.9907, 0.9976, 0.9976, 0.9985, 0.9718, 0.9779, 0.9893, 0.998, 0.9971, 0.6711, 0.6166, 0.6707, 0.5245, 0.9447, 0.9713, 0.9736, 0.6479, 0.9692, 0.6369, 0.6381, 0.5014, 0.9902, 0.9937, 0.9069, 0.9961, 0.8279, 0.9786, 0.9956, 0.98, 0.9976, 0.9907, 0.6424, 0.9599, 0.9985, 0.981, 0.9541, 0.978, 0.9946, 0.6234, 0.9995, 0.9609, 0.9956, 0.6851, 0.683, 0.9966, 0.9976, 0.9956, 0.9985, 0.9863, 0.9917, 0.9761, 0.625, 0.5009, 0.978, 0.9839, 0.9839, 0.9932, 0.9834, 0.9824, 0.9893, 0.999, 0.9966, 0.9985, 0.9927, 0.9976, 0.9956, 0.998, 0.9912, 0.9966, 0.9399, 0.9873, 0.9976, 0.9951, 0.9985, 0.9897, 0.9888, 0.8916, 0.7094, 0.9966, 0.9971, 0.9961, 0.9956, 0.9976, 0.9966, 0.981, 0.9971, 0.98, 0.9775, 0.5874, 0.3945, 0.9745, 0.9648, 0.9922, 0.998, 0.9985, 0.6096, 0.9818, 0.9985, 0.9878, 0.7094, 0.999, 0.9678, 0.9688, 0.9902, 0.9917, 0.9907, 0.999, 0.9961, 0.9927, 0.9634, 0.9579, 0.9868, 0.9592, 0.9956, 0.9985, 0.9976, 0.9971, 0.998, 0.9995, 0.9629, 0.9985, 0.9976, 0.9554, 0.9697, 0.9985, 0.9976, 0.9912, 0.9961, 0.9971, 0.9728, 0.1722, 0.9966, 0.9722, 0.7068, 0.9912, 0.9937, 0.9922, 0.9111, 0.9922, 0.9932, 0.9888, 0.999, 0.951, 0.6765, 0.9902, 0.9893, 0.9961, 0.9941, 0.9907, 0.9976, 0.9976, 0.9956, 0.999, 0.6971, 0.8258, 0.9941, 0.8596, 0.6403, 0.971, 0.815, 0.4096, 0.9961, 0.999, 0.6448, 0.9778, 0.6644, 0.999, 0.7834, 0.9971, 0.9951, 0.9995, 0.998, 0.9897, 0.9971, 0.9937, 0.9562, 0.9985, 0.9956, 0.9961, 0.9985, 0.9971, 0.9927, 0.9976, 0.9985, 0.9941, 0.9966, 0.9951, 0.9985, 0.9956, 0.9912, 0.9956, 0.9985, 0.9961, 0.9839, 0.9966, 0.9961, 0.9692, 0.9956, 0.9966, 0.998, 0.9976, 0.9932, 0.9985, 0.9922, 0.9961, 0.9619, 0.6328, 0.9912, 0.9937, 0.9985, 0.998, 0.9961, 0.998, 0.9976, 0.9805, 0.9985, 0.9897, 0.9971, 0.9932, 0.2323, 0.9961, 0.9971, 0.998, 0.9639, 0.9941, 0.9917, 0.999, 0.998, 0.9985, 0.9951, 0.9951, 0.9951, 0.9985, 0.9902, 0.9819, 0.8436, 0.9883, 0.9912, 0.9937, 0.9834, 0.9746, 0.9946, 0.9971, 0.999, 0.9722, 0.999, 0.9961, 0.6208, 0.9985, 0.998, 0.9624, 0.5582, 0.9863, 0.9971, 0.981, 0.9985, 0.9937, 0.9966, 0.9966, 0.9946, 0.9883, 0.6604, 0.9985, 0.9995, 0.9839, 0.9946, 0.9941, 0.9976, 0.9995, 0.9785, 0.9854, 0.9976, 0.998, 0.9294, 0.9108, 0.9995, 0.9971, 0.3028, 0.9888, 0.9971, 0.9927, 0.9688, 0.9976, 0.998, 0.9907, 0.9781, 0.9951, 0.998, 0.9937, 0.9668, 0.9897, 0.9727, 0.9985, 0.9907, 0.9971, 0.9917, 0.9961, 0.9985, 0.9985, 0.6132, 0.9976, 0.998, 0.9956, 0.9922, 0.9976, 0.9961, 0.9961, 0.9839, 0.9971, 0.999, 0.9858, 0.9995, 0.9824, 0.6248, 0.619, 0.9995, 0.9971, 0.9985, 0.9985, 0.9746, 0.9683, 0.9854, 0.6467, 0.9941, 0.9951, 0.9966, 0.9961, 0.999, 0.9956, 0.9985, 0.981, 0.998, 0.999, 0.9966, 0.9927, 0.999, 0.9746, 0.9927, 0.9927, 0.998, 0.9961, 0.9717, 0.9922, 0.6404, 0.9778, 0.9819, 0.9873, 0.8742, 0.999, 0.9878, 0.9985, 0.9902, 0.9737, 0.98, 0.9907, 0.9091, 0.3482, 0.9985, 0.9844, 0.9927, 0.9966, 0.9976, 0.8935, 0.9956, 0.998, 0.999, 0.9976, 0.9985, 0.9966, 0.9941, 0.9985, 0.9985, 0.9976, 0.999, 0.9937, 0.9858, 0.9192, 0.9966, 0.9932, 0.9966, 0.979, 0.999, 0.9281, 0.9766, 0.6482, 0.998, 0.979, 0.9791, 0.668, 0.9805, 0.9937, 0.9985, 0.9927, 0.9946, 0.9819, 0.9995], "coor_probs": [0.9487, 0.9478, 0.9429, 0.8926, 0.9194, 0.8315, 0.6768, 0.7422, 0.8052, 0.8506, 0.7881, 0.8755, 0.9028, 0.8931, 0.8613, 0.9092, 0.9087, 0.9023, 0.9048, 0.9253, 0.9062, 0.6792, 0.8188, 0.8203, 0.8672, 0.7769, 0.9058, 0.8975, 0.9019, 0.8525, 0.8726, 0.9199, 0.9253, 0.9229, 0.9395, 0.8936, 0.8843, 0.9219, 0.9263, 0.9224, 0.9419, 0.9302, 0.936, 0.918, 0.9194, 0.9302, 0.9263, 0.9316, 0.9282, 0.8579, 0.9121, 0.8394, 0.9038, 0.8032, 0.9058, 0.8208, 0.8599, 0.8989, 0.9126, 0.7656, 0.915, 0.917, 0.9136, 0.793, 0.8906, 0.8486, 0.855, 0.6602, 0.8608, 0.8364, 0.9121, 0.916, 0.9058, 0.9312, 0.9243, 0.9248, 0.853, 0.9443, 0.9453, 0.9473, 0.9336, 0.9321, 0.9434, 0.9429, 0.936, 0.9268, 0.9141, 0.9126, 0.9419, 0.873, 0.9233, 0.8501, 0.9131, 0.8916, 0.8984, 0.6094, 0.8965, 0.9141, 0.8745, 0.9316, 0.916, 0.8662, 0.8608, 0.8677, 0.8506, 0.752, 0.9102, 0.9165, 0.9189, 0.9082, 0.9126, 0.9136, 0.9116, 0.8726, 0.9072, 0.8174, 0.8423, 0.855, 0.9028, 0.9072, 0.8438, 0.8979, 0.9175, 0.897, 0.9194, 0.8525, 0.8604, 0.8887, 0.8467, 0.9331, 0.9263, 0.9292, 0.9214, 0.9194, 0.9038, 0.9175, 0.8984, 0.749, 0.8774, 0.9297, 0.9126, 0.8965, 0.9175, 0.9155, 0.769, 0.8882, 0.7886, 0.8911, 0.9185, 0.9473, 0.9473, 0.9468, 0.9141, 0.8311, 0.9316, 0.7446, 0.9341, 0.9424, 0.9341, 0.8408, 0.9165, 0.8955, 0.9165, 0.9263, 0.9248, 0.9399, 0.9395, 0.9473, 0.9521, 0.9497, 0.9492, 0.9312, 0.9414, 0.7969, 0.8901, 0.8667, 0.9238, 0.9277, 0.9214, 0.9194, 0.915, 0.8706, 0.9204, 0.8833, 0.8389, 0.8804, 0.9126, 0.936, 0.9478, 0.9272, 0.9238, 0.9302, 0.9175, 0.9155, 0.9268, 0.9395, 0.9204, 0.9072, 0.8799, 0.9116, 0.9087, 0.9165, 0.9292, 0.896, 0.8794, 0.9312, 0.8564, 0.8584, 0.8999, 0.9346, 0.9351, 0.9248, 0.9204, 0.916, 0.9287, 0.8682, 0.9014, 0.9175, 0.8906, 0.8696, 0.8232, 0.8579, 0.8975, 0.9229, 0.9014, 0.9385, 0.7944, 0.8613, 0.9224, 0.9126, 0.8506, 0.918, 0.9175, 0.8765, 0.897, 0.918, 0.9351, 0.9185, 0.8921, 0.9219, 0.9092, 0.8887, 0.8438, 0.895, 0.9165, 0.9209, 0.8579, 0.9048, 0.9229, 0.9028, 0.9126, 0.9224, 0.8896, 0.9414, 0.9478, 0.9629, 0.9478, 0.937, 0.9414, 0.8965, 0.8833, 0.8911, 0.9312, 0.9331, 0.894, 0.9097, 0.9238, 0.9272, 0.9058, 0.9028, 0.9268, 0.897, 0.9463, 0.9487, 0.9243, 0.958, 0.9492, 0.9443, 0.9443, 0.938, 0.9351, 0.9067, 0.8789, 0.939, 0.9375, 0.9385, 0.9395, 0.9346, 0.9106, 0.9165, 0.9033, 0.896, 0.9282, 0.9302, 0.8843, 0.9253, 0.9399, 0.9307, 0.9082, 0.9404, 0.9014, 0.9307, 0.8989, 0.9243, 0.9194, 0.9292, 0.9268, 0.9482, 0.9438, 0.9541, 0.9419, 0.9517, 0.9429, 0.9434, 0.9521, 0.9307, 0.9468, 0.936, 0.8999, 0.9189, 0.9087, 0.9126, 0.9092, 0.9316, 0.9014, 0.8872, 0.8232, 0.8921, 0.9453, 0.9121, 0.9116, 0.8164, 0.9326, 0.9478, 0.8896, 0.9282, 0.9165, 0.9268, 0.9009, 0.9126, 0.9365, 0.9258, 0.9355, 0.9214, 0.9395, 0.9106, 0.9277, 0.8779, 0.9097, 0.7949, 0.9453, 0.9224, 0.9189, 0.9243, 0.9268, 0.9385, 0.8843, 0.9116, 0.8984, 0.9312, 0.9155, 0.9004, 0.7861, 0.9272, 0.9355, 0.9268, 0.8823, 0.9263, 0.9136, 0.9189, 0.9287, 0.7939, 0.9009, 0.9106, 0.9307, 0.9019, 0.9307, 0.9604, 0.9443, 0.9458, 0.9531, 0.9468, 0.9531, 0.9385, 0.9448, 0.9497, 0.957, 0.9482, 0.9404, 0.9561, 0.9468, 0.9463, 0.9546, 0.9468, 0.9429, 0.9214, 0.9302, 0.916, 0.9434, 0.9375, 0.9404, 0.9341, 0.9263, 0.9175, 0.9165, 0.9009, 0.8979, 0.8911, 0.9253, 0.9248, 0.9014, 0.9307, 0.9219, 0.8989, 0.9185, 0.9189, 0.9468, 0.9072, 0.939, 0.9463, 0.9028, 0.9395, 0.9331, 0.9014, 0.9214, 0.9297, 0.9253, 0.9287, 0.8838, 0.915, 0.9028, 0.8989, 0.9355, 0.8721, 0.9141, 0.9238, 0.9165, 0.9185, 0.9023, 0.9243, 0.9072, 0.8745, 0.9238, 0.9316, 0.9326, 0.9229, 0.9341, 0.9331, 0.9307, 0.9478, 0.9526, 0.9531, 0.9546, 0.9521, 0.9473, 0.9531, 0.9521, 0.9517, 0.9487, 0.9419, 0.9326, 0.9482, 0.9443, 0.9414, 0.9111, 0.9155, 0.9028, 0.9219, 0.6235, 0.6226, 0.6001, 0.7559, 0.7476, 0.6372, 0.645, 0.8301, 0.54, 0.7266, 0.6113, 0.7026, 0.8457], "char_ids": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480], "line_ids": [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 37, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52], "layer": [[0, 0], [0, 0], [0, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 2], [0, 2], [0, 2], [0, 2], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [2, 0, 0], [2, 0, 0], [2, 0, 0], [2, 0, 0], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 0, 1], [2, 1, 0], [2, 1, 0], [2, 1, 0], [2, 1, 0], [2, 1, 0], [2, 1, 0], [2, 1, 0], [2, 1, 1], [2, 1, 1], [2, 1, 1], [2, 1, 1], [2, 1, 1], [2, 1, 1], [2, 1, 1], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 2, 0], [3, 2, 0], [3, 2, 0], [3, 2, 0], [3, 2, 0], [3, 2, 0], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [4, 0, 0], [4, 0, 0], [4, 0, 1], [4, 0, 1], [4, 1], [4, 1], [4, 1], [4, 2, 0], [4, 2, 0], [4, 2, 1], [4, 2, 1], [4, 3], [4, 3], [4, 3], [4, 4, 0], [4, 4, 0], [4, 4, 1], [4, 4, 1], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 6], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [5, 1], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 0], [7, 0, 1], [7, 0, 1], [7, 0, 1], [7, 0, 1], [7, 0, 1], [7, 0, 1], [7, 0, 1], [7, 0, 1], [7, 0, 1], [7, 0, 1], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 2], [7, 0, 3], [7, 0, 3], [7, 0, 3], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 4], [7, 0, 5], [7, 0, 5], [7, 0, 5], [7, 0, 6], [7, 0, 6], [7, 0, 6], [7, 0, 6], [7, 0, 6], [7, 0, 7], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [7, 0, 8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [9, 0, 0], [9, 0, 0], [9, 0, 1], [9, 0, 1], [9, 0, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 0], [10, 0, 1], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 2], [10, 0, 3], [10, 0, 3], [10, 0, 3], [10, 0, 3], [10, 0, 3], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 4], [10, 0, 5], [10, 0, 5], [10, 0, 5], [10, 0, 5], [11, 0], [11, 1], [11, 1], [11, 1], [11, 1], [11, 1], [11, 1], [11, 1], [11, 1], [11, 2], [11, 2], [11, 2], [11, 2]], "option": [{}, {"従": 0.0271}, {}, {}, {}, {"虛": 0.4264}, {"尢": 0.0186, "尤": 0.0037}, {"静": 0.3959, "瀞": 0.0396}, {"池": 0.131, "地": 0.0952, "他": 0.0578, "阤": 0.0141, "迆": 0.0086, "巾": 0.0053}, {}, {}, {"凊": 0.1544, "淸": 0.007, "情": 0.0041}, {"静": 0.3561}, {}, {}, {"內": 0.3193}, {"特": 0.0864, "㭙": 0.0072}, {}, {}, {"虛": 0.3587}, {}, {}, {}, {"爲": 0.3056, "偽": 0.0054, "马": 0.0041, "焉": 0.004, "𫠉": 0.0036}, {}, {}, {}, {}, {}, {"晚": 0.1563, "曉": 0.1006, "慎": 0.086, "懔": 0.0835, "居": 0.0763, "霆": 0.0653, "應": 0.0634}, {}, {}, {}, {"戌": 0.3358, "戍": 0.0137, "攻": 0.0124, "戊": 0.0123, "成": 0.0052}, {}, {"閖": 0.0413, "閉": 0.0095, "閙": 0.0026}, {}, {"小": 0.3525, "心": 0.0165, "止": 0.0102}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"安": 0.0966, "如": 0.0964, "好": 0.093, "郊": 0.0892, "數": 0.088, "𡚱": 0.0842, "姲": 0.0832}, {}, {}, {}, {"沙": 0.0398}, {}, {"列": 0.0305}, {}, {"静": 0.3291}, {"按": 0.0141, "變": 0.0074, "載": 0.0044}, {"沁": 0.0146}, {}, {}, {}, {}, {"户": 0.0757, "庄": 0.0569, "正": 0.0071, "長": 0.0039, "在": 0.0039}, {"湜": 0.0144}, {"井": 0.0356, "兆": 0.0088, "养": 0.0066, "罪": 0.004, "卷": 0.0035}, {"二": 0.0097, "冖": 0.0076}, {}, {"趣": 0.008}, {}, {"谐": 0.0659, "𣅜": 0.005}, {}, {}, {}, {}, {"地": 0.1342, "廿": 0.0589, "卄": 0.047, "北": 0.0239, "出": 0.019, "阤": 0.0112, "曲": 0.009}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"𢖽": 0.0266}, {"个": 0.0151}, {}, {}, {}, {"毒": 0.176, "海": 0.0547, "每": 0.0404, "娑": 0.0213, "汝": 0.0142, "要": 0.0125, "母": 0.0098}, {"階": 0.3744, "谐": 0.0038}, {"顺": 0.3288}, {"利": 0.2973, "和": 0.0775, "非": 0.0286, "𣏌": 0.0221, "礼": 0.0218, "似": 0.0169, "代": 0.0113}, {"昜": 0.0516}, {"疋": 0.0161, "𤴓": 0.0086}, {"做": 0.0157}, {"新": 0.17, "豉": 0.1048, "𧯞": 0.0304, "斯": 0.0181, "暫": 0.0126, "訴": 0.0085}, {"顙": 0.0071, "碩": 0.0071}, {"泌": 0.1087, "祕": 0.0875, "佖": 0.0672, "怭": 0.0488, "秘": 0.0442}, {"縱": 0.1157, "傱": 0.0632, "嵷": 0.0571, "暰": 0.0418, "䢨": 0.0365, "漎": 0.0282, "蹤": 0.0194}, {"夕": 0.2497, "次": 0.1463, "刄": 0.034, "乆": 0.032, "乄": 0.0304}, {}, {}, {"来": 0.0695, "銶": 0.0163}, {}, {"旡": 0.1684}, {"攤": 0.0089, "灘": 0.0061}, {}, {"池": 0.0092}, {}, {}, {"日": 0.3545}, {"和": 0.0297, "鎮": 0.0052}, {}, {}, {"𭔱": 0.0423}, {"痴": 0.0071}, {}, {"庵": 0.1232, "原": 0.0847, "个": 0.0542, "蜃": 0.0389, "亷": 0.0285, "𠀚": 0.0245, "遂": 0.0225}, {}, {"國": 0.0223}, {}, {"張": 0.304, "帳": 0.0043}, {"久": 0.314}, {}, {}, {}, {}, {}, {}, {"麁": 0.0084}, {"七": 0.2699, "池": 0.0554, "毛": 0.0157, "他": 0.0125, "花": 0.0085, "身": 0.0081}, {"卅": 0.165, "般": 0.1402, "册": 0.0457, "卌": 0.0405, "無": 0.0392, "飛": 0.0352, "一": 0.0334}, {"𣂺": 0.0102}, {}, {}, {}, {"桉": 0.0153}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"悪": 0.0539}, {}, {}, {}, {}, {}, {}, {"𪷂": 0.047, "幕": 0.0275, "暮": 0.0266}, {"出": 0.0784, "乜": 0.0763, "比": 0.0469, "地": 0.0379, "七": 0.0257, "虫": 0.0145, "切": 0.0109}, {}, {}, {}, {}, {}, {}, {}, {}, {"日": 0.0148}, {"杜": 0.0144}, {"尤": 0.3858, "元": 0.0216}, {"𣱵": 0.1145, "沫": 0.104, "詠": 0.0968, "求": 0.0916, "抹": 0.0796, "袜": 0.0629, "泳": 0.0559}, {"乜": 0.0131, "出": 0.0047}, {"湜": 0.0259}, {}, {}, {}, {"浞": 0.351, "促": 0.0325}, {"地": 0.0074, "出": 0.0036}, {}, {}, {"日": 0.2875}, {}, {"奠": 0.0096, "嗼": 0.0057}, {"犬": 0.011, "太": 0.0089}, {}, {}, {}, {}, {}, {}, {"太": 0.0167}, {"淤": 0.0404}, {}, {"嘚": 0.0104, "羯": 0.0103, "捍": 0.0068, "𠊚": 0.0057}, {}, {}, {}, {}, {}, {}, {"促": 0.0233}, {}, {}, {"痱": 0.0258, "剕": 0.008, "兆": 0.0061}, {"識": 0.0174}, {}, {}, {}, {}, {}, {"促": 0.0202}, {"代": 0.1678, "發": 0.1186, "紫": 0.1112, "按": 0.1103, "臓": 0.1078, "满": 0.1071, "就": 0.1049}, {}, {"渚": 0.0196, "褚": 0.0031}, {"劉": 0.1241, "𧉨": 0.0432, "蜀": 0.038, "仍": 0.0241, "郞": 0.0236, "留": 0.0219, "马": 0.0183}, {}, {}, {}, {"涘": 0.0689, "俟": 0.0111, "埃": 0.0026}, {}, {}, {}, {}, {"湜": 0.0357, "隄": 0.0066}, {"则": 0.3212}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"膈": 0.0742, "鬲": 0.05, "編": 0.0455, "聊": 0.0396, "斋": 0.0329, "隔": 0.0307, "扁": 0.03}, {"氓": 0.0668, "眠": 0.0455, "冺": 0.0414, "泯": 0.0065, "氏": 0.005, "珉": 0.0049}, {}, {"困": 0.1116, "札": 0.0173, "杜": 0.0048}, {"和": 0.0892, "臭": 0.0599, "尖": 0.0523, "更": 0.0495, "似": 0.0396, "奚": 0.0395, "只": 0.03}, {"𣂺": 0.0238}, {"齩": 0.1036, "較": 0.0236, "𪁉": 0.0146, "餃": 0.0134, "皎": 0.0133, "骹": 0.0105}, {"萑": 0.1651, "星": 0.1465, "且": 0.0754, "冝": 0.0536, "隹": 0.0524, "雀": 0.0511, "翟": 0.0464}, {}, {}, {"別": 0.3514}, {"夲": 0.0209}, {"曰": 0.3328}, {}, {"旧": 0.2122}, {}, {}, {}, {}, {}, {}, {}, {"个": 0.0326, "丕": 0.0032}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"巳": 0.019}, {}, {}, {}, {}, {}, {}, {}, {}, {"了": 0.028}, {"日": 0.3594}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"眀": 0.1636, "旧": 0.1238, "胉": 0.1169, "䀠": 0.095, "胆": 0.0928, "阳": 0.0879, "抇": 0.0877}, {}, {}, {}, {"石": 0.0245}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"𫝀": 0.1077, "吾": 0.0212, "五": 0.0125, "左": 0.005, "召": 0.004}, {}, {}, {}, {}, {"偽": 0.0135}, {}, {}, {}, {"𠖇": 0.021}, {}, {}, {"𮗚": 0.3462, "𰴔": 0.0122, "観": 0.008, "欟": 0.0071}, {}, {}, {"倶": 0.0309}, {"損": 0.4392}, {}, {}, {"𢖽": 0.0185}, {}, {}, {}, {}, {}, {}, {"𢈏": 0.3382}, {}, {}, {}, {}, {}, {}, {}, {"坐": 0.014}, {}, {}, {}, {"𢙣": 0.0518, "恩": 0.0076, "恶": 0.0033}, {"虜": 0.0493, "盧": 0.0151, "𭞐": 0.0106, "廬": 0.0058, "𠫂": 0.0045}, {}, {}, {"必": 0.2658, "心": 0.0872, "梁": 0.0848, "丶": 0.0693, "八": 0.0692, "卜": 0.0644, "述": 0.0562}, {}, {}, {}, {"亡": 0.0089, "二": 0.0067}, {}, {}, {}, {"熱": 0.004, "尢": 0.0037, "走": 0.0035, "㦲": 0.0034}, {}, {}, {}, {"𣃥": 0.0171}, {}, {"數": 0.0112}, {}, {}, {}, {}, {}, {}, {}, {"歳": 0.3563, "𫞓": 0.0274}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"涉": 0.3748}, {"淤": 0.3763}, {}, {}, {}, {}, {"乜": 0.015}, {"荘": 0.0247}, {}, {"日": 0.3446, "𠔼": 0.006}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"猪": 0.0118, "渚": 0.0058}, {}, {}, {}, {}, {"巾": 0.0146, "出": 0.0083}, {}, {"日": 0.3571}, {"旡": 0.013, "元": 0.0053}, {}, {}, {"牲": 0.1135, "徃": 0.0079}, {}, {}, {}, {}, {"末": 0.0212}, {"乙": 0.0155}, {}, {"遺": 0.0197, "改": 0.0191, "池": 0.0131, "維": 0.0118, "遂": 0.0094, "睺": 0.0091, "慈": 0.0086}, {"𢩭": 0.3093, "村": 0.1834, "扌": 0.153}, {}, {}, {}, {}, {}, {"白": 0.0773, "日": 0.0217}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"𢿙": 0.0729}, {}, {}, {}, {"𤣥": 0.0135}, {}, {"煮": 0.0392, "老": 0.0269}, {"旧": 0.0112}, {"日": 0.3489}, {}, {"孑": 0.0109}, {"长": 0.0091, "古": 0.0051}, {"歳": 0.3175, "𫞓": 0.011}, {}, {}, {}, {}, {}, {}, {}], "text": "安從來【恬憺虚无靜也法道清靜精氣内持故】【其虚邪不能為害恬蹄廉反舊音淡是】以志閑而\n少欲心安而不懼形勞而不倦䢿【機息故少欲外紛靜故心】【然情欲两亡是非一貫起】\n【居皆適故】【不倦也氣從以順各從其欲皆得所願】【志不貪故所欲皆】【順心易足故所願】\n【必從以不異求故无難得他老子】【曰知足不辱知止還殆回以長乆】故美其食【順精麄也髮新】【校正云按别本】\n【美一】【作甘】任其服【隨美】【惡也】樂其俗【去傾】【慕也】髙下不相慕其民故曰朴 无\n末也是所謂心足也老子曰禍莫大於不知足咎莫大於欲 得故知足之足常足矣盖非謂物足者為知足錢足者乃為\n【知足矣不恣於欲是則朴同故聖人云我無】【欲而民自朴矣新校集云按别本日作日是】以嗜欲不能\n【目不妄視故嗜欲不能勞心与玄】【勞其目淫邪不能惑其心】【同故淫邪不能惑老子曰不見可】【情計两】【欲使心不乱又昍愚智賢不肖不懼於物故合於道】【亡不為】【人為腹不為】【聖】【謀府冥心一觀勝𧴥俱捐故心志保安合同於道庚桑楚田】\n汝形抱汝生无使汝思慮營營字新校正云按全元起註\n【云合】【於道数】所以能年皆度百歲而動作不衰者以其德全不危\n【不渉於危故德全也莊子曰執道者德全德全者形全形】【也】【全者聖人之道也又曰无為而性命不全者未之有也】【材謂材幹可】【帝曰人年老而無子者材力盡邪將天數然也】【以立身者】\n伯 曰女子七歲腎氣盛 齒更髮長"}
\ No newline at end of file
diff --git a/Data/json/1/67997bf16a7c2e2f7489a6f97ae8a83e.json b/Data/json/1/67997bf16a7c2e2f7489a6f97ae8a83e.json
new file mode 100644
index 0000000..a2b498a
--- /dev/null
+++ b/Data/json/1/67997bf16a7c2e2f7489a6f97ae8a83e.json
@@ -0,0 +1 @@
+{"FileName": "67997bf16a7c2e2f7489a6f97ae8a83e", "ContentType": "image/png", "Width": 889, "Height": 1393, "Size": 2345247, "Layout": 0, "Area": "[]", "Compact": 1, "CharNumber": 696, "LineNumber": 35, "chars": ["人", "造", "字", "轉", "注", "之", "法", "厥", "後", "文", "字", "滋", "生", "莫", "識", "其", "本", "許", "君", "特", "得", "義", "故", "入", "句", "部", "許", "書", "分", "部", "之", "精", "類", "皆", "如", "此", "曷", "言", "乎", "其", "窮", "流", "溯", "源", "次", "弟", "先", "後", "轉", "注", "之", "指", "顯", "然", "矣", "顧", "其", "言", "凡", "某", "本", "義", "也", "許", "君", "每", "部", "之", "下", "悉", "以", "類", "相", "從", "雖", "後", "人", "假", "用", "已", "之", "屬", "皆", "从", "某", "也", "有", "指", "本", "部", "而", "言", "者", "有", "指", "異", "部", "而", "言", "者", "久", "許", "必", "標", "其", "本", "義", "以", "从", "本", "形", "使", "古", "人", "造", "字", "之", "意", "了", "然", "若", "白", "部", "自", "皎", "字", "至", "皛", "字", "均", "從", "白", "得", "義", "老", "部", "自", "耋", "字", "至", "可", "覩", "此", "轉", "注", "之", "一", "大", "例", "也", "如", "假", "氣", "爲", "气", "假", "前", "爲", "歬", "假", "考", "字", "皆", "從", "老", "得", "義", "此", "指", "本", "部", "而", "言", "也", "此", "類", "隨", "舉", "皆", "是", "若", "三", "部", "憂", "爲", "㥑", "假", "和", "爲", "龢", "經", "傳", "多", "有", "之", "詐", "則", "氣", "入", "米", "部", "饋", "客", "兜", "部", "只", "載", "一", "文", "亦", "特", "爲", "立", "部", "者", "以", "王", "王", "龜", "黽", "等", "字", "由", "芻", "米", "也", "而", "气", "部", "訓", "云", "雲", "气", "也", "象", "形", "而", "本", "義", "見", "矣", "前", "入", "此", "而", "生", "故", "也", "又", "或", "本", "字", "之", "類", "實", "無", "所", "屬", "而", "他", "部", "之", "字", "刀", "部", "齊", "斷", "也", "而", "止", "部", "歬", "字", "訓", "云", "不", "行", "而", "進", "謂", "之", "歬", "从", "旣", "有", "从", "此", "者", "則", "亦", "自", "爲", "一", "部", "如", "才", "耑", "等", "部", "僅", "載", "一", "文", "止", "在", "舟", "上", "而", "本", "義", "見", "矣", "憂", "入", "久", "部", "爲", "和", "之", "行", "和", "入", "口", "上", "下", "亦", "不", "相", "比", "次", "則", "所", "从", "又", "指", "遠", "部", "而", "言", "萈", "部", "云", "寛", "部", "訓", "云", "相", "應", "若", "此", "之", "類", "嚮", "非", "許", "君", "顯", "爲", "表", "出", "誰", "復", "知", "字", "从", "此", "草", "爲", "山", "羊", "細", "角", "者", "故", "不", "入", "艸", "部", "厂", "部", "云", "虒", "字", "从", "此", "是", "也", "顧", "許", "造", "字", "之", "本", "旨", "乎", "至", "其", "訓", "釋", "之", "例", "又", "約", "有", "六", "曰", "本", "字", "如", "君", "分", "部", "之", "例", "悉", "有", "精", "義", "非", "如", "後", "世", "字", "書", "僅", "據", "偏", "㫄", "區", "言", "部", "讓", "相", "責", "讓", "也", "辵", "部", "道", "所", "行", "道", "也", "之", "屬", "曰", "偏", "㫄", "字", "別", "若", "井", "部", "荆", "下", "云", "罰", "辠", "也", "从", "刀", "井", "易", "曰", "井", "者", "法", "也", "段", "氏", "如", "辵", "部", "延", "正", "行", "也", "言", "部", "誼", "人", "所", "宜", "也", "之", "屬", "曰", "疉", "本", "字", "云", "此", "易", "緯", "說", "㓝", "與", "罰", "俱", "从", "刀", "而", "㓝", "特", "入", "井", "部", "蓋", "罰", "者", "持", "刀", "如", "刄", "部", "刄", "行", "遲", "久", "久", "也", "夋", "行", "夋", "夋", "也", "之", "屬", "曰", "雙", "聲", "字", "罵", "詈", "罰", "字", "本", "注", "系", "諸", "受", "法", "者", "荆", "者", "以", "刀", "治", "辠", "系", "諸", "執", "法", "者", "如", "㫄", "溥", "也", "俚", "聊", "也", "鼓", "郭", "也", "儒", "柔", "也", "之", "屬", "曰", "疊", "韻", "字", "如", "重", "在", "守", "法", "故", "入", "井", "部", "此", "正", "得", "古", "人", "造", "字", "之", "本", "意", "他", "若", "戸", "護", "也", "門", "聞", "也", "之", "屬", "曰", "連", "字", "如", "𧺆", "部", "趍", "趙", "久", "也", "辵", "部", "𢆶", "部", "幽", "本", "从", "山", "𢆶", "亦", "聲", "也", "然", "以", "𢆶", "得", "義", "故", "入", "𢆶", "部", "𢆶", "注", "唐", "逮", "及", "也", "之", "屬", "此", "六", "例", "者", "要", "皆", "訓", "明", "本", "義", "使", "人", "知", "形", "云", "㣲", "也", "句", "部", "拘", "鉤", "字", "本", "从", "手", "从", "金", "句", "亦", "聲", "也", "然", "以", "句", "曲", "聲", "與", "義", "相", "爲", "表", "裏", "而", "六", "書", "之", "旨", "益", "明", "則", "許", "書", "本", "義", "之"], "coors": [[719, 134, 747, 160], [717, 161, 749, 189], [718, 189, 749, 214], [717, 213, 749, 241], [719, 242, 748, 267], [721, 268, 748, 292], [719, 292, 749, 320], [720, 322, 750, 346], [717, 345, 750, 373], [718, 372, 751, 398], [719, 398, 751, 425], [722, 425, 752, 452], [721, 453, 751, 476], [721, 478, 752, 505], [721, 504, 753, 530], [721, 532, 753, 557], [722, 557, 752, 583], [721, 584, 753, 610], [722, 614, 753, 638], [723, 638, 754, 664], [725, 710, 758, 737], [727, 737, 757, 765], [727, 765, 757, 791], [727, 791, 757, 817], [726, 817, 756, 844], [728, 845, 758, 869], [727, 871, 758, 896], [727, 896, 759, 925], [729, 925, 759, 950], [727, 950, 759, 976], [729, 977, 759, 1002], [726, 1002, 759, 1030], [727, 1030, 759, 1056], [729, 1056, 759, 1084], [725, 1084, 759, 1109], [727, 1110, 760, 1136], [726, 1137, 760, 1164], [729, 1165, 758, 1190], [729, 1190, 759, 1215], [727, 1214, 760, 1241], [676, 134, 707, 162], [676, 162, 705, 189], [677, 189, 706, 215], [677, 216, 706, 242], [677, 241, 707, 267], [678, 267, 708, 295], [677, 294, 708, 319], [676, 319, 708, 346], [677, 346, 708, 373], [680, 373, 708, 400], [679, 399, 708, 423], [678, 425, 710, 452], [679, 452, 710, 479], [678, 479, 710, 505], [679, 505, 709, 530], [678, 531, 710, 558], [679, 557, 710, 584], [679, 585, 710, 611], [682, 612, 710, 637], [680, 637, 712, 666], [686, 711, 715, 736], [685, 737, 715, 766], [685, 766, 715, 790], [685, 791, 716, 817], [684, 818, 715, 844], [685, 845, 716, 870], [685, 871, 717, 898], [687, 899, 715, 923], [687, 926, 716, 950], [687, 953, 717, 976], [688, 977, 716, 1004], [685, 1003, 717, 1031], [685, 1030, 717, 1054], [685, 1056, 715, 1084], [686, 1084, 718, 1109], [684, 1109, 718, 1136], [686, 1137, 717, 1162], [685, 1163, 716, 1188], [685, 1189, 717, 1215], [690, 1217, 716, 1241], [635, 136, 663, 161], [633, 161, 664, 189], [634, 189, 664, 215], [633, 216, 663, 242], [634, 242, 665, 269], [636, 269, 665, 293], [635, 293, 665, 320], [635, 319, 666, 346], [635, 347, 667, 372], [635, 371, 667, 399], [636, 401, 667, 426], [636, 426, 667, 452], [636, 452, 668, 480], [636, 479, 668, 505], [638, 504, 667, 531], [638, 532, 669, 559], [637, 558, 670, 584], [638, 584, 669, 610], [637, 611, 668, 638], [638, 637, 669, 664], [643, 711, 673, 737], [644, 739, 672, 765], [645, 766, 673, 790], [642, 790, 673, 817], [643, 818, 673, 843], [643, 845, 674, 869], [642, 869, 675, 899], [645, 900, 674, 924], [642, 926, 675, 950], [642, 950, 675, 977], [642, 977, 674, 1003], [642, 1003, 675, 1030], [645, 1030, 675, 1055], [642, 1056, 676, 1084], [646, 1084, 676, 1109], [645, 1111, 675, 1136], [646, 1137, 674, 1161], [645, 1162, 677, 1189], [645, 1190, 673, 1214], [644, 1216, 674, 1242], [595, 137, 627, 163], [597, 163, 628, 189], [596, 190, 628, 215], [599, 215, 628, 242], [598, 242, 630, 269], [600, 269, 630, 294], [599, 296, 629, 321], [600, 320, 630, 348], [598, 348, 632, 373], [599, 372, 631, 400], [600, 399, 630, 426], [603, 426, 631, 451], [600, 452, 633, 480], [602, 479, 633, 508], [603, 506, 633, 532], [603, 532, 635, 558], [606, 559, 634, 584], [604, 584, 634, 611], [604, 611, 634, 638], [604, 639, 635, 665], [601, 712, 631, 735], [598, 737, 632, 765], [602, 765, 632, 790], [601, 791, 633, 818], [604, 820, 632, 844], [604, 845, 632, 870], [603, 879, 631, 888], [601, 896, 632, 924], [601, 923, 632, 950], [603, 950, 633, 976], [601, 977, 631, 1003], [602, 1003, 633, 1030], [602, 1030, 633, 1056], [601, 1055, 633, 1084], [602, 1083, 634, 1107], [601, 1109, 634, 1137], [604, 1135, 634, 1162], [603, 1164, 635, 1189], [603, 1189, 634, 1218], [603, 1218, 635, 1243], [553, 137, 583, 164], [555, 162, 585, 190], [555, 191, 585, 217], [554, 217, 585, 243], [556, 242, 586, 268], [555, 269, 586, 296], [556, 295, 588, 322], [557, 322, 587, 349], [557, 348, 588, 375], [556, 374, 589, 400], [557, 400, 590, 427], [559, 427, 589, 454], [559, 454, 590, 480], [560, 480, 590, 505], [576, 506, 597, 532], [576, 533, 598, 557], [578, 560, 598, 584], [554, 506, 575, 532], [555, 535, 574, 559], [555, 561, 575, 584], [559, 584, 593, 613], [561, 616, 593, 638], [561, 639, 595, 666], [558, 712, 589, 738], [558, 738, 589, 764], [559, 766, 588, 792], [557, 791, 589, 818], [558, 820, 590, 844], [557, 845, 591, 870], [558, 871, 590, 897], [557, 898, 591, 925], [559, 924, 591, 950], [557, 950, 589, 977], [557, 976, 590, 1003], [560, 1004, 590, 1028], [559, 1030, 591, 1056], [561, 1058, 590, 1083], [558, 1082, 592, 1109], [561, 1111, 589, 1135], [559, 1137, 591, 1163], [558, 1163, 592, 1188], [559, 1188, 591, 1215], [559, 1217, 591, 1243], [513, 139, 542, 165], [512, 165, 543, 191], [514, 193, 542, 216], [512, 216, 544, 245], [515, 253, 542, 261], [514, 268, 544, 296], [513, 296, 545, 323], [513, 322, 546, 350], [514, 349, 546, 375], [516, 375, 548, 399], [515, 400, 548, 427], [517, 427, 548, 455], [519, 454, 549, 481], [518, 483, 548, 507], [518, 508, 548, 534], [518, 533, 549, 560], [521, 559, 549, 586], [519, 585, 550, 612], [520, 612, 550, 641], [522, 641, 550, 665], [517, 713, 546, 739], [516, 739, 546, 767], [518, 767, 548, 792], [518, 794, 546, 817], [518, 818, 547, 843], [516, 845, 548, 871], [518, 871, 547, 899], [517, 899, 547, 924], [517, 924, 548, 951], [517, 950, 549, 976], [518, 977, 547, 1003], [516, 1003, 548, 1031], [518, 1031, 548, 1057], [520, 1058, 548, 1082], [519, 1084, 548, 1109], [517, 1109, 549, 1137], [520, 1137, 549, 1161], [518, 1161, 549, 1188], [520, 1188, 548, 1215], [519, 1216, 550, 1242], [469, 140, 500, 166], [471, 166, 499, 192], [469, 193, 501, 217], [471, 218, 502, 245], [471, 245, 501, 271], [472, 273, 503, 298], [472, 297, 504, 325], [471, 324, 503, 350], [473, 349, 503, 376], [473, 376, 504, 401], [472, 401, 505, 428], [474, 427, 506, 455], [474, 454, 507, 482], [475, 481, 507, 508], [474, 507, 508, 535], [475, 535, 507, 561], [475, 561, 508, 587], [475, 587, 509, 613], [477, 614, 507, 639], [477, 639, 508, 667], [478, 714, 505, 739], [477, 739, 509, 767], [477, 765, 510, 792], [478, 793, 509, 820], [480, 820, 509, 845], [481, 845, 508, 871], [480, 872, 509, 898], [480, 898, 511, 924], [478, 924, 511, 951], [480, 950, 510, 977], [479, 977, 509, 1001], [480, 1004, 510, 1028], [480, 1031, 510, 1056], [478, 1056, 511, 1082], [482, 1082, 511, 1108], [481, 1109, 511, 1136], [481, 1136, 512, 1162], [482, 1162, 511, 1187], [481, 1188, 515, 1216], [480, 1218, 514, 1242], [427, 141, 457, 165], [427, 166, 457, 194], [428, 195, 458, 220], [430, 220, 458, 245], [427, 245, 459, 274], [428, 273, 459, 298], [428, 297, 461, 324], [432, 324, 459, 350], [429, 350, 463, 377], [431, 385, 461, 394], [430, 403, 464, 430], [431, 431, 463, 456], [432, 456, 463, 482], [433, 482, 465, 509], [433, 507, 465, 535], [433, 534, 465, 560], [432, 560, 465, 588], [435, 586, 466, 615], [436, 622, 465, 631], [434, 638, 467, 667], [436, 714, 464, 739], [434, 739, 466, 767], [435, 766, 466, 793], [437, 793, 465, 818], [437, 820, 466, 845], [436, 846, 468, 871], [436, 871, 467, 899], [438, 898, 466, 924], [436, 923, 467, 952], [437, 951, 467, 978], [437, 978, 468, 1001], [438, 1003, 467, 1030], [438, 1030, 468, 1056], [436, 1056, 469, 1082], [437, 1084, 468, 1107], [439, 1109, 468, 1134], [437, 1135, 469, 1161], [437, 1164, 469, 1187], [437, 1188, 469, 1215], [443, 1219, 466, 1241], [385, 142, 414, 166], [385, 169, 415, 193], [384, 194, 415, 221], [385, 222, 416, 246], [385, 246, 418, 272], [387, 273, 418, 297], [387, 298, 420, 325], [388, 326, 419, 351], [388, 351, 419, 379], [387, 378, 421, 406], [389, 404, 420, 430], [388, 430, 422, 455], [390, 455, 421, 482], [388, 482, 422, 509], [391, 510, 422, 535], [390, 536, 422, 560], [391, 561, 422, 587], [391, 588, 423, 614], [393, 616, 423, 638], [393, 639, 425, 667], [393, 713, 424, 740], [392, 740, 424, 767], [393, 770, 422, 792], [392, 793, 423, 819], [392, 820, 424, 847], [393, 847, 423, 873], [393, 873, 423, 899], [395, 899, 423, 922], [393, 924, 425, 951], [394, 950, 426, 977], [396, 977, 426, 1005], [395, 1004, 426, 1030], [395, 1031, 426, 1056], [396, 1056, 427, 1082], [396, 1082, 426, 1108], [396, 1109, 426, 1137], [400, 1136, 425, 1162], [398, 1162, 427, 1187], [397, 1188, 426, 1215], [395, 1218, 428, 1243], [343, 141, 372, 168], [342, 170, 372, 197], [344, 196, 374, 222], [361, 222, 379, 246], [360, 249, 381, 271], [364, 275, 379, 296], [362, 300, 381, 323], [364, 328, 382, 351], [363, 352, 382, 378], [339, 224, 358, 245], [340, 249, 358, 273], [340, 276, 359, 297], [341, 301, 361, 324], [340, 327, 359, 350], [340, 352, 363, 377], [348, 379, 374, 402], [345, 404, 379, 431], [346, 432, 377, 454], [348, 456, 378, 483], [348, 482, 379, 508], [347, 508, 380, 536], [350, 537, 378, 563], [348, 563, 381, 588], [350, 588, 380, 615], [350, 616, 382, 643], [351, 642, 383, 668], [349, 714, 380, 742], [351, 741, 380, 768], [348, 769, 380, 793], [350, 793, 381, 820], [351, 821, 382, 847], [350, 850, 382, 873], [351, 875, 381, 899], [351, 900, 383, 926], [352, 926, 382, 950], [351, 952, 383, 979], [353, 979, 382, 1002], [351, 1003, 383, 1030], [354, 1032, 384, 1056], [352, 1056, 385, 1082], [352, 1082, 384, 1111], [354, 1111, 384, 1136], [357, 1137, 384, 1160], [355, 1162, 385, 1188], [356, 1189, 386, 1216], [356, 1218, 386, 1242], [301, 144, 331, 171], [301, 170, 332, 196], [301, 196, 332, 222], [302, 222, 333, 246], [301, 246, 333, 274], [303, 274, 334, 300], [302, 299, 333, 327], [302, 326, 334, 353], [303, 351, 335, 380], [303, 379, 336, 405], [304, 405, 336, 431], [304, 430, 335, 458], [304, 458, 337, 485], [305, 483, 337, 510], [306, 510, 337, 538], [305, 537, 338, 563], [307, 562, 339, 591], [306, 590, 339, 618], [307, 616, 340, 643], [311, 643, 340, 668], [308, 716, 339, 741], [308, 742, 338, 767], [309, 768, 339, 794], [308, 794, 338, 819], [308, 820, 339, 847], [308, 847, 339, 875], [310, 875, 340, 901], [308, 901, 339, 926], [309, 926, 341, 952], [312, 952, 341, 979], [311, 978, 341, 1005], [309, 1005, 342, 1032], [313, 1032, 341, 1056], [312, 1058, 340, 1084], [312, 1085, 342, 1109], [312, 1109, 343, 1137], [315, 1139, 343, 1161], [312, 1162, 343, 1190], [313, 1190, 344, 1217], [313, 1217, 343, 1243], [258, 143, 288, 169], [257, 170, 289, 198], [259, 197, 289, 223], [259, 223, 291, 250], [260, 249, 290, 275], [262, 276, 290, 301], [261, 303, 291, 325], [259, 327, 291, 354], [261, 352, 292, 380], [263, 380, 292, 405], [263, 406, 293, 432], [263, 432, 292, 457], [262, 458, 293, 485], [264, 485, 295, 512], [268, 513, 294, 535], [263, 537, 294, 564], [263, 563, 297, 590], [266, 590, 296, 617], [266, 616, 296, 643], [282, 645, 305, 668], [261, 647, 281, 669], [265, 715, 297, 742], [266, 739, 296, 767], [266, 767, 298, 793], [265, 796, 296, 820], [266, 823, 297, 846], [266, 847, 299, 874], [267, 875, 298, 901], [267, 901, 297, 926], [266, 926, 299, 952], [267, 952, 299, 977], [268, 978, 299, 1005], [267, 1005, 300, 1032], [269, 1032, 300, 1058], [270, 1059, 299, 1082], [270, 1084, 299, 1109], [269, 1108, 301, 1137], [273, 1138, 298, 1160], [271, 1161, 302, 1190], [271, 1190, 301, 1215], [272, 1216, 301, 1243], [233, 147, 252, 169], [233, 173, 253, 196], [233, 198, 253, 222], [209, 146, 232, 170], [211, 173, 232, 196], [217, 223, 248, 250], [219, 249, 250, 275], [219, 275, 248, 300], [220, 301, 251, 329], [219, 329, 249, 354], [219, 355, 248, 378], [220, 379, 251, 405], [220, 405, 252, 431], [220, 431, 252, 459], [221, 459, 253, 483], [221, 484, 252, 511], [222, 511, 254, 536], [222, 536, 254, 565], [223, 565, 254, 590], [223, 590, 255, 617], [224, 617, 255, 644], [225, 646, 253, 668], [224, 716, 253, 742], [225, 744, 254, 769], [224, 770, 255, 794], [224, 796, 254, 820], [223, 821, 254, 847], [225, 847, 255, 873], [224, 875, 256, 901], [226, 901, 256, 926], [225, 927, 256, 952], [224, 952, 256, 979], [224, 978, 257, 1004], [224, 1004, 258, 1031], [224, 1030, 256, 1059], [227, 1058, 257, 1084], [228, 1084, 258, 1107], [228, 1109, 259, 1137], [230, 1138, 259, 1160], [225, 1162, 261, 1189], [227, 1188, 260, 1215], [227, 1215, 259, 1243], [176, 142, 205, 168], [175, 168, 205, 196], [193, 197, 212, 221], [194, 224, 213, 246], [170, 197, 191, 220], [171, 223, 192, 246], [176, 246, 207, 274], [175, 273, 208, 300], [177, 301, 208, 326], [178, 326, 208, 353], [175, 353, 208, 380], [176, 379, 208, 406], [177, 404, 209, 432], [179, 433, 208, 459], [178, 460, 207, 484], [180, 485, 210, 511], [179, 510, 211, 539], [178, 537, 211, 565], [179, 564, 213, 589], [179, 589, 213, 616], [183, 617, 211, 642], [180, 642, 214, 670], [182, 716, 212, 742], [184, 741, 212, 767], [184, 768, 213, 795], [184, 796, 211, 820], [182, 821, 213, 847], [183, 847, 214, 875], [184, 874, 212, 900], [182, 901, 214, 928], [183, 926, 214, 952], [183, 953, 214, 979], [181, 979, 214, 1005], [184, 1005, 215, 1030], [186, 1032, 213, 1058], [186, 1059, 215, 1082], [185, 1083, 217, 1111], [189, 1113, 216, 1133], [187, 1135, 217, 1162], [186, 1163, 217, 1189], [187, 1190, 217, 1215], [186, 1216, 216, 1242], [132, 142, 163, 169], [134, 169, 163, 195], [135, 196, 164, 221], [135, 222, 164, 247], [135, 248, 165, 274], [133, 275, 164, 300], [134, 300, 166, 326], [136, 327, 166, 353], [135, 355, 166, 381], [135, 382, 167, 406], [134, 404, 167, 433], [137, 433, 167, 458], [137, 458, 167, 485], [139, 486, 168, 513], [138, 512, 168, 538], [139, 540, 169, 564], [137, 564, 170, 591], [138, 591, 170, 617], [138, 617, 170, 644], [138, 643, 170, 669], [139, 716, 171, 741], [141, 741, 172, 769], [141, 770, 173, 794], [143, 794, 172, 820], [143, 821, 172, 848], [142, 850, 171, 874], [142, 875, 172, 900], [142, 901, 171, 928], [144, 928, 171, 950], [143, 952, 172, 979], [142, 979, 170, 1005], [142, 1006, 173, 1032], [142, 1033, 173, 1057], [143, 1058, 176, 1084], [143, 1084, 175, 1110], [144, 1111, 174, 1137], [143, 1138, 175, 1164], [146, 1164, 174, 1189], [143, 1190, 174, 1215], [144, 1217, 176, 1243], [91, 144, 120, 166], [90, 169, 121, 196], [91, 197, 121, 222], [92, 223, 122, 248], [92, 251, 123, 276], [95, 276, 122, 300], [93, 301, 123, 327], [92, 328, 124, 353], [92, 353, 123, 381], [95, 380, 123, 406], [93, 406, 125, 434], [97, 434, 124, 460], [95, 460, 125, 484], [94, 485, 126, 513], [96, 511, 127, 539], [96, 539, 127, 566], [96, 567, 127, 590], [97, 590, 126, 614], [98, 617, 128, 643], [114, 647, 134, 669], [93, 646, 113, 670], [99, 716, 128, 742], [100, 742, 130, 769], [99, 771, 128, 796], [100, 797, 127, 822], [100, 823, 130, 847], [101, 847, 130, 875], [101, 875, 130, 901], [100, 901, 130, 924], [101, 925, 131, 951], [100, 952, 131, 978], [102, 981, 131, 1005], [102, 1005, 131, 1030], [101, 1033, 131, 1057], [103, 1058, 132, 1084], [103, 1084, 133, 1109], [102, 1111, 133, 1138], [104, 1138, 132, 1164], [101, 1164, 134, 1191], [102, 1192, 132, 1214], [101, 1219, 133, 1245], [64, 145, 83, 167], [63, 170, 86, 195], [44, 144, 62, 169], [48, 196, 79, 221], [50, 223, 79, 249], [49, 248, 80, 275], [48, 276, 81, 301], [51, 302, 80, 328], [49, 329, 81, 353], [51, 357, 81, 381], [52, 381, 81, 405], [52, 407, 83, 433], [52, 432, 83, 460], [51, 460, 82, 486], [51, 486, 84, 514], [53, 512, 85, 540], [53, 541, 83, 565], [54, 567, 85, 593], [56, 593, 85, 619], [54, 619, 85, 644], [55, 645, 86, 673], [57, 717, 90, 745], [58, 745, 90, 772], [57, 772, 88, 799], [58, 799, 87, 824], [59, 824, 89, 851], [58, 850, 89, 876], [60, 875, 90, 904], [61, 904, 88, 928], [60, 930, 89, 953], [60, 954, 90, 981], [61, 983, 90, 1006], [60, 1008, 90, 1034], [61, 1033, 93, 1060], [62, 1062, 91, 1085], [62, 1087, 91, 1111], [62, 1113, 92, 1139], [63, 1139, 92, 1165], [63, 1167, 93, 1191], [63, 1192, 93, 1220], [62, 1220, 93, 1244]], "char_probs": [0.9858, 0.9985, 0.9834, 0.998, 0.9985, 0.9878, 0.9976, 0.9976, 0.9907, 0.9755, 0.9771, 0.9902, 0.9941, 0.9971, 0.998, 0.9888, 0.9888, 0.9966, 0.999, 0.999, 0.998, 0.8721, 0.9966, 0.9951, 0.9946, 0.999, 0.9966, 0.9839, 0.9985, 0.999, 0.9878, 0.9971, 0.9153, 0.9961, 0.9951, 0.9956, 0.999, 0.9937, 0.9971, 0.9932, 0.9966, 0.9985, 0.9985, 0.999, 0.9883, 0.9976, 0.9985, 0.9937, 0.9985, 0.9985, 0.9937, 0.951, 0.999, 0.9985, 0.9995, 0.9985, 0.9917, 0.9824, 0.683, 0.999, 0.9878, 0.8883, 0.9937, 0.9966, 0.999, 0.9707, 0.999, 0.9854, 0.9956, 0.9589, 0.9976, 0.983, 0.9961, 0.9976, 0.9985, 0.9932, 0.9893, 0.999, 0.998, 0.6838, 0.9912, 0.9985, 0.9961, 0.9966, 0.999, 0.9922, 0.9956, 0.998, 0.9878, 0.999, 0.9956, 0.9932, 0.9547, 0.9961, 0.9976, 0.9976, 0.999, 0.9976, 0.9976, 0.9746, 0.9932, 0.9849, 0.9995, 0.9971, 0.9922, 0.9854, 0.9829, 0.999, 0.9956, 0.9888, 0.9985, 0.9985, 0.9961, 0.9858, 0.9985, 0.9297, 0.9878, 0.999, 0.9985, 0.9971, 0.9976, 0.9961, 0.999, 0.9937, 0.999, 0.9829, 0.999, 0.4943, 0.9834, 0.999, 0.9971, 0.9912, 0.9985, 0.9384, 0.999, 0.999, 0.9961, 0.9971, 0.9165, 0.999, 0.9976, 0.9985, 0.9966, 0.998, 0.9985, 0.9858, 0.9966, 0.9907, 0.999, 0.9912, 0.9976, 0.999, 0.9985, 0.9834, 0.9995, 0.999, 0.9985, 0.9727, 0.998, 0.999, 0.9995, 0.981, 0.9946, 0.9976, 0.9985, 0.998, 0.979, 0.9961, 0.9951, 0.9839, 0.999, 0.9956, 0.9956, 0.9961, 0.9961, 0.9741, 0.6324, 0.6723, 0.9946, 0.9961, 0.9976, 0.9966, 0.9985, 0.683, 0.9644, 0.1913, 0.999, 0.999, 0.9849, 0.999, 0.9946, 0.9493, 0.9941, 0.9971, 0.9888, 0.6478, 0.9614, 0.9976, 0.9707, 0.9966, 0.999, 0.999, 0.9951, 0.3342, 0.999, 0.999, 0.9941, 0.9961, 0.9653, 0.9937, 0.9985, 0.9829, 0.9985, 0.999, 0.9902, 0.999, 0.9917, 0.9922, 0.9995, 0.9736, 0.999, 0.9785, 0.998, 0.9995, 0.9971, 0.9966, 0.999, 0.999, 0.9985, 0.9966, 0.9961, 0.9985, 0.999, 0.9941, 0.9946, 0.999, 0.9966, 0.9868, 0.9626, 0.9961, 0.9985, 0.9971, 0.998, 0.9961, 0.9985, 0.9932, 0.998, 0.9951, 0.9927, 0.9985, 0.9854, 0.981, 0.9878, 0.9868, 0.9912, 0.998, 0.9976, 0.9985, 0.9976, 0.9985, 0.9985, 0.9912, 0.9858, 0.9985, 0.999, 0.9937, 0.9966, 0.9775, 0.9976, 0.9927, 0.999, 0.9995, 0.9702, 0.9976, 0.9985, 0.9878, 0.999, 0.9976, 0.9985, 0.9985, 0.9902, 0.999, 0.9907, 0.9907, 0.9941, 0.9961, 0.9966, 0.9731, 0.9868, 0.9966, 0.9902, 0.978, 0.9976, 0.999, 0.9976, 0.9985, 0.999, 0.9985, 0.999, 0.999, 0.9761, 0.9976, 0.981, 0.9868, 0.9985, 0.9995, 0.9961, 0.9976, 0.9854, 0.96, 0.9912, 0.9995, 0.9941, 0.998, 0.9902, 0.999, 0.9844, 0.9985, 0.9932, 0.999, 0.9985, 0.9951, 0.9873, 0.9932, 0.9961, 0.9966, 0.9917, 0.9976, 0.9902, 0.998, 0.9863, 0.9971, 0.9766, 0.9907, 0.9971, 0.9966, 0.9985, 0.9976, 0.9976, 0.5654, 0.999, 0.9971, 0.6268, 0.999, 0.9966, 0.9976, 0.9966, 0.9976, 0.9985, 0.9966, 0.9883, 0.9829, 0.9971, 0.9932, 0.9932, 0.999, 0.9985, 0.981, 0.9985, 0.9592, 0.999, 0.9956, 0.9985, 0.9897, 0.9922, 0.9961, 0.3777, 0.601, 0.9922, 0.9976, 0.9907, 0.998, 0.9849, 0.9956, 0.9888, 0.9946, 0.9976, 0.999, 0.8893, 0.999, 0.9922, 0.9927, 0.9818, 0.9971, 0.9966, 0.998, 0.9976, 0.9995, 0.9976, 0.9985, 0.9702, 0.9922, 0.9878, 0.7789, 0.998, 0.9985, 0.9164, 0.9976, 0.9946, 0.9863, 0.999, 0.9844, 0.9971, 0.9976, 0.9985, 0.9937, 0.9878, 0.9766, 0.9956, 0.9985, 0.998, 0.999, 0.9858, 0.999, 0.9976, 0.9902, 0.998, 0.9678, 0.998, 0.9971, 0.9951, 0.9736, 0.9668, 0.9648, 0.999, 0.999, 0.9985, 0.9985, 0.9995, 0.9941, 0.999, 0.9966, 0.9961, 0.9971, 0.9951, 0.9956, 0.9961, 0.999, 0.9932, 0.9976, 0.999, 0.9893, 0.9951, 0.9873, 0.9976, 0.9932, 0.9976, 0.999, 0.9722, 0.5302, 0.9971, 0.998, 0.999, 0.4375, 0.9956, 0.9946, 0.9976, 0.9746, 0.9941, 0.9971, 0.998, 0.9966, 0.9966, 0.9956, 0.9976, 0.9907, 0.9985, 0.9971, 0.9966, 0.9961, 0.9971, 0.9863, 0.999, 0.9683, 0.999, 0.999, 0.9932, 0.998, 0.999, 0.533, 0.9946, 0.9985, 0.475, 0.9932, 0.9912, 0.9985, 0.9961, 0.34, 0.9888, 0.9854, 0.9971, 0.9795, 0.9961, 0.9746, 0.9717, 0.3938, 0.9553, 0.9932, 0.9761, 0.9888, 0.998, 0.9985, 0.443, 0.9985, 0.9868, 0.9985, 0.9985, 0.9976, 0.998, 0.942, 0.9941, 0.9985, 0.9966, 0.9893, 0.999, 0.98, 0.999, 0.999, 0.9412, 0.9692, 0.9956, 0.9766, 0.999, 0.9907, 0.9946, 0.9966, 0.9902, 0.999, 0.9941, 0.9805, 0.9912, 0.9241, 0.9932, 0.9985, 0.998, 0.9609, 0.9722, 0.999, 0.9971, 0.9951, 0.9961, 0.9966, 0.9922, 0.477, 0.9937, 0.9971, 0.9985, 0.9897, 0.9217, 0.9917, 0.9941, 0.9922, 0.9985, 0.9917, 0.9971, 0.9976, 0.998, 0.9922, 0.9995, 0.9971, 0.9927, 0.677, 0.999, 0.9961, 0.9985, 0.9961, 0.9956, 0.9897, 0.9971, 0.9785, 0.7298, 0.9289, 0.9863, 0.9966, 0.9985, 0.9971, 0.9995, 0.9956, 0.998, 0.9946, 0.9956, 0.999, 0.9971, 0.999, 0.9971, 0.9971, 0.9922, 0.9985, 0.9382, 0.9888, 0.9746, 0.9985, 0.9985, 0.998, 0.4567, 0.5328, 0.9966, 0.9608, 0.9839, 0.9932, 0.9868, 0.999, 0.9902, 0.9976, 0.9888, 0.9961, 0.9985, 0.999, 0.4581, 0.9985, 0.9897, 0.9937, 0.9941, 0.999, 0.426, 0.999, 0.9956, 0.9668, 0.9971, 0.998, 0.979, 0.9966, 0.981, 0.9937, 0.999, 0.999, 0.6719, 0.9976, 0.9907, 0.9971, 0.9795, 0.4589, 0.999, 0.4444, 0.999, 0.9985, 0.9985, 0.999, 0.9941, 0.9897, 0.999, 0.9951, 0.9985, 0.9985, 0.9927, 0.9907, 0.9912, 0.9966, 0.9292, 0.9766, 0.9775, 0.9985, 0.9328, 0.9985, 0.9985, 0.9961, 0.2665, 0.9922, 0.9976, 0.9985, 0.998, 0.9961, 0.9878, 0.9893, 0.9971, 0.998, 0.998, 0.9971, 0.9956, 0.9941, 0.9927, 0.9951, 0.999, 0.9985, 0.9932, 0.9873, 0.9844, 0.9442, 0.9751, 0.9961, 0.6836, 0.999, 0.9749, 0.998, 0.999, 0.9863, 0.9888, 0.632, 0.9941, 0.9629, 0.9917, 0.9941, 0.9761, 0.9604, 0.9573, 0.9937], "coor_probs": [0.9292, 0.937, 0.9316, 0.936, 0.9194, 0.9248, 0.9351, 0.9287, 0.9351, 0.9331, 0.9336, 0.9297, 0.9258, 0.938, 0.9331, 0.9282, 0.9341, 0.9312, 0.9243, 0.9189, 0.9189, 0.9302, 0.9287, 0.9253, 0.9268, 0.9224, 0.9307, 0.9351, 0.9268, 0.9316, 0.9209, 0.937, 0.9316, 0.9321, 0.9365, 0.9312, 0.9287, 0.8965, 0.9268, 0.9219, 0.9316, 0.936, 0.9365, 0.9331, 0.9365, 0.9292, 0.9336, 0.9395, 0.938, 0.9292, 0.936, 0.9375, 0.9341, 0.9336, 0.9312, 0.9204, 0.9351, 0.9253, 0.9243, 0.9307, 0.9312, 0.9321, 0.9336, 0.9321, 0.9341, 0.9326, 0.9351, 0.9287, 0.9175, 0.9263, 0.9253, 0.936, 0.9316, 0.9346, 0.9272, 0.9341, 0.9355, 0.9316, 0.9312, 0.9004, 0.9297, 0.938, 0.9336, 0.936, 0.9414, 0.9351, 0.9424, 0.9399, 0.9263, 0.9312, 0.8672, 0.9258, 0.9321, 0.9331, 0.9336, 0.9326, 0.9321, 0.9312, 0.9204, 0.9277, 0.9312, 0.9292, 0.9224, 0.9346, 0.9336, 0.9336, 0.939, 0.9287, 0.9355, 0.9424, 0.9336, 0.9399, 0.9336, 0.9385, 0.9346, 0.937, 0.9341, 0.937, 0.9219, 0.918, 0.9316, 0.9316, 0.9326, 0.9326, 0.9385, 0.9307, 0.9302, 0.9326, 0.9321, 0.9307, 0.9341, 0.9233, 0.9336, 0.9312, 0.9321, 0.9365, 0.9272, 0.9282, 0.9307, 0.9136, 0.9243, 0.9346, 0.9351, 0.9355, 0.9302, 0.9302, 0.8345, 0.9375, 0.9419, 0.9424, 0.9346, 0.9419, 0.9355, 0.9429, 0.9346, 0.9395, 0.9414, 0.9355, 0.9365, 0.9121, 0.916, 0.916, 0.9355, 0.937, 0.936, 0.9395, 0.9404, 0.9331, 0.9395, 0.9346, 0.9375, 0.936, 0.9253, 0.9321, 0.9189, 0.9189, 0.9204, 0.916, 0.9263, 0.9194, 0.9224, 0.9102, 0.9219, 0.9243, 0.9268, 0.9194, 0.9355, 0.9365, 0.9429, 0.9326, 0.9395, 0.9321, 0.9346, 0.9351, 0.9346, 0.9395, 0.937, 0.9414, 0.9331, 0.9395, 0.9385, 0.9312, 0.8774, 0.9282, 0.9336, 0.9253, 0.9375, 0.835, 0.9336, 0.939, 0.9399, 0.9316, 0.9365, 0.9375, 0.9355, 0.9189, 0.9243, 0.9219, 0.938, 0.9331, 0.937, 0.938, 0.9204, 0.9341, 0.9424, 0.9336, 0.9258, 0.9336, 0.9326, 0.9292, 0.9316, 0.9268, 0.9087, 0.9331, 0.938, 0.9336, 0.937, 0.9404, 0.9346, 0.9292, 0.9404, 0.9355, 0.9268, 0.9336, 0.9316, 0.9326, 0.936, 0.9326, 0.9282, 0.939, 0.9355, 0.936, 0.9336, 0.9282, 0.9272, 0.9346, 0.936, 0.9404, 0.9346, 0.9385, 0.9409, 0.9302, 0.9224, 0.9238, 0.936, 0.937, 0.937, 0.9321, 0.9326, 0.9312, 0.9326, 0.9419, 0.9395, 0.9316, 0.9292, 0.9351, 0.9409, 0.936, 0.9365, 0.9399, 0.938, 0.9385, 0.9272, 0.9287, 0.9307, 0.9302, 0.9282, 0.9375, 0.9268, 0.9326, 0.9204, 0.9409, 0.813, 0.9395, 0.936, 0.9331, 0.9385, 0.938, 0.9351, 0.9404, 0.9365, 0.8486, 0.9268, 0.9243, 0.9375, 0.9404, 0.9248, 0.9287, 0.938, 0.9399, 0.9282, 0.9429, 0.9414, 0.937, 0.9438, 0.9404, 0.9424, 0.9355, 0.9336, 0.9375, 0.9331, 0.939, 0.8999, 0.9116, 0.9209, 0.9268, 0.9292, 0.937, 0.9346, 0.938, 0.9326, 0.937, 0.938, 0.9336, 0.9419, 0.9365, 0.938, 0.9316, 0.9316, 0.937, 0.9365, 0.9209, 0.9238, 0.9282, 0.9331, 0.9229, 0.9355, 0.938, 0.938, 0.9385, 0.936, 0.9419, 0.9434, 0.9341, 0.936, 0.9385, 0.9414, 0.9434, 0.9404, 0.9365, 0.9263, 0.9375, 0.9282, 0.9351, 0.9351, 0.9307, 0.9126, 0.9204, 0.9067, 0.9189, 0.9209, 0.9194, 0.9131, 0.918, 0.9175, 0.9243, 0.9116, 0.9229, 0.9048, 0.9331, 0.9277, 0.9365, 0.9385, 0.9409, 0.939, 0.936, 0.9287, 0.9341, 0.9233, 0.9302, 0.9321, 0.9346, 0.936, 0.9375, 0.9346, 0.9341, 0.9395, 0.9307, 0.9429, 0.9365, 0.9434, 0.9341, 0.9419, 0.9429, 0.9312, 0.9307, 0.9385, 0.9429, 0.9268, 0.9243, 0.9346, 0.9351, 0.9307, 0.9385, 0.9316, 0.9409, 0.937, 0.936, 0.9326, 0.9341, 0.937, 0.9336, 0.9307, 0.9336, 0.936, 0.9351, 0.9355, 0.9375, 0.9058, 0.9097, 0.9292, 0.9312, 0.9307, 0.9355, 0.9355, 0.9395, 0.9365, 0.9424, 0.9419, 0.9458, 0.9487, 0.9419, 0.9404, 0.9351, 0.9346, 0.9185, 0.9336, 0.937, 0.9268, 0.9253, 0.9487, 0.936, 0.9351, 0.9312, 0.9248, 0.9248, 0.9341, 0.9341, 0.9365, 0.9365, 0.9341, 0.9375, 0.9365, 0.9258, 0.9419, 0.937, 0.9307, 0.9292, 0.8882, 0.8911, 0.9209, 0.9165, 0.9282, 0.9277, 0.9312, 0.9365, 0.9346, 0.9263, 0.937, 0.9375, 0.9448, 0.9458, 0.9438, 0.939, 0.936, 0.939, 0.9209, 0.936, 0.937, 0.9292, 0.8589, 0.915, 0.9194, 0.9209, 0.9106, 0.9326, 0.937, 0.9307, 0.9375, 0.939, 0.9282, 0.936, 0.9365, 0.9429, 0.939, 0.9409, 0.9365, 0.9375, 0.9263, 0.9341, 0.937, 0.918, 0.9248, 0.9312, 0.9341, 0.9287, 0.9355, 0.9365, 0.9414, 0.9385, 0.9399, 0.9404, 0.9424, 0.9443, 0.9463, 0.9438, 0.9355, 0.9395, 0.9282, 0.9419, 0.9355, 0.9287, 0.9263, 0.9175, 0.9126, 0.9097, 0.9229, 0.8989, 0.937, 0.9395, 0.9355, 0.937, 0.939, 0.937, 0.9429, 0.9287, 0.9341, 0.938, 0.9385, 0.9385, 0.9326, 0.9316, 0.9307, 0.9321, 0.9282, 0.9243, 0.9331, 0.9287, 0.9331, 0.939, 0.9346, 0.9434, 0.9404, 0.9404, 0.9448, 0.9404, 0.938, 0.939, 0.9424, 0.9238, 0.9443, 0.9404, 0.937, 0.9297, 0.9312, 0.9336, 0.9326, 0.9307, 0.9321, 0.9355, 0.9399, 0.937, 0.9399, 0.9229, 0.9399, 0.9399, 0.9399, 0.9395, 0.9346, 0.9336, 0.9365, 0.9351, 0.9375, 0.9302, 0.9106, 0.9336, 0.9321, 0.9263, 0.9312, 0.9336, 0.936, 0.9351, 0.9224, 0.9385, 0.9365, 0.9365, 0.9385, 0.9409, 0.9414, 0.9409, 0.9404, 0.9341, 0.9399, 0.9253, 0.9209, 0.9321, 0.9312, 0.936, 0.9365, 0.9282, 0.9341, 0.9346, 0.9453, 0.939, 0.9434, 0.9355, 0.939, 0.9419, 0.9409, 0.9375, 0.9346, 0.9312, 0.9321, 0.9038, 0.8833, 0.9316, 0.9336, 0.9336, 0.9541, 0.9302, 0.9316, 0.9399, 0.9399, 0.939, 0.939, 0.9336, 0.9419, 0.939, 0.9438, 0.9414, 0.9438, 0.9409, 0.9414, 0.9263, 0.9209, 0.8965, 0.915, 0.8594, 0.9194, 0.9282, 0.9341, 0.938, 0.9355, 0.9331, 0.9365, 0.9414, 0.9463, 0.9473, 0.938, 0.9419, 0.9385, 0.9331, 0.9316, 0.9253, 0.9277, 0.895, 0.9321, 0.9326, 0.9341, 0.937, 0.9331, 0.9404, 0.9434, 0.9365, 0.939, 0.9365, 0.9473, 0.9448, 0.9429, 0.9326, 0.9326, 0.9448, 0.9385, 0.9351, 0.9395, 0.9204], "char_ids": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695], "line_ids": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34], "layer": [[0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [2], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 0], [4, 1, 0], [4, 1, 0], [4, 1, 0], [4, 1, 1], [4, 1, 1], [4, 1, 1], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [9, 0], [9, 0], [9, 0], [9, 1, 0], [9, 1, 0], [9, 1, 0], [9, 1, 0], [9, 1, 0], [9, 1, 0], [9, 1, 1], [9, 1, 1], [9, 1, 1], [9, 1, 1], [9, 1, 1], [9, 1, 1], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [9, 2], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 0], [11, 1, 0], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [11, 1, 1], [12, 0, 0], [12, 0, 0], [12, 0, 0], [12, 0, 1], [12, 0, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [13, 0], [13, 0], [13, 1, 0], [13, 1, 0], [13, 1, 1], [13, 1, 1], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [13, 2], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [14], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 0], [15, 1, 0], [15, 1, 1], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [15, 2], [16, 0, 0], [16, 0, 0], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 0, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1], [16, 1]], "option": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {"交": 0.021}, {"宇": 0.0194}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"羲": 0.1263}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"𩔖": 0.0839}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"𢫾": 0.0471}, {}, {}, {}, {}, {}, {}, {"几": 0.3162}, {}, {}, {"羲": 0.1071}, {}, {}, {}, {"毎": 0.0289}, {}, {}, {}, {"𢘻": 0.0396}, {}, {"𩔖": 0.0156}, {}, {}, {}, {}, {}, {}, {}, {"己": 0.3099}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"耆": 0.041}, {}, {}, {}, {}, {}, {}, {"耆": 0.0146}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"宇": 0.0691}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"晶": 0.2559, "贔": 0.2436}, {}, {}, {}, {}, {}, {"羲": 0.0571}, {}, {}, {}, {}, {"宇": 0.0823}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"為": 0.0101}, {}, {}, {}, {}, {}, {}, {}, {}, {"羲": 0.0147}, {}, {}, {}, {}, {}, {}, {}, {}, {"𩔖": 0.0219}, {"随": 0.365}, {"擧": 0.3261}, {}, {}, {}, {}, {}, {"愛": 0.3153}, {"為": 0.0282}, {"慐": 0.173, "息": 0.14, "愿": 0.1326, "㥲": 0.096, "惡": 0.0956, "恿": 0.086, "惠": 0.0855}, {}, {}, {}, {}, {}, {"傅": 0.0414, "𫝊": 0.0089}, {}, {}, {}, {"許": 0.3513}, {"则": 0.0373}, {}, {"八": 0.0253}, {}, {}, {}, {}, {"血": 0.1231, "鬯": 0.1066, "龜": 0.0932, "峦": 0.0862, "丘": 0.086, "卯": 0.0854, "底": 0.0852}, {}, {}, {}, {}, {"交": 0.0294}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"龜": 0.0146}, {}, {"宇": 0.0186}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"羲": 0.0342}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"乜": 0.017}, {}, {}, {}, {}, {"宇": 0.0263}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"耆": 0.0184}, {}, {}, {}, {"為": 0.0145}, {}, {}, {}, {}, {}, {}, {}, {}, {"载": 0.0092}, {}, {}, {}, {}, {}, {}, {}, {}, {"羲": 0.0297}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"丛": 0.0202}, {}, {}, {}, {}, {}, {}, {"菟": 0.2158, "莧": 0.2121}, {}, {}, {"寬": 0.3712}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"岀": 0.0405}, {}, {}, {}, {}, {}, {}, {"莧": 0.3457, "萖": 0.1913, "莌": 0.0788}, {"為": 0.3086, "偽": 0.0809, "烏": 0.0039}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"": 0.0596, "𠂆": 0.0466}, {}, {}, {}, {"宇": 0.0176}, {}, {}, {}, {}, {}, {}, {}, {"宇": 0.0273}, {}, {}, {"㫖": 0.2154}, {}, {}, {"共": 0.08}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"宇": 0.0126}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"羲": 0.0239}, {}, {}, {}, {"𠀍": 0.0159}, {"宇": 0.0306}, {"晝": 0.0291}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"宇": 0.0211}, {"别": 0.4688}, {}, {}, {}, {"荊": 0.296, "㓝": 0.2596}, {}, {}, {}, {"辜": 0.0226}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"𢌛": 0.0297}, {}, {}, {}, {}, {}, {"諠": 0.4652}, {}, {}, {"宣": 0.2709, "宐": 0.1333, "宦": 0.0607, "豈": 0.0537}, {}, {}, {}, {}, {"疊": 0.1454, "㬅": 0.1144, "㬪": 0.1094, "蕚": 0.0974, "曡": 0.094, "萼": 0.0938}, {}, {}, {}, {"北": 0.0166}, {}, {"褘": 0.0153}, {"説": 0.0243}, {"荆": 0.3302, "荊": 0.2691}, {"舆": 0.0275, "𫟋": 0.0115}, {}, {"倶": 0.0144}, {}, {}, {}, {"荆": 0.3157, "荊": 0.236}, {}, {}, {}, {}, {}, {}, {"耆": 0.0248, "䎛": 0.0116, "老": 0.0083, "煮": 0.0069}, {}, {}, {}, {}, {}, {"刃": 0.0149}, {}, {}, {"𫝄": 0.0543}, {"𫝄": 0.0205}, {}, {"亥": 0.0068}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"宇": 0.075}, {}, {}, {}, {"宇": 0.0377}, {"夲": 0.0227}, {}, {}, {}, {}, {}, {}, {"荊": 0.3136, "㓝": 0.2054}, {}, {}, {}, {}, {"辜": 0.0725}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"鼔": 0.3218}, {}, {}, {}, {}, {}, {}, {}, {"旦": 0.0158}, {"曡": 0.269}, {"部": 0.0399, "䫓": 0.0236}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"宇": 0.0603}, {}, {"夲": 0.025}, {}, {}, {}, {"戶": 0.2786, "户": 0.262}, {"䕶": 0.4663}, {}, {"鬥": 0.0379}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"移": 0.1949, "夥": 0.1712, "眵": 0.1695}, {}, {}, {}, {}, {}, {"兹": 0.1307, "𢇁": 0.1182, "絃": 0.1105, "㓜": 0.1064, "幻": 0.1029}, {}, {}, {"夲": 0.0326}, {}, {}, {"𢇁": 0.0055}, {}, {}, {}, {}, {}, {"𢇁": 0.3229}, {}, {}, {}, {"人": 0.0163}, {"𢇁": 0.1482, "丝": 0.1372, "兹": 0.1252, "玆": 0.1233}, {}, {"𢇁": 0.1734, "丝": 0.1286, "幼": 0.1244, "兹": 0.1232}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"眀": 0.0663}, {"夲": 0.0221}, {"羲": 0.0191}, {}, {"八": 0.0374, "入": 0.0286}, {}, {}, {}, {"微": 0.2378, "徵": 0.1937, "徴": 0.15, "徽": 0.148}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {"舆": 0.0289, "𫟋": 0.024}, {"羲": 0.0215}, {}, {"為": 0.3141}, {}, {"裹": 0.0189}, {}, {}, {}, {}, {"㫖": 0.366}, {}, {"眀": 0.034}, {}, {}, {"畫": 0.0099}, {"夲": 0.0378}, {"羲": 0.0393}, {}], "text": "人造字轉注之法厥後文字滋生莫識其本許君特得義故入句部許書分部之精類皆如此曷言乎其\n窮流溯源次弟先後轉注之指顯然矣顧其言凡某本義也許君每部之下悉以類相從雖後人假用已\n之屬皆从某也有指本部而言者有指異部而言者久許必標其本義以从本形使古人造字之意了然\n若白部自皎字至皛字均從白得義老部自耋字至可覩此轉注之一大例也如假氣爲气假前爲歬假\n考字皆從老得義此指本部而言也【此類隨】【舉皆是】若三部憂爲㥑假和爲龢經傳多有之詐則氣入米部饋客\n兜部只載一文亦特爲立部者以王王龜黽等字由芻米也而气部訓云雲气也象形而本義見矣前入\n此而生故也又或本字之類實無所屬而他部之字刀部齊斷也而止部歬字訓云不行而進謂之歬从\n旣有从此者則亦自爲一部如才耑等部僅載一文止在舟上而本義見矣憂入久部爲和之行和入口\n上下亦不相比次則所从又指遠部而言萈部云寛部訓云相應若此之類嚮非許君顯爲表出誰復知\n字从此【草爲山羊細角】【者故不入艸部】厂部云虒字从此是也顧許造字之本旨乎至其訓釋之例又約有六曰本字如\n君分部之例悉有精義非如後世字書僅據偏㫄區言部讓相責讓也辵部道所行道也之屬曰偏㫄字\n別若井部荆下云罰辠也从刀井易曰井者法也【段】【氏如辵部延正行也言部誼人所宜也之屬曰疉本字】\n【云此易】【緯說】㓝與罰俱从刀而㓝特入井部蓋罰者持刀如刄部刄行遲久久也夋行夋夋也之屬曰雙聲字\n罵詈【罰字】【本注】系諸受法者荆者以刀治辠系諸執法者如㫄溥也俚聊也鼓郭也儒柔也之屬曰疊韻字如\n重在守法故入井部此正得古人造字之本意他若戸護也門聞也之屬曰連字如𧺆部趍趙久也辵部\n𢆶部幽本从山𢆶亦聲也然以𢆶得義故入𢆶部【𢆶】【注】唐逮及也之屬此六例者要皆訓明本義使人知形\n【云㣲】【也句部拘鉤字本从手从金句亦聲也然以句曲聲與義相爲表裏而六書之旨益】明則許書本義之"}
\ No newline at end of file
diff --git a/Data/json/1233/0003.json b/Data/json/1233/0003.json
new file mode 100644
index 0000000..b29d53a
--- /dev/null
+++ b/Data/json/1233/0003.json
@@ -0,0 +1 @@
+{"FileName": "0003", "ContentType": "image/jpeg", "Width": 3706, "Height": 6871, "Size": 4725487, "Layout": 0, "Area": "[]", "Compact": 1, "CharNumber": 491, "LineNumber": 20, "chars": ["𬼘", "王", "幼", "遐", "前", "輩", "景", "槧", "元", "巾", "箱", "本", "旧", "有", "注", "编", "次", "體", "例", "与", "孫", "稼", "航", "京", "兆", "𫠦", "藏", "元", "刻", "遮", "𨹧", "陈", "元", "龍", "片", "玉", "词", "注", "本", "無", "異", "惟", "𬼘", "题", "𭈹", "分", "卷", "尚", "仍", "其", "旧", "曰", "片", "玉", "䏻", "实", "昉", "于", "陈", "少", "章", "𢴃", "劉", "必", "欽", "叙", "知", "之", "至", "今", "歎", "之", "例", "宋", "元", "时", "選", "刻", "昔", "贤", "诗", "词", "集", "最", "多", "如", "杜", "工", "部", "白", "真", "山", "集", "日", "本", "皆", "𩔖", "偏", "清", "真", "词", "以", "分", "類", "为", "最", "初", "刻", "證", "以", "方", "千", "里", "楊", "泽", "民", "和", "词", "之", "诠", "弟", "並", "止", "扵", "兹", "谝", "之", "𮦀", "賦", "𩔖", "其", "𢿘", "適", "府", "陈", "允", "平", "𫠦", "淂", "獨", "𭐴", "则", "曰", "以", "追", "和", "在", "後", "可", "知", "惜", "元", "鈔", "诸", "脱", "时", "見", "幼", "遐", "𡖋", "未", "之", "校", "雠", "然", "词", "中", "分", "段", "如", "垂", "𡖋", "釣", "鬲", "浦", "蓮", "近", "俱", "皎", "汲", "古", "反", "戈", "校", "丁", "𠜇", "夲", "弟", "長", "是", "旧", "𠜇", "之", "善", "北", "必", "光", "𬼘", "阏", "逢", "之", "歲", "大", "果", "月", "老", "芝", "𭁡", "識", "于", "半", "雨", "樓", "西", "牕", "案", "𫠦", "𠜇", "藥", "堂", "詩", "餘", "载", "秋", "霁", "一", "首", "證", "以", "萹", "次", "前", "後", "皆", "選", "𫟈", "成", "之", "作", "则", "秋", "霽", "亦", "當", "屬", "𰛓", "真", "苐", "宋", "元", "时", "槧", "监", "鷗", "汲", "古", "諸", "𠜇", "並", "未", "之", "錄", "入", "闻", "疑", "載", "疑", "云", "尔", "余", "校", "𫟈", "成", "词", "凡", "卅", "餘", "過", "正", "其", "诸", "敬", "𫠦", "得", "实", "多", "是", "夲", "鶩", "之", "之", "元", "夲", "景", "𠜇", "明", "鈔", "不", "相", "失", "其", "旧", "故", "故", "未", "及", "校", "订", "误", "𠁅", "以", "徴", "盡", "善", "猶", "憶", "出", "京", "时", "翁", "据", "陈", "氏", "𦾔", "注", "鹜", "翁", "斤", "丶", "原", "録", "𢴃", "當", "将", "别", "为", "校", "勘", "记", "附", "刊", "卷", "末", "至", "以", "余", "攺", "㝎", "䨥", "頭", "蓮", "西", "七", "闋", "字", "句", "谓", "有", "神", "助", "雖", "使", "美", "成", "復", "生", "必", "無", "異", "词", "是", "亦", "好", "之", "𬼘", "不", "觉", "其", "誉", "之", "過", "也", "余", "旅", "沽", "上", "三", "月", "中", "更", "喪", "洗", "卒", "丶", "未", "有", "以", "報", "鹜", "翁", "今", "復", "旋", "吳", "閶", "人", "亊", "業", "蕞", "間", "亊", "旧", "業", "每", "一", "展", "诵", "是", "偏", "輙", "愳", "為", "㝠", "爹", "之", "負", "行", "将", "入", "浙", "㦯", "扵", "湖", "山", "勝", "𠁅", "少", "得", "清", "致", "重", "为", "校", "㝎", "与", "许", "榆", "園", "商", "𣙜", "付", "鍥", "亦", "𠯁", "為", "片", "玉", "蕩", "滌", "纎", "瑕", "且", "有", "以", "副", "良", "友", "涶", "诿", "庶", "㡬", "幸", "甚", "躰", "问", "记", "光", "諸", "戊", "戍", "之", "𭘾", "十", "月", "朔", "日", "下", "接", "弟", "二", "页"], "coors": [[3266, 736, 3404, 840], [3279, 848, 3380, 945], [3274, 949, 3402, 1050], [3258, 1045, 3444, 1169], [3244, 1172, 3399, 1313], [3286, 1322, 3397, 1518], [3266, 1522, 3417, 1667], [3256, 1673, 3420, 1839], [3300, 1850, 3427, 1954], [3295, 1951, 3405, 2065], [3271, 2067, 3409, 2194], [3291, 2186, 3409, 2317], [3300, 2320, 3427, 2394], [3269, 2402, 3424, 2530], [3285, 2533, 3417, 2654], [3276, 2659, 3437, 2803], [3296, 2800, 3424, 2900], [3264, 2912, 3437, 3060], [3269, 3068, 3424, 3175], [3286, 3189, 3414, 3290], [3263, 3290, 3427, 3420], [3273, 3430, 3437, 3570], [3264, 3576, 3467, 3711], [3283, 3714, 3420, 3888], [3300, 3892, 3430, 3999], [3278, 4006, 3437, 4133], [3281, 4137, 3444, 4311], [3306, 4325, 3427, 4425], [3251, 4445, 3420, 4600], [3276, 4603, 3410, 4784], [3278, 4784, 3427, 4932], [3271, 4928, 3420, 5063], [3310, 5069, 3414, 5157], [3271, 5170, 3427, 5311], [3301, 5321, 3399, 5442], [3303, 5455, 3414, 5556], [3281, 5566, 3420, 5680], [3283, 5697, 3414, 5811], [3285, 5811, 3427, 5938], [3276, 5955, 3407, 6083], [3273, 6099, 3430, 6274], [3078, 741, 3216, 872], [3087, 876, 3217, 963], [3066, 961, 3221, 1102], [3066, 1109, 3227, 1268], [3115, 1262, 3216, 1365], [3102, 1368, 3229, 1527], [3105, 1541, 3243, 1658], [3108, 1657, 3239, 1763], [3105, 1768, 3222, 1926], [3117, 1926, 3227, 2003], [3120, 2018, 3224, 2095], [3122, 2109, 3222, 2223], [3125, 2234, 3236, 2352], [3110, 2367, 3251, 2481], [3105, 2481, 3246, 2652], [3095, 2662, 3256, 2780], [3137, 2795, 3224, 2905], [3088, 2919, 3246, 3050], [3125, 3058, 3226, 3172], [3092, 3177, 3249, 3365], [3097, 3367, 3248, 3503], [3100, 3509, 3238, 3657], [3100, 3674, 3244, 3781], [3095, 3784, 3256, 3925], [3087, 3932, 3261, 4080], [3098, 4106, 3263, 4227], [3145, 4231, 3256, 4351], [3135, 4361, 3253, 4502], [3118, 4499, 3236, 4620], [3080, 4637, 3261, 4818], [3110, 4831, 3224, 4945], [3088, 4935, 3249, 5063], [3113, 5073, 3264, 5200], [3135, 5210, 3253, 5311], [3097, 5324, 3264, 5432], [3098, 5452, 3273, 5606], [3093, 5616, 3254, 5757], [3125, 5761, 3256, 5901], [3115, 5925, 3263, 6079], [3120, 6086, 3254, 6207], [3120, 6220, 3274, 6334], [2880, 739, 3028, 916], [2874, 910, 3041, 1058], [2926, 1074, 3019, 1225], [2900, 1223, 3035, 1337], [2895, 1342, 3033, 1451], [2926, 1456, 3019, 1530], [2887, 1546, 3051, 1683], [2926, 1675, 3036, 1807], [2907, 1802, 3045, 1929], [2921, 1911, 3045, 1981], [2922, 1993, 3040, 2164], [2927, 2169, 3048, 2256], [2929, 2266, 3056, 2424], [2926, 2427, 3056, 2572], [2907, 2590, 3071, 2761], [2904, 2758, 3098, 2915], [2919, 2924, 3056, 3085], [2926, 3095, 3050, 3263], [2917, 3269, 3078, 3400], [2926, 3415, 3060, 3489], [2932, 3496, 3050, 3603], [2884, 3627, 3068, 3788], [2927, 3791, 3055, 3919], [2885, 3942, 3063, 4117], [2910, 4137, 3078, 4257], [2915, 4274, 3080, 4422], [2927, 4425, 3095, 4580], [2934, 4593, 3075, 4700], [2926, 4714, 3063, 4855], [2944, 4868, 3045, 5002], [2944, 5006, 3055, 5140], [2900, 5153, 3065, 5328], [2927, 5321, 3061, 5482], [2927, 5506, 3075, 5646], [2900, 5653, 3071, 5794], [2915, 5814, 3077, 5948], [2946, 5958, 3050, 6066], [2899, 6079, 3103, 6234], [2949, 6244, 3087, 6398], [2709, 740, 2830, 902], [2733, 915, 2823, 994], [2696, 1001, 2837, 1122], [2724, 1124, 2835, 1238], [2711, 1248, 2858, 1384], [2739, 1385, 2843, 1472], [2689, 1474, 2867, 1626], [2711, 1624, 2885, 1765], [2696, 1790, 2870, 1931], [2724, 1934, 2852, 2099], [2704, 2100, 2875, 2241], [2702, 2256, 2884, 2447], [2721, 2449, 2872, 2600], [2718, 2608, 2865, 2759], [2754, 2761, 2882, 2875], [2746, 2890, 2874, 3048], [2711, 3055, 2889, 3175], [2748, 3177, 2882, 3348], [2716, 3360, 2870, 3503], [2746, 3519, 2847, 3694], [2724, 3701, 2852, 3828], [2759, 3831, 2857, 3939], [2716, 3956, 2880, 4076], [2729, 4080, 2894, 4234], [2694, 4247, 2882, 4388], [2743, 4395, 2860, 4509], [2749, 4499, 2884, 4653], [2758, 4667, 2862, 4794], [2709, 4798, 2890, 4918], [2718, 4942, 2892, 5096], [2759, 5120, 2887, 5214], [2707, 5237, 2882, 5378], [2721, 5395, 2879, 5529], [2731, 5529, 2902, 5670], [2726, 5690, 2897, 5804], [2739, 5807, 2880, 5948], [2719, 5969, 2870, 6096], [2711, 6099, 2869, 6247], [2733, 6240, 2877, 6361], [2528, 729, 2672, 888], [2548, 906, 2649, 1003], [2515, 1021, 2682, 1157], [2506, 1159, 2697, 1303], [2538, 1314, 2672, 1447], [2518, 1474, 2662, 1593], [2545, 1595, 2655, 1729], [2546, 1736, 2667, 1840], [2511, 1845, 2699, 1986], [2508, 2006, 2669, 2107], [2501, 2122, 2659, 2276], [2503, 2290, 2660, 2421], [2488, 2429, 2682, 2593], [2516, 2607, 2681, 2758], [2526, 2765, 2684, 2909], [2511, 2926, 2699, 3093], [2504, 3112, 2692, 3239], [2531, 3249, 2689, 3390], [2530, 3394, 2697, 3536], [2550, 3556, 2707, 3677], [2536, 3694, 2677, 3808], [2541, 3825, 2682, 3939], [2551, 3949, 2676, 4083], [2530, 4086, 2687, 4221], [2521, 4241, 2676, 4328], [2498, 4355, 2666, 4496], [2538, 4499, 2659, 4667], [2530, 4670, 2660, 4811], [2528, 4811, 2666, 4959], [2536, 4986, 2650, 5173], [2551, 5167, 2659, 5247], [2521, 5267, 2662, 5388], [2551, 5402, 2645, 5495], [2531, 5509, 2655, 5717], [2531, 5720, 2682, 5848], [2520, 5844, 2654, 5952], [2528, 5979, 2662, 6140], [2521, 6130, 2679, 6264], [2531, 6264, 2692, 6398], [2295, 712, 2476, 907], [2343, 922, 2431, 1022], [2317, 1040, 2478, 1218], [2340, 1234, 2451, 1355], [2303, 1360, 2471, 1532], [2343, 1534, 2454, 1692], [2302, 1693, 2476, 1837], [2325, 1844, 2463, 2005], [2307, 2026, 2471, 2174], [2286, 2181, 2478, 2355], [2332, 2375, 2439, 2513], [2333, 2525, 2447, 2692], [2320, 2709, 2481, 2840], [2295, 2860, 2466, 3014], [2322, 3033, 2463, 3160], [2310, 3162, 2481, 3300], [2132, 922, 2253, 1110], [2130, 1100, 2258, 1218], [2130, 1218, 2271, 1340], [2159, 1339, 2260, 1493], [2139, 1490, 2283, 1613], [2127, 1634, 2268, 1770], [2125, 1760, 2280, 1907], [2110, 1916, 2281, 2080], [2129, 2072, 2273, 2213], [2119, 2226, 2266, 2427], [2154, 2434, 2255, 2488], [2134, 2498, 2258, 2686], [2117, 2687, 2285, 2835], [2137, 2840, 2268, 2917], [2105, 2932, 2273, 3107], [2132, 3105, 2263, 3222], [2107, 3234, 2261, 3415], [2156, 3410, 2273, 3519], [2139, 3533, 2253, 3654], [2125, 3674, 2286, 3808], [2144, 3818, 2302, 3992], [2140, 3989, 2291, 4123], [2157, 4133, 2255, 4227], [2122, 4221, 2276, 4361], [2140, 4385, 2265, 4479], [2132, 4499, 2280, 4620], [2139, 4663, 2283, 4851], [2144, 4861, 2268, 4949], [2125, 4959, 2280, 5133], [2146, 5147, 2280, 5281], [2139, 5281, 2270, 5442], [2144, 5448, 2285, 5610], [2144, 5623, 2281, 5797], [2161, 5797, 2285, 5952], [2174, 5958, 2288, 6059], [2161, 6073, 2275, 6160], [2130, 6173, 2298, 6354], [1934, 946, 2085, 1117], [1931, 1118, 2092, 1277], [1951, 1286, 2105, 1400], [1964, 1411, 2082, 1511], [1959, 1518, 2104, 1644], [1938, 1642, 2082, 1780], [1968, 1785, 2075, 1912], [1951, 1916, 2085, 2047], [1964, 2043, 2078, 2154], [1932, 2169, 2097, 2313], [1938, 2335, 2095, 2416], [1929, 2434, 2094, 2602], [1939, 2595, 2080, 2726], [1902, 2741, 2080, 2926], [1926, 2931, 2087, 3082], [1951, 3095, 2062, 3199], [1931, 3212, 2082, 3323], [1914, 3326, 2105, 3496], [1909, 3509, 2100, 3650], [1939, 3650, 2094, 3831], [1953, 3835, 2090, 3956], [1943, 3962, 2090, 4103], [1964, 4100, 2099, 4214], [1911, 4234, 2105, 4335], [1931, 4335, 2085, 4476], [1953, 4489, 2130, 4643], [1973, 4663, 2083, 4777], [1954, 4781, 2075, 4942], [1938, 4949, 2095, 5090], [1938, 5093, 2112, 5240], [1936, 5247, 2090, 5375], [1963, 5371, 2083, 5499], [1963, 5502, 2090, 5663], [1991, 5670, 2092, 5851], [1953, 5851, 2130, 6019], [1971, 6012, 2092, 6166], [1941, 6173, 2115, 6361], [1867, 1904, 1951, 1988], [1756, 1914, 1924, 2035], [1770, 2043, 1891, 2164], [1753, 2172, 1870, 2337], [1743, 2345, 1874, 2520], [1738, 2530, 1882, 2671], [1736, 2691, 1874, 2805], [1728, 2823, 1899, 2998], [1753, 3016, 1870, 3113], [1738, 3132, 1869, 3259], [1758, 3263, 1869, 3390], [1756, 3390, 1870, 3546], [1733, 3556, 1877, 3650], [1741, 3660, 1872, 3788], [1751, 3798, 1896, 3912], [1773, 3915, 1884, 4049], [1758, 4053, 1906, 4187], [1740, 4211, 1904, 4358], [1750, 4375, 1884, 4482], [1748, 4512, 1899, 4660], [1771, 4677, 1896, 4831], [1763, 4845, 1897, 4945], [1743, 4959, 1914, 5106], [1748, 5126, 1892, 5308], [1765, 5311, 1896, 5506], [1753, 5519, 1911, 5680], [1766, 5693, 1914, 5854], [1788, 5861, 1892, 5982], [1775, 5982, 1909, 6150], [1776, 6150, 1911, 6291], [1743, 949, 1880, 1131], [1729, 1155, 1894, 1287], [1736, 1305, 1887, 1451], [1758, 1449, 1902, 1579], [1750, 1575, 1884, 1771], [1756, 1775, 1891, 1909], [1547, 941, 1711, 1161], [1574, 1169, 1693, 1327], [1589, 1336, 1693, 1470], [1619, 1485, 1698, 1558], [1575, 1580, 1704, 1726], [1558, 1745, 1718, 1889], [1569, 1889, 1733, 2030], [1585, 2033, 1716, 2198], [1579, 2208, 1729, 2359], [1582, 2369, 1719, 2506], [1581, 2521, 1721, 2662], [1568, 2669, 1723, 2806], [1560, 2825, 1718, 2976], [1568, 2999, 1721, 3103], [1573, 3122, 1728, 3253], [1574, 3274, 1718, 3395], [1589, 3410, 1713, 3590], [1559, 3593, 1709, 3707], [1600, 3734, 1718, 3841], [1593, 3852, 1718, 3939], [1582, 3939, 1723, 4073], [1575, 4090, 1736, 4204], [1568, 4217, 1716, 4372], [1568, 4398, 1729, 4586], [1581, 4603, 1728, 4737], [1581, 4744, 1740, 4925], [1594, 4952, 1735, 5126], [1615, 5140, 1711, 5220], [1580, 5220, 1729, 5375], [1598, 5381, 1719, 5542], [1589, 5552, 1714, 5680], [1575, 5697, 1724, 5844], [1596, 5844, 1714, 5999], [1575, 6009, 1753, 6210], [1583, 6210, 1751, 6344], [1349, 975, 1508, 1133], [1369, 1123, 1511, 1241], [1385, 1235, 1519, 1382], [1398, 1376, 1517, 1485], [1390, 1491, 1526, 1634], [1402, 1636, 1511, 1756], [1371, 1778, 1527, 1899], [1392, 1904, 1516, 2031], [1382, 2040, 1527, 2184], [1386, 2191, 1529, 2312], [1394, 2310, 1515, 2464], [1387, 2469, 1523, 2570], [1395, 2550, 1522, 2691], [1406, 2706, 1501, 2803], [1384, 2810, 1516, 2910], [1383, 2929, 1485, 3019], [1371, 3030, 1515, 3170], [1377, 3174, 1511, 3355], [1379, 3368, 1532, 3576], [1412, 3576, 1511, 3704], [1381, 3717, 1566, 3858], [1383, 3885, 1568, 3979], [1386, 3989, 1543, 4130], [1376, 4143, 1530, 4291], [1402, 4298, 1532, 4432], [1426, 4422, 1535, 4509], [1413, 4526, 1537, 4627], [1421, 4630, 1528, 4784], [1406, 4784, 1530, 4905], [1405, 4915, 1554, 5049], [1381, 5053, 1526, 5207], [1402, 5220, 1553, 5361], [1410, 5371, 1529, 5546], [1438, 5549, 1518, 5630], [1405, 5636, 1509, 5764], [1408, 5771, 1506, 5905], [1391, 5918, 1511, 5999], [1357, 5999, 1533, 6133], [1367, 6143, 1532, 6324], [1188, 983, 1295, 1131], [1180, 1132, 1334, 1260], [1186, 1261, 1319, 1398], [1173, 1407, 1348, 1532], [1193, 1536, 1329, 1665], [1193, 1676, 1335, 1827], [1206, 1845, 1322, 1926], [1199, 1929, 1333, 2080], [1177, 2085, 1341, 2270], [1188, 2290, 1327, 2481], [1199, 2493, 1345, 2634], [1211, 2640, 1330, 2805], [1201, 2810, 1330, 2894], [1169, 2900, 1342, 3071], [1190, 3088, 1334, 3226], [1198, 3238, 1330, 3298], [1194, 3291, 1326, 3456], [1193, 3466, 1344, 3607], [1193, 3613, 1332, 3761], [1183, 3754, 1357, 3909], [1188, 3925, 1350, 4066], [1207, 4080, 1346, 4221], [1204, 4221, 1324, 4355], [1203, 4365, 1342, 4519], [1264, 4533, 1345, 4613], [1231, 4616, 1327, 4744], [1235, 4751, 1345, 4939], [1220, 4949, 1355, 5069], [1216, 5073, 1359, 5214], [1209, 5234, 1349, 5314], [1208, 5328, 1365, 5455], [1217, 5469, 1360, 5596], [1184, 5606, 1345, 5740], [1210, 5740, 1351, 5875], [1224, 5881, 1350, 5969], [1192, 5982, 1356, 6143], [1200, 6163, 1350, 6324], [1001, 991, 1137, 1122], [1001, 1122, 1131, 1236], [1012, 1246, 1158, 1396], [1022, 1402, 1171, 1527], [1013, 1537, 1152, 1708], [1022, 1708, 1136, 1828], [1019, 1833, 1168, 1961], [1017, 1974, 1161, 2122], [1018, 2140, 1157, 2255], [1015, 2280, 1156, 2407], [1002, 2419, 1175, 2573], [1030, 2575, 1164, 2723], [1013, 2724, 1157, 2892], [1005, 2899, 1171, 3056], [1012, 3060, 1163, 3194], [994, 3211, 1175, 3365], [1022, 3375, 1147, 3489], [1036, 3509, 1148, 3637], [1018, 3637, 1146, 3778], [1041, 3784, 1143, 3919], [1043, 3935, 1157, 4063], [1023, 4086, 1171, 4288], [1001, 4284, 1189, 4445], [995, 4465, 1181, 4633], [1011, 4650, 1197, 4784], [1045, 4798, 1152, 4925], [1040, 4932, 1144, 5086], [1038, 5083, 1163, 5177], [1035, 5183, 1173, 5324], [1053, 5334, 1158, 5489], [1038, 5489, 1173, 5616], [1018, 5640, 1169, 5794], [1008, 5811, 1181, 5979], [1015, 5995, 1159, 6170], [1027, 6156, 1173, 6331], [795, 975, 946, 1181], [816, 1185, 939, 1338], [819, 1443, 949, 1581], [824, 1590, 959, 1718], [809, 1728, 960, 1839], [820, 1852, 946, 1986], [808, 1990, 965, 2137], [837, 2142, 970, 2246], [845, 2256, 970, 2374], [857, 2377, 953, 2494], [855, 2518, 964, 2689], [856, 2702, 954, 2827], [851, 2830, 962, 2978], [834, 2998, 970, 3159], [861, 3179, 948, 3296], [633, 1420, 724, 1487], [623, 1501, 742, 1629], [640, 1633, 735, 1776], [632, 1797, 736, 1870], [651, 1896, 723, 1996]], "char_probs": [0.9922, 0.8664, 0.9785, 0.998, 0.9956, 0.84, 0.9863, 0.9976, 0.8624, 0.9893, 0.9056, 0.6078, 0.8202, 0.998, 0.9839, 0.6749, 0.9961, 0.9893, 0.9976, 0.9966, 0.4365, 0.9985, 0.9971, 0.9932, 0.9236, 0.5824, 0.4264, 0.9791, 0.9888, 0.2494, 0.9961, 0.9883, 0.5661, 0.6356, 0.999, 0.8228, 0.9868, 0.9951, 0.96, 0.6998, 0.9985, 0.9956, 0.9917, 0.6779, 0.9819, 0.7069, 0.9922, 0.9937, 0.9985, 0.9849, 0.9649, 0.7491, 0.9927, 0.9561, 0.3914, 0.9985, 0.9912, 0.9946, 0.9971, 0.6667, 0.998, 0.9678, 0.9971, 0.9995, 0.6652, 0.9907, 0.979, 0.6302, 0.9966, 0.4956, 0.214, 0.9707, 0.981, 0.9893, 0.9833, 0.9868, 0.9985, 0.9697, 0.9946, 0.9907, 0.6048, 0.9803, 0.9825, 0.8212, 0.9306, 0.6728, 0.8352, 0.9814, 0.9137, 0.3807, 0.5769, 0.9927, 0.9946, 0.5571, 0.3605, 0.7791, 0.5109, 0.6818, 0.6675, 0.9956, 0.9873, 0.9731, 0.2934, 0.6071, 0.9849, 0.998, 0.7593, 0.9951, 0.9849, 0.7144, 0.9971, 0.9912, 0.9854, 0.96, 0.9218, 0.9927, 0.998, 0.9966, 0.9932, 0.9834, 0.4779, 0.9976, 0.9941, 0.6394, 0.1922, 0.2512, 0.9658, 0.4983, 0.9912, 0.4481, 0.978, 0.1806, 0.9932, 0.2123, 0.998, 0.5373, 0.9771, 0.9902, 0.5776, 0.5717, 0.5225, 0.8298, 0.591, 0.2955, 0.9941, 0.9956, 0.9941, 0.4693, 0.9941, 0.998, 0.999, 0.4133, 0.9863, 0.4217, 0.9829, 0.9976, 0.9956, 0.9951, 0.999, 0.4972, 0.7294, 0.98, 0.7436, 0.9839, 0.9878, 0.6086, 0.9961, 0.6575, 0.6695, 0.4812, 0.9824, 0.6746, 0.5869, 0.9966, 0.979, 0.999, 0.9985, 0.9688, 0.2629, 0.9946, 0.9653, 0.7595, 0.9814, 0.5358, 0.9893, 0.9609, 0.4029, 0.5344, 0.518, 0.5326, 0.4655, 0.6789, 0.904, 0.6623, 0.389, 0.9858, 0.5781, 0.3222, 0.2906, 0.9971, 0.9771, 0.6164, 0.461, 0.5713, 0.9971, 0.9888, 0.4897, 0.9658, 0.998, 0.9736, 0.347, 0.653, 0.3195, 0.9829, 0.5811, 0.9858, 0.3945, 0.6746, 0.2679, 0.6146, 0.2722, 0.646, 0.554, 0.9888, 0.978, 0.998, 0.9961, 0.999, 0.9787, 0.98, 0.999, 0.998, 0.5781, 0.8286, 0.9937, 0.9707, 0.9868, 0.9897, 0.5645, 0.9941, 0.9985, 0.9976, 0.6052, 0.9976, 0.6212, 0.4128, 0.9951, 0.9946, 0.9708, 0.9692, 0.9834, 0.9976, 0.682, 0.999, 0.998, 0.6797, 0.9785, 0.9722, 0.9971, 0.8063, 0.9922, 0.6609, 0.9985, 0.5181, 0.8742, 0.9946, 0.5129, 0.9976, 0.9267, 0.8993, 0.3488, 0.5734, 0.9946, 0.9814, 0.9761, 0.9785, 0.9107, 0.9697, 0.908, 0.9907, 0.3721, 0.1844, 0.6732, 0.6599, 0.9951, 0.9707, 0.9985, 0.9775, 0.6666, 0.9756, 0.291, 0.3965, 0.9858, 0.4396, 0.4493, 0.4364, 0.9937, 0.9971, 0.24, 0.9883, 0.9824, 0.7541, 0.4118, 0.4998, 0.9814, 0.92, 0.5783, 0.4332, 0.9766, 0.9858, 0.9932, 0.4888, 0.9122, 0.8359, 0.9951, 0.979, 0.6766, 0.674, 0.5271, 0.9614, 0.9888, 0.9985, 0.9927, 0.6576, 0.9961, 0.9604, 0.4347, 0.9985, 0.4964, 0.5962, 0.6608, 0.9883, 0.2774, 0.9678, 0.6603, 0.6623, 0.6712, 0.9937, 0.6631, 0.9971, 0.9712, 0.9775, 0.9966, 0.9971, 0.9746, 0.9888, 0.6037, 0.9775, 0.999, 0.9858, 0.9966, 0.4331, 0.3806, 0.6672, 0.9951, 0.9897, 0.9897, 0.9527, 0.9688, 0.9775, 0.998, 0.9961, 0.5483, 0.9619, 0.5376, 0.9678, 0.9995, 0.7539, 0.998, 0.9937, 0.4763, 0.577, 0.998, 0.9873, 0.2514, 0.9966, 0.9917, 0.9932, 0.5664, 0.9849, 0.9005, 0.9985, 0.9937, 0.9985, 0.9023, 0.9475, 0.979, 0.9976, 0.9951, 0.9985, 0.9976, 0.4856, 0.998, 0.219, 0.9917, 0.9917, 0.9873, 0.9858, 0.5248, 0.9878, 0.7385, 0.6179, 0.9985, 0.9609, 0.6207, 0.9951, 0.9912, 0.642, 0.9995, 0.9873, 0.9604, 0.6243, 0.9354, 0.5683, 0.8002, 0.9976, 0.9673, 0.9863, 0.5461, 0.5029, 0.9961, 0.9854, 0.5803, 0.3201, 0.9057, 0.9712, 0.9966, 0.6756, 0.7771, 0.6797, 0.4842, 0.5814, 0.6261, 0.9966, 0.9976, 0.5707, 0.9932, 0.5265, 0.4066, 0.4545, 0.9971, 0.6512, 0.352, 0.9805, 0.9966, 0.6564, 0.3558, 0.5924, 0.7717, 0.6709, 0.9985, 0.9946, 0.9966, 0.9951, 0.9619, 0.9951, 0.9824, 0.9985, 0.9169, 0.4946, 0.9976, 0.9961, 0.9897, 0.7699, 0.9985, 0.999, 0.9727, 0.9761, 0.6779, 0.6646, 0.6766, 0.9611, 0.9951, 0.1837, 0.3487, 0.683, 0.2953, 0.3346, 0.9457, 0.9653, 0.7062, 0.9805, 0.9912, 0.8185, 0.6625, 0.7556, 0.3726, 0.9985, 0.5444, 0.9941, 0.9888], "coor_probs": [0.8887, 0.8291, 0.8745, 0.8911, 0.9033, 0.8862, 0.9106, 0.9189, 0.8882, 0.8857, 0.8916, 0.8887, 0.8701, 0.8872, 0.8818, 0.9121, 0.8726, 0.9165, 0.8965, 0.8682, 0.9053, 0.9014, 0.9072, 0.9077, 0.8691, 0.9038, 0.9126, 0.8516, 0.8984, 0.8921, 0.9023, 0.8926, 0.8433, 0.9106, 0.876, 0.8628, 0.894, 0.8931, 0.8901, 0.8862, 0.8896, 0.9058, 0.8901, 0.9048, 0.9067, 0.8315, 0.9111, 0.8989, 0.8862, 0.9014, 0.8672, 0.8706, 0.8716, 0.8555, 0.8965, 0.8945, 0.9038, 0.8115, 0.8979, 0.8613, 0.9009, 0.916, 0.9077, 0.875, 0.9058, 0.9116, 0.8843, 0.8267, 0.8154, 0.8296, 0.9072, 0.7549, 0.8545, 0.9062, 0.7793, 0.9014, 0.9106, 0.9165, 0.9048, 0.9014, 0.8818, 0.8643, 0.9106, 0.9136, 0.8037, 0.8691, 0.894, 0.7139, 0.8823, 0.853, 0.8374, 0.752, 0.8843, 0.8535, 0.9043, 0.9004, 0.9067, 0.894, 0.9014, 0.8687, 0.8877, 0.8154, 0.7871, 0.897, 0.8926, 0.9087, 0.9019, 0.9111, 0.9087, 0.8667, 0.9204, 0.8882, 0.8818, 0.9258, 0.9092, 0.9082, 0.9106, 0.9116, 0.7949, 0.9028, 0.8804, 0.8628, 0.8394, 0.9077, 0.8984, 0.8989, 0.7852, 0.9087, 0.9136, 0.9092, 0.8779, 0.9189, 0.9263, 0.9214, 0.9141, 0.8882, 0.8677, 0.8735, 0.8999, 0.9092, 0.835, 0.8564, 0.814, 0.8408, 0.8745, 0.8872, 0.8091, 0.8511, 0.8398, 0.877, 0.915, 0.875, 0.9204, 0.9155, 0.9136, 0.9033, 0.9072, 0.9048, 0.8516, 0.8438, 0.895, 0.8223, 0.8931, 0.9004, 0.8711, 0.8931, 0.8682, 0.876, 0.9023, 0.8774, 0.9136, 0.9072, 0.9292, 0.9204, 0.9033, 0.9131, 0.8916, 0.9092, 0.9014, 0.8931, 0.8867, 0.8931, 0.8521, 0.8901, 0.8579, 0.9141, 0.8745, 0.8735, 0.8755, 0.873, 0.7163, 0.897, 0.8105, 0.8413, 0.8696, 0.8457, 0.856, 0.8789, 0.8857, 0.894, 0.7441, 0.9038, 0.8633, 0.9097, 0.8633, 0.9106, 0.8975, 0.8931, 0.9146, 0.8345, 0.8242, 0.8848, 0.9048, 0.8657, 0.8901, 0.8555, 0.855, 0.9019, 0.8726, 0.9048, 0.8867, 0.9087, 0.9033, 0.8838, 0.9033, 0.6802, 0.8599, 0.9028, 0.8052, 0.8945, 0.8882, 0.8955, 0.8408, 0.8862, 0.8647, 0.8872, 0.8809, 0.6978, 0.8276, 0.8687, 0.894, 0.752, 0.8652, 0.9067, 0.897, 0.8799, 0.9033, 0.915, 0.9014, 0.8457, 0.8633, 0.918, 0.9019, 0.9277, 0.9043, 0.8745, 0.9077, 0.9082, 0.8926, 0.8936, 0.7739, 0.9141, 0.874, 0.9136, 0.9014, 0.9062, 0.8975, 0.8516, 0.8794, 0.8809, 0.9058, 0.8687, 0.8857, 0.897, 0.8643, 0.8521, 0.8931, 0.8853, 0.8594, 0.897, 0.9116, 0.9141, 0.8955, 0.8916, 0.9106, 0.8638, 0.9224, 0.9004, 0.918, 0.6978, 0.8311, 0.8701, 0.8926, 0.9033, 0.894, 0.8716, 0.9048, 0.8745, 0.8931, 0.9014, 0.9028, 0.8999, 0.9111, 0.8984, 0.8516, 0.8955, 0.9014, 0.8604, 0.9121, 0.8955, 0.8657, 0.9102, 0.9019, 0.8555, 0.9077, 0.9004, 0.8398, 0.8789, 0.8896, 0.8838, 0.9126, 0.9067, 0.8931, 0.897, 0.875, 0.9126, 0.8901, 0.8818, 0.6772, 0.9004, 0.9204, 0.915, 0.8984, 0.915, 0.9097, 0.9121, 0.9023, 0.9043, 0.9014, 0.915, 0.9023, 0.8794, 0.8862, 0.8428, 0.7725, 0.8599, 0.9014, 0.9038, 0.9204, 0.9004, 0.8896, 0.8438, 0.6826, 0.9014, 0.8906, 0.8979, 0.916, 0.876, 0.9116, 0.9067, 0.9121, 0.8936, 0.9019, 0.8887, 0.9033, 0.8789, 0.9067, 0.8843, 0.9092, 0.9087, 0.8999, 0.7637, 0.7568, 0.8262, 0.9058, 0.8428, 0.9126, 0.895, 0.8882, 0.7378, 0.8984, 0.8955, 0.9097, 0.9155, 0.8569, 0.7559, 0.8579, 0.832, 0.9048, 0.916, 0.9136, 0.9175, 0.9077, 0.7505, 0.8955, 0.8843, 0.8403, 0.896, 0.9219, 0.8809, 0.9136, 0.9023, 0.9126, 0.9067, 0.9014, 0.8428, 0.9116, 0.9312, 0.9062, 0.9131, 0.9048, 0.8921, 0.9253, 0.9087, 0.7798, 0.8687, 0.9111, 0.8633, 0.8882, 0.9126, 0.9014, 0.9038, 0.9067, 0.6826, 0.8193, 0.8452, 0.917, 0.9214, 0.8608, 0.9092, 0.9077, 0.916, 0.9077, 0.8481, 0.9053, 0.9131, 0.8955, 0.897, 0.915, 0.9116, 0.895, 0.8838, 0.9028, 0.9097, 0.895, 0.9014, 0.9219, 0.9106, 0.916, 0.9224, 0.9058, 0.9185, 0.8916, 0.8735, 0.895, 0.8677, 0.8516, 0.8916, 0.9131, 0.9141, 0.9038, 0.8652, 0.8413, 0.8467, 0.8857, 0.8843, 0.9028, 0.9097, 0.9111, 0.8887, 0.8921, 0.8936, 0.896, 0.8965, 0.8857, 0.8999, 0.874, 0.875, 0.8672, 0.8833, 0.8086, 0.8726, 0.8477, 0.8027, 0.8477, 0.7349, 0.752, 0.8672, 0.8667, 0.8374, 0.8042], "char_ids": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490], "line_ids": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19], "layer": [[0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [3], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [5], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 0], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 1], [6, 0, 2], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 3], [6, 0, 4], [6, 0, 4], [6, 0, 4], [6, 0, 4], [6, 0, 4], [6, 0, 4], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [7], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 0], [8, 1], [8, 1], [8, 1], [8, 1], [8, 1], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 0], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [9, 1], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [11], [11], [11], [11], [11], [11], [11], [11], [11], [11], [11], [11], [11], [11], [11], [12], [12], [12], [12], [12]], "option": [{}, {"即": 0.0696, "互": 0.0302, "天": 0.0276}, {"仂": 0.0093, "㫑": 0.0033, "功": 0.0028}, {}, {}, {"軰": 0.1209, "莗": 0.0349}, {}, {}, {"文": 0.0835, "之": 0.0253, "无": 0.0222}, {}, {"𩔊": 0.0653, "業": 0.0082, "廂": 0.007, "開": 0.0045, "葙": 0.0032}, {"夲": 0.3371, "𡥂": 0.0359, "率": 0.0085, "𡧸": 0.0035}, {"四": 0.0535, "卅": 0.0374, "田": 0.0265, "曇": 0.0205, "口": 0.0198, "曰": 0.0158}, {}, {}, {"編": 0.3116, "偏": 0.0094}, {}, {}, {}, {}, {"緣": 0.2374, "絲": 0.1676, "好": 0.1535}, {}, {}, {}, {"非": 0.0573, "必": 0.0079, "氺": 0.0047}, {"㪽": 0.2081, "𬻔": 0.2044}, {"𮐼": 0.2393, "𮐻": 0.2188, "𫟖": 0.1115}, {"无": 0.0145}, {}, {"廣": 0.2336, "庶": 0.1165, "度": 0.1001, "虚": 0.0994, "𰊤": 0.0976, "應": 0.0957}, {}, {}, {"无": 0.4285}, {"𮧻": 0.3127, "猒": 0.0243, "就": 0.0088, "嚨": 0.0053, "熟": 0.0046, "𤞣": 0.0046}, {}, {"至": 0.0536, "玊": 0.0378, "王": 0.0238, "瓦": 0.0236, "則": 0.017, "述": 0.015}, {}, {}, {"夲": 0.0372}, {"𬻝": 0.2809, "每": 0.0084, "𭘾": 0.0048}, {}, {}, {}, {"題": 0.3189}, {}, {"兮": 0.2915}, {}, {}, {}, {}, {"归": 0.0099, "児": 0.0057, "臼": 0.0051, "卅": 0.0047, "纳": 0.0038}, {"日": 0.249}, {}, {"至": 0.0279, "玊": 0.0075, "王": 0.0042}, {"𬼘": 0.1225, "北": 0.1102, "共": 0.0965, "皆": 0.0926, "甚": 0.0914, "考": 0.0906}, {}, {}, {}, {}, {"𣥂": 0.3314}, {}, {"㩀": 0.0262}, {}, {}, {"钦": 0.3309}, {}, {"智": 0.0168}, {"天": 0.1089, "足": 0.0987, "无": 0.0681, "分": 0.0342, "攵": 0.0294, "久": 0.0231}, {}, {"兮": 0.3243, "令": 0.0398, "舎": 0.0366, "會": 0.0364, "舍": 0.0334, "分": 0.0289}, {"𩔖": 0.1894, "𣣇": 0.125, "報": 0.1079, "颖": 0.105, "𩔫": 0.0889, "颣": 0.0863, "𩔗": 0.0836}, {"言": 0.0088, "彡": 0.0079}, {}, {}, {"无": 0.0096}, {}, {}, {"𠜇": 0.0271}, {}, {}, {"詩": 0.3629, "诸": 0.0218, "请": 0.0035}, {"调": 0.0149}, {"某": 0.0145}, {"眾": 0.1203, "衆": 0.0399, "彔": 0.0139}, {"𭐴": 0.0667}, {"次": 0.0915, "水": 0.0685, "數": 0.0659, "加": 0.041, "以": 0.0248, "䏻": 0.0188, "斷": 0.0167}, {"壮": 0.123, "社": 0.0384}, {}, {"祁": 0.0781, "鄣": 0.003}, {"㒵": 0.2452, "申": 0.1046, "皃": 0.0792, "自": 0.0791, "皁": 0.056, "句": 0.051}, {"未": 0.3462, "六": 0.0445, "长": 0.0251}, {}, {}, {"四": 0.2902, "田": 0.0402, "罸": 0.0269, "曇": 0.0241, "曰": 0.0216, "由": 0.0211, "臼": 0.0185}, {"夲": 0.3605, "率": 0.0984, "車": 0.0597, "𡥂": 0.0593, "卆": 0.0547}, {"𣅜": 0.218}, {"類": 0.3366, "𩔫": 0.1472}, {"编": 0.3102}, {"凊": 0.2814, "请": 0.0177, "淸": 0.0142, "請": 0.0141}, {}, {}, {"似": 0.0188}, {"兮": 0.1967, "今": 0.1698, "勾": 0.1172, "皆": 0.1141, "習": 0.1029}, {"𩔖": 0.3646, "𩔗": 0.0161, "𩔫": 0.0118}, {}, {}, {"𥘉": 0.2387}, {}, {}, {"斷": 0.1127, "仏": 0.0738, "願": 0.0427, "似": 0.0323, "何": 0.0112, "𫠦": 0.0085}, {}, {}, {}, {"揚": 0.021, "場": 0.011}, {"𭰏": 0.0444, "證": 0.0104, "護": 0.0064, "際": 0.0056, "譯": 0.0054}, {}, {}, {}, {}, {}, {"苐": 0.2802, "𬼺": 0.2382}, {}, {}, {"𪱸": 0.355}, {"花": 0.1506, "茲": 0.1425, "衆": 0.1188, "並": 0.1032, "茯": 0.1016, "玆": 0.0963, "蘊": 0.0947}, {"偏": 0.2364, "编": 0.1226, "編": 0.1054, "㴜": 0.0961, "徧": 0.0926, "淪": 0.0917}, {"足": 0.0173}, {"雑": 0.2957, "雜": 0.2021}, {}, {"歎": 0.2344, "𩔫": 0.1065, "𩔗": 0.1037, "類": 0.1032}, {"甚": 0.0097}, {"皷": 0.1484, "𢻎": 0.1368, "鼓": 0.1146, "跛": 0.1106, "数": 0.1044, "皵": 0.1028, "皱": 0.1018}, {}, {"符": 0.2111, "将": 0.1361, "𣅜": 0.1045, "𭁺": 0.0875, "省": 0.0861, "苻": 0.0814, "附": 0.0807}, {}, {"见": 0.2453, "久": 0.2127}, {"乎": 0.0216}, {}, {"得": 0.416}, {"觸": 0.2162, "𰡡": 0.2052}, {"多": 0.475}, {"侧": 0.1624}, {"日": 0.4078}, {"微": 0.214, "明": 0.1626, "所": 0.0868, "湖": 0.0768, "聞": 0.059, "故": 0.0537, "徵": 0.0515}, {}, {}, {}, {"復": 0.211, "浚": 0.1591, "浄": 0.1538}, {}, {}, {}, {"之": 0.3977, "无": 0.1821}, {}, {"為": 0.1346, "議": 0.1158, "偽": 0.1096, "为": 0.1056, "諸": 0.1049}, {}, {}, {}, {}, {}, {"尔": 0.1252, "品": 0.1246, "六": 0.1244, "尓": 0.1232}, {"末": 0.2694}, {"天": 0.0081}, {"枝": 0.1755, "挍": 0.059, "𢴃": 0.0204}, {}, {}, {"詞": 0.2354, "诃": 0.1503}, {}, {"兮": 0.3387}, {"叚": 0.3248}, {"數": 0.1637, "加": 0.1378, "九": 0.1081, "妃": 0.1022}, {}, {"然": 0.32}, {"鈞": 0.2317, "鈎": 0.1782}, {}, {"埔": 0.0109}, {}, {}, {"倶": 0.0281}, {"然": 0.1485, "狡": 0.1028, "𢺹": 0.0999, "𢴃": 0.0998, "榖": 0.0972, "脱": 0.0948, "牧": 0.0941}, {}, {"长": 0.0079, "有": 0.0055, "故": 0.0054}, {"及": 0.1209, "友": 0.1131}, {}, {"枝": 0.2411, "挍": 0.2162}, {}, {"刻": 0.037}, {"𡥂": 0.1433, "専": 0.1214, "率": 0.1162, "卓": 0.1054, "車": 0.1044}, {"为": 0.4586}, {"长": 0.2714, "𨱗": 0.207}, {"曇": 0.1558, "畢": 0.1528, "暑": 0.1523}, {"口": 0.1124, "曇": 0.1112, "曰": 0.1111, "臼": 0.1078, "四": 0.0864}, {"刻": 0.3188}, {"者": 0.0645, "𠧒": 0.0263}, {"𠵊": 0.3329}, {"䏻": 0.1101, "长": 0.1072, "𬼘": 0.1059, "考": 0.0986, "比": 0.0933, "堪": 0.0904}, {}, {"坐": 0.2122, "尘": 0.2043}, {"泚": 0.1694, "諸": 0.1111, "供": 0.1067, "𥾑": 0.0959, "继": 0.0952, "疵": 0.0935}, {"閼": 0.2233, "闗": 0.1108, "闕": 0.0979, "關": 0.0919, "闞": 0.0918, "鬫": 0.0902}, {}, {"言": 0.0143}, {"嵗": 0.2902, "𡻕": 0.0868}, {"圡": 0.2211, "太": 0.1644, "𣏅": 0.1464}, {"𭩮": 0.2143, "梁": 0.2069}, {}, {}, {"芸": 0.1306, "芩": 0.125, "芞": 0.125, "芒": 0.1237}, {"再": 0.0196}, {}, {"手": 0.0154}, {"𭜧": 0.1297, "迷": 0.1153, "𢘤": 0.1141, "果": 0.1077, "業": 0.0918, "米": 0.0907}, {"𮦄": 0.2219, "兩": 0.1223}, {"楼": 0.2551, "樑": 0.1116, "横": 0.0899, "橫": 0.0611, "数": 0.0582, "猶": 0.055, "樣": 0.0492}, {}, {"聪": 0.1759, "𤗉": 0.0978, "脱": 0.0619, "説": 0.0259, "捴": 0.0242, "晚": 0.0199, "版": 0.0134}, {}, {"顯": 0.1306, "所": 0.1024, "解": 0.0945, "願": 0.093, "命": 0.0914, "衆": 0.0905}, {"刻": 0.3249}, {"薬": 0.1763, "草": 0.141, "孳": 0.0869, "業": 0.085, "京": 0.0832, "導": 0.0806, "厳": 0.0792}, {"坣": 0.2388, "学": 0.0455, "尚": 0.0228, "常": 0.0221, "受": 0.0203, "觉": 0.0183, "党": 0.0179}, {"诸": 0.2135, "諸": 0.1827, "诗": 0.159, "誌": 0.0726, "请": 0.0613, "𰵕": 0.02, "诮": 0.0187}, {"解": 0.3281, "辝": 0.0188}, {"載": 0.3656, "戟": 0.0206, "報": 0.0177, "截": 0.0139, "栽": 0.0131, "裁": 0.0109}, {}, {"寄": 0.0088}, {}, {}, {}, {"㕥": 0.0125, "心": 0.0031}, {"篇": 0.0193}, {}, {}, {"識": 0.2101, "復": 0.206}, {"𣅜": 0.1648}, {}, {"羙": 0.0179}, {}, {}, {"下": 0.1589, "个": 0.1356, "𫠦": 0.0378, "尒": 0.028, "𬻔": 0.0279, "令": 0.0241, "命": 0.0232}, {}, {}, {}, {"𡖋": 0.3843, "六": 0.004}, {}, {"原": 0.3114, "漏": 0.0475, "𠩤": 0.008, "末": 0.0051}, {"諸": 0.3956, "𰑊": 0.0707, "結": 0.0584, "德": 0.0562}, {}, {}, {"𭓦": 0.026}, {"无": 0.0266}, {}, {}, {"盟": 0.315}, {}, {}, {"智": 0.1115, "合": 0.0703, "在": 0.0499, "长": 0.0439, "故": 0.024, "圡": 0.0107, "知": 0.01}, {"诸": 0.0171}, {"刻": 0.0253}, {}, {"末": 0.1917}, {}, {"録": 0.3343}, {}, {"聞": 0.4197, "閗": 0.058}, {"𠗆": 0.0579, "㣠": 0.0261, "終": 0.0132, "凝": 0.013, "终": 0.0112}, {}, {"㣠": 0.1637, "略": 0.1366, "𠗆": 0.0745, "終": 0.0612, "脩": 0.0432}, {}, {"尓": 0.0686}, {"𪜬": 0.0961}, {"挍": 0.1921, "枝": 0.1196, "胶": 0.0866, "𢴃": 0.0854, "故": 0.0817, "皎": 0.0809}, {"羙": 0.2138, "美": 0.2122}, {}, {}, {"𭂬": 0.0132}, {"卌": 0.0109}, {"馀": 0.0618, "解": 0.0115, "𨐫": 0.0052, "緣": 0.0048}, {"遇": 0.0191}, {"曰": 0.0423, "西": 0.0172, "血": 0.0127, "白": 0.0122}, {}, {"偽": 0.2217, "说": 0.1684, "谓": 0.0907, "湯": 0.0593, "議": 0.0435, "諹": 0.0391}, {"敵": 0.1403, "敓": 0.1342, "㪚": 0.1188, "敞": 0.116, "𭣰": 0.1081, "敚": 0.1072, "敝": 0.0909}, {"𬻔": 0.3199}, {"論": 0.2508, "浄": 0.0846}, {}, {"𭐴": 0.023}, {}, {"本": 0.0172}, {"鹜": 0.3264}, {"上": 0.0089}, {"字": 0.2235, "中": 0.1891, "曰": 0.0768, "示": 0.0588, "口": 0.0567, "分": 0.0524, "八": 0.0518}, {"之": 0.1867, "文": 0.1566, "无": 0.1273, "竟": 0.0588, "六": 0.0385, "天": 0.0318}, {}, {"㬌": 0.3524, "影": 0.2024}, {"刻": 0.1578, "𠛴": 0.1346, "刾": 0.1273, "列": 0.1243}, {"然": 0.2035, "顯": 0.0949, "𫠦": 0.0701, "昭": 0.0496, "𬻔": 0.0493, "顺": 0.0492, "扵": 0.047}, {}, {}, {"顯": 0.1921, "頪": 0.155, "𥼶": 0.1137, "𩔫": 0.0983, "斷": 0.0802, "賴": 0.0617, "歡": 0.059}, {}, {}, {"怛": 0.1034, "汨": 0.0477, "伯": 0.025, "汩": 0.0227, "但": 0.0205, "卄": 0.0188}, {"格": 0.3874, "執": 0.061, "疑": 0.0369, "𫝑": 0.0335, "終": 0.0322, "𣑽": 0.0308}, {"坟": 0.1776, "坆": 0.161, "攻": 0.1562}, {}, {"反": 0.0614, "友": 0.0114}, {"𢴃": 0.3035, "挍": 0.112}, {"訂": 0.2378, "論": 0.1425, "汀": 0.0952, "诃": 0.0837}, {"誤": 0.0223}, {}, {}, {"徵": 0.4091, "𢕄": 0.0979}, {"常": 0.0492, "冬": 0.0317}, {"𠵊": 0.163}, {}, {"境": 0.0158}, {"岀": 0.319}, {"亰": 0.3235}, {"射": 0.3244, "肘": 0.1405}, {"翳": 0.0176, "義": 0.0088}, {}, {}, {}, {"𭑣": 0.3368}, {}, {"鶩": 0.0187, "驚": 0.0133}, {"義": 0.2042, "對": 0.1439, "業": 0.106, "翳": 0.1052}, {}, {"懵": 0.1258, "爹": 0.1242, "乁": 0.1237, "姐": 0.1236}, {"乕": 0.0825, "𡱖": 0.0811, "漏": 0.0789, "承": 0.0777, "槃": 0.0773}, {"錄": 0.3383}, {}, {"𥼶": 0.2096, "夲": 0.1812, "常": 0.0925, "掣": 0.0919, "掌": 0.0737, "聲": 0.0658}, {"將": 0.0279}, {"別": 0.3386}, {"為": 0.3357}, {"𢴃": 0.2504, "枝": 0.0712}, {}, {"記": 0.336}, {}, {"刑": 0.0179}, {"盡": 0.0049}, {}, {}, {"似": 0.0145}, {}, {"改": 0.3956}, {"宗": 0.005}, {}, {}, {}, {"曲": 0.1664, "𢙣": 0.0988, "遍": 0.0988, "典": 0.0984, "酉": 0.098}, {"上": 0.3605, "十": 0.1482, "少": 0.0348, "止": 0.0325, "丄": 0.0215, "与": 0.0153}, {"阕": 0.3295}, {}, {}, {}, {"冇": 0.0452}, {"𫋵": 0.0246}, {"𦔳": 0.0148}, {}, {}, {"𫟈": 0.4067, "羙": 0.0442}, {"烕": 0.008, "誠": 0.0062, "城": 0.0054}, {"𣸪": 0.4586}, {"出": 0.0109, "失": 0.0085}, {}, {"𬻝": 0.2403}, {}, {}, {"者": 0.411, "具": 0.0328, "甚": 0.0265, "𠯣": 0.0243, "𠲘": 0.0237}, {"𡖋": 0.3121, "六": 0.04, "品": 0.0348, "与": 0.0175, "𤆛": 0.0117}, {}, {}, {"北": 0.1996, "此": 0.1378, "比": 0.1164, "堪": 0.0998, "共": 0.0998, "䏻": 0.0926}, {}, {}, {}, {"譽": 0.4288}, {}, {"遇": 0.0923}, {}, {}, {}, {"活": 0.0557, "估": 0.0347}, {"与": 0.0484}, {"二": 0.008}, {}, {}, {}, {}, {"沈": 0.134, "光": 0.1259, "究": 0.1252, "𣑽": 0.1232}, {}, {"爹": 0.2034, "姐": 0.188, "法": 0.0964, "上": 0.0957, "懵": 0.0952, "翩": 0.0948}, {}, {}, {}, {}, {"鶩": 0.4697}, {}, {"𫝆": 0.254}, {"𣸪": 0.3807}, {}, {"吴": 0.0262}, {"阊": 0.3786}, {}, {}, {"𭪙": 0.3504}, {}, {}, {"事": 0.0381}, {"田": 0.3009, "卅": 0.0677}, {"𭪙": 0.0641}, {"毎": 0.4304}, {"門": 0.1338, "乛": 0.0282, "所": 0.0156, "门": 0.0153}, {}, {"誦": 0.0264}, {}, {"编": 0.2793, "徧": 0.1712}, {"輒": 0.4959}, {}, {}, {"𠖇": 0.208, "𡨕": 0.2047}, {"姐": 0.1661, "法": 0.0986, "懵": 0.0984, "怡": 0.0944, "上": 0.0899, "與": 0.0722, "之": 0.0601}, {"言": 0.0462, "足": 0.042}, {"𧴥": 0.0172}, {}, {"將": 0.3239}, {"八": 0.1933, "丆": 0.0196, "丶": 0.005}, {"渐": 0.318}, {"𢦙": 0.2998, "或": 0.2126}, {"𪱸": 0.4155}, {"微": 0.2422, "歡": 0.0381, "漸": 0.0363, "瀕": 0.0163, "脩": 0.0155, "渐": 0.0133, "淅": 0.0122}, {}, {}, {"䖏": 0.2189, "雾": 0.2064}, {}, {"浄": 0.1195, "淂": 0.1162, "後": 0.1158, "汤": 0.1158}, {"凊": 0.3768, "淸": 0.2087}, {"改": 0.4494, "攺": 0.0892}, {}, {"為": 0.3437}, {"𢴃": 0.2153, "挍": 0.1559, "枝": 0.1397, "扵": 0.1298}, {}, {}, {"許": 0.3422}, {"揄": 0.1357, "瑜": 0.1271, "堬": 0.098, "愉": 0.0978, "輸": 0.0907, "楡": 0.0905}, {"𡈂": 0.2985, "國": 0.0378, "圗": 0.0331, "周": 0.0325}, {"啇": 0.2274}, {"㩁": 0.3264}, {}, {}, {}, {}, {"为": 0.0298}, {}, {}, {}, {"條": 0.0694, "𭛹": 0.0081}, {"纖": 0.3121, "繊": 0.1856}, {}, {}, {}, {"似": 0.1427, "心": 0.054, "願": 0.0109, "所": 0.0102, "从": 0.005}, {}, {}, {"犮": 0.011}, {"諈": 0.0136}, {"諉": 0.3185}, {"𢈎": 0.0683, "鹿": 0.0678, "遮": 0.0665, "廣": 0.0654, "席": 0.0619}, {"烕": 0.3175}, {"𠦡": 0.0358}, {}, {"解": 0.1433, "壯": 0.1369, "牀": 0.1252, "䏻": 0.1153, "将": 0.1023, "壮": 0.0992, "財": 0.0942}, {"向": 0.3044, "問": 0.287, "句": 0.0545}, {"記": 0.3115}, {"略": 0.1576, "说": 0.1017, "晚": 0.0957, "觉": 0.0889, "况": 0.0888, "説": 0.086, "呪": 0.086}, {"绪": 0.3172, "緒": 0.3064, "𬼘": 0.0241, "结": 0.0063, "疵": 0.0043}, {"战": 0.0199, "伐": 0.018, "議": 0.0102}, {"戌": 0.0244}, {"姐": 0.1185, "爹": 0.099, "分": 0.027, "号": 0.0213, "婆": 0.0209}, {}, {}, {"卪": 0.1778}, {"翔": 0.3235, "羯": 0.0103}, {"曰": 0.2432}, {"有": 0.2632, "今": 0.1012, "丶": 0.0633, "八": 0.0598, "九": 0.0541, "卜": 0.0443, "姐": 0.0415}, {}, {"苐": 0.45}, {}, {}], "text": "𬼘王幼遐前輩景槧元巾箱本旧有注编次體例与孫稼航京兆𫠦藏元刻遮𨹧陈元龍片玉词注本無異\n惟𬼘题𭈹分卷尚仍其旧曰片玉䏻实昉于陈少章𢴃劉必欽叙知之至今歎之例宋元时選刻昔贤诗词\n集最多如杜工部白真山集日本皆𩔖偏清真词以分 類为最初刻證以方千里楊泽民和词之诠弟\n並止扵兹谝之𮦀賦𩔖其𢿘適府陈允平𫠦淂獨𭐴则曰以追和在後可知惜元鈔诸脱时見幼遐𡖋\n未之校雠然词中分段如垂𡖋釣鬲浦蓮近俱皎汲古反戈校丁𠜇夲弟長是旧𠜇之善北必光𬼘阏\n逢之歲大果月老芝𭁡識于半雨樓西牕\n【案𫠦𠜇藥堂詩餘载秋霁一首證以萹次前後皆選𫟈成之作则秋霽亦當屬𰛓真苐宋元时槧】【监鷗汲古諸𠜇並未之錄入闻疑載疑云尔余校𫟈成词凡卅餘過正其诸敬𫠦得实多是夲鶩】【之】【之元夲景𠜇明鈔不相失其旧故故未及校订误𠁅以徴盡善猶憶出京时】【翁据陈氏𦾔注】\n鹜翁斤丶原録𢴃當将别为校勘记附刊卷末至以余攺㝎䨥頭蓮西七闋字句谓有神助\n雖使美成復生必無異词是亦好之𬼘不觉其誉之過也余旅沽上三月中更喪洗卒丶 未有以報鹜\n翁今復旋吳閶人亊業蕞間亊旧業每一展诵是偏輙愳為㝠 爹之負行将入浙㦯扵湖山勝𠁅\n少得清致重为校㝎与许榆園商𣙜付鍥亦𠯁為片玉蕩滌纎瑕且有以副良友涶诿庶㡬\n幸甚躰问记光諸戊戍之𭘾十月朔日\n下接弟二页"}
\ No newline at end of file
diff --git a/Data/text/1/0003.txt b/Data/text/1/0003.txt
new file mode 100644
index 0000000..bc886f8
--- /dev/null
+++ b/Data/text/1/0003.txt
@@ -0,0 +1,12 @@
+安從來【恬憺虚无靜也法道清靜精氣内持故】【其虚邪不能為害恬蹄廉反舊音淡是】以志閑而
+少欲心安而不懼形勞而不倦䢿【機息故少欲外紛靜故心】【然情欲两亡是非一貫起】
+【居皆適故】【不倦也氣從以順各從其欲皆得所願】【志不貪故所欲皆】【順心易足故所願】
+【必從以不異求故无難得他老子】【曰知足不辱知止還殆回以長乆】故美其食【順精麄也髮新】【校正云按别本】
+【美一】【作甘】任其服【隨美】【惡也】樂其俗【去傾】【慕也】髙下不相慕其民故曰朴 无
+末也是所謂心足也老子曰禍莫大於不知足咎莫大於欲 得故知足之足常足矣盖非謂物足者為知足錢足者乃為
+【知足矣不恣於欲是則朴同故聖人云我無】【欲而民自朴矣新校集云按别本日作日是】以嗜欲不能
+【目不妄視故嗜欲不能勞心与玄】【勞其目淫邪不能惑其心】【同故淫邪不能惑老子曰不見可】【情計两】【欲使心不乱又昍愚智賢不肖不懼於物故合於道】【亡不為】【人為腹不為】【聖】【謀府冥心一觀勝𧴥俱捐故心志保安合同於道庚桑楚田】
+汝形抱汝生无使汝思慮營營字新校正云按全元起註
+【云合】【於道数】所以能年皆度百歲而動作不衰者以其德全不危
+【不渉於危故德全也莊子曰執道者德全德全者形全形】【也】【全者聖人之道也又曰无為而性命不全者未之有也】【材謂材幹可】【帝曰人年老而無子者材力盡邪將天數然也】【以立身者】
+伯 曰女子七歲腎氣盛 齒更髮長
\ No newline at end of file
diff --git a/Data/text/1/67997bf16a7c2e2f7489a6f97ae8a83e.txt b/Data/text/1/67997bf16a7c2e2f7489a6f97ae8a83e.txt
new file mode 100644
index 0000000..32b44a9
--- /dev/null
+++ b/Data/text/1/67997bf16a7c2e2f7489a6f97ae8a83e.txt
@@ -0,0 +1,17 @@
+人造字轉注之法厥後文字滋生莫識其本許君特得義故入句部許書分部之精類皆如此曷言乎其
+窮流溯源次弟先後轉注之指顯然矣顧其言凡某本義也許君每部之下悉以類相從雖後人假用已
+之屬皆从某也有指本部而言者有指異部而言者久許必標其本義以从本形使古人造字之意了然
+若白部自皎字至皛字均從白得義老部自耋字至可覩此轉注之一大例也如假氣爲气假前爲歬假
+考字皆從老得義此指本部而言也【此類隨】【舉皆是】若三部憂爲㥑假和爲龢經傳多有之詐則氣入米部饋客
+兜部只載一文亦特爲立部者以王王龜黽等字由芻米也而气部訓云雲气也象形而本義見矣前入
+此而生故也又或本字之類實無所屬而他部之字刀部齊斷也而止部歬字訓云不行而進謂之歬从
+旣有从此者則亦自爲一部如才耑等部僅載一文止在舟上而本義見矣憂入久部爲和之行和入口
+上下亦不相比次則所从又指遠部而言萈部云寛部訓云相應若此之類嚮非許君顯爲表出誰復知
+字从此【草爲山羊細角】【者故不入艸部】厂部云虒字从此是也顧許造字之本旨乎至其訓釋之例又約有六曰本字如
+君分部之例悉有精義非如後世字書僅據偏㫄區言部讓相責讓也辵部道所行道也之屬曰偏㫄字
+別若井部荆下云罰辠也从刀井易曰井者法也【段】【氏如辵部延正行也言部誼人所宜也之屬曰疉本字】
+【云此易】【緯說】㓝與罰俱从刀而㓝特入井部蓋罰者持刀如刄部刄行遲久久也夋行夋夋也之屬曰雙聲字
+罵詈【罰字】【本注】系諸受法者荆者以刀治辠系諸執法者如㫄溥也俚聊也鼓郭也儒柔也之屬曰疊韻字如
+重在守法故入井部此正得古人造字之本意他若戸護也門聞也之屬曰連字如𧺆部趍趙久也辵部
+𢆶部幽本从山𢆶亦聲也然以𢆶得義故入𢆶部【𢆶】【注】唐逮及也之屬此六例者要皆訓明本義使人知形
+【云㣲】【也句部拘鉤字本从手从金句亦聲也然以句曲聲與義相爲表裏而六書之旨益】明則許書本義之
\ No newline at end of file
diff --git a/Data/text/1233/0003.txt b/Data/text/1233/0003.txt
new file mode 100644
index 0000000..36131da
--- /dev/null
+++ b/Data/text/1233/0003.txt
@@ -0,0 +1,13 @@
+𬼘王幼遐前輩景槧元巾箱本旧有注编次體例与孫稼航京兆𫠦藏元刻遮𨹧陈元龍片玉词注本無異
+惟𬼘题𭈹分卷尚仍其旧曰片玉䏻实昉于陈少章𢴃劉必欽叙知之至今歎之例宋元时選刻昔贤诗词
+集最多如杜工部白真山集日本皆𩔖偏清真词以分 類为最初刻證以方千里楊泽民和词之诠弟
+並止扵兹谝之𮦀賦𩔖其𢿘適府陈允平𫠦淂獨𭐴则曰以追和在後可知惜元鈔诸脱时見幼遐𡖋
+未之校雠然词中分段如垂𡖋釣鬲浦蓮近俱皎汲古反戈校丁𠜇夲弟長是旧𠜇之善北必光𬼘阏
+逢之歲大果月老芝𭁡識于半雨樓西牕
+【案𫠦𠜇藥堂詩餘载秋霁一首證以萹次前後皆選𫟈成之作则秋霽亦當屬𰛓真苐宋元时槧】【监鷗汲古諸𠜇並未之錄入闻疑載疑云尔余校𫟈成词凡卅餘過正其诸敬𫠦得实多是夲鶩】【之】【之元夲景𠜇明鈔不相失其旧故故未及校订误𠁅以徴盡善猶憶出京时】【翁据陈氏𦾔注】
+鹜翁斤丶原録𢴃當将别为校勘记附刊卷末至以余攺㝎䨥頭蓮西七闋字句谓有神助
+雖使美成復生必無異词是亦好之𬼘不觉其誉之過也余旅沽上三月中更喪洗卒丶 未有以報鹜
+翁今復旋吳閶人亊業蕞間亊旧業每一展诵是偏輙愳為㝠 爹之負行将入浙㦯扵湖山勝𠁅
+少得清致重为校㝎与许榆園商𣙜付鍥亦𠯁為片玉蕩滌纎瑕且有以副良友涶诿庶㡬
+幸甚躰问记光諸戊戍之𭘾十月朔日
+下接弟二页
\ No newline at end of file
diff --git a/Log/OCR/2025-08-08.log b/Log/OCR/2025-08-08.log
new file mode 100644
index 0000000..6c809ad
--- /dev/null
+++ b/Log/OCR/2025-08-08.log
@@ -0,0 +1,15 @@
+2025-08-08 09:46:01 INFO 任务:1233 START 总数:1
+2025-08-08 09:46:01 INFO 序号 用时 字数 列数 大小 宽度 高度 路径
+2025-08-08 09:46:14 INFO 1 13.29 491 20 4615 3706 6871 D:/Important/software/软件交接/重要/重/籍智达OCR软件/籍智达OCR软件/jzd.0129/图/0003.JPG
+2025-08-08 09:46:14 INFO 任务:1233 END
+2025-08-08 09:46:14 INFO 总数 总用时 总字数 总列数 总大小
+2025-08-08 09:46:14 INFO 1/0 13.34 491 20 4725487
+
+2025-08-08 10:34:30 INFO 任务:1 START 总数:1
+2025-08-08 10:34:30 INFO 压缩模式开启,最大像素: 2500
+2025-08-08 10:34:30 INFO 序号 用时 字数 列数 大小 宽度 高度 路径
+2025-08-08 10:34:38 INFO 1 7.90 481 53 1469 3075 6030 D:/Windos0/desktop/0003.jpg
+2025-08-08 10:34:38 INFO 任务:1 END
+2025-08-08 10:34:38 INFO 总数 总用时 总字数 总列数 总大小
+2025-08-08 10:34:38 INFO 1/0 7.92 481 53 1504099
+
diff --git a/Log/OCR/2025-08-20.log b/Log/OCR/2025-08-20.log
new file mode 100644
index 0000000..eafafeb
--- /dev/null
+++ b/Log/OCR/2025-08-20.log
@@ -0,0 +1,29 @@
+2025-08-20 14:02:33 INFO 任务:1 START 总数:1
+2025-08-20 14:02:33 INFO 序号 用时 字数 列数 大小 宽度 高度 路径
+2025-08-20 14:02:49 INFO 1 15.61 696 35 2290 889 1393 D:/Windos0/desktop/67997bf16a7c2e2f7489a6f97ae8a83e.png
+2025-08-20 14:02:49 INFO 任务:1 END
+2025-08-20 14:02:49 INFO 总数 总用时 总字数 总列数 总大小
+2025-08-20 14:02:49 INFO 1/0 15.69 696 35 2345247
+
+2025-08-20 14:23:42 INFO 任务:11 START 总数:1
+2025-08-20 14:23:42 INFO 序号 用时 字数 列数 大小 宽度 高度 路径
+2025-08-20 14:23:47 WARNING 1 ocr failed D:/Important/software/软件交接/重要/重/籍智达OCR软件/籍智达OCR软件/jzd.0129/图/0003.JPG
+2025-08-20 14:23:47 INFO 任务:11 END
+2025-08-20 14:23:47 INFO 总数 总用时 总字数 总列数 总大小
+2025-08-20 14:23:47 INFO 0/1 5.04 0 0 0
+
+2025-08-20 14:24:29 INFO 任务:11 START 总数:1
+2025-08-20 14:24:29 INFO 序号 用时 字数 列数 大小 宽度 高度 路径
+2025-08-20 14:24:34 WARNING 1 ocr failed D:/Windos0/desktop/0001/0001.png
+2025-08-20 14:24:34 INFO 任务:11 END
+2025-08-20 14:24:34 INFO 总数 总用时 总字数 总列数 总大小
+2025-08-20 14:24:34 INFO 0/1 5.04 0 0 0
+
+2025-08-20 14:27:35 INFO 任务:1 START 总数:1
+2025-08-20 14:27:35 INFO 压缩模式开启,最大像素: 2500
+2025-08-20 14:27:35 INFO 序号 用时 字数 列数 大小 宽度 高度 路径
+2025-08-20 14:27:41 WARNING 1 ocr failed D:/Windos0/desktop/0001/0001.png
+2025-08-20 14:27:41 INFO 任务:1 END
+2025-08-20 14:27:41 INFO 总数 总用时 总字数 总列数 总大小
+2025-08-20 14:27:41 INFO 0/1 5.85 0 0 0
+
diff --git a/Log/fail/ocr/1.txt b/Log/fail/ocr/1.txt
new file mode 100644
index 0000000..e69de29
diff --git a/Log/fail/ocr/11.txt b/Log/fail/ocr/11.txt
new file mode 100644
index 0000000..c9fa5fa
--- /dev/null
+++ b/Log/fail/ocr/11.txt
@@ -0,0 +1 @@
+D:/Windos0/desktop/0001/0001.png
diff --git a/Log/fail/ocr/1233.txt b/Log/fail/ocr/1233.txt
new file mode 100644
index 0000000..e69de29
diff --git a/config.json b/config.json
new file mode 100644
index 0000000..add88ae
--- /dev/null
+++ b/config.json
@@ -0,0 +1,20 @@
+{
+ "login_url": "https://gj.cool/ocr_login",
+ "apiid": "5be9a4ac35015a478425ba2d212545",
+ "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmcmVzaCI6dHJ1ZSwiaWF0IjoxNzU1NjcxMDA4LCJqdGkiOiJmYjE4Mzc1Yy0yYmQwLTQ3MDUtOTg1Zi0yYmMyOGU0NTQ0NWQiLCJ0eXBlIjoiYWNjZXNzIiwic3ViIjoibWtHdFh0OW5NTUtQcGpuQ2daSXV6dz09XG4iLCJuYmYiOjE3NTU2NzEwMDgsImV4cCI6MTc2MzQ0NzAwOH0.UU441ZZVpQ5gxRHhWDuhUn1X8ToOMjN_kYH-5fuMWA6ZKfJTFWu29jzXrWZgSFbLmzONNrhrMPpg5bTPHALl7UJrs6yJO5G6Q264vAO4kwDyjLdrl55BGoh2DO_Lq3NWd8LvKfn64TIG620fJJuItNARczOO_TGUjLtBrSMRx30",
+ "server": "web",
+ "server_lst": {
+ "web": "https://ap2.jzd.cool:9043",
+ "local": "http://117.72.92.55:9012"
+ },
+ "local_head": "http://",
+ "local_port": 9012,
+ "max_size": 70,
+ "interval": 0,
+ "punct_max_length": 100000,
+ "punct_detect_encoding": true,
+ "punct_default_encoding": "utf-8",
+ "timeout_connect": 15,
+ "timeout_read": 300,
+ "retry_time": 3
+}
\ No newline at end of file
diff --git a/jzd.py b/jzd.py
new file mode 100644
index 0000000..851f5e7
--- /dev/null
+++ b/jzd.py
@@ -0,0 +1,1341 @@
+#pip install -r requirements.txt
+import json,logging,time,os,tkinter,base64,requests,whatimage,rsa
+from pathlib import Path
+from getpass import getpass
+from tkinter import filedialog
+from tqdm import tqdm
+from PyPDF2 import PdfMerger, PdfReader, PdfWriter
+from pdf2image import convert_from_path
+
+Start_dir = Path(__file__).parent
+ConfigFile = Start_dir / 'config.json'
+Pubkey_path = str(Start_dir / 'password_pubkey.pem')
+Password_path = str(Start_dir / 'password_encrypt.txt')
+
+
+SR_EXT_lst = ['jpeg', 'png', 'tiff', 'webp']
+SR_Output_lst = ['file', 'base64']
+Pdf_to_Image_lst= ['JPEG', 'PNG']
+Usage_API_Type_lst = ['ocr', 'sr', 'pdf']
+
+
+Log_dir = Start_dir / 'Log'
+Data_dir = Start_dir / 'Data'
+
+Json_Data_dir = Data_dir / 'json'
+Text_Data_dir = Data_dir / 'text'
+Punct_Data_dir = Data_dir / 'punct'
+PDF_Data_dir = Data_dir / 'pdf'
+SR_Data_dir = Data_dir / 'sr'
+
+Fail_dir = Log_dir / 'fail'
+Fail_OCR_dir = Fail_dir / 'ocr'
+Fail_Punct_dir = Fail_dir / 'punct'
+Fail_SR_dir = Fail_dir / 'sr'
+Fail_PDF_dir = Fail_dir / 'pdf'
+
+Log_dir.mkdir(exist_ok=True)
+Data_dir.mkdir(exist_ok=True)
+Json_Data_dir.mkdir(exist_ok=True)
+Text_Data_dir.mkdir(exist_ok=True)
+Punct_Data_dir.mkdir(exist_ok=True)
+PDF_Data_dir.mkdir(exist_ok=True)
+SR_Data_dir.mkdir(exist_ok=True)
+Fail_dir.mkdir(exist_ok=True)
+Fail_OCR_dir.mkdir(exist_ok=True)
+Fail_Punct_dir.mkdir(exist_ok=True)
+Fail_SR_dir.mkdir(exist_ok=True)
+Fail_PDF_dir.mkdir(exist_ok=True)
+
+# Poppler_Path = None
+Poppler_Path = r'D:\poppler-0.68.0\bin'
+
+def api_area(img_path, area_num, row_num, void_value, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/area'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ img_name = Path(img_path).name
+ mime = get_mime(img_path)
+ files = [('img', (img_name, open(img_path, 'rb'), mime))]
+ data = {'area_num':area_num, 'row_num':row_num}
+
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ return result.get('area', void_value)
+
+ except:
+ print('area failed')
+ return void_value
+
+def api_ocr_pro(img_path, layout, area, compact, void_value, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/ocr_pro'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ img_name = Path(img_path).name
+ mime = get_mime(img_path)
+ files = [('img', (img_name, open(img_path, 'rb'), mime))]
+ data = {'layout':layout, 'area':str(area), 'compact':compact}
+
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ if result.get('msg') is None and result.get('detail') is None:
+ return result
+ else:
+ print(result)
+ return void_value
+ except:
+ print('ocr_pro failed')
+ return void_value
+
+def api_punct_pro(orig_path, encoding,void_value, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/punct_pro'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ lines = open(orig_path, 'r', encoding=encoding).readlines()
+ src =''.join(lines).replace('\n', '').replace('】【', '')
+ payload = {'src':src}
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ if result.get('msg') is None and result.get('detail') is None:
+ return result
+ else:
+ print(result)
+ return void_value
+ except:
+ print('punct_pro failed')
+ return void_value
+
+def api_pdf(img_path, data_path, pdf_path, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/pdf'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ if data_path is not None:
+ filename = Path(img_path).name
+ mime = get_mime(img_path)
+ files = [('img', (filename, open(img_path, 'rb'), mime)), ('data', (filename, open(data_path, 'rb'), 'application/json'))]
+
+ i = 0
+ while i=retry_times or response is None:
+ return False
+ elif response.headers['content-type'] == 'application/json':
+ print(response.json())
+ return False
+ elif response.headers['content-type'] == 'application/pdf':
+ with open(pdf_path, "wb") as f:
+ f.write(response.content)
+ return True
+ else:
+ return False
+
+ except:
+ print('pdf failed')
+ return False
+
+def api_sr(img_path, output_path, scale, ext, output, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/sr'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ img_name = Path(img_path).name
+ mime = get_mime(img_path)
+ files = [('img', (img_name, open(img_path, 'rb'), mime))]
+ data = {'scale':scale, 'ext':ext, 'output':output}
+
+ i = 0
+ while i=retry_times or response is None:
+ return False
+ elif response.headers['content-type'] == 'application/json':
+ result = response.json()
+ if output == 'base64':
+ if output in result.keys(): # result.get(output):
+ with open(output_path, "w", encoding='utf-8') as f:
+ f.write(result[output])
+ return True
+ else:
+ print(result)
+ return False
+ elif output == 'file':
+ print(result)
+ return False
+ else:
+ print(f'ouput wrong: {output}')
+ return False
+ else:
+ with open(output_path, "wb") as f:
+ f.write(response.content)
+ return True
+ except:
+ print('sr failed')
+ return False
+
+def api_usage(api_type, void_value, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/usage'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ return result
+
+
+ except:
+ print('get usage failed')
+ return False
+
+def batch_ocr_api(path_lst, layout, compact, area_num, row_num, task_name, config): #area_num, row_num, area_url
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t\t总数:{len(path_lst)}')
+ logging.info(f'\t\t序号\t用时\t字数\t列数\t大小\t宽度\t高度\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0,'CharNumber':0, 'LineNumber':0, 'ImageSize':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_OCR_dir.joinpath(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="OCR"):
+ now_api_time = time.time()
+
+ if area_num == 0:
+ area = []
+ else:
+ area = api_area(path_dict['img_path'], area_num, row_num, [], config)
+ print(area)
+
+ data = api_ocr_pro(path_dict['img_path'], layout, area, compact, {}, config)
+
+ last_api_time = time.time()
+ if data=={}:
+ logging.warning(f"\t{index+1:<5d}\tocr failed\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ try:
+ with open(path_dict['json_path'], "w", encoding='utf-8') as f:
+ json.dump(data, f, ensure_ascii=False)
+
+ text = data['text'] if data.get('text') is not None else data_to_text(data)
+ with open(path_dict['text_path'], "w", encoding='utf-8') as f:
+ f.write(text)
+
+ #序号、用时、字数、列数、大小、宽度、高度、路径
+ # img_size = round(os.path.getsize(path_dict['img_path'])/1024) #KB
+ img_size = round(data['Size']/1024) #KB
+ time_cost= last_api_time - now_api_time #s
+ logging.info(f"\t\t{index+1:<6d}\t{time_cost:.2f}\t{data['CharNumber']:<6d}\t{data['LineNumber']:<6d}\t{img_size:<6d}\t{data['Width']:<6d}\t{data['Height']:<6d}\t{path_dict['img_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['CharNumber'] += data['CharNumber']
+ total_info['LineNumber'] += data['LineNumber']
+ total_info['ImageSize'] += data['Size']
+ total_info['SuccessNumber'] += 1
+ except:
+ logging.warning(f"\t\t{index+1:<6d}\tsave data wrong\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+
+ index += 1
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t总用时\t总字数\t总列数\t总大小")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['CharNumber']:<6d}\t{total_info['LineNumber']:<6d}\t{total_info['ImageSize']:<6d}\n")
+
+def batch_punct_api(path_lst, task_name, config):
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t\t总数:{len(path_lst)}')
+ logging.info(f'\t\t序号\t用时\t原字数\t字数\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0, 'OrigNumber':0, 'PunctNumber':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_Punct_dir /(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="Punct"):
+ now_api_time = time.time()
+ data = api_punct_pro(path_dict['orig_path'], path_dict['encoding'], {}, config)
+
+ last_api_time = time.time()
+ if data=={}:
+ logging.warning(f"\t{index+1:<6d}\tocr failed\t{path_dict['orig_path']}")
+ save_text(fail_list_path, f"{path_dict['orig_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ try:
+ text = data['text'][0]
+ with open(path_dict['punct_path'], "w", encoding=path_dict['encoding']) as f:
+ f.write(text)
+
+ #序号、用时、字数、列数、大小、宽度、高度、路径
+ time_cost= last_api_time - now_api_time #s
+ orig_num = path_dict['orig_num']
+ punct_num = len(list(text))
+ logging.info(f"\t\t{index+1:<6d}\t{time_cost:.2f}\t{orig_num:<6d}\t{punct_num:<6d}\t{path_dict['orig_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['OrigNumber'] += orig_num
+ total_info['PunctNumber'] += punct_num
+ total_info['SuccessNumber'] += 1
+ except:
+ logging.warning(f"\t\t{index+1:<6d}\tsave data wrong\t{path_dict['orig_path']}")
+ save_text(fail_list_path, f"{path_dict['orig_path']}\n", True)
+ total_info['FailNumber'] += 1
+ index += 1
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t总用时\t总原字数\t总字数")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['OrigNumber']:<6d}\t{total_info['PunctNumber']:<6d}\n")
+
+
+def batch_pdf_api(path_lst, task_name, config):
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t总数:{len(path_lst)}')
+ logging.info(f'\t\t序号\t用时\t大小\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0, 'PDFSize':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_PDF_dir.joinpath(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ # access_token = get_access_token_by_refresh(refresh_token)
+ # last_refresh_time = time.time()
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="PDF"):
+ # if time.time()-last_refresh_time > Access_Token_Refresh_Interval:
+ # access_token = get_access_token_by_refresh(refresh_token)
+ # last_refresh_time = time.time()
+ # if access_token == '':
+ # logging.warning(f"get access token failed")
+ # print('get access token failed')
+ # break
+
+ now_api_time = time.time()
+ pdf_file = api_pdf(path_dict['img_path'], path_dict['data_path'], path_dict['pdf_path'], config)
+ last_api_time = time.time()
+
+ if not pdf_file:
+ logging.warning(f"\t{index+1:<5d}\tpdf failed\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ #序号、用时、大小、路径
+ pdf_size = round(os.path.getsize(path_dict['pdf_path'])/1024) #KB
+ time_cost= last_api_time - now_api_time #s
+ logging.info(f"\t\t{index+1:<5d}\t{time_cost:.2f}\t{pdf_size:<6d}\t{path_dict['pdf_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['PDFSize'] += pdf_size
+ total_info['SuccessNumber'] += 1
+
+ index += 1
+ # while time.time()-last_api_time < interval:
+ # time.sleep(1)
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t总用时\t总大小")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['PDFSize']:<8d}\n")
+
+def batch_sr_api(path_lst, scale, ext, output, task_name, config):
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t总数:{len(path_lst)}')
+ logging.info(f'\t\t序号\t\t用时\t\t大小\t\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0, 'SRSize':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_SR_dir.joinpath(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="SR"):
+
+ now_api_time = time.time()
+ pdf_file = api_sr(path_dict['img_path'], path_dict['sr_path'], scale, ext, output, config)
+ last_api_time = time.time()
+ if not pdf_file:
+ logging.warning(f"\t{index+1:<5d}\tsr failed\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ #序号、用时、大小、路径
+ sr_size = round(os.path.getsize(path_dict['sr_path'])/1024) #KB
+ time_cost= last_api_time - now_api_time #s
+ logging.info(f"\t\t{index+1:<5d}\t{time_cost:.2f}\t{sr_size:<6d}\t{path_dict['sr_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['SRSize'] += sr_size
+ total_info['SuccessNumber'] += 1
+
+ index += 1
+ # while time.time()-last_api_time < interval:
+ # time.sleep(1)
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t\t总用时\t总大小")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['SRSize']:<8d}\n")
+
+def get_usage_api(api_type, config):
+ # access_token = get_access_token_by_refresh(refresh_token)
+
+ usage = api_usage(api_type, config, {})
+ if usage != {}:
+ if usage.get('msg') is not None:
+ print(usage['msg'])
+ elif usage.get('detail') is not None:
+ print(usage['detail'])
+ else:
+ result = f'本期已用: {usage["usage"]}; 本期剩余: {usage["remain"]}; 本期总量: {usage["total"]}; 历史总量: {usage["history"]}'
+ print(result)
+ else:
+ print('查询失败')
+
+
+
+def check_apiid(apiid):
+ return len(apiid) !=0 and len(apiid)==30
+
+def check_config(config, password_path=Password_path):
+ if not check_apiid(config['apiid']):
+ print('注意: apiid无效, 请设置apiid')
+ elif load_password(password_path) == '':
+ print('注意: 密码无效,请设置密码')
+ elif config['token'] == '':
+ print('注意: Token无效,请刷新Token')
+ elif config['server'] not in config['server_lst'].keys():
+ print('注意: 服务器无效,请设置服务器')
+ elif config['server'] == 'local' and config['server_lst']['local'] == '':
+ print('注意: 本地服务器为空,请设置本地服务器IP地址')
+
+def check_password(password, pubkey_path, password_encrypt_path):
+ try:
+ if password=='':
+ return False
+ encrypt_password = encrypt_by_rsa(read_key(pubkey_path), password)
+ if encrypt_password=='':
+ return False
+ else:
+ save_text(password_encrypt_path, encrypt_password)
+ return True
+ except:
+ print('密码检查失败')
+ return False
+
+
+
+
+
+def encrypt_by_rsa(pubkey, message:str):
+ '''
+ 用RSA公钥加密密码, 不超过117bytes
+
+ pubkey: rsa.key.PublicKey
+ message: str
+ return : str
+ '''
+ try:
+ if len(message.encode('utf-8')) <= 117:
+ encrypted = rsa.encrypt(message.encode('utf-8'), pubkey)
+ return str(base64.encodebytes(encrypted), encoding='utf-8')
+ else:
+ raise ValueError
+ except ValueError:
+ print('message length longer than 117 bytes')
+ return ''
+ except:
+ print("encrypt failed")
+ return ''
+
+def get_allfile_alldir_in_dir(path):
+ alldir_path =[]
+ allfile_path=[]
+ path_tuple = os.walk(path)
+
+ for dirpath, dirnames, filenames in path_tuple:
+ for dir in dirnames:
+ alldir_path.append(os.path.join(dirpath, dir))
+
+ for f in filenames:
+ allfile_path.append(os.path.join(dirpath, f))
+
+ alldir_path = sorted(alldir_path)
+ allfile_path = sorted(allfile_path)
+ return alldir_path, allfile_path
+
+
+def get_token_by_login(apiid, password, url):
+ try:
+ payload = {'apiid':apiid, 'password':password, 'encrypt':1, 'is_long':1}
+ response = requests.post(url, data=payload).json()
+ token = response['access_token']
+ except:
+ token = ''
+ return token
+
+
+def get_mime(img_path):
+ with open(img_path, 'rb') as f:
+ img = f.read()
+ mime_type = whatimage.identify_image(img)
+ if mime_type is None or mime_type=='None':
+ mime_type = Path(img_path).suffix.replace('.', '')
+ return f'image/{mime_type}'
+
+def get_encodeing(text_path, encoding_detect, default_encoding):
+ encoding = default_encoding
+ if encoding_detect:
+ import chardet
+ try:
+ data = open(text_path,'rb').read()
+ encoding = chardet.detect(data)['encoding']
+ except:
+ encoding = default_encoding
+
+ return encoding
+
+def get_text_length(file_path, encoding):
+ try:
+ text = open(file_path, 'r', encoding=encoding).read()
+ return len(list(text))
+ except:
+ return 0
+
+def load_config(config_path=ConfigFile):
+ try:
+ with open(config_path, 'r', encoding='utf-8') as f:
+ return json.load(f)
+ except:
+ print('配置文件读取失败')
+ return None
+
+
+def load_password(filepath):
+ try:
+ return open(filepath, "r" ,encoding='utf-8').read()
+ except:
+ return ''
+
+def logging_init(log_type:str, dir:Path=Log_dir):
+ '''
+ 初始化日志记录器
+ '''
+ log_dir = dir / log_type
+ log_dir.mkdir(exist_ok=True)
+
+ log_filepath = log_dir / (time.strftime("%Y-%m-%d", time.localtime()) + '.log')
+ logging.basicConfig(
+ filename=str(log_filepath),
+ level=logging.INFO,
+ format="%(asctime)s %(levelname)s %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S",
+ encoding='utf-8'
+ )
+
+
+def pdf_merge(pdf_lst, save_path):
+ try:
+ merger = PdfMerger()
+ for pdf in pdf_lst:
+ merger.append(pdf)
+ merger.write(save_path)
+ merger.close()
+ return True
+ except:
+ return False
+
+
+
+def prepare_ocr_dir_task_paths(dir, task_name, max_size):
+ #创建目录
+ json_save_dir = Json_Data_dir.joinpath(task_name)
+ json_save_dir.mkdir(exist_ok=True)
+ text_save_dir = Text_Data_dir.joinpath(task_name)
+ text_save_dir.mkdir(exist_ok=True)
+
+ alldir_path, allfile_path = get_allfile_alldir_in_dir(dir)
+ for dir_path in alldir_path:
+ data_dir = Path(str(dir_path).replace(dir, str(json_save_dir)))
+ data_dir.mkdir(exist_ok=True)
+ text_dir = Path(str(dir_path).replace(dir, str(text_save_dir)))
+ text_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in allfile_path:
+ if os.path.getsize(file_path) < max_size:
+ filename = Path(file_path).stem
+ json_dir = Path(str(file_path).replace(dir, str(json_save_dir))).parent
+ text_dir = Path(str(file_path).replace(dir, str(text_save_dir))).parent
+ path_dict = {'img_path':file_path, 'json_path':str(json_dir.joinpath(f'{filename}.json')), 'text_path':str(text_dir.joinpath(f'{filename}.txt'))}
+ path_lst.append(path_dict)
+ else:
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ return path_lst, fail_lst
+
+def prepare_ocr_files_task_paths(paths, task_name, max_size):
+ json_save_dir = Json_Data_dir.joinpath(task_name)
+ json_save_dir.mkdir(exist_ok=True)
+ text_save_dir = Text_Data_dir.joinpath(task_name)
+ text_save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in paths:
+ if os.path.getsize(file_path) < max_size:
+ filename = Path(file_path).stem
+ path_lst.append({'img_path':file_path, 'json_path':str(json_save_dir.joinpath(f'{filename}.json')), 'text_path':str(text_save_dir.joinpath(f'{filename}.txt'))})
+ else:
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ return path_lst, fail_lst
+
+
+
+def prepare_punct_dir_task_paths(dir, task_name, config):
+ detect_encoding = config['punct_detect_encoding']
+ default_encoding = config['punct_default_encoding']
+ max_length = config['punct_max_length']
+
+ #创建目录
+ save_dir = Punct_Data_dir / task_name
+ save_dir.mkdir(exist_ok=True)
+
+ alldir_path, allfile_path = get_allfile_alldir_in_dir(dir)
+ for dir_path in alldir_path:
+ punct_dir = Path(str(dir_path).replace(dir, str(save_dir)))
+ punct_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in allfile_path:
+ encoding = get_encodeing(file_path, detect_encoding, default_encoding)
+ num = get_text_length(file_path, encoding)
+ if num == 0:
+ print(f'{file_path}读取失败')
+ fail_lst.append(file_path)
+ elif num > max_length:
+ print(f'{file_path}长度过大, , 超过最大限量{max_length}字')
+ fail_lst.append(file_path)
+ else:
+ filename = Path(file_path).stem
+ punct_dir = Path(str(file_path).replace(dir, str(save_dir))).parent
+ path_dict = {'orig_path':file_path, 'punct_path':str(punct_dir.joinpath(f'{filename}.txt')), 'encoding':encoding, 'orig_num':num}
+ path_lst.append(path_dict)
+
+
+ return path_lst, fail_lst
+
+def prepare_punct_files_task_paths(paths, task_name, config):
+ detect_encoding = config['punct_detect_encoding']
+ default_encoding = config['punct_default_encoding']
+ max_length = config['punct_max_length']
+
+ #创建目录
+ save_dir = Punct_Data_dir / task_name
+ save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in paths:
+ encoding = get_encodeing(file_path, detect_encoding, default_encoding)
+ num = get_text_length(file_path, encoding)
+ if num == 0:
+ print(f'{file_path}读取失败')
+ fail_lst.append(file_path)
+ elif num > max_length:
+ print(f'{file_path}长度过大, , 超过最大限量{max_length}字')
+ fail_lst.append(file_path)
+ else:
+ filename = Path(file_path).stem
+ path_dict = {'orig_path':file_path, 'punct_path':str(save_dir.joinpath(f'{filename}.txt')), 'encoding':encoding, 'orig_num':num}
+ path_lst.append(path_dict)
+
+ return path_lst, fail_lst
+
+
+def prepare_ocr_list_task_paths(list_paths, task_name, max_size):
+ img_paths = []
+ for lst_path in list_paths:
+ with open(lst_path, 'r',encoding='utf-8') as f:
+ for line in f.readlines():
+ img_path = line.strip()
+ if Path(img_path).exists():
+ img_paths.append(img_path)
+
+ # [img_paths.append(line.strip()) for line in f.readlines() if len(line.strip())>0 and Path(line.strip()).exists()]
+
+ path_lst, fail_lst = prepare_ocr_files_task_paths(img_paths, task_name, max_size)
+
+ return path_lst, fail_lst
+
+def prepare_pdf_merge(root_dir, task_name):
+ try:
+ pdf_root_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_root_dir.mkdir(exist_ok=True)
+
+ all_dir, all_files = get_allfile_alldir_in_dir(root_dir)
+ if len(all_dir)>0:
+ for dir in all_dir:
+ #寻找最底层子目录
+ subdirs, item_paths = get_allfile_alldir_in_dir(dir)
+ if len(subdirs)==0:
+ save_path = str(pdf_root_dir.joinpath(f'{Path(dir).name}.pdf'))
+ if pdf_merge(item_paths, save_path):
+ print(f'{Path(save_path).name}合并完成')
+ else:
+ print(f'{Path(save_path).name}合并失败')
+ else:
+ save_path = str(pdf_root_dir.joinpath(Path(root_dir).name))
+ if pdf_merge(all_files, save_path):
+ print(f'{Path(save_path).name}合并完成')
+ else:
+ print(f'{Path(save_path).name}合并失败')
+
+ except:
+ print(f'{task_name}失败')
+
+def prepare_pdf_split(pdf_paths, task_name):
+ try:
+ pdf_root_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_root_dir.mkdir(exist_ok=True)
+ for pdf_path in tqdm(pdf_paths, desc='PDF拆分'):
+ reader = PdfReader(pdf_path)
+ pdf_dir = pdf_root_dir.joinpath(Path(pdf_path).stem)
+ pdf_dir.mkdir(exist_ok=True)
+ for i in range(len(reader.pages)):
+ writer = PdfWriter()
+ writer.add_page(reader.pages[i])
+ page_path = pdf_dir.joinpath(f'{i+1:04d}.pdf')
+ with open(str(page_path), "wb") as fp:
+ writer.write(fp)
+ print(f'{task_name}完成')
+ except:
+ print(f'{task_name}失败')
+
+def prepare_pdf_to_image(pdf_paths, task_name, dpi=300, image_format='JPEG', first_page=None, last_page=None):
+ try:
+ pdf_root_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_root_dir.mkdir(exist_ok=True)
+
+ for pdf_path in tqdm(pdf_paths, desc='PDF转图片'):
+ pdf_dir = pdf_root_dir.joinpath(Path(pdf_path).stem)
+ pdf_dir.mkdir(exist_ok=True)
+ filename = Path(pdf_path).stem
+ try:
+ _ = convert_from_path(pdf_path,poppler_path=Poppler_Path, dpi=dpi, output_folder=pdf_dir, fmt=image_format, first_page=first_page, last_page=last_page, thread_count=os.cpu_count(), output_file=filename)
+ except Exception as e:
+ print(e.args)
+ print(f'{pdf_path}失败')
+
+ print(f'{task_name}完成')
+ except:
+ print(f'{task_name}失败')
+
+
+def prepare_pdf_dir_task_paths(img_dir, data_dir, task_name, max_size):
+ pdf_save_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_save_dir.mkdir(exist_ok=True)
+
+ all_img_dir, all_img_file = get_allfile_alldir_in_dir(img_dir)
+ for dir in all_img_dir:
+ pdf_dir = Path(str(dir).replace(img_dir, str(pdf_save_dir)))
+ pdf_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for img_path in all_img_file:
+ if os.path.getsize(img_path) < max_size:
+ filename = Path(img_path).stem
+
+ data_path = Path(str(img_path).replace(img_dir, data_dir)).parent.joinpath(f'{filename}.json')
+ if data_path.exists():
+ pdf_path = Path(str(img_path).replace(img_dir, str(pdf_save_dir))).parent.joinpath(f'{filename}.pdf')
+ path_lst.append({'img_path':img_path, 'data_path':str(data_path), 'pdf_path':str(pdf_path)})
+ else:
+ print(f'数据不存在: {data_path}')
+ fail_lst.append(img_path)
+ else:
+ print(f'{img_path}体积过大, {os.path.getsize(img_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(img_path)
+ return path_lst, fail_lst
+
+def prepare_pdf_files_task_paths(img_paths, data_dir, task_name, max_size):
+ pdf_save_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for img_path in img_paths:
+ if os.path.getsize(img_path) < max_size:
+ filename = Path(img_path).stem
+
+ data_path = Path(data_dir).joinpath(f'{filename}.json')
+ if data_path.exists():
+ pdf_path = Path(pdf_save_dir).joinpath(f'{filename}.pdf')
+ path_lst.append({'img_path':img_path, 'data_path':str(data_path), 'pdf_path':str(pdf_path)})
+ else:
+ print(f'数据不存在: {data_path}')
+ fail_lst.append(img_path)
+ else:
+ print(f'{img_path}体积过大, {os.path.getsize(img_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(img_path)
+ return path_lst, fail_lst
+
+def prepare_sr_dir_task_paths(img_dir, task_name, ext, output, max_size):
+ #创建目录
+ sr_save_dir = SR_Data_dir.joinpath(task_name)
+ sr_save_dir.mkdir(exist_ok=True)
+
+ alldir_path, allfile_path = get_allfile_alldir_in_dir(img_dir)
+ for dir_path in alldir_path:
+ data_dir = Path(str(dir_path).replace(img_dir, str(sr_save_dir)))
+ data_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in allfile_path:
+ # img_PIL = Image.open(file_path)
+
+ if os.path.getsize(file_path) > max_size:
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ # elif max(img_PIL.size)>max_length:
+ # print(f'{file_path}尺寸过大, {img_PIL.size[0]}x{img_PIL.size[1]}px, 超过最大限量{max_length}px')
+ # fail_lst.append(file_path)
+ else:
+ filename = Path(file_path).stem
+ sr_dir = Path(str(file_path).replace(img_dir, str(sr_save_dir))).parent
+ ext_format = 'txt' if output=='base64' else ext
+ path_lst.append( {'img_path':file_path, 'sr_path':str(sr_dir.joinpath(f'{filename}.{ext_format}'))})
+
+ return path_lst, fail_lst
+
+def prepare_sr_files_task_paths(img_paths, task_name, ext, output, max_size):
+ #创建目录
+ sr_save_dir = SR_Data_dir.joinpath(task_name)
+ sr_save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in img_paths:
+ # img_PIL = Image.open(file_path)
+
+ if os.path.getsize(file_path) > max_size :
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ # elif max(img_PIL.size)>max_length:
+ # print(f'{file_path}尺寸过大, {img_PIL.size[0]}x{img_PIL.size[1]}px, 超过最大限量{max_length}px')
+ # fail_lst.append(file_path)
+ else:
+ filename = Path(file_path).stem
+ ext_format = 'txt' if output=='base64' else ext
+ path_lst.append( {'img_path':file_path, 'sr_path':str(sr_save_dir.joinpath(f'{filename}.{ext_format}'))})
+
+
+ return path_lst, fail_lst
+
+def read_key(key_path):
+ '''
+ 读取公钥文件
+ key_path: pem文件地址
+ return: rsa.key.PublicKey
+ '''
+ with open(key_path, 'rb') as f:
+ pubkey_data = f.read()
+ return rsa.PublicKey.load_pkcs1(pubkey_data)
+
+def read_paths(pathtype='file', init_dir='./'):
+ root = tkinter.Tk()
+ root.focus_force()
+ root.after(10, root.withdraw)
+ if pathtype == 'file':
+ return filedialog.askopenfilenames(parent=root, initialdir=init_dir)
+ elif pathtype == 'dir':
+ return filedialog.askdirectory(parent=root, initialdir=init_dir)
+
+def save_text(filepath, content, is_add=False):
+ if not filepath: return
+ with open(filepath, "a" if is_add else "w",encoding='utf-8') as f:
+ f.write(content)
+
+def save_config(config, config_path=ConfigFile):
+ with open(config_path, 'w', encoding='utf-8') as f:
+ json.dump(config, f, ensure_ascii=False, indent=4)
+
+def data_to_text(data):
+ result = ''
+ if data.get('line_ids') is not None and data.get('chars') is not None:
+ for i, (id_i, char_i) in enumerate(zip(data['line_ids'], data['chars'])):
+ #处理非结尾的字符
+ if i < len(data['line_ids'])-1 and id_i==data['line_ids'][i+1]:
+ result+=char_i
+ #处理结尾处的字符
+ else:
+ result+=char_i+'\n'
+ return result
+
+if __name__ == "__main__":
+
+ key = input('选择任务: 0.设置; 1.识别; 2.自动标点; 3.PDF; 4.超分辨率增强; 5.查询使用量. 输入其他键, 退出\t')
+ while key in ['0', '1', '2', '3', '4', '5']:
+ if key in ['0']:
+ config = load_config()
+ check_config(config)
+
+ sub_key = input('1.设置apiid; 2.设置密码; 3.刷新Token; 4.选择服务器; 5.设置本地服务器IP地址. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3', '4', '5']:
+ if sub_key in ['1']:
+ config = load_config()
+ apiid_now = config['apiid']
+ apiid = input(f'当前apiid: {apiid_now}. 如果重新设置, 请输入apiid, 否则请回车:\t')
+ if len(apiid) == 0:
+ print('放弃设置apiid')
+ else:
+ while not check_apiid(apiid):
+ apiid = input('请输入apiid, 回车则放弃设置:\t')
+ if len(apiid) == 0:
+ print('放弃设置apiid')
+ break
+ config['apiid'] = apiid
+ save_config(config)
+
+ elif sub_key in ['2']:
+ password = getpass('请输入密码,密码加密后保存于Config/password_encrypt.txt。回车则放弃设置:\t')
+ while not check_password(password, Pubkey_path, Password_path):
+ password = getpass('请输入密码:\t')
+ if len(password) == 0:
+ print('放弃设置密码')
+ break
+
+ elif sub_key in ['3']:
+ config = load_config()
+ apiid = config['apiid']
+ login_url = config['login_url']
+ encrypt_password = load_password(Password_path)
+ token = get_token_by_login(apiid, encrypt_password, login_url)
+ if len(token) == 0:
+ print('Token刷新失败,请重新检查账号信息或网络连接')
+ else:
+ print('Token刷新成功')
+ config['token'] = token
+ save_config(config)
+
+ elif sub_key in ['4']:
+ config = load_config()
+ server_now = config['server']
+ server_lst = list(config['server_lst'].keys())
+ server = input(f'当前服务器: {server_now}. 如果重新选择,请选择{",".join(server_lst)} , 否则请回车:\t')
+ if len(server)>0:
+ if server in server_lst:
+ config['server'] = server
+ save_config(config)
+ else:
+ while len(server)>0 and server not in server_lst:
+ server = input(f'请选择{", ".join(server_lst)} , 放弃请回车:\t')
+ if len(server) == 0:
+ print('放弃选择服务器')
+ break
+ elif server in server_lst:
+ config['server'] = server
+ save_config(config)
+
+ elif sub_key in ['5']:
+ config = load_config()
+ if config['server'] == 'local':
+ local_ip = input(f"当前本地服务器: {config['server_lst']['local']}. 如果重新设置, 输入本地服务器的IP地址, 否则请回车:\t")
+ if len(local_ip) == 0:
+ print('放弃修改本地服务器IP')
+ else:
+ while len(local_ip.split('.'))!= 4:
+ print('IP地址格式错误,请重新输入')
+ local_ip = input(f"请输入本地服务器的IP地址, 放弃请回车:\t")
+ if len(local_ip) == 0:
+ break
+ if len(local_ip) != 0:
+ config['server_lst']['local'] = f"{config['local_head']}{local_ip}:{config['local_port']}"
+ save_config(config)
+ else:
+ print('请先将服务器设置为local')
+
+ config = load_config()
+ check_config(config)
+ sub_key = input('1.设置apiid; 2.设置密码; 3.刷新Token; 4.选择服务器; 5.设置本地服务器IP地址. 输入其他键, 返回上层\t')
+
+ elif key in ['1']:
+ logging_init('OCR')
+ sub_key = input('选择图片: 1.目录; 2.文件; 3.列表. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3']:
+
+ layout = input('请输入排版方向: 0:竖版,1:横版. 默认值:0\t')
+ if layout not in ['0', '1']:
+ layout = '0'
+
+ compact = input('请输入Compact参数: 1, 2, 4, 6. 默认值: 1\t')
+ if compact not in ['1', '2', '4', '6']:
+ compact = '1'
+ compact = int(compact)
+
+ #task_name
+ task_name = input('请输入任务名称:\t')
+ if not task_name:
+ break
+
+ config = load_config()
+ max_size = config['max_size'] * 1024 * 1024
+
+ #图片列表:path_lst,fail_lst
+ if sub_key in ['1']:
+ print('请选择图片目录')
+ dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not dir:
+ break
+ print(dir)
+ path_lst, fail_lst = prepare_ocr_dir_task_paths(dir, task_name, max_size)
+ elif sub_key in ['2']:
+ print('请选择图片文件')
+ img_paths = read_paths(init_dir=str(Start_dir))
+ if not img_paths:
+ break
+ print(f'已选择{len(img_paths)}个文件')
+ path_lst, fail_lst = prepare_ocr_files_task_paths(img_paths, task_name, max_size)
+ elif sub_key in ['3']:
+ print('请选择列表文件')
+ list_paths = read_paths(init_dir=str(Start_dir))
+ if not list_paths:
+ break
+ print(f'已选择{len(list_paths)}个列表')
+ path_lst, fail_lst = prepare_ocr_list_task_paths(list_paths, task_name, max_size)
+
+ #path_lst, layout,task_name,url, fail_lst
+ if len(fail_lst)>0:
+ check_size = input(f'有{len(fail_lst)}个文件体积超标, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_size not in ['1']:
+ break
+
+ area_check = input('如果需要自动检测封闭区域, 则输入区域数量(1-4); 不需要则跳过\t')
+ if area_check in ['1', '2', '3', '4']:
+ area_num = int(area_check)
+
+ row_num_check = input('如果需要分栏,则输入分栏数量(2-4); 不需要则跳过\t')
+ if row_num_check in ['2','3','4']:
+ row_num = int(row_num_check)
+ else:
+ row_num = 1
+ else:
+ area_num = 0
+ row_num = 1
+
+ try:
+ batch_ocr_api(path_lst, layout, compact, area_num, row_num, task_name, config)
+ except:
+ print(f'{task_name}任务失败')
+
+ sub_key = input('选择方式: 1.目录; 2.文件; 3.列表. 输入其他键, 返回上层\t')
+
+ elif key in ['2']:
+ logging_init('Punct')
+ sub_key = input('选择文本: 1.目录; 2.文件. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2']:
+ task_name = input('请输入任务名称:\t')
+ if not task_name:
+ break
+
+ config = load_config()
+
+ if sub_key in ['1']:
+ print('请选择目录')
+ dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not dir:
+ break
+ print(dir)
+ path_lst, fail_lst = prepare_punct_dir_task_paths(dir, task_name, config)
+ elif sub_key in ['2']:
+ print('请选择文件')
+ orig_paths = read_paths(init_dir=str(Start_dir))
+ if not orig_paths:
+ break
+ print(f'已选择{len(orig_paths)}个文件')
+ path_lst, fail_lst = prepare_punct_files_task_paths(orig_paths, task_name, config)
+
+ if len(fail_lst)>0:
+ check_length = input(f'有{len(fail_lst)}个文件长度超标, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_length not in ['1']:
+ break
+
+ batch_punct_api(path_lst, task_name, config)
+
+ sub_key = input('选择方式: 1.目录; 2.文件. 输入其他键, 返回上层\t')
+
+
+ elif key in ['3']:
+ logging_init('PDF')
+ sub_key = input('选择方式: 1.按目录生成; 2.按文件生成; 3.PDF合并; 4.PDF拆分; 5.PDF转图片. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3', '4', '5']:
+
+ task_name = input('请输入任务名称:\t')
+ if not task_name:
+ break
+
+ if sub_key in ['1', '2']:
+ config = load_config()
+ max_size = config['max_size'] * 1024 * 1024
+
+ if sub_key in ['1']:
+ print('请选择图片目录')
+ img_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not img_dir:
+ break
+ print(img_dir)
+
+ print('请选择数据目录')
+ data_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not data_dir:
+ print('数据为空')
+ break
+ else:
+ print(data_dir)
+
+
+ path_lst, fail_lst = prepare_pdf_dir_task_paths(img_dir, data_dir, task_name, max_size)
+
+ elif sub_key in ['2']:
+ print('请选择图片文件')
+ img_paths = read_paths(init_dir=str(Start_dir))
+ if not img_paths:
+ break
+ print(f'已选择{len(img_paths)}个文件')
+
+ print('请选择数据目录')
+ data_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not data_dir:
+ print('数据为空')
+ break
+ else:
+ print(data_dir)
+
+ path_lst, fail_lst = prepare_pdf_files_task_paths(img_paths, data_dir, task_name, max_size)
+
+ #
+ if len(fail_lst)>0:
+ check_size = input(f'有{len(fail_lst)}个文件存在问题, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_size not in ['1']:
+ break
+ try:
+ config = load_config()
+ batch_pdf_api(path_lst, task_name, config)
+ except:
+ print(f'{task_name}任务失败')
+
+ #合并
+ elif sub_key in ['3']:
+ print('请选择PDF目录')
+ pdf_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not pdf_dir:
+ break
+ print(pdf_dir)
+
+ prepare_pdf_merge(pdf_dir, task_name)
+
+ #拆分
+ elif sub_key in ['4']:
+ print('请选择PDF文件')
+ pdf_paths = read_paths(init_dir=str(Start_dir))
+ if not pdf_paths:
+ break
+ print(f'已选择{len(pdf_paths)}个文件')
+
+ prepare_pdf_split(pdf_paths, task_name)
+
+ #转图片
+ elif sub_key in ['5']:
+ print('请选择PDF文件')
+ pdf_paths = read_paths(init_dir=str(Start_dir))
+ if not pdf_paths:
+ break
+ print(f'已选择{len(pdf_paths)}个文件')
+
+ dpi_str = input('请输入dpi:\t')
+ try:
+ dpi = int(dpi_str)
+ if dpi<=0:
+ break
+ except:
+ break
+
+ format_str = input('请选择图片格式: 1.jpeg; 2.png.\t')
+ if format_str not in ['1', '2']:
+ break
+ format_id = int(format_str)-1
+ image_format = Pdf_to_Image_lst[format_id]
+
+ prepare_pdf_to_image(pdf_paths, task_name, dpi=dpi, image_format=image_format)
+
+
+ sub_key = input('选择方式: 1.按目录生成; 2.按文件生成; 3.PDF合并; 4.PDF拆分; 5.PDF转图片. 输入其他键, 返回上层\t')
+
+ elif key in ['4']:
+ logging_init('SR')
+ sub_key = input('选择方式: 1.目录; 2.文件. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2']:
+
+ task_name = input('请输入任务名称:\t')
+ if not task_name:
+ break
+
+ scale_str = input('请输入放大倍数: 1, 2, 4. 默认值:2\t')
+ if scale_str not in ['1','2','4']:
+ scale_str = '2'
+ scale = int(scale_str)
+
+ ext_str = input('请输入保存图片格式: 1.jpeg, 2.png, 3.tiff, 4.webp. 默认值:jpeg\t')
+ if ext_str not in ['1','2','3','4']:
+ ext_str = '1'
+ ext = SR_EXT_lst[int(ext_str)-1]
+
+ output_str = input('请输入数据格式: 1.file, 2.base64. 默认值:file\t')
+ if output_str not in ['1','2','3','4']:
+ output_str = '1'
+ output = SR_Output_lst[int(output_str)-1]
+
+ config = load_config()
+ max_size = config['max_size'] * 1024 * 1024
+
+ if sub_key in ['1']:
+ print('请选择图片目录')
+ img_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not img_dir:
+ break
+ print(img_dir)
+ path_lst, fail_lst = prepare_sr_dir_task_paths(img_dir, task_name, ext, output, max_size)
+
+ elif sub_key in ['2']:
+ print('请选择图片文件')
+ img_paths = read_paths(init_dir=str(Start_dir))
+ if not img_paths:
+ break
+ # print(img_paths)
+ path_lst, fail_lst = prepare_sr_files_task_paths(img_paths, task_name, ext, output, max_size)
+
+ if len(fail_lst)>0:
+ check_size = input(f'有{len(fail_lst)}个文件存在问题, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_size not in ['1']:
+ break
+
+ try:
+ config = load_config()
+ batch_sr_api(path_lst, scale, ext, output, task_name, config)
+ except:
+ print(f'{task_name}任务失败')
+ sub_key = input('选择方式: 1.目录; 2.文件. 输入其他键, 返回上层\t')
+
+ elif key in ['5']:
+ sub_key = input('选择参数: 1.ocr; 2.sr; 3.pdf. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3']:
+ api_type = Usage_API_Type_lst[int(sub_key)-1]
+
+ try:
+ config = load_config()
+ get_usage_api(api_type, config)
+ except:
+ print(f'查询失败')
+
+ sub_key = input('选择参数: 1.ocr; 2.sr; 3.pdf. 输入其他键, 返回上层\t')
+
+ key = input('选择任务: 0.设置; 1.OCR; 2.自动标点; 3.PDF; 4.超分辨率增强; 5.查询使用量. 输入其他键, 退出\t')
\ No newline at end of file
diff --git a/jzd_main.py b/jzd_main.py
new file mode 100644
index 0000000..137dd33
--- /dev/null
+++ b/jzd_main.py
@@ -0,0 +1,1413 @@
+#pip install -r requirements.txt
+import json,logging,time,os,tkinter,base64,requests,whatimage,rsa
+from pathlib import Path
+from getpass import getpass
+from tkinter import filedialog
+from tqdm import tqdm
+from PyPDF2 import PdfMerger, PdfReader, PdfWriter
+from pdf2image import convert_from_path
+from io import BytesIO
+
+Start_dir = Path(__file__).parent
+ConfigFile = Start_dir / 'config.json'
+Pubkey_path = str(Start_dir / 'password_pubkey.pem')
+Password_path = str(Start_dir / 'password_encrypt.txt')
+
+
+SR_EXT_lst = ['jpeg', 'png', 'tiff', 'webp']
+SR_Output_lst = ['file', 'base64']
+Pdf_to_Image_lst= ['JPEG', 'PNG']
+Usage_API_Type_lst = ['ocr', 'sr', 'pdf']
+
+
+Log_dir = Start_dir / 'Log'
+Data_dir = Start_dir / 'Data'
+
+Json_Data_dir = Data_dir / 'json'
+Text_Data_dir = Data_dir / 'text'
+Punct_Data_dir = Data_dir / 'punct'
+PDF_Data_dir = Data_dir / 'pdf'
+SR_Data_dir = Data_dir / 'sr'
+
+Fail_dir = Log_dir / 'fail'
+Fail_OCR_dir = Fail_dir / 'ocr'
+Fail_Punct_dir = Fail_dir / 'punct'
+Fail_SR_dir = Fail_dir / 'sr'
+Fail_PDF_dir = Fail_dir / 'pdf'
+
+Log_dir.mkdir(exist_ok=True)
+Data_dir.mkdir(exist_ok=True)
+Json_Data_dir.mkdir(exist_ok=True)
+Text_Data_dir.mkdir(exist_ok=True)
+Punct_Data_dir.mkdir(exist_ok=True)
+PDF_Data_dir.mkdir(exist_ok=True)
+SR_Data_dir.mkdir(exist_ok=True)
+Fail_dir.mkdir(exist_ok=True)
+Fail_OCR_dir.mkdir(exist_ok=True)
+Fail_Punct_dir.mkdir(exist_ok=True)
+Fail_SR_dir.mkdir(exist_ok=True)
+Fail_PDF_dir.mkdir(exist_ok=True)
+
+# Poppler_Path = None
+Poppler_Path = r'D:\poppler-0.68.0\bin'
+
+def resize_image(img_path, max_length:int):
+ """
+ 将图片压缩到指定的最大像素
+ """
+ try:
+ import cv2
+ file_path_gbk = str(img_path).encode('gbk')
+ img = cv2.imread(file_path_gbk.decode())
+ if img is None:
+ img = cv2.imread(str(img_path))
+
+ if img is None:
+ return None, 1.0
+
+ height, width = img.shape[:2]
+ resize_factor = max(height, width) / max_length if max(height, width) > max_length > 0 else 1.0
+ if resize_factor > 1:
+ img = cv2.resize(img, (round(width/resize_factor), round(height/resize_factor)))
+ _, buffer = cv2.imencode('.jpeg', img) # 编码为JPEG字节流
+ img_bytes = BytesIO(buffer).getvalue() # 获取字节数据
+ return img_bytes, resize_factor
+ except ImportError:
+ print("错误:需要安装opencv-python才能使用压缩功能: pip install opencv-python")
+ return None, 1.0
+ except Exception as e:
+ print(f"图片压缩失败: {e}")
+ return None, 1.0
+
+def resize_data(data, resize_factor:float):
+ """
+ 将返回的坐标数据按比例放大到原图片尺寸
+ """
+ if resize_factor > 1:
+ if data.get('Width') is not None and data.get('Height') is not None:
+ data['Width'] = round(data['Width'] * resize_factor)
+ data['Height'] = round(data['Height'] * resize_factor)
+ if data.get('coors') is not None and type(data['coors'])==list:
+ data['coors'] = [[round(x*resize_factor) for x in coor] for coor in data['coors'] if type(coor)==list]
+ return data
+
+def api_area(img_path, area_num, row_num, void_value, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/area'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ img_name = Path(img_path).name
+ mime = get_mime(img_path)
+ files = [('img', (img_name, open(img_path, 'rb'), mime))]
+ data = {'area_num':area_num, 'row_num':row_num}
+
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ return result.get('area', void_value)
+
+ except:
+ print('area failed')
+ return void_value
+
+def api_ocr_pro(img_path, layout, area, compact, void_value, config, compress_mode=False, max_length=2500):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/ocr_pro'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ img_name = Path(img_path).name
+ mime = get_mime(img_path)
+
+ # 根据压缩模式处理图片
+ if compress_mode and max_length > 0:
+ img_bytes, resize_factor = resize_image(img_path, max_length)
+ if img_bytes is not None:
+ files = [('img', (img_name, img_bytes, mime))]
+ else:
+ # 压缩失败,使用原图片
+ files = [('img', (img_name, open(img_path, 'rb'), mime))]
+ resize_factor = 1.0
+ else:
+ files = [('img', (img_name, open(img_path, 'rb'), mime))]
+ resize_factor = 1.0
+
+ data = {'layout':layout, 'area':str(area), 'compact':compact}
+
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ if result.get('msg') is None and result.get('detail') is None:
+ # 如果使用了压缩,需要将坐标数据放大回原尺寸
+ if compress_mode and resize_factor > 1:
+ result = resize_data(result, resize_factor)
+ return result
+ else:
+ print(result)
+ return void_value
+ except:
+ print('ocr_pro failed')
+ return void_value
+
+def api_punct_pro(orig_path, encoding,void_value, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/punct_pro'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ lines = open(orig_path, 'r', encoding=encoding).readlines()
+ src =''.join(lines).replace('\n', '').replace('】【', '')
+ payload = {'src':src}
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ if result.get('msg') is None and result.get('detail') is None:
+ return result
+ else:
+ print(result)
+ return void_value
+ except:
+ print('punct_pro failed')
+ return void_value
+
+def api_pdf(img_path, data_path, pdf_path, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/pdf'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ if data_path is not None:
+ filename = Path(img_path).name
+ mime = get_mime(img_path)
+ files = [('img', (filename, open(img_path, 'rb'), mime)), ('data', (filename, open(data_path, 'rb'), 'application/json'))]
+
+ i = 0
+ while i=retry_times or response is None:
+ return False
+ elif response.headers['content-type'] == 'application/json':
+ print(response.json())
+ return False
+ elif response.headers['content-type'] == 'application/pdf':
+ with open(pdf_path, "wb") as f:
+ f.write(response.content)
+ return True
+ else:
+ return False
+
+ except:
+ print('pdf failed')
+ return False
+
+def api_sr(img_path, output_path, scale, ext, output, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/sr'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ img_name = Path(img_path).name
+ mime = get_mime(img_path)
+ files = [('img', (img_name, open(img_path, 'rb'), mime))]
+ data = {'scale':scale, 'ext':ext, 'output':output}
+
+ i = 0
+ while i=retry_times or response is None:
+ return False
+ elif response.headers['content-type'] == 'application/json':
+ result = response.json()
+ if output == 'base64':
+ if output in result.keys(): # result.get(output):
+ with open(output_path, "w", encoding='utf-8') as f:
+ f.write(result[output])
+ return True
+ else:
+ print(result)
+ return False
+ elif output == 'file':
+ print(result)
+ return False
+ else:
+ print(f'ouput wrong: {output}')
+ return False
+ else:
+ with open(output_path, "wb") as f:
+ f.write(response.content)
+ return True
+ except:
+ print('sr failed')
+ return False
+
+def api_usage(api_type, void_value, config):
+ try:
+ access_token = config['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+
+ url = config['server_lst'][server_type] + '/usage'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ return result
+
+
+ except:
+ print('get usage failed')
+ return False
+
+def batch_ocr_api(path_lst, layout, compact, area_num, row_num, task_name, config, compress_mode=False, max_length=2500): #area_num, row_num, area_url
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t\t总数:{len(path_lst)}')
+ if compress_mode:
+ logging.info(f'\t\t压缩模式开启,最大像素: {max_length}')
+ logging.info(f'\t\t序号\t用时\t字数\t列数\t大小\t宽度\t高度\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0,'CharNumber':0, 'LineNumber':0, 'ImageSize':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_OCR_dir.joinpath(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="OCR"):
+ now_api_time = time.time()
+
+ if area_num == 0:
+ area = []
+ else:
+ area = api_area(path_dict['img_path'], area_num, row_num, [], config)
+ print(area)
+
+ data = api_ocr_pro(path_dict['img_path'], layout, area, compact, {}, config, compress_mode, max_length)
+
+ last_api_time = time.time()
+ if data=={}:
+ logging.warning(f"\t{index+1:<5d}\tocr failed\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ try:
+ with open(path_dict['json_path'], "w", encoding='utf-8') as f:
+ json.dump(data, f, ensure_ascii=False)
+
+ text = data['text'] if data.get('text') is not None else data_to_text(data)
+ with open(path_dict['text_path'], "w", encoding='utf-8') as f:
+ f.write(text)
+
+ #序号、用时、字数、列数、大小、宽度、高度、路径
+ # img_size = round(os.path.getsize(path_dict['img_path'])/1024) #KB
+ img_size = round(data['Size']/1024) #KB
+ time_cost= last_api_time - now_api_time #s
+ logging.info(f"\t\t{index+1:<6d}\t{time_cost:.2f}\t{data['CharNumber']:<6d}\t{data['LineNumber']:<6d}\t{img_size:<6d}\t{data['Width']:<6d}\t{data['Height']:<6d}\t{path_dict['img_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['CharNumber'] += data['CharNumber']
+ total_info['LineNumber'] += data['LineNumber']
+ total_info['ImageSize'] += data['Size']
+ total_info['SuccessNumber'] += 1
+ except:
+ logging.warning(f"\t\t{index+1:<6d}\tsave data wrong\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+
+ index += 1
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t总用时\t总字数\t总列数\t总大小")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['CharNumber']:<6d}\t{total_info['LineNumber']:<6d}\t{total_info['ImageSize']:<6d}\n")
+
+def batch_punct_api(path_lst, task_name, config):
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t\t总数:{len(path_lst)}')
+ logging.info(f'\t\t序号\t用时\t原字数\t字数\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0, 'OrigNumber':0, 'PunctNumber':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_Punct_dir /(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="Punct"):
+ now_api_time = time.time()
+ data = api_punct_pro(path_dict['orig_path'], path_dict['encoding'], {}, config)
+
+ last_api_time = time.time()
+ if data=={}:
+ logging.warning(f"\t{index+1:<6d}\tocr failed\t{path_dict['orig_path']}")
+ save_text(fail_list_path, f"{path_dict['orig_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ try:
+ text = data['text'][0]
+ with open(path_dict['punct_path'], "w", encoding=path_dict['encoding']) as f:
+ f.write(text)
+
+ #序号、用时、字数、列数、大小、宽度、高度、路径
+ time_cost= last_api_time - now_api_time #s
+ orig_num = path_dict['orig_num']
+ punct_num = len(list(text))
+ logging.info(f"\t\t{index+1:<6d}\t{time_cost:.2f}\t{orig_num:<6d}\t{punct_num:<6d}\t{path_dict['orig_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['OrigNumber'] += orig_num
+ total_info['PunctNumber'] += punct_num
+ total_info['SuccessNumber'] += 1
+ except:
+ logging.warning(f"\t\t{index+1:<6d}\tsave data wrong\t{path_dict['orig_path']}")
+ save_text(fail_list_path, f"{path_dict['orig_path']}\n", True)
+ total_info['FailNumber'] += 1
+ index += 1
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t总用时\t总原字数\t总字数")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['OrigNumber']:<6d}\t{total_info['PunctNumber']:<6d}\n")
+
+
+def batch_pdf_api(path_lst, task_name, config):
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t总数:{len(path_lst)}')
+ logging.info(f'\t\t序号\t用时\t大小\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0, 'PDFSize':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_PDF_dir.joinpath(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ # access_token = get_access_token_by_refresh(refresh_token)
+ # last_refresh_time = time.time()
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="PDF"):
+ # if time.time()-last_refresh_time > Access_Token_Refresh_Interval:
+ # access_token = get_access_token_by_refresh(refresh_token)
+ # last_refresh_time = time.time()
+ # if access_token == '':
+ # logging.warning(f"get access token failed")
+ # print('get access token failed')
+ # break
+
+ now_api_time = time.time()
+ pdf_file = api_pdf(path_dict['img_path'], path_dict['data_path'], path_dict['pdf_path'], config)
+ last_api_time = time.time()
+
+ if not pdf_file:
+ logging.warning(f"\t{index+1:<5d}\tpdf failed\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ #序号、用时、大小、路径
+ pdf_size = round(os.path.getsize(path_dict['pdf_path'])/1024) #KB
+ time_cost= last_api_time - now_api_time #s
+ logging.info(f"\t\t{index+1:<5d}\t{time_cost:.2f}\t{pdf_size:<6d}\t{path_dict['pdf_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['PDFSize'] += pdf_size
+ total_info['SuccessNumber'] += 1
+
+ index += 1
+ # while time.time()-last_api_time < interval:
+ # time.sleep(1)
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t总用时\t总大小")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['PDFSize']:<8d}\n")
+
+def batch_sr_api(path_lst, scale, ext, output, task_name, config):
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t总数:{len(path_lst)}')
+ logging.info(f'\t\t序号\t\t用时\t\t大小\t\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0, 'SRSize':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_SR_dir.joinpath(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="SR"):
+
+ now_api_time = time.time()
+ pdf_file = api_sr(path_dict['img_path'], path_dict['sr_path'], scale, ext, output, config)
+ last_api_time = time.time()
+ if not pdf_file:
+ logging.warning(f"\t{index+1:<5d}\tsr failed\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ #序号、用时、大小、路径
+ sr_size = round(os.path.getsize(path_dict['sr_path'])/1024) #KB
+ time_cost= last_api_time - now_api_time #s
+ logging.info(f"\t\t{index+1:<5d}\t{time_cost:.2f}\t{sr_size:<6d}\t{path_dict['sr_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['SRSize'] += sr_size
+ total_info['SuccessNumber'] += 1
+
+ index += 1
+ # while time.time()-last_api_time < interval:
+ # time.sleep(1)
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t\t总用时\t总大小")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['SRSize']:<8d}\n")
+
+def get_usage_api(api_type, config):
+ # access_token = get_access_token_by_refresh(refresh_token)
+
+ usage = api_usage(api_type, config, {})
+ if usage != {}:
+ if usage.get('msg') is not None:
+ print(usage['msg'])
+ elif usage.get('detail') is not None:
+ print(usage['detail'])
+ else:
+ result = f'本期已用: {usage["usage"]}; 本期剩余: {usage["remain"]}; 本期总量: {usage["total"]}; 历史总量: {usage["history"]}'
+ print(result)
+ else:
+ print('查询失败')
+
+
+
+def check_apiid(apiid):
+ return len(apiid) !=0 and len(apiid)==30
+
+def check_config(config, password_path=Password_path):
+ if not check_apiid(config['apiid']):
+ print('注意: apiid无效, 请设置apiid')
+ elif load_password(password_path) == '':
+ print('注意: 密码无效,请设置密码')
+ elif config['token'] == '':
+ print('注意: Token无效,请刷新Token')
+ elif config['server'] not in config['server_lst'].keys():
+ print('注意: 服务器无效,请设置服务器')
+ elif config['server'] == 'local' and config['server_lst']['local'] == '':
+ print('注意: 本地服务器为空,请设置本地服务器IP地址')
+
+def check_password(password, pubkey_path, password_encrypt_path):
+ try:
+ if password=='':
+ return False
+ encrypt_password = encrypt_by_rsa(read_key(pubkey_path), password)
+ if encrypt_password=='':
+ return False
+ else:
+ save_text(password_encrypt_path, encrypt_password)
+ return True
+ except:
+ print('密码检查失败')
+ return False
+
+
+
+
+
+def encrypt_by_rsa(pubkey, message:str):
+ '''
+ 用RSA公钥加密密码, 不超过117bytes
+
+ pubkey: rsa.key.PublicKey
+ message: str
+ return : str
+ '''
+ try:
+ if len(message.encode('utf-8')) <= 117:
+ encrypted = rsa.encrypt(message.encode('utf-8'), pubkey)
+ return str(base64.encodebytes(encrypted), encoding='utf-8')
+ else:
+ raise ValueError
+ except ValueError:
+ print('message length longer than 117 bytes')
+ return ''
+ except:
+ print("encrypt failed")
+ return ''
+
+def get_allfile_alldir_in_dir(path):
+ alldir_path =[]
+ allfile_path=[]
+ path_tuple = os.walk(path)
+
+ for dirpath, dirnames, filenames in path_tuple:
+ for dir in dirnames:
+ alldir_path.append(os.path.join(dirpath, dir))
+
+ for f in filenames:
+ allfile_path.append(os.path.join(dirpath, f))
+
+ alldir_path = sorted(alldir_path)
+ allfile_path = sorted(allfile_path)
+ return alldir_path, allfile_path
+
+
+def get_token_by_login(apiid, password, url):
+ try:
+ payload = {'apiid':apiid, 'password':password, 'encrypt':1, 'is_long':1}
+ response = requests.post(url, data=payload).json()
+ token = response['access_token']
+ except:
+ token = ''
+ return token
+
+
+def get_mime(img_path):
+ with open(img_path, 'rb') as f:
+ img = f.read()
+ mime_type = whatimage.identify_image(img)
+ if mime_type is None or mime_type=='None':
+ mime_type = Path(img_path).suffix.replace('.', '')
+ return f'image/{mime_type}'
+
+def get_encodeing(text_path, encoding_detect, default_encoding):
+ encoding = default_encoding
+ if encoding_detect:
+ import chardet
+ try:
+ data = open(text_path,'rb').read()
+ encoding = chardet.detect(data)['encoding']
+ except:
+ encoding = default_encoding
+
+ return encoding
+
+def get_text_length(file_path, encoding):
+ try:
+ text = open(file_path, 'r', encoding=encoding).read()
+ return len(list(text))
+ except:
+ return 0
+
+def load_config(config_path=ConfigFile):
+ try:
+ with open(config_path, 'r', encoding='utf-8') as f:
+ return json.load(f)
+ except:
+ print('配置文件读取失败')
+ return None
+
+
+def load_password(filepath):
+ try:
+ return open(filepath, "r" ,encoding='utf-8').read()
+ except:
+ return ''
+
+def logging_init(log_type:str, dir:Path=Log_dir):
+ '''
+ 初始化日志记录器
+ '''
+ log_dir = dir / log_type
+ log_dir.mkdir(exist_ok=True)
+
+ log_filepath = log_dir / (time.strftime("%Y-%m-%d", time.localtime()) + '.log')
+ logging.basicConfig(
+ filename=str(log_filepath),
+ level=logging.INFO,
+ format="%(asctime)s %(levelname)s %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S",
+ encoding='utf-8'
+ )
+
+
+def pdf_merge(pdf_lst, save_path):
+ try:
+ merger = PdfMerger()
+ for pdf in pdf_lst:
+ merger.append(pdf)
+ merger.write(save_path)
+ merger.close()
+ return True
+ except:
+ return False
+
+
+
+def prepare_ocr_dir_task_paths(dir, task_name, max_size):
+ #创建目录
+ json_save_dir = Json_Data_dir.joinpath(task_name)
+ json_save_dir.mkdir(exist_ok=True)
+ text_save_dir = Text_Data_dir.joinpath(task_name)
+ text_save_dir.mkdir(exist_ok=True)
+
+ alldir_path, allfile_path = get_allfile_alldir_in_dir(dir)
+ for dir_path in alldir_path:
+ data_dir = Path(str(dir_path).replace(dir, str(json_save_dir)))
+ data_dir.mkdir(exist_ok=True)
+ text_dir = Path(str(dir_path).replace(dir, str(text_save_dir)))
+ text_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in allfile_path:
+ if os.path.getsize(file_path) < max_size:
+ filename = Path(file_path).stem
+ json_dir = Path(str(file_path).replace(dir, str(json_save_dir))).parent
+ text_dir = Path(str(file_path).replace(dir, str(text_save_dir))).parent
+ path_dict = {'img_path':file_path, 'json_path':str(json_dir.joinpath(f'{filename}.json')), 'text_path':str(text_dir.joinpath(f'{filename}.txt'))}
+ path_lst.append(path_dict)
+ else:
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ return path_lst, fail_lst
+
+def prepare_ocr_files_task_paths(paths, task_name, max_size):
+ json_save_dir = Json_Data_dir.joinpath(task_name)
+ json_save_dir.mkdir(exist_ok=True)
+ text_save_dir = Text_Data_dir.joinpath(task_name)
+ text_save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in paths:
+ if os.path.getsize(file_path) < max_size:
+ filename = Path(file_path).stem
+ path_lst.append({'img_path':file_path, 'json_path':str(json_save_dir.joinpath(f'{filename}.json')), 'text_path':str(text_save_dir.joinpath(f'{filename}.txt'))})
+ else:
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ return path_lst, fail_lst
+
+
+
+def prepare_punct_dir_task_paths(dir, task_name, config):
+ detect_encoding = config['punct_detect_encoding']
+ default_encoding = config['punct_default_encoding']
+ max_length = config['punct_max_length']
+
+ #创建目录
+ save_dir = Punct_Data_dir / task_name
+ save_dir.mkdir(exist_ok=True)
+
+ alldir_path, allfile_path = get_allfile_alldir_in_dir(dir)
+ for dir_path in alldir_path:
+ punct_dir = Path(str(dir_path).replace(dir, str(save_dir)))
+ punct_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in allfile_path:
+ encoding = get_encodeing(file_path, detect_encoding, default_encoding)
+ num = get_text_length(file_path, encoding)
+ if num == 0:
+ print(f'{file_path}读取失败')
+ fail_lst.append(file_path)
+ elif num > max_length:
+ print(f'{file_path}长度过大, , 超过最大限量{max_length}字')
+ fail_lst.append(file_path)
+ else:
+ filename = Path(file_path).stem
+ punct_dir = Path(str(file_path).replace(dir, str(save_dir))).parent
+ path_dict = {'orig_path':file_path, 'punct_path':str(punct_dir.joinpath(f'{filename}.txt')), 'encoding':encoding, 'orig_num':num}
+ path_lst.append(path_dict)
+
+
+ return path_lst, fail_lst
+
+def prepare_punct_files_task_paths(paths, task_name, config):
+ detect_encoding = config['punct_detect_encoding']
+ default_encoding = config['punct_default_encoding']
+ max_length = config['punct_max_length']
+
+ #创建目录
+ save_dir = Punct_Data_dir / task_name
+ save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in paths:
+ encoding = get_encodeing(file_path, detect_encoding, default_encoding)
+ num = get_text_length(file_path, encoding)
+ if num == 0:
+ print(f'{file_path}读取失败')
+ fail_lst.append(file_path)
+ elif num > max_length:
+ print(f'{file_path}长度过大, , 超过最大限量{max_length}字')
+ fail_lst.append(file_path)
+ else:
+ filename = Path(file_path).stem
+ path_dict = {'orig_path':file_path, 'punct_path':str(save_dir.joinpath(f'{filename}.txt')), 'encoding':encoding, 'orig_num':num}
+ path_lst.append(path_dict)
+
+ return path_lst, fail_lst
+
+
+def prepare_ocr_list_task_paths(list_paths, task_name, max_size):
+ img_paths = []
+ for lst_path in list_paths:
+ with open(lst_path, 'r',encoding='utf-8') as f:
+ for line in f.readlines():
+ img_path = line.strip()
+ if Path(img_path).exists():
+ img_paths.append(img_path)
+
+ # [img_paths.append(line.strip()) for line in f.readlines() if len(line.strip())>0 and Path(line.strip()).exists()]
+
+ path_lst, fail_lst = prepare_ocr_files_task_paths(img_paths, task_name, max_size)
+
+ return path_lst, fail_lst
+
+def prepare_pdf_merge(root_dir, task_name):
+ try:
+ pdf_root_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_root_dir.mkdir(exist_ok=True)
+
+ all_dir, all_files = get_allfile_alldir_in_dir(root_dir)
+ if len(all_dir)>0:
+ for dir in all_dir:
+ #寻找最底层子目录
+ subdirs, item_paths = get_allfile_alldir_in_dir(dir)
+ if len(subdirs)==0:
+ save_path = str(pdf_root_dir.joinpath(f'{Path(dir).name}.pdf'))
+ if pdf_merge(item_paths, save_path):
+ print(f'{Path(save_path).name}合并完成')
+ else:
+ print(f'{Path(save_path).name}合并失败')
+ else:
+ save_path = str(pdf_root_dir.joinpath(Path(root_dir).name))
+ if pdf_merge(all_files, save_path):
+ print(f'{Path(save_path).name}合并完成')
+ else:
+ print(f'{Path(save_path).name}合并失败')
+
+ except:
+ print(f'{task_name}失败')
+
+def prepare_pdf_split(pdf_paths, task_name):
+ try:
+ pdf_root_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_root_dir.mkdir(exist_ok=True)
+ for pdf_path in tqdm(pdf_paths, desc='PDF拆分'):
+ reader = PdfReader(pdf_path)
+ pdf_dir = pdf_root_dir.joinpath(Path(pdf_path).stem)
+ pdf_dir.mkdir(exist_ok=True)
+ for i in range(len(reader.pages)):
+ writer = PdfWriter()
+ writer.add_page(reader.pages[i])
+ page_path = pdf_dir.joinpath(f'{i+1:04d}.pdf')
+ with open(str(page_path), "wb") as fp:
+ writer.write(fp)
+ print(f'{task_name}完成')
+ except:
+ print(f'{task_name}失败')
+
+def prepare_pdf_to_image(pdf_paths, task_name, dpi=300, image_format='JPEG', first_page=None, last_page=None):
+ try:
+ pdf_root_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_root_dir.mkdir(exist_ok=True)
+
+ for pdf_path in tqdm(pdf_paths, desc='PDF转图片'):
+ pdf_dir = pdf_root_dir.joinpath(Path(pdf_path).stem)
+ pdf_dir.mkdir(exist_ok=True)
+ filename = Path(pdf_path).stem
+ try:
+ _ = convert_from_path(pdf_path,poppler_path=Poppler_Path, dpi=dpi, output_folder=pdf_dir, fmt=image_format, first_page=first_page, last_page=last_page, thread_count=os.cpu_count(), output_file=filename)
+ except Exception as e:
+ print(e.args)
+ print(f'{pdf_path}失败')
+
+ print(f'{task_name}完成')
+ except:
+ print(f'{task_name}失败')
+
+
+def prepare_pdf_dir_task_paths(img_dir, data_dir, task_name, max_size):
+ pdf_save_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_save_dir.mkdir(exist_ok=True)
+
+ all_img_dir, all_img_file = get_allfile_alldir_in_dir(img_dir)
+ for dir in all_img_dir:
+ pdf_dir = Path(str(dir).replace(img_dir, str(pdf_save_dir)))
+ pdf_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for img_path in all_img_file:
+ if os.path.getsize(img_path) < max_size:
+ filename = Path(img_path).stem
+
+ data_path = Path(str(img_path).replace(img_dir, data_dir)).parent.joinpath(f'{filename}.json')
+ if data_path.exists():
+ pdf_path = Path(str(img_path).replace(img_dir, str(pdf_save_dir))).parent.joinpath(f'{filename}.pdf')
+ path_lst.append({'img_path':img_path, 'data_path':str(data_path), 'pdf_path':str(pdf_path)})
+ else:
+ print(f'数据不存在: {data_path}')
+ fail_lst.append(img_path)
+ else:
+ print(f'{img_path}体积过大, {os.path.getsize(img_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(img_path)
+ return path_lst, fail_lst
+
+def prepare_pdf_files_task_paths(img_paths, data_dir, task_name, max_size):
+ pdf_save_dir = PDF_Data_dir.joinpath(task_name)
+ pdf_save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for img_path in img_paths:
+ if os.path.getsize(img_path) < max_size:
+ filename = Path(img_path).stem
+
+ data_path = Path(data_dir).joinpath(f'{filename}.json')
+ if data_path.exists():
+ pdf_path = Path(pdf_save_dir).joinpath(f'{filename}.pdf')
+ path_lst.append({'img_path':img_path, 'data_path':str(data_path), 'pdf_path':str(pdf_path)})
+ else:
+ print(f'数据不存在: {data_path}')
+ fail_lst.append(img_path)
+ else:
+ print(f'{img_path}体积过大, {os.path.getsize(img_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(img_path)
+ return path_lst, fail_lst
+
+def prepare_sr_dir_task_paths(img_dir, task_name, ext, output, max_size):
+ #创建目录
+ sr_save_dir = SR_Data_dir.joinpath(task_name)
+ sr_save_dir.mkdir(exist_ok=True)
+
+ alldir_path, allfile_path = get_allfile_alldir_in_dir(img_dir)
+ for dir_path in alldir_path:
+ data_dir = Path(str(dir_path).replace(img_dir, str(sr_save_dir)))
+ data_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in allfile_path:
+ # img_PIL = Image.open(file_path)
+
+ if os.path.getsize(file_path) > max_size:
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ # elif max(img_PIL.size)>max_length:
+ # print(f'{file_path}尺寸过大, {img_PIL.size[0]}x{img_PIL.size[1]}px, 超过最大限量{max_length}px')
+ # fail_lst.append(file_path)
+ else:
+ filename = Path(file_path).stem
+ sr_dir = Path(str(file_path).replace(img_dir, str(sr_save_dir))).parent
+ ext_format = 'txt' if output=='base64' else ext
+ path_lst.append( {'img_path':file_path, 'sr_path':str(sr_dir.joinpath(f'{filename}.{ext_format}'))})
+
+ return path_lst, fail_lst
+
+def prepare_sr_files_task_paths(img_paths, task_name, ext, output, max_size):
+ #创建目录
+ sr_save_dir = SR_Data_dir.joinpath(task_name)
+ sr_save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in img_paths:
+ # img_PIL = Image.open(file_path)
+
+ if os.path.getsize(file_path) > max_size :
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ # elif max(img_PIL.size)>max_length:
+ # print(f'{file_path}尺寸过大, {img_PIL.size[0]}x{img_PIL.size[1]}px, 超过最大限量{max_length}px')
+ # fail_lst.append(file_path)
+ else:
+ filename = Path(file_path).stem
+ ext_format = 'txt' if output=='base64' else ext
+ path_lst.append( {'img_path':file_path, 'sr_path':str(sr_save_dir.joinpath(f'{filename}.{ext_format}'))})
+
+
+ return path_lst, fail_lst
+
+def read_key(key_path):
+ '''
+ 读取公钥文件
+ key_path: pem文件地址
+ return: rsa.key.PublicKey
+ '''
+ with open(key_path, 'rb') as f:
+ pubkey_data = f.read()
+ return rsa.PublicKey.load_pkcs1(pubkey_data)
+
+def read_paths(pathtype='file', init_dir='./'):
+ root = tkinter.Tk()
+ root.focus_force()
+ root.after(10, root.withdraw)
+ if pathtype == 'file':
+ return filedialog.askopenfilenames(parent=root, initialdir=init_dir)
+ elif pathtype == 'dir':
+ return filedialog.askdirectory(parent=root, initialdir=init_dir)
+
+def save_text(filepath, content, is_add=False):
+ if not filepath: return
+ with open(filepath, "a" if is_add else "w",encoding='utf-8') as f:
+ f.write(content)
+
+def save_config(config, config_path=ConfigFile):
+ with open(config_path, 'w', encoding='utf-8') as f:
+ json.dump(config, f, ensure_ascii=False, indent=4)
+
+def data_to_text(data):
+ result = ''
+ if data.get('line_ids') is not None and data.get('chars') is not None:
+ for i, (id_i, char_i) in enumerate(zip(data['line_ids'], data['chars'])):
+ #处理非结尾的字符
+ if i < len(data['line_ids'])-1 and id_i==data['line_ids'][i+1]:
+ result+=char_i
+ #处理结尾处的字符
+ else:
+ result+=char_i+'\n'
+ return result
+
+if __name__ == "__main__":
+
+ key = input('选择任务: 0.设置; 1.识别; 2.自动标点; 3.PDF; 4.超分辨率增强; 5.查询使用量. 输入其他键, 退出\t')
+ while key in ['0', '1', '2', '3', '4', '5']:
+ if key in ['0']:
+ config = load_config()
+ check_config(config)
+
+ sub_key = input('1.设置apiid; 2.设置密码; 3.刷新Token; 4.选择服务器; 5.设置本地服务器IP地址. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3', '4', '5']:
+ if sub_key in ['1']:
+ config = load_config()
+ apiid_now = config['apiid']
+ apiid = input(f'当前apiid: {apiid_now}. 如果重新设置, 请输入apiid, 否则请回车:\t')
+ if len(apiid) == 0:
+ print('放弃设置apiid')
+ else:
+ while not check_apiid(apiid):
+ apiid = input('请输入apiid, 回车则放弃设置:\t')
+ if len(apiid) == 0:
+ print('放弃设置apiid')
+ break
+ config['apiid'] = apiid
+ save_config(config)
+
+ elif sub_key in ['2']:
+ password = getpass('请输入密码,密码加密后保存于Config/password_encrypt.txt。回车则放弃设置:\t')
+ while not check_password(password, Pubkey_path, Password_path):
+ password = getpass('请输入密码:\t')
+ if len(password) == 0:
+ print('放弃设置密码')
+ break
+
+ elif sub_key in ['3']:
+ config = load_config()
+ apiid = config['apiid']
+ login_url = config['login_url']
+ encrypt_password = load_password(Password_path)
+ token = get_token_by_login(apiid, encrypt_password, login_url)
+ if len(token) == 0:
+ print('Token刷新失败,请重新检查账号信息或网络连接')
+ else:
+ print('Token刷新成功')
+ config['token'] = token
+ save_config(config)
+
+ elif sub_key in ['4']:
+ config = load_config()
+ server_now = config['server']
+ server_lst = list(config['server_lst'].keys())
+ server = input(f'当前服务器: {server_now}. 如果重新选择,请选择{",".join(server_lst)} , 否则请回车:\t')
+ if len(server)>0:
+ if server in server_lst:
+ config['server'] = server
+ save_config(config)
+ else:
+ while len(server)>0 and server not in server_lst:
+ server = input(f'请选择{", ".join(server_lst)} , 放弃请回车:\t')
+ if len(server) == 0:
+ print('放弃选择服务器')
+ break
+ elif server in server_lst:
+ config['server'] = server
+ save_config(config)
+
+ elif sub_key in ['5']:
+ config = load_config()
+ if config['server'] == 'local':
+ local_ip = input(f"当前本地服务器: {config['server_lst']['local']}. 如果重新设置, 输入本地服务器的IP地址, 否则请回车:\t")
+ if len(local_ip) == 0:
+ print('放弃修改本地服务器IP')
+ else:
+ while len(local_ip.split('.'))!= 4:
+ print('IP地址格式错误,请重新输入')
+ local_ip = input(f"请输入本地服务器的IP地址, 放弃请回车:\t")
+ if len(local_ip) == 0:
+ break
+ if len(local_ip) != 0:
+ config['server_lst']['local'] = f"{config['local_head']}{local_ip}:{config['local_port']}"
+ save_config(config)
+ else:
+ print('请先将服务器设置为local')
+
+ config = load_config()
+ check_config(config)
+ sub_key = input('1.设置apiid; 2.设置密码; 3.刷新Token; 4.选择服务器; 5.设置本地服务器IP地址. 输入其他键, 返回上层\t')
+
+ elif key in ['1']:
+ logging_init('OCR')
+ sub_key = input('选择图片: 1.目录; 2.文件; 3.列表. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3']:
+
+ layout = input('请输入排版方向: 0:竖版,1:横版. 默认值:0\t')
+ if layout not in ['0', '1']:
+ layout = '0'
+
+ compact = input('请输入Compact参数: 1, 2, 4, 6. 默认值: 1\t')
+ if compact not in ['1', '2', '4', '6']:
+ compact = '1'
+ compact = int(compact)
+
+ # 添加压缩模式选择
+ compress_choice = input('是否启用压缩模式(对大图片可能有更好的识别效果): 1.启用; 其他.不启用\t')
+ compress_mode = compress_choice in ['1']
+ max_length = 2500 # 默认压缩像素
+
+ if compress_mode:
+ max_length_input = input('请输入压缩后的最大像素(默认2500):\t')
+ if max_length_input.isdigit() and int(max_length_input) > 0:
+ max_length = int(max_length_input)
+ print(f'压缩模式已启用,最大像素: {max_length}')
+ else:
+ print('压缩模式未启用')
+
+ #task_name
+ task_name = input('请输入任务名称:\t')
+ if not task_name:
+ break
+
+ config = load_config()
+ max_size = config['max_size'] * 1024 * 1024
+
+ #图片列表:path_lst,fail_lst
+ if sub_key in ['1']:
+ print('请选择图片目录')
+ dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not dir:
+ break
+ print(dir)
+ path_lst, fail_lst = prepare_ocr_dir_task_paths(dir, task_name, max_size)
+ elif sub_key in ['2']:
+ print('请选择图片文件')
+ img_paths = read_paths(init_dir=str(Start_dir))
+ if not img_paths:
+ break
+ print(f'已选择{len(img_paths)}个文件')
+ path_lst, fail_lst = prepare_ocr_files_task_paths(img_paths, task_name, max_size)
+ elif sub_key in ['3']:
+ print('请选择列表文件')
+ list_paths = read_paths(init_dir=str(Start_dir))
+ if not list_paths:
+ break
+ print(f'已选择{len(list_paths)}个列表')
+ path_lst, fail_lst = prepare_ocr_list_task_paths(list_paths, task_name, max_size)
+
+ #path_lst, layout,task_name,url, fail_lst
+ if len(fail_lst)>0:
+ check_size = input(f'有{len(fail_lst)}个文件体积超标, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_size not in ['1']:
+ break
+
+ area_check = input('如果需要自动检测封闭区域, 则输入区域数量(1-4); 不需要则跳过\t')
+ if area_check in ['1', '2', '3', '4']:
+ area_num = int(area_check)
+
+ row_num_check = input('如果需要分栏,则输入分栏数量(2-4); 不需要则跳过\t')
+ if row_num_check in ['2','3','4']:
+ row_num = int(row_num_check)
+ else:
+ row_num = 1
+ else:
+ area_num = 0
+ row_num = 1
+
+ try:
+ batch_ocr_api(path_lst, layout, compact, area_num, row_num, task_name, config, compress_mode, max_length)
+ except:
+ print(f'{task_name}任务失败')
+
+ sub_key = input('选择方式: 1.目录; 2.文件; 3.列表. 输入其他键, 返回上层\t')
+
+ elif key in ['2']:
+ logging_init('Punct')
+ sub_key = input('选择文本: 1.目录; 2.文件. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2']:
+ task_name = input('请输入任务名称:\t')
+ if not task_name:
+ break
+
+ config = load_config()
+
+ if sub_key in ['1']:
+ print('请选择目录')
+ dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not dir:
+ break
+ print(dir)
+ path_lst, fail_lst = prepare_punct_dir_task_paths(dir, task_name, config)
+ elif sub_key in ['2']:
+ print('请选择文件')
+ orig_paths = read_paths(init_dir=str(Start_dir))
+ if not orig_paths:
+ break
+ print(f'已选择{len(orig_paths)}个文件')
+ path_lst, fail_lst = prepare_punct_files_task_paths(orig_paths, task_name, config)
+
+ if len(fail_lst)>0:
+ check_length = input(f'有{len(fail_lst)}个文件长度超标, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_length not in ['1']:
+ break
+
+ batch_punct_api(path_lst, task_name, config)
+
+ sub_key = input('选择方式: 1.目录; 2.文件. 输入其他键, 返回上层\t')
+
+
+ elif key in ['3']:
+ logging_init('PDF')
+ sub_key = input('选择方式: 1.按目录生成; 2.按文件生成; 3.PDF合并; 4.PDF拆分; 5.PDF转图片. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3', '4', '5']:
+
+ task_name = input('请输入任务名称:\t')
+ if not task_name:
+ break
+
+ if sub_key in ['1', '2']:
+ config = load_config()
+ max_size = config['max_size'] * 1024 * 1024
+
+ if sub_key in ['1']:
+ print('请选择图片目录')
+ img_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not img_dir:
+ break
+ print(img_dir)
+
+ print('请选择数据目录')
+ data_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not data_dir:
+ print('数据为空')
+ break
+ else:
+ print(data_dir)
+
+
+ path_lst, fail_lst = prepare_pdf_dir_task_paths(img_dir, data_dir, task_name, max_size)
+
+ elif sub_key in ['2']:
+ print('请选择图片文件')
+ img_paths = read_paths(init_dir=str(Start_dir))
+ if not img_paths:
+ break
+ print(f'已选择{len(img_paths)}个文件')
+
+ print('请选择数据目录')
+ data_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not data_dir:
+ print('数据为空')
+ break
+ else:
+ print(data_dir)
+
+ path_lst, fail_lst = prepare_pdf_files_task_paths(img_paths, data_dir, task_name, max_size)
+
+ #
+ if len(fail_lst)>0:
+ check_size = input(f'有{len(fail_lst)}个文件存在问题, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_size not in ['1']:
+ break
+ try:
+ config = load_config()
+ batch_pdf_api(path_lst, task_name, config)
+ except:
+ print(f'{task_name}任务失败')
+
+ #合并
+ elif sub_key in ['3']:
+ print('请选择PDF目录')
+ pdf_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not pdf_dir:
+ break
+ print(pdf_dir)
+
+ prepare_pdf_merge(pdf_dir, task_name)
+
+ #拆分
+ elif sub_key in ['4']:
+ print('请选择PDF文件')
+ pdf_paths = read_paths(init_dir=str(Start_dir))
+ if not pdf_paths:
+ break
+ print(f'已选择{len(pdf_paths)}个文件')
+
+ prepare_pdf_split(pdf_paths, task_name)
+
+ #转图片
+ elif sub_key in ['5']:
+ print('请选择PDF文件')
+ pdf_paths = read_paths(init_dir=str(Start_dir))
+ if not pdf_paths:
+ break
+ print(f'已选择{len(pdf_paths)}个文件')
+
+ dpi_str = input('请输入dpi:\t')
+ try:
+ dpi = int(dpi_str)
+ if dpi<=0:
+ break
+ except:
+ break
+
+ format_str = input('请选择图片格式: 1.jpeg; 2.png.\t')
+ if format_str not in ['1', '2']:
+ break
+ format_id = int(format_str)-1
+ image_format = Pdf_to_Image_lst[format_id]
+
+ prepare_pdf_to_image(pdf_paths, task_name, dpi=dpi, image_format=image_format)
+
+
+ sub_key = input('选择方式: 1.按目录生成; 2.按文件生成; 3.PDF合并; 4.PDF拆分; 5.PDF转图片. 输入其他键, 返回上层\t')
+
+ elif key in ['4']:
+ logging_init('SR')
+ sub_key = input('选择方式: 1.目录; 2.文件. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2']:
+
+ task_name = input('请输入任务名称:\t')
+ if not task_name:
+ break
+
+ scale_str = input('请输入放大倍数: 1, 2, 4. 默认值:2\t')
+ if scale_str not in ['1','2','4']:
+ scale_str = '2'
+ scale = int(scale_str)
+
+ ext_str = input('请输入保存图片格式: 1.jpeg, 2.png, 3.tiff, 4.webp. 默认值:jpeg\t')
+ if ext_str not in ['1','2','3','4']:
+ ext_str = '1'
+ ext = SR_EXT_lst[int(ext_str)-1]
+
+ output_str = input('请输入数据格式: 1.file, 2.base64. 默认值:file\t')
+ if output_str not in ['1','2','3','4']:
+ output_str = '1'
+ output = SR_Output_lst[int(output_str)-1]
+
+ config = load_config()
+ max_size = config['max_size'] * 1024 * 1024
+
+ if sub_key in ['1']:
+ print('请选择图片目录')
+ img_dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not img_dir:
+ break
+ print(img_dir)
+ path_lst, fail_lst = prepare_sr_dir_task_paths(img_dir, task_name, ext, output, max_size)
+
+ elif sub_key in ['2']:
+ print('请选择图片文件')
+ img_paths = read_paths(init_dir=str(Start_dir))
+ if not img_paths:
+ break
+ # print(img_paths)
+ path_lst, fail_lst = prepare_sr_files_task_paths(img_paths, task_name, ext, output, max_size)
+
+ if len(fail_lst)>0:
+ check_size = input(f'有{len(fail_lst)}个文件存在问题, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_size not in ['1']:
+ break
+
+ try:
+ config = load_config()
+ batch_sr_api(path_lst, scale, ext, output, task_name, config)
+ except:
+ print(f'{task_name}任务失败')
+ sub_key = input('选择方式: 1.目录; 2.文件. 输入其他键, 返回上层\t')
+
+ elif key in ['5']:
+ sub_key = input('选择参数: 1.ocr; 2.sr; 3.pdf. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3']:
+ api_type = Usage_API_Type_lst[int(sub_key)-1]
+
+ try:
+ config = load_config()
+ get_usage_api(api_type, config)
+ except:
+ print(f'查询失败')
+
+ sub_key = input('选择参数: 1.ocr; 2.sr; 3.pdf. 输入其他键, 返回上层\t')
+
+ key = input('选择任务: 0.设置; 1.OCR; 2.自动标点; 3.PDF; 4.超分辨率增强; 5.查询使用量. 输入其他键, 退出\t')
\ No newline at end of file
diff --git a/jzd_ocr.py b/jzd_ocr.py
new file mode 100644
index 0000000..791fd7b
--- /dev/null
+++ b/jzd_ocr.py
@@ -0,0 +1,368 @@
+# last updata: 2025-07-13
+# 下载离线安装包
+# mkdir lib
+# pip download requests whatimage tqdm opencv-python -d lib
+# 离线安装
+# 1. 解压/lib (python>=3.9) ;或解压/lib38 (python=3.8)
+# 2. pip install --no-index --find-links=lib requests whatimage tqdm opencv-python
+# 在线安装
+# pip install requests whatimage tqdm
+
+import json,logging,time,os
+from pathlib import Path
+from tkinter import filedialog, Tk
+import requests, whatimage
+from tqdm import tqdm
+from tempfile import NamedTemporaryFile
+from io import BytesIO
+
+
+Start_dir = Path(__file__).parent
+ConfigFile = Start_dir / 'ocr_config.json'
+AuthFile = Start_dir / 'ocr_auth.json'
+
+Log_dir = Start_dir / 'Log'
+Data_dir = Start_dir / 'Data'
+Json_Data_dir = Data_dir / 'json'
+Text_Data_dir = Data_dir / 'text'
+Fail_dir = Log_dir / 'fail'
+Fail_OCR_dir = Fail_dir / 'ocr'
+
+Log_dir.mkdir(exist_ok=True)
+Data_dir.mkdir(exist_ok=True)
+Json_Data_dir.mkdir(exist_ok=True)
+Text_Data_dir.mkdir(exist_ok=True)
+Fail_dir.mkdir(exist_ok=True)
+Fail_OCR_dir.mkdir(exist_ok=True)
+
+TimeStampStr = '%Y-%m-%d_%H.%M.%S'
+
+def get_timestamp(time_stamp_format=TimeStampStr):
+ return time.strftime(time_stamp_format, time.localtime())
+
+
+def data_to_text(data):
+ result = ''
+ if data.get('line_ids') is not None and data.get('chars') is not None:
+ for i, (id_i, char_i) in enumerate(zip(data['line_ids'], data['chars'])):
+ #处理非结尾的字符
+ if i < len(data['line_ids'])-1 and id_i==data['line_ids'][i+1]:
+ result+=char_i
+ #处理结尾处的字符
+ else:
+ result+=char_i+'\n'
+ return result
+
+
+def resize_image(img_path, max_length:int):
+ import cv2
+ file_path_gbk = str(img_path).encode('gbk')
+ img = cv2.imread(file_path_gbk.decode())
+ # img = cv2.imread(str(img_path))
+
+ height, width = img.shape[:2]
+ resize_factor:float = max(height, width) / max_length if max(height, width) > max_length > 0 else 1.0
+ if resize_factor>1:
+ img = cv2.resize(img, (round(width/resize_factor), round(height/resize_factor)))
+ _, buffer = cv2.imencode('.jpeg', img) # 编码为JPEG字节流
+ img_bytes = BytesIO(buffer).getvalue() # 获取字节数据
+ return img_bytes, resize_factor
+
+
+
+def resize_data(data, resize_factor:float):
+ if resize_factor > 1:
+ if data.get('Width') is not None and data.get('Height') is not None:
+ data['Width'] = round(data['Width'] * resize_factor)
+ data['Height'] = round(data['Height'] * resize_factor)
+ if data.get('coors') is not None and type(data['coors'])==list:
+ data['coors'] = [[round(x*resize_factor) for x in coor] for coor in data['coors'] if type(coor)==list]
+ return data
+
+def api_ocr_pro(img_path, void_value, auth_dict, config):
+ try:
+ access_token = auth_dict['token']
+ connect_timeout = config['timeout_connect']
+ read_timeout = config['timeout_read']
+ retry_times = config['retry_time']
+ server_type = config['server']
+ ocr_type = config['ocr_type']
+
+ max_length = config['max_length']
+
+ url = config['server_lst'][server_type] + f'/{ocr_type}'
+ headers = {'Authorization': f'gjcool {access_token}'}
+
+ img_name = Path(img_path).name
+ mime = get_mime(img_path)
+
+ if max_length == 0:
+ files = [('img', (img_name, open(img_path, 'rb'), mime))]
+ resize_factor = 1.0
+ else:
+ img_bytes, resize_factor = resize_image(img_path, max_length)
+ files = [('img', (img_name, img_bytes, mime))]
+ data = {}
+ i = 0
+ while i=retry_times or response is None:
+ return void_value
+ else:
+ result = response.json()
+ if result.get('msg') is None and result.get('detail') is None:
+ result = resize_data(result, resize_factor)
+ return result
+ else:
+ print(result)
+ return void_value
+ except:
+ print('ocr_pro failed')
+ return void_value
+
+
+def batch_ocr_api(path_lst, task_name, auth_dict, config): #layout, compact, area_num, row_num, , anno_open:bool=True
+ logging.info(f'\t\t任务:{task_name}\t\tSTART\t\t总数:{len(path_lst)}')
+ logging.info(f'\t\t序号\t用时\t字数\t列数\t大小\t宽度\t高度\t路径')
+
+ #初始化记录变量
+ total_info = {'TimeCost':0,'CharNumber':0, 'LineNumber':0, 'ImageSize':0, 'SuccessNumber':0, 'FailNumber':0}
+ fail_list_path = str(Fail_OCR_dir.joinpath(f'{task_name}.txt'))
+ save_text(fail_list_path, "", False)
+
+ start_time = time.time()
+ index = 0
+ for path_dict in tqdm(path_lst, desc="OCR"):
+ now_api_time = time.time()
+
+ data = api_ocr_pro(path_dict['img_path'], {}, auth_dict, config)
+ last_api_time = time.time()
+ if data=={}:
+ logging.warning(f"\t{index+1:<5d}\tocr failed\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+ else:
+ try:
+ with open(path_dict['json_path'], "w", encoding='utf-8') as f:
+ json.dump(data, f, ensure_ascii=False)
+
+ text = data.get('text', data_to_text(data))
+
+ with open(path_dict['text_path'], "w", encoding='utf-8') as f:
+ f.write(text)
+
+ #序号、用时、字数、列数、大小、宽度、高度、路径
+ img_size = round(data['Size']/1024) #KB
+ time_cost= last_api_time - now_api_time #s
+ logging.info(f"\t\t{index+1:<6d}\t{time_cost:.2f}\t{data['CharNumber']:<6d}\t{data['LineNumber']:<6d}\t{img_size:<6d}\t{data['Width']:<6d}\t{data['Height']:<6d}\t{path_dict['img_path']}")
+
+ total_info['TimeCost'] += time_cost
+ total_info['CharNumber'] += data['CharNumber']
+ total_info['LineNumber'] += data['LineNumber']
+ total_info['ImageSize'] += data['Size']
+ total_info['SuccessNumber'] += 1
+ except:
+ logging.warning(f"\t\t{index+1:<6d}\tsave data wrong\t{path_dict['img_path']}")
+ save_text(fail_list_path, f"{path_dict['img_path']}\n", True)
+ total_info['FailNumber'] += 1
+
+ index += 1
+
+ logging.info(f"\t\t任务:{task_name}\t\tEND")
+ logging.info(f"\t\t总数\t总用时\t总字数\t总列数\t总大小")
+ logging.info(f"\t\t{total_info['SuccessNumber']}/{total_info['FailNumber']} \t{time.time()-start_time:.2f}\t{total_info['CharNumber']:<6d}\t{total_info['LineNumber']:<6d}\t{total_info['ImageSize']:<6d}\n")
+
+
+
+def get_allfile_alldir_in_dir(path):
+ alldir_path =[]
+ allfile_path=[]
+ path_tuple = os.walk(path)
+
+ for dirpath, dirnames, filenames in path_tuple:
+ for dir in dirnames:
+ alldir_path.append(os.path.join(dirpath, dir))
+
+ for f in filenames:
+ allfile_path.append(os.path.join(dirpath, f))
+
+ alldir_path = sorted(alldir_path)
+ allfile_path = sorted(allfile_path)
+ return alldir_path, allfile_path
+
+
+def get_token_by_login(apiid, password, url):
+ try:
+ payload = {'apiid':apiid, 'password':password, 'encrypt':1, 'is_long':1}
+ response = requests.post(url, data=payload).json()
+ token = response['access_token']
+ except:
+ token = ''
+ return token
+
+
+def get_mime(img_path):
+ with open(img_path, 'rb') as f:
+ img = f.read()
+ mime_type = whatimage.identify_image(img)
+ if mime_type is None or mime_type=='None':
+ mime_type = Path(img_path).suffix.replace('.', '')
+ return f'image/{mime_type}'
+
+
+
+def load_config(config_path):
+ try:
+ with open(config_path, 'r', encoding='utf-8') as f:
+ return json.load(f)
+ except:
+ print('配置文件读取失败')
+ return None
+
+
+def logging_init(log_type:str, dir:Path=Log_dir, level=logging.INFO):
+ '''
+ 初始化日志记录器
+ '''
+ log_dir = dir / log_type
+ log_dir.mkdir(exist_ok=True)
+
+ log_filepath = log_dir / (time.strftime("%Y-%m-%d", time.localtime()) + '.log')
+ logging.basicConfig(
+ filename=str(log_filepath),
+ level=level,
+ format="%(asctime)s %(levelname)s %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S",
+ encoding='utf-8'
+ )
+
+
+def prepare_ocr_dir_task_paths(dir, task_name, max_size):
+ #创建目录
+ json_save_dir = Json_Data_dir.joinpath(task_name)
+ json_save_dir.mkdir(exist_ok=True)
+ text_save_dir = Text_Data_dir.joinpath(task_name)
+ text_save_dir.mkdir(exist_ok=True)
+
+ alldir_path, allfile_path = get_allfile_alldir_in_dir(dir)
+ for dir_path in alldir_path:
+ data_dir = Path(str(dir_path).replace(dir, str(json_save_dir)))
+ data_dir.mkdir(exist_ok=True)
+ text_dir = Path(str(dir_path).replace(dir, str(text_save_dir)))
+ text_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in allfile_path:
+ if os.path.getsize(file_path) < max_size:
+ filename = Path(file_path).stem
+ json_dir = Path(str(file_path).replace(dir, str(json_save_dir))).parent
+ text_dir = Path(str(file_path).replace(dir, str(text_save_dir))).parent
+ path_dict = {'img_path':file_path, 'json_path':str(json_dir.joinpath(f'{filename}.json')), 'text_path':str(text_dir.joinpath(f'{filename}.txt'))}
+ path_lst.append(path_dict)
+ else:
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ return path_lst, fail_lst
+
+def prepare_ocr_files_task_paths(paths, task_name, max_size):
+ json_save_dir = Json_Data_dir.joinpath(task_name)
+ json_save_dir.mkdir(exist_ok=True)
+ text_save_dir = Text_Data_dir.joinpath(task_name)
+ text_save_dir.mkdir(exist_ok=True)
+
+ path_lst, fail_lst =[], []
+ for file_path in paths:
+ if os.path.getsize(file_path) < max_size:
+ filename = Path(file_path).stem
+ path_lst.append({'img_path':file_path, 'json_path':str(json_save_dir.joinpath(f'{filename}.json')), 'text_path':str(text_save_dir.joinpath(f'{filename}.txt'))})
+ else:
+ print(f'{file_path}体积过大, {os.path.getsize(file_path)/1024/1024}MB, 超过最大限量{max_size/1024/1024}MB')
+ fail_lst.append(file_path)
+ return path_lst, fail_lst
+
+
+def prepare_ocr_list_task_paths(list_paths, task_name, max_size):
+ img_paths = []
+ for lst_path in list_paths:
+ with open(lst_path, 'r',encoding='utf-8') as f:
+ for line in f.readlines():
+ img_path = line.strip()
+ if Path(img_path).exists():
+ img_paths.append(img_path)
+
+ path_lst, fail_lst = prepare_ocr_files_task_paths(img_paths, task_name, max_size)
+
+ return path_lst, fail_lst
+
+def read_paths(pathtype='file', init_dir='./'):
+ root = Tk()
+ root.focus_force()
+ root.after(10, root.withdraw)
+ if pathtype == 'file':
+ return filedialog.askopenfilenames(parent=root, initialdir=init_dir)
+ elif pathtype == 'dir':
+ return filedialog.askdirectory(parent=root, initialdir=init_dir)
+
+def save_text(filepath, content, is_add=False):
+ if not filepath: return
+ with open(filepath, "a" if is_add else "w",encoding='utf-8') as f:
+ f.write(content)
+
+
+
+if __name__ == "__main__":
+ logging_init('OCR')
+ sub_key = input('选择图片: 1.目录; 2.文件; 3.列表. 输入其他键, 返回上层\t')
+ while sub_key in ['1', '2', '3']:
+ task_name = input(f'请输入任务名称. 默认取当前日期时间({TimeStampStr}):\t')
+ if not task_name:
+ task_name = get_timestamp(TimeStampStr)
+
+ auth_dict = load_config(AuthFile)
+ config = load_config(ConfigFile)
+ max_size = config['max_size'] * 1024 * 1024
+
+ #图片列表:path_lst,fail_lst
+ if sub_key in ['1']:
+ print('请选择图片目录')
+ dir = read_paths(pathtype='dir', init_dir=str(Start_dir))
+ if not dir:
+ break
+ print(dir)
+ path_lst, fail_lst = prepare_ocr_dir_task_paths(dir, task_name, max_size)
+ elif sub_key in ['2']:
+ print('请选择图片文件')
+ img_paths = read_paths(init_dir=str(Start_dir))
+ if not img_paths:
+ break
+ print(f'已选择{len(img_paths)}个文件')
+ path_lst, fail_lst = prepare_ocr_files_task_paths(img_paths, task_name, max_size)
+ elif sub_key in ['3']:
+ print('请选择列表文件')
+ list_paths = read_paths(init_dir=str(Start_dir))
+ if not list_paths:
+ break
+ print(f'已选择{len(list_paths)}个列表')
+ path_lst, fail_lst = prepare_ocr_list_task_paths(list_paths, task_name, max_size)
+
+ #path_lst,task_name, url, fail_lst
+ if len(fail_lst)>0:
+ check_size = input(f'有{len(fail_lst)}个文件体积超标, 是否停止任务: 1. 继续; 其他, 中止\t')
+ if check_size not in ['1']:
+ break
+
+ try:
+ batch_ocr_api(path_lst, task_name, auth_dict, config)
+ except:
+ print(f'{task_name}任务失败')
+
+ sub_key = input('选择方式: 1.目录; 2.文件; 3.列表. 输入其他键, 返回上层\t')
+
+
\ No newline at end of file
diff --git a/password_encrypt.txt b/password_encrypt.txt
new file mode 100644
index 0000000..4b78694
--- /dev/null
+++ b/password_encrypt.txt
@@ -0,0 +1,3 @@
+c4tW323xNjzh+hf6cR0KddW25iUhY3JpYcBXQF1PJ73zvgtqIB/R7pRlHoDTY5aFDv7N8L0EfqyM
+Eskb49WGiI3kAWhyo+sfUZ7ZgwC7cXWdma3b3oenL+RK/3ZWOKOP/Uxjunm8ZTGB4huHHFlkZXJW
+HXRZLJm3nJ6oxdLr/ck=
diff --git a/password_pubkey.pem b/password_pubkey.pem
new file mode 100644
index 0000000..f8fd602
--- /dev/null
+++ b/password_pubkey.pem
@@ -0,0 +1,5 @@
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAIhu/jI4yZqa4+Yyh7qN52YH4Y0xohg5no4+w1N15y0oSeNuCE2V88eR
+oXg+EwmY6RsHmTvHE/OnvM44sqfEFVucSwJDj0cfUTlQqkKzf+YukKfaQx6syiBn
+2LzXH4LOP+dLho4rzD32HwM5rPtQ7nWtdUr7PrbUyjGeBsLI+J2LAgMBAAE=
+-----END RSA PUBLIC KEY-----
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..a97aac1
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,8 @@
+requests
+whatimage
+rsa
+tqdm
+chardet
+PyPDF2[full]
+pdf2image
+pillow
diff --git a/图/0003.JPG b/图/0003.JPG
new file mode 100644
index 0000000..43b97a5
Binary files /dev/null and b/图/0003.JPG differ
diff --git a/图/ocrfailed/110613020250003/0004/0024A.jp2 b/图/ocrfailed/110613020250003/0004/0024A.jp2
new file mode 100644
index 0000000..82b668a
Binary files /dev/null and b/图/ocrfailed/110613020250003/0004/0024A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0004A.jp2 b/图/ocrfailed/110613020250003/0006/0004A.jp2
new file mode 100644
index 0000000..92d374e
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0004A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0012A.jp2 b/图/ocrfailed/110613020250003/0006/0012A.jp2
new file mode 100644
index 0000000..f9cba9f
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0012A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0013A.jp2 b/图/ocrfailed/110613020250003/0006/0013A.jp2
new file mode 100644
index 0000000..9d71c3a
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0013A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0024A.jp2 b/图/ocrfailed/110613020250003/0006/0024A.jp2
new file mode 100644
index 0000000..716fc80
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0024A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0027A.jp2 b/图/ocrfailed/110613020250003/0006/0027A.jp2
new file mode 100644
index 0000000..154e042
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0027A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0032A.jp2 b/图/ocrfailed/110613020250003/0006/0032A.jp2
new file mode 100644
index 0000000..d9a2c12
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0032A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0039A.jp2 b/图/ocrfailed/110613020250003/0006/0039A.jp2
new file mode 100644
index 0000000..d1889ee
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0039A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0047A.jp2 b/图/ocrfailed/110613020250003/0006/0047A.jp2
new file mode 100644
index 0000000..39e51a9
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0047A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0049A.jp2 b/图/ocrfailed/110613020250003/0006/0049A.jp2
new file mode 100644
index 0000000..8890d94
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0049A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0006/0054A.jp2 b/图/ocrfailed/110613020250003/0006/0054A.jp2
new file mode 100644
index 0000000..18c8392
Binary files /dev/null and b/图/ocrfailed/110613020250003/0006/0054A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0008/0027A.jp2 b/图/ocrfailed/110613020250003/0008/0027A.jp2
new file mode 100644
index 0000000..db41536
Binary files /dev/null and b/图/ocrfailed/110613020250003/0008/0027A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0012/0005A.jp2 b/图/ocrfailed/110613020250003/0012/0005A.jp2
new file mode 100644
index 0000000..67ec6fb
Binary files /dev/null and b/图/ocrfailed/110613020250003/0012/0005A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0012/0019A.jp2 b/图/ocrfailed/110613020250003/0012/0019A.jp2
new file mode 100644
index 0000000..34bbb7d
Binary files /dev/null and b/图/ocrfailed/110613020250003/0012/0019A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0012/0022A.jp2 b/图/ocrfailed/110613020250003/0012/0022A.jp2
new file mode 100644
index 0000000..070015a
Binary files /dev/null and b/图/ocrfailed/110613020250003/0012/0022A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0013/0004A.jp2 b/图/ocrfailed/110613020250003/0013/0004A.jp2
new file mode 100644
index 0000000..e7a3fbe
Binary files /dev/null and b/图/ocrfailed/110613020250003/0013/0004A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0013/0021A.jp2 b/图/ocrfailed/110613020250003/0013/0021A.jp2
new file mode 100644
index 0000000..0a11d20
Binary files /dev/null and b/图/ocrfailed/110613020250003/0013/0021A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0013/0031A.jp2 b/图/ocrfailed/110613020250003/0013/0031A.jp2
new file mode 100644
index 0000000..a33bf6b
Binary files /dev/null and b/图/ocrfailed/110613020250003/0013/0031A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0013/0057A.jp2 b/图/ocrfailed/110613020250003/0013/0057A.jp2
new file mode 100644
index 0000000..d96d741
Binary files /dev/null and b/图/ocrfailed/110613020250003/0013/0057A.jp2 differ
diff --git a/图/ocrfailed/110613020250003/0013/0062A.jp2 b/图/ocrfailed/110613020250003/0013/0062A.jp2
new file mode 100644
index 0000000..c99f44c
Binary files /dev/null and b/图/ocrfailed/110613020250003/0013/0062A.jp2 differ