猿人学验证码第二题纯算

AST解混淆

难点分析

变量名分析
逻辑指令分析
变量重命名
https://img.131213.xyz/api/cfile/AgACAgUAAx0Eflp52gACzndoRZbfv_lLdS-0xF5jjpZqRlbl_gACWsUxG6eQMVZioPk7NvjXlAEAAwIAA3cAAzYE

结构分析

1
yrx_ﱞﱞﱞ < 3408 + -9131 + -1 * -5725 ? yrx_ﱞﱞﱞ < 2 * 1927 + -50 * -38 + 11 * -523 ? (yrx_ﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞ = yrx_ﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞ["slice"](5335 + 170 * 25 + -5 * 1915, yrx_ﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞ["length"]) 技术难点

整体还原

https://img.131213.xyz/api/cfile/AgACAgUAAx0Eflp52gACzntoRZ_sp_ODTxPAUjxaEt8WWXdc9QACfsUxG6eQMVawY6REl1hg1AEAAwIAA3kAAzYE
发现这个是Identifier类型那我们就直接替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
UnaryExpression: {
exit(path) {
// Evaluate unary expressions with literals
if (t.isNumericLiteral(path.node.argument) || t.isBooleanLiteral(path.node.argument)) {
const expr = generate(path.node).code;
const result = evaluateExpression(expr);

if (result !== null) {
if (typeof result === 'number') {
path.replaceWith(t.numericLiteral(result));
} else if (typeof result === 'boolean') {
path.replaceWith(t.booleanLiteral(result));
}
path.skip();
}
}
}
},

最后附上还原后的代码

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
(function (param) {
var func = function () {
var param = !![];
return function (func, data) {
var index = param ? function () {
if (data) {
var param = data["apply"](func, arguments); //
return data = null, param;
}
} : function () {};
return param = ![], index;
};
}(),
data = function () {
var param = !![];
return function (func, data) {
var index = param ? function () {
if (data) {
var param = data["apply"](func, arguments); //这个可以是检测点
return data = null, param;
}
} : function () {};
return param = ![], index;
};
}(),
index = param || 4;
for (;;) if (index < 4) {
if (index < 2) index < 1 ? index += 3 : index -= 1;else {
if (index < 3) return;else !function () {
var index = param || 13;
for (;;) if (index < 8) { //这个是前面两个算法的特点
if (index < 4) index < 2 ? index < 1 ? (var_0 = new TextEncoder()["encode"](var_1), index += 11) : (var_2["dataType"] = "json", index += 4) : index < 3 ? index += (var_2["data"] = {
mmc: Array["from"](var_3)["map"](function (func) {
var data = param || 0;
for (;;) return func["toString"](16)["padStart"](2, "0");
})["join"]("") + var_1
}, 4) : index += (var_2 = {}, 9);else {
if (index < 6) {
if (index < 5) {
var var_1, var_0, var_3, var_2;
index += 4;
} else index += (var_2["async"] = "true", 5);
} else index < 7 ? (var_2["success"] = function (func) {
var data = param || 6;
for (;;) if (data < 16) {
if (data < 8) {
if (data < 4) data < 2 ? data < 1 ? (var_4 = var_5["slice"](10, var_5["length"]), data += 9) : (var_2["onload"] = function () {
var func = param || 0;
for (;;) if (func < 1) var_3["drawImage"](var_2, 0, 0, var_1["width"], var_1["height"]), func += 1;else return;
}, data += 2) : data < 3 ? (var_6 = new Uint8Array(func["洋芋粑"]["match"](/.{2}/g)["map"](function (func) {
var data = param || 0;
for (;;) return parseInt(func, 16);
})), data += 9) : ($["fn"]["drag"] = function () {
var func = param || 6;
for (;;) if (func < 8) {
if (func < 4) func < 2 ? func < 1 ? func += (var_0 = ![], 5) : (var_3["on"]("mousedown", function (func) {
var var_1 = param || 3;
for (;;) if (var_1 < 4) {
if (var_1 < 2) {
if (var_1 < 1) return;else var_1 -= ($(document)["on"]("mousemove.drag", function (func) {
var var_1 = param || 12;
for (;;) if (var_1 < 16) {
if (var_1 < 8) {
if (var_1 < 4) {
if (var_1 < 2) {
if (var_1 < 1) var_2["css"]({
width: var_3
}), var_1 += 9;else return;
} else var_1 < 3 ? var_1 += 5 : var_1 += 14;
} else var_1 < 6 ? var_1 < 5 ? var_1 += 13 : var_1 -= (var_3 = 0, 3) : var_1 < 7 ? var_1 += 13 : var_1 += 9;
} else {
if (var_1 < 12) var_1 < 10 ? var_1 < 9 ? !var_0 ? var_1 += 12 : var_1 += 3 : var_1 -= (index(var_3), 8) : var_1 < 11 ? (var_3 = var_7, var_1 -= 6) : var_1 += 8;else {
if (var_1 < 14) {
if (var_1 < 13) {
var var_3;
var_1 -= 4;
} else var_1 -= (var_8["css"]({
left: var_3
}), 13);
} else var_1 < 15 ? var_3 < 0 ? var_1 -= 9 : var_1 += 1 : var_1 -= 8;
}
}
} else {
if (var_1 < 20) var_1 < 18 ? var_1 < 17 ? var_3 > var_7 ? var_1 -= 6 : var_1 -= 13 : var_1 -= 4 : var_1 < 19 ? (var_3 = func["pageX"] - data, var_1 -= 4) : var_1 -= 1;else return;
}
})["on"]("mouseup.drag", function (func) {
var index = param || 0;
for (;;) if (index < 8) {
if (index < 4) {
if (index < 2) {
if (index < 1) {
var var_1;
index += 9;
} else var_0 = ![], index += 5;
} else index < 3 ? index += (var_8["css"]({
left: 0
}), 6) : index -= 2;
} else {
if (index < 6) {
if (index < 5) return;else return;
} else index < 7 ? ($(document)["off"](".drag"), index += 6) : index -= 4;
}
} else index < 12 ? index < 10 ? index < 9 ? index += (var_2["css"]({
width: 0
}), 5) : !var_0 ? index -= 4 : index -= 2 : index < 11 ? index -= 7 : (function func(data, index, var_1, var_0, var_3, var_2, var_8, var_7, var_6, var_9, var_5) {
var var_4 = param || 2;
for (;;) if (var_4 < 4) var_4 < 2 ? var_4 < 1 ? !var_8 ? var_4 += 4 : var_4 += 5 : var_4 -= 1 : var_4 < 3 ? (((var_1 || (func["$"] = [func["$"] = "1.1", func["apply"][func["$"]] = func["call"][func["$"]] = func["call"], func["apply"], []["push"], []["pop"], []["concat"], []["slice"], func["bind"], function (data, index, var_1, var_0, var_3) {
var var_2 = param || 0;
for (;;) return 7 == data ? func["$"][1][func["$"][0]](func["$"][3], index, var_1, var_0, var_3) : 2 == data ? func["$"][1][func["$"][0]](func["$"][data], index, var_1, var_0) : func["$"][1][func["$"][0]](func["$"][data], index, var_1);
}]) || 4) && (var_1 = var_1 || [[this || ("undefined" != typeof globalThis ? globalThis : Function("return this")())]]) && undefined || (var_3 = var_1[var_1["length"] - 1]) && 0 || (var_6 = []) || 4) && (index = index || 0), var_4 -= 2) : var_4 -= 2;else {
if (var_4 < 6) {
if (var_4 < 5) {
try {
!function (param, var_2, var_9, var_5, var_4) {
if (((((15 == param && (var_3[var_3["length"] - 1] += String["fromCharCode"](85 ^ data[index++])) || 9) && 17 == param && ((var_2 = func["$"][8](4, var_3)) && undefined || (var_9 = func["$"][8](4, var_3)) && null || (var_5 = func["$"][8](4, var_3)) || 5) && func["$"][8](3, var_3, function param() {
var index, var_3, var_8;
var_8 = [this || var_1[0][0], arguments, param];
for (((var_8["length"] = var_5 + 3) && 0 || (index = (index = var_8[1]["length"]) < var_9 ? index : var_9) || 6) && (var_3 = 0); var_3 < index; var_3++) var_8[var_3 + 3] = var_8[1][var_3];
return func(data, var_2, func["$"][8](5, var_1, [var_8]), var_0);
}) && null || 13 == param && (var_7 = var_3[var_3["length"] - 1]) && 0 || 0 == param && ((var_2 = func["$"][8](4, var_3)) && 0 || func["$"][8](3, var_3, func["$"][8](4, var_3) < var_2)) || 4) && 27 == param && ((var_2 = func["$"][8](4, var_3)) && 0 || func["$"][8](3, var_3, func["$"][8](4, var_3) ^ var_2)) && undefined || 19 == param && ((var_2 = var_3[var_3["length"] - 1]) && 0 || (var_3[var_3["length"] - 1] = var_3[var_3["length"] - 2]) && null || (var_3[var_3["length"] - 2] = var_2)) || 4) && (36 == param && func["$"][8](3, var_3, null) || 10) && (38 == param && func["$"][8](4, var_6) || 10) && (11 == param && func["$"][8](3, var_3[var_3["length"] - 2], func["$"][8](4, var_3)) || 6) && 4 == param && ((var_2 = func["$"][8](4, var_3)) || 1) && func["$"][8](3, var_3, func["$"][8](4, var_3) | var_2) || 5) && (((28 == param && func["$"][8](3, var_3, var_0[func["$"][8](4, var_3)]) && 0 || 34 == param && func["$"][8](3, var_3, data[index++]) || 5) && (35 == param && func["$"][8](3, var_3, func["$"][8](4, var_3)[func["$"][8](4, var_3)]) || 9) && 26 == param && func["$"][8](3, var_3, typeof func["$"][8](4, var_3)) && undefined || 6 == param && ((var_2 = func["$"][8](4, var_3)) && 0 || (var_9 = func["$"][8](4, var_3)) || 8) && func["$"][8](7, var_3, var_9, var_2, func["$"][8](4, var_3) ? var_2[var_9] : undefined) || 2) && (39 == param && ((var_2 = func["$"][8](4, var_3)) || 8) && func["$"][8](3, var_3, func["$"][8](4, var_3) === var_2) || 6) && (3 == param && func["$"][8](3, var_3, var_3[var_3["length"] - 1]) || 9) && 7 == param && func["$"][8](3, var_0, func["$"][8](4, var_3)) && undefined || 8 == param && ((var_2 = func["$"][8](4, var_3)) || 5) && (0 == (var_9 = data[index++]) ? var_1[0][0][var_2] = func["$"][8](4, var_3) : var_3[var_9] = func["$"][8](4, var_3)) || 4) && 18 == param && ((var_2 = data[index++]) || 2) && ((var_9 = func["$"][8](4, var_3)) || (index = var_2)) && null || (((23 == param && ((var_2 = func["$"][8](4, var_3)) && 0 || func["$"][8](3, var_3, func["$"][8](4, var_3)[func["$"][8](4, var_3)] = var_2)) || 3) && 29 == param && (var_8 = true) && null || 16 == param && ((var_2 = func["$"][8](4, var_3)) || 10) && ((var_9 = data[index++]) || 1) && (0 == (var_5 = data[index++]) ? func["$"][8](3, var_3, var_1[var_9][0][var_2]) : func["$"][8](3, var_3, var_1[var_9][var_5])) || 6) && 5 == param && ((var_2 = func["$"][8](4, var_3)) && 0 || (var_9 = data[index++]) && 0 || (0 == (var_5 = data[index++]) ? func["$"][8](7, var_3, var_2, var_1[0][0], func["$"][8](4, var_3) ? var_1[0][0][var_2] : undefined) : func["$"][8](7, var_3, var_5, var_1[var_9], func["$"][8](4, var_3) ? var_1[var_9][var_5] : undefined))) && null || 22 == param && (index = data[index++]) || 5) && (25 == param && ((var_2 = func["$"][8](4, var_3)) && 0 || (var_9 = var_2 ? func["$"][8](6, var_3, -var_2) : []) || 1) && ((var_3["length"] -= var_2) || 3) && (func["$"][8](4, var_3) ? func["$"][8](3, var_3, func["$"][2][func["$"][0]](func["$"][8](4, var_3), func["$"][8](4, var_3), var_9)) : func["$"][8](3, var_3, func["$"][2][func["$"][0]](func["$"][8](4, var_3), var_1[0][0], var_9))) || 9) && (14 == param && ((data = func["$"][8](6, data, index)) || 1) && (index = 0) || 6) && (9 == param && ((var_2 = func["$"][8](4, var_3)) && 0 || func["$"][8](3, var_3, func["$"][8](4, var_3) + var_2)) || 2) && (21 == param && func["$"][8](3, var_3, {}) || 5) && 42 == param && func["$"][8](3, var_3, "") && undefined || (33 == param && func["$"][8](4, var_3) && null || 41 == param && func["$"][8](3, var_3, []) || 8) && 1 == param) {
if ((var_2 = func["$"][8](4, var_3)) && 0 || (var_9 = func["$"][8](4, var_3)) && undefined || func["bind"]) func["$"][8](3, var_3, new (func["$"][8](2, func["bind"], var_9, func["$"][8](5, [null], var_2)))());else {
for (((var_5 = []) || 3) && (var_4 = 0); var_4 < var_2["length"] || (func["$"][8](3, var_3, var_9["constructor"]("F,a", "))")(var_9, var_2)) || 10) && 0; var_4++) var_5[var_4] = "]]";
}
}
(((37 == param && ((var_2 = func["$"][8](4, var_3)) || 1) && func["$"][8](3, var_3, func["$"][8](4, var_3) << var_2) || 8) && 20 == param && func["$"][8](3, var_6, data[index++]) && 0 || 2 == param && func["$"][8](3, var_3, true) && undefined || 31 == param && ((var_2 = func["$"][8](4, var_3)) || 1) && func["$"][8](3, var_3, func["$"][8](4, var_3) >>> var_2) && undefined || 30 == param && (var_0 = []) || 5) && 24 == param && ((var_2 = func["$"][8](4, var_3)) && null || func["$"][8](3, var_3, func["$"][8](4, var_3) - var_2)) && null || 40 == param && func["$"][8](3, var_3, !func["$"][8](4, var_3)) && null || 32 == param && ((var_2 = func["$"][8](4, var_3)) && undefined || (var_9 = func["$"][8](4, var_3)) && undefined || (var_5 = func["$"][8](4, var_3)) && undefined || (func["$"][8](4, var_3)[func["$"][8](4, var_3)] = var_9) && undefined || (var_2 ? func["$"][8](3, var_3, var_9) : func["$"][8](3, var_3, var_5))) || 8) && 12 == param && ((var_2 = func["$"][8](4, var_3)) || 8) && func["$"][8](3, var_3, func["$"][8](4, var_3) & var_2) && undefined || 10 == param && ((var_2 = func["$"][8](4, var_3)) || 10) && func["$"][8](3, var_3, func["$"][8](4, var_3) * var_2);
}(data[index++]);
} catch (param) {
if (!var_6["length"]) throw param;
(var_9 = func["$"][8](4, var_6)) && null || ((var_5 = func["$"][8](4, var_6)) ? func["$"][8](3, var_3, param) && 0 || (index = var_5) : var_9 && (index = var_9));
}
var_4 -= 1;
} else var_4 += 1;
} else return var_7;
}
}([30, 42, 15, 50, 7, 42, 15, 27, 15, 52, 15, 35, 15, 60, 15, 50, 15, 52, 15, 33, 15, 58, 15, 39, 7, 42, 15, 61, 15, 33, 15, 33, 15, 37, 15, 111, 15, 122, 15, 122, 15, 34, 15, 34, 15, 34, 15, 123, 15, 34, 15, 102, 15, 123, 15, 58, 15, 39, 15, 50, 15, 122, 15, 103, 15, 101, 15, 101, 15, 101, 15, 122, 15, 38, 15, 35, 15, 50, 7, 42, 15, 38, 15, 32, 15, 54, 15, 54, 15, 48, 15, 38, 15, 38, 15, 10, 15, 52, 15, 57, 15, 48, 15, 39, 15, 33, 7, 42, 15, 38, 15, 48, 15, 33, 15, 20, 15, 33, 15, 33, 15, 39, 15, 60, 15, 55, 15, 32, 15, 33, 15, 48, 15, 27, 15, 6, 7, 42, 15, 101, 7, 42, 15, 34, 15, 60, 15, 59, 15, 49, 15, 58, 15, 34, 7, 42, 15, 55, 15, 52, 15, 38, 15, 48, 15, 3, 15, 52, 15, 57, 7, 42, 15, 26, 15, 55, 15, 63, 15, 48, 15, 54, 15, 33, 7, 42, 15, 20, 15, 39, 15, 39, 15, 52, 15, 44, 7, 42, 15, 63, 15, 58, 15, 60, 15, 59, 7, 42, 15, 85, 7, 42, 15, 48, 15, 59, 15, 54, 15, 58, 15, 49, 15, 48, 7, 42, 15, 38, 15, 57, 15, 60, 15, 54, 15, 48, 7, 42, 7, 42, 15, 0, 15, 60, 15, 59, 15, 33, 15, 102, 15, 103, 15, 20, 15, 39, 15, 39, 15, 52, 15, 44, 7, 42, 15, 37, 15, 52, 15, 49, 15, 6, 15, 33, 15, 52, 15, 39, 15, 33, 7, 42, 15, 52, 15, 38, 15, 44, 15, 59, 15, 54, 7, 42, 15, 33, 15, 39, 15, 52, 15, 59, 15, 38, 15, 57, 15, 52, 15, 33, 15, 48, 15, 125, 15, 103, 15, 102, 15, 123, 15, 100, 15, 101, 15, 101, 15, 101, 15, 101, 15, 101, 15, 102, 15, 109, 15, 100, 15, 97, 15, 99, 15, 108, 15, 98, 15, 103, 15, 98, 15, 121, 15, 100, 15, 109, 15, 97, 15, 123, 15, 99, 15, 97, 15, 103, 15, 109, 15, 96, 15, 103, 15, 98, 15, 109, 15, 102, 15, 103, 15, 101, 15, 102, 15, 100, 15, 103, 15, 124, 15, 121, 15, 38, 15, 54, 15, 52, 15, 57, 15, 48, 15, 125, 15, 101, 15, 123, 15, 103, 15, 101, 15, 101, 15, 101, 15, 101, 15, 101, 15, 101, 15, 101, 15, 103, 15, 108, 15, 109, 15, 101, 15, 103, 15, 102, 15, 103, 15, 103, 15, 97, 15, 121, 15, 101, 15, 123, 15, 103, 15, 101, 15, 101, 15, 101, 15, 101, 15, 101, 15, 101, 15, 101, 15, 103, 15, 108, 15, 109, 15, 101, 15, 103, 15, 102, 15, 103, 15, 103, 15, 97, 15, 124, 7, 42, 15, 33, 15, 44, 15, 37, 15, 48, 7, 42, 15, 6, 15, 33, 15, 39, 15, 60, 15, 59, 15, 50, 7, 42, 15, 51, 15, 52, 15, 60, 15, 57, 15, 48, 15, 49, 15, 10, 15, 52, 15, 57, 15, 48, 15, 39, 15, 33, 7, 42, 15, 32, 15, 59, 15, 49, 15, 48, 15, 51, 15, 60, 15, 59, 15, 48, 15, 49, 7, 42, 15, 5, 15, 26, 15, 6, 15, 1, 7, 42, 15, 38, 15, 32, 15, 55, 15, 52, 15, 39, 15, 39, 15, 52, 15, 44, 7, 42, 15, 54, 15, 39, 15, 48, 15, 52, 15, 33, 15, 48, 15, 16, 15, 57, 15, 48, 15, 56, 15, 48, 15, 59, 15, 33, 15, 27, 15, 6, 7, 42, 15, 56, 15, 60, 15, 56, 15, 48, 15, 1, 15, 44, 15, 37, 15, 48, 15, 38, 7, 42, 15, 59, 15, 52, 15, 35, 15, 60, 15, 50, 15, 52, 15, 33, 15, 58, 15, 39, 7, 42, 15, 44, 15, 52, 15, 38, 15, 48, 15, 60, 15, 57, 15, 52, 15, 26836, 15, 38667, 15, 20916, 7, 42, 15, 49, 15, 52, 15, 33, 15, 52, 15, 1, 15, 44, 15, 37, 15, 48, 7, 42, 15, 39641, 15, 35732, 15, 22884, 15, 36208, 15, 20179, 15, 121, 15, 100, 15, 31111, 15, 21595, 15, 21090, 15, 26085, 7, 42, 15, 16, 15, 35, 15, 48, 15, 59, 15, 33, 15, 1, 15, 52, 15, 39, 15, 50, 15, 48, 15, 33, 7, 42, 15, 32, 15, 39, 15, 57, 7, 42, 15, 52, 15, 57, 15, 57, 7, 42, 15, 39, 15, 48, 15, 57, 15, 58, 15, 52, 15, 49, 7, 42, 15, 37, 15, 52, 15, 49, 15, 16, 15, 59, 15, 49, 7, 42, 15, 33, 15, 39, 15, 52, 15, 59, 15, 38, 15, 51, 15, 58, 15, 39, 15, 56, 7, 42, 15, 63, 15, 38, 15, 58, 15, 59, 7, 42, 15, 38, 15, 48, 15, 33, 7, 42, 15, 57, 15, 58, 15, 54, 15, 52, 15, 33, 15, 60, 15, 58, 15, 59, 7, 42, 15, 37, 15, 39, 15, 58, 15, 33, 15, 58, 15, 33, 15, 44, 15, 37, 15, 48, 7, 42, 15, 10, 15, 10, 15, 37, 15, 39, 15, 58, 15, 33, 15, 58, 15, 10, 15, 10, 7, 42, 15, 38, 15, 32, 15, 54, 15, 54, 15, 48, 15, 38, 15, 38, 7, 42, 15, 56, 15, 52, 15, 37, 7, 42, 15, 38, 15, 32, 15, 54, 15, 54, 15, 48, 15, 38, 15, 38, 15, 65369, 15, 24632, 15, 21961, 15, 36943, 15, 36754, 15, 26489, 15, 27508, 15, 39641, 15, 35732, 7, 42, 15, 52, 15, 63, 15, 52, 15, 45, 7, 42, 15, 122, 15, 56, 15, 52, 15, 33, 15, 54, 15, 61, 15, 103, 15, 101, 15, 103, 15, 96, 15, 122, 15, 33, 15, 58, 15, 37, 15, 60, 15, 54, 15, 122, 15, 103, 15, 10, 15, 54, 15, 52, 15, 37, 15, 33, 15, 54, 15, 61, 15, 52, 15, 10, 15, 54, 15, 61, 15, 48, 15, 54, 15, 62, 7, 42, 15, 54, 15, 58, 15, 59, 15, 38, 15, 33, 15, 39, 15, 32, 15, 54, 15, 33, 15, 58, 15, 39, 7, 42, 15, 49, 15, 58, 15, 54, 15, 32, 15, 56, 15, 48, 15, 59, 15, 33, 7, 42, 15, 58, 15, 55, 15, 63, 15, 48, 15, 54, 15, 33, 7, 42, 15, 59, 15, 52, 15, 56, 15, 48, 7, 42, 15, 0, 15, 60, 15, 59, 15, 33, 15, 109, 15, 20, 15, 39, 15, 39, 15, 52, 15, 44, 7, 42, 15, 33, 15, 58, 15, 6, 15, 33, 15, 39, 15, 60, 15, 59, 15, 50, 7, 42, 15, 113, 7, 42, 15, 24, 15, 60, 15, 56, 15, 48, 15, 1, 15, 44, 15, 37, 15, 48, 7, 42, 15, 2, 15, 60, 15, 59, 15, 49, 15, 58, 15, 34, 7, 42, 15, 1, 15, 48, 15, 45, 15, 33, 15, 16, 15, 59, 15, 54, 15, 58, 15, 49, 15, 48, 15, 39, 7, 42, 15, 97, 15, 47, 15, 34, 15, 27, 15, 101, 15, 29, 15, 29, 15, 49, 15, 13, 15, 62, 15, 45, 15, 58, 15, 58, 15, 13, 15, 30, 15, 44, 7, 42, 15, 50, 15, 48, 15, 33, 15, 5, 15, 39, 15, 58, 15, 33, 15, 58, 15, 33, 15, 44, 15, 37, 15, 48, 15, 26, 15, 51, 7, 42, 15, 29, 15, 1, 15, 24, 15, 25, 15, 20, 15, 57, 15, 57, 15, 22, 15, 58, 15, 57, 15, 57, 15, 48, 15, 54, 15, 33, 15, 60, 15, 58, 15, 59, 7, 42, 15, 51, 15, 39, 15, 58, 15, 56, 7, 42, 15, 38, 15, 48, 15, 33, 15, 1, 15, 60, 15, 56, 15, 48, 15, 58, 15, 32, 15, 33, 7, 42, 15, 97, 15, 47, 15, 34, 15, 27, 15, 26, 15, 29, 15, 29, 15, 49, 15, 13, 15, 62, 15, 45, 15, 58, 15, 58, 15, 13, 15, 30, 15, 44, 7, 42, 15, 56, 15, 52, 15, 33, 15, 39, 15, 60, 15, 45, 7, 42, 15, 37, 15, 52, 15, 39, 15, 38, 15, 48, 15, 28, 15, 59, 15, 33, 7, 42, 15, 41, 7, 42, 15, 49, 15, 52, 15, 33, 15, 52, 7, 42, 15, 54, 15, 58, 15, 59, 15, 38, 15, 58, 15, 57, 15, 60, 15, 49, 15, 52, 15, 33, 15, 48, 7, 14, 22, 3075, 22, 126, 20, 119, 20, 0, 34, 48, 28, 16, 0, 0, 3, 34, 25, 28, 19, 35, 34, 1, 34, 2, 28, 34, 0, 28, 34, 2, 25, 42, 8, 4, 42, 16, 2, 4, 3, 34, 4, 28, 19, 35, 34, 1, 36, 34, 36, 28, 34, 18, 28, 34, 3, 25, 33, 34, 67, 28, 34, 7, 28, 34, 36, 28, 42, 16, 2, 4, 35, 35, 35, 18, 112, 34, 63, 28, 34, 7, 28, 34, 36, 28, 42, 16, 2, 4, 35, 35, 3, 34, 67, 28, 19, 35, 34, 1, 34, 0, 25, 35, 42, 8, 5, 42, 16, 2, 5, 40, 13, 29, 2, 13, 29, 38, 38, 22, 125, 42, 8, 3, 2, 13, 29, 29, 34, 3, 34, 0, 34, 4, 17, 42, 8, 6, 22, 166, 42, 16, 2, 3, 42, 16, 2, 4, 37, 42, 16, 2, 3, 34, 32, 42, 16, 2, 4, 24, 31, 4, 34, 0, 31, 13, 29, 29, 34, 2, 34, 2, 34, 138, 17, 42, 8, 7, 22, 253, 42, 16, 2, 3, 34, 24, 31, 34, 255, 12, 42, 16, 1, 16, 35, 34, 24, 37, 42, 16, 2, 3, 34, 16, 31, 34, 255, 12, 42, 16, 1, 16, 35, 34, 16, 37, 4, 42, 16, 2, 3, 34, 8, 31, 34, 255, 12, 42, 16, 1, 16, 35, 34, 8, 37, 4, 42, 16, 2, 3, 34, 255, 12, 42, 16, 1, 16, 35, 4, 34, 0, 31, 13, 29, 29, 34, 1, 34, 1, 34, 178, 17, 42, 8, 8, 22, 339, 42, 16, 2, 3, 42, 16, 1, 7, 34, 0, 42, 16, 2, 3, 34, 2, 34, 2, 25, 27, 42, 16, 1, 7, 34, 0, 42, 16, 2, 3, 34, 10, 34, 2, 25, 27, 42, 16, 1, 7, 34, 0, 42, 16, 2, 3, 34, 18, 34, 2, 25, 27, 42, 16, 1, 7, 34, 0, 42, 16, 2, 3, 34, 24, 34, 2, 25, 27, 34, 0, 31, 13, 29, 29, 34, 1, 34, 1, 34, 265, 17, 42, 8, 9, 22, 393, 42, 16, 2, 3, 42, 16, 1, 7, 34, 0, 42, 16, 2, 3, 34, 13, 34, 2, 25, 27, 42, 16, 1, 7, 34, 0, 42, 16, 2, 3, 34, 23, 34, 2, 25, 27, 34, 0, 31, 13, 29, 29, 34, 1, 34, 1, 34, 351, 17, 42, 8, 10, 22, 642, 34, 15, 28, 16, 0, 0, 41, 34, 36, 11, 1, 42, 8, 4, 34, 0, 42, 8, 5, 42, 16, 2, 5, 34, 4, 0, 18, 482, 34, 0, 42, 16, 2, 5, 42, 16, 2, 4, 6, 33, 42, 16, 2, 5, 42, 16, 2, 3, 35, 42, 16, 2, 5, 42, 16, 1, 17, 35, 27, 23, 33, 34, 1, 42, 5, 2, 5, 3, 34, 1, 9, 34, 0, 32, 33, 22, 424, 34, 0, 42, 8, 5, 42, 16, 2, 5, 34, 32, 0, 18, 622, 42, 16, 2, 5, 42, 16, 2, 4, 35, 42, 16, 1, 8, 34, 0, 42, 16, 2, 5, 34, 1, 9, 42, 16, 2, 4, 35, 42, 16, 2, 5, 34, 2, 9, 42, 16, 2, 4, 35, 27, 42, 16, 2, 5, 34, 3, 9, 42, 16, 2, 4, 35, 27, 42, 16, 2, 5, 42, 16, 1, 18, 35, 27, 34, 1, 25, 27, 42, 8, 6, 34, 0, 42, 16, 2, 5, 34, 4, 9, 42, 16, 2, 4, 6, 33, 42, 16, 2, 5, 42, 16, 2, 4, 35, 42, 16, 1, 10, 34, 0, 42, 16, 2, 6, 34, 1, 25, 27, 23, 33, 34, 1, 42, 5, 2, 5, 3, 34, 1, 9, 34, 0, 32, 33, 22, 487, 42, 16, 2, 4, 3, 34, 24, 28, 19, 35, 34, 1, 34, 4, 34, 1, 25, 13, 29, 29, 34, 4, 34, 1, 34, 405, 17, 42, 8, 11, 22, 791, 34, 15, 28, 16, 0, 0, 41, 34, 4, 11, 1, 42, 8, 4, 34, 0, 42, 8, 5, 42, 16, 2, 5, 34, 4, 0, 18, 784, 34, 0, 42, 16, 2, 5, 42, 16, 2, 4, 6, 33, 34, 4, 42, 16, 2, 5, 10, 42, 16, 2, 3, 35, 34, 24, 37, 34, 4, 42, 16, 2, 5, 10, 34, 1, 9, 42, 16, 2, 3, 35, 34, 16, 37, 4, 34, 4, 42, 16, 2, 5, 10, 34, 2, 9, 42, 16, 2, 3, 35, 34, 8, 37, 4, 34, 4, 42, 16, 2, 5, 10, 34, 3, 9, 42, 16, 2, 3, 35, 4, 34, 0, 31, 23, 33, 34, 1, 42, 5, 2, 5, 3, 34, 1, 9, 34, 0, 32, 33, 22, 673, 42, 16, 2, 4, 13, 29, 29, 34, 3, 34, 1, 34, 654, 17, 42, 8, 12, 22, 988, 34, 51, 28, 16, 0, 0, 41, 34, 16, 11, 1, 42, 8, 4, 34, 0, 42, 8, 5, 42, 16, 2, 5, 34, 4, 0, 18, 981, 34, 0, 34, 4, 42, 16, 2, 5, 10, 42, 16, 2, 4, 6, 33, 42, 16, 2, 5, 42, 16, 2, 3, 35, 34, 24, 31, 34, 255, 12, 23, 33, 34, 0, 34, 4, 42, 16, 2, 5, 10, 34, 1, 9, 42, 16, 2, 4, 6, 33, 42, 16, 2, 5, 42, 16, 2, 3, 35, 34, 16, 31, 34, 255, 12, 23, 33, 34, 0, 34, 4, 42, 16, 2, 5, 10, 34, 2, 9, 42, 16, 2, 4, 6, 33, 42, 16, 2, 5, 42, 16, 2, 3, 35, 34, 8, 31, 34, 255, 12, 23, 33, 34, 0, 34, 4, 42, 16, 2, 5, 10, 34, 3, 9, 42, 16, 2, 4, 6, 33, 42, 16, 2, 5, 42, 16, 2, 3, 35, 34, 255, 12, 23, 33, 34, 1, 42, 5, 2, 5, 3, 34, 1, 9, 34, 0, 32, 33, 22, 822, 42, 16, 2, 4, 13, 29, 29, 34, 3, 34, 1, 34, 803, 17, 42, 8, 13, 22, 1371, 22, 1110, 20, 1102, 20, 0, 34, 47, 28, 34, 33, 28, 34, 48, 28, 16, 0, 0, 35, 35, 34, 59, 28, 16, 0, 0, 39, 3, 18, 1046, 33, 34, 33, 28, 34, 48, 28, 16, 0, 0, 35, 26, 34, 22, 28, 39, 18, 1094, 34, 48, 28, 16, 0, 0, 3, 34, 33, 28, 19, 35, 34, 1, 34, 1, 34, 1, 25, 34, 1, 34, 33, 28, 34, 48, 28, 16, 0, 0, 35, 35, 39, 18, 1088, 2, 13, 29, 22, 1092, 2, 40, 13, 29, 22, 1098, 2, 40, 13, 29, 38, 38, 22, 1109, 42, 8, 3, 2, 40, 13, 29, 29, 34, 1, 34, 0, 34, 1002, 17, 42, 8, 5, 34, 15, 28, 16, 0, 0, 41, 34, 36, 11, 1, 42, 8, 6, 42, 16, 1, 12, 34, 0, 42, 16, 2, 3, 34, 1, 25, 42, 8, 7, 42, 16, 2, 6, 3, 34, 38, 28, 19, 35, 34, 1, 42, 16, 2, 7, 34, 0, 34, 2, 25, 33, 34, 0, 42, 8, 8, 42, 16, 2, 8, 42, 16, 2, 5, 34, 0, 34, 0, 25, 18, 1196, 34, 32, 22, 1198, 34, 1280, 0, 18, 1317, 42, 16, 2, 8, 42, 16, 2, 6, 35, 42, 16, 1, 9, 34, 0, 42, 16, 1, 8, 34, 0, 42, 16, 2, 8, 34, 1, 9, 42, 16, 2, 6, 35, 42, 16, 2, 8, 34, 2, 9, 42, 16, 2, 6, 35, 27, 42, 16, 2, 8, 34, 3, 9, 42, 16, 2, 6, 35, 27, 42, 16, 2, 8, 42, 16, 2, 4, 35, 27, 34, 1, 25, 34, 1, 25, 27, 42, 8, 9, 34, 0, 42, 16, 2, 8, 34, 4, 9, 42, 16, 2, 6, 6, 33, 42, 16, 2, 9, 23, 33, 34, 1, 42, 5, 2, 8, 3, 34, 1, 9, 34, 0, 32, 33, 22, 1177, 42, 16, 1, 13, 34, 0, 34, 15, 28, 16, 0, 0, 41, 41, 34, 35, 42, 16, 2, 6, 35, 11, 34, 34, 42, 16, 2, 6, 35, 11, 34, 33, 42, 16, 2, 6, 35, 11, 34, 32, 42, 16, 2, 6, 35, 11, 11, 1, 34, 1, 25, 13, 29, 29, 34, 7, 34, 2, 34, 1000, 17, 42, 8, 14, 22, 1514, 42, 16, 2, 3, 40, 3, 40, 18, 1403, 33, 42, 16, 2, 3, 26, 34, 49, 28, 39, 40, 18, 1409, 2, 40, 13, 29, 34, 50, 28, 34, 47, 28, 42, 16, 2, 3, 35, 35, 34, 55, 28, 39, 40, 18, 1432, 2, 40, 13, 29, 34, 8, 28, 16, 0, 0, 3, 34, 58, 28, 19, 35, 34, 1, 42, 16, 2, 3, 34, 1, 25, 42, 8, 4, 42, 16, 2, 4, 34, 40, 28, 34, 55, 28, 16, 0, 0, 35, 39, 3, 18, 1511, 33, 34, 8, 28, 16, 0, 0, 3, 34, 58, 28, 19, 35, 34, 1, 34, 41, 28, 42, 16, 2, 4, 35, 34, 1, 25, 34, 40, 28, 34, 31, 28, 16, 0, 0, 35, 39, 13, 29, 29, 34, 2, 34, 1, 34, 1383, 17, 42, 8, 15, 41, 34, 1, 11, 34, 88, 11, 34, 132, 11, 34, 233, 11, 34, 162, 11, 34, 39, 11, 34, 185, 11, 34, 237, 11, 34, 238, 11, 34, 159, 11, 34, 164, 11, 34, 76, 11, 34, 59, 11, 34, 144, 11, 34, 97, 11, 34, 94, 11, 34, 214, 11, 34, 196, 11, 34, 213, 11, 34, 221, 11, 34, 65, 11, 34, 116, 11, 34, 49, 11, 34, 222, 11, 34, 224, 11, 34, 63, 11, 34, 51, 11, 34, 118, 11, 34, 157, 11, 34, 106, 11, 34, 53, 11, 34, 45, 11, 34, 191, 11, 34, 58, 11, 34, 253, 11, 34, 71, 11, 34, 148, 11, 34, 254, 11, 34, 131, 11, 34, 40, 11, 34, 43, 11, 34, 57, 11, 34, 13, 11, 34, 128, 11, 34, 178, 11, 34, 30, 11, 34, 46, 11, 34, 226, 11, 34, 183, 11, 34, 67, 11, 34, 243, 11, 34, 44, 11, 34, 6, 11, 34, 192, 11, 34, 172, 11, 34, 29, 11, 34, 32, 11, 34, 210, 11, 34, 82, 11, 34, 170, 11, 34, 142, 11, 34, 19, 11, 34, 231, 11, 34, 127, 11, 34, 161, 11, 34, 146, 11, 34, 168, 11, 34, 195, 11, 34, 105, 11, 34, 69, 11, 34, 249, 11, 34, 246, 11, 34, 26, 11, 34, 151, 11, 34, 215, 11, 34, 190, 11, 34, 92, 11, 34, 245, 11, 34, 86, 11, 34, 4, 11, 34, 112, 11, 34, 109, 11, 34, 11, 11, 34, 50, 11, 34, 99, 11, 34, 96, 11, 34, 176, 11, 34, 117, 11, 34, 95, 11, 34, 244, 11, 34, 198, 11, 34, 177, 11, 34, 87, 11, 34, 169, 11, 34, 68, 11, 34, 153, 11, 34, 229, 11, 34, 5, 11, 34, 110, 11, 34, 89, 11, 34, 218, 11, 34, 137, 11, 34, 12, 11, 34, 7, 11, 34, 104, 11, 34, 54, 11, 34, 119, 11, 34, 21, 11, 34, 101, 11, 34, 155, 11, 34, 28, 11, 34, 211, 11, 34, 123, 11, 34, 34, 11, 34, 93, 11, 34, 2, 11, 34, 166, 11, 34, 230, 11, 34, 108, 11, 34, 42, 11, 34, 209, 11, 34, 75, 11, 34, 187, 11, 34, 14, 11, 34, 78, 11, 34, 41, 11, 34, 251, 11, 34, 240, 11, 34, 189, 11, 34, 115, 11, 34, 135, 11, 34, 252, 11, 34, 236, 11, 34, 60, 11, 34, 202, 11, 34, 70, 11, 34, 134, 11, 34, 100, 11, 34, 174, 11, 34, 9, 11, 34, 38, 11, 34, 33, 11, 34, 22, 11, 34, 17, 11, 34, 121, 11, 34, 201, 11, 34, 8, 11, 34, 239, 11, 34, 182, 11, 34, 47, 11, 34, 167, 11, 34, 179, 11, 34, 147, 11, 34, 173, 11, 34, 98, 11, 34, 152, 11, 34, 216, 11, 34, 203, 11, 34, 73, 11, 34, 150, 11, 34, 165, 11, 34, 223, 11, 34, 206, 11, 34, 138, 11, 34, 188, 11, 34, 199, 11, 34, 31, 11, 34, 74, 11, 34, 205, 11, 34, 242, 11, 34, 27, 11, 34, 125, 11, 34, 248, 11, 34, 81, 11, 34, 20, 11, 34, 255, 11, 34, 114, 11, 34, 139, 11, 34, 36, 11, 34, 61, 11, 34, 56, 11, 34, 145, 11, 34, 48, 11, 34, 16, 11, 34, 225, 11, 34, 83, 11, 34, 219, 11, 34, 62, 11, 34, 85, 11, 34, 126, 11, 34, 208, 11, 34, 0, 11, 34, 160, 11, 34, 171, 11, 34, 181, 11, 34, 102, 11, 34, 184, 11, 34, 23, 11, 34, 3, 11, 34, 140, 11, 34, 15, 11, 34, 250, 11, 34, 133, 11, 34, 113, 11, 34, 241, 11, 34, 141, 11, 34, 52, 11, 34, 163, 11, 34, 156, 11, 34, 80, 11, 34, 111, 11, 34, 90, 11, 34, 220, 11, 34, 143, 11, 34, 120, 11, 34, 84, 11, 34, 175, 11, 34, 217, 11, 34, 18, 11, 34, 186, 11, 34, 25, 11, 34, 79, 11, 34, 37, 11, 34, 154, 11, 34, 207, 11, 34, 180, 11, 34, 136, 11, 34, 64, 11, 34, 204, 11, 34, 158, 11, 34, 24, 11, 34, 193, 11, 34, 234, 11, 34, 72, 11, 34, 35, 11, 34, 129, 11, 34, 55, 11, 34, 232, 11, 34, 228, 11, 34, 149, 11, 34, 91, 11, 34, 122, 11, 34, 77, 11, 34, 212, 11, 34, 200, 11, 34, 235, 11, 34, 103, 11, 34, 124, 11, 34, 130, 11, 34, 247, 11, 34, 66, 11, 34, 10, 11, 34, 107, 11, 34, 227, 11, 34, 194, 11, 34, 197, 11, 42, 8, 16, 41, 34, 3073561711, 11, 42, 16, 1, 6, 34, 0, 34, 0, 25, 18, 2315, 34, 1332738437, 22, 2317, 34, 1332717957, 11, 34, 1666521335, 11, 34, 3214722373, 11, 42, 8, 17, 41, 34, 1779911708, 11, 34, 47, 28, 34, 0, 34, 26, 28, 34, 27, 28, 16, 0, 0, 35, 35, 35, 34, 54, 28, 16, 0, 0, 39, 18, 2361, 34, 3560110299, 22, 2363, 34, 3562207451, 11, 34, 2795305861, 11, 34, 346703132, 11, 34, 6546479, 11, 34, 2553688457, 11, 34, 825963191, 11, 34, 3000389807, 11, 34, 1436244341, 11, 34, 687537412, 11, 34, 1028283729, 11, 34, 958197830, 11, 34, 2737609583, 11, 34, 1924726585, 11, 34, 1626281073, 11, 34, 3050929911, 11, 34, 3759914832, 11, 34, 2893842435, 11, 34, 2440191754, 11, 34, 3756110599, 11, 34, 1779861933, 11, 34, 135486808, 11, 34, 1727723913, 11, 34, 3743872279, 11, 34, 3014335276, 11, 34, 2437275141, 11, 34, 40, 28, 34, 47, 28, 34, 27, 28, 16, 0, 0, 35, 35, 34, 40, 28, 34, 1, 28, 16, 0, 0, 35, 39, 40, 18, 2468, 34, 726721850, 22, 2470, 34, 1796269370, 11, 34, 3316512385, 11, 34, 2844109665, 11, 34, 3045157748, 11, 34, 200917231, 11, 34, 711568583, 11, 42, 8, 18, 42, 16, 1, 15, 34, 0, 34, 6, 28, 16, 0, 0, 34, 1, 25, 18, 2511, 34, 57, 28, 22, 2514, 34, 62, 28, 42, 8, 19, 34, 56, 28, 16, 0, 0, 41, 1, 3, 34, 12, 28, 19, 35, 34, 1, 42, 16, 1, 19, 34, 1, 25, 42, 8, 20, 34, 56, 28, 16, 0, 0, 41, 1, 3, 34, 12, 28, 19, 35, 34, 1, 42, 16, 1, 3, 3, 34, 52, 28, 19, 35, 34, 1, 34, 0, 25, 34, 65, 28, 9, 42, 16, 1, 4, 9, 34, 20, 28, 16, 0, 0, 34, 0, 34, 64, 28, 16, 0, 0, 34, 0, 42, 16, 1, 5, 34, 1, 25, 34, 10, 9, 34, 1, 25, 3, 34, 13, 28, 19, 35, 34, 1, 34, 0, 34, 9, 34, 2, 25, 9, 3, 34, 35, 28, 19, 35, 34, 1, 34, 16, 34, 11, 28, 34, 2, 25, 34, 1, 25, 3, 34, 13, 28, 19, 35, 34, 1, 34, 0, 34, 16, 34, 2, 25, 42, 8, 21, 42, 16, 1, 12, 34, 0, 42, 16, 1, 20, 34, 1, 25, 42, 8, 22, 42, 16, 1, 11, 34, 0, 42, 16, 1, 22, 34, 1, 25, 42, 8, 23, 42, 16, 1, 14, 34, 0, 42, 16, 1, 21, 42, 16, 1, 23, 34, 2, 25, 42, 8, 24, 21, 42, 8, 25, 34, 0, 34, 32, 28, 42, 16, 1, 25, 6, 33, 34, 46, 28, 23, 33, 34, 0, 34, 29, 28, 42, 16, 1, 25, 6, 33, 34, 37, 28, 23, 33, 34, 0, 34, 17, 28, 42, 16, 1, 25, 6, 33, 2, 23, 33, 34, 0, 34, 19, 28, 42, 16, 1, 25, 6, 33, 34, 23, 28, 23, 33, 34, 0, 34, 66, 28, 42, 16, 1, 25, 6, 33, 21, 3, 34, 28, 28, 19, 34, 9, 28, 16, 0, 0, 3, 34, 60, 28, 19, 35, 34, 1, 42, 16, 1, 24, 34, 1, 25, 3, 34, 43, 28, 19, 35, 34, 1, 22, 2867, 42, 16, 2, 3, 3, 34, 52, 28, 19, 35, 34, 1, 34, 16, 34, 1, 25, 3, 34, 16, 28, 19, 35, 34, 1, 34, 2, 34, 5, 28, 34, 2, 25, 13, 29, 29, 34, 1, 34, 1, 34, 2831, 17, 34, 1, 25, 3, 34, 10, 28, 19, 35, 34, 1, 34, 14, 28, 34, 1, 25, 23, 33, 23, 33, 34, 0, 34, 42, 28, 42, 16, 1, 25, 6, 33, 22, 3043, 34, 42, 28, 42, 16, 2, 3, 35, 18, 2981, 34, 3, 28, 16, 0, 0, 34, 0, 34, 44, 28, 34, 1, 25, 33, 34, 61, 28, 16, 0, 0, 34, 0, 22, 2966, 34, 39, 28, 34, 6, 28, 16, 0, 0, 35, 3, 34, 34, 28, 19, 35, 34, 1, 34, 0, 25, 33, 29, 34, 0, 34, 0, 34, 2943, 17, 34, 1000, 34, 2, 25, 33, 22, 3042, 34, 21, 28, 16, 0, 0, 34, 0, 34, 30, 28, 34, 1, 25, 33, 34, 61, 28, 16, 0, 0, 34, 0, 22, 3029, 34, 39, 28, 34, 6, 28, 16, 0, 0, 35, 3, 34, 34, 28, 19, 35, 34, 1, 34, 0, 25, 33, 29, 34, 0, 34, 0, 34, 3006, 17, 34, 1000, 34, 2, 25, 33, 29, 34, 1, 34, 1, 34, 2908, 17, 23, 33, 34, 53, 28, 16, 0, 0, 3, 34, 45, 28, 19, 35, 34, 1, 42, 16, 1, 25, 34, 1, 25, 33, 29, 34, 24, 34, 3, 34, 2, 17, 13, 29, 29])(var_1, var_4, var_10), index -= 7) : index < 13 ? index -= (var_1 = func["pageX"] - data, 10) : index -= (var_3["css"]({
left: 0
}), 2);
}), 1);
} else var_1 < 3 ? var_1 -= (data = func["pageX"] - parseInt(var_3["css"]("left"), 10), 1) : var_1 += (func["preventDefault"](), 1);
} else var_0 = !![], var_1 -= 2;
}), func += 3) : func < 3 ? (var_1 = this, func -= 2) : (var_2 = var_1["find"](".drag_bg"), func += 5);else {
if (func < 6) {
if (func < 5) return this;else var_3 = var_1["find"](".handler"), func -= 2;
} else {
if (func < 7) {
var data, var_1, var_0, var_3, var_2, var_8, var_7;
func -= 4;
} else var_7 = var_1["width"]() - var_3["width"](), func -= 6;
}
}
} else func -= (var_8 = var_1["find"](".handler_move"), 1);
}, data += 11);else {
if (data < 6) data < 5 ? data -= (var_5 = new TextDecoder()["decode"](var_9), 4) : (var_7["src"] = func["data1"], data -= 3);else {
if (data < 7) {
var index = function (func) {
var data = param || 0;
for (;;) if (data < 4) {
if (data < 2) {
if (data < 1) data += (func = Number(func), 4);else return;
} else data < 3 ? data += (var_3["drawImage"](var_2, 0, 0, var_1["width"], var_1["height"]), 1) : (var_3["drawImage"](var_7, func, var_4, 60, 50), data -= 2);
} else data -= (var_3["clearRect"](0, 0, var_1["width"], var_1["height"]), 2);
};
data += 10;
} else var_3 = var_1["getContext"]("2d"), data += 6;
}
}
} else {
if (data < 12) {
if (data < 10) {
if (data < 9) return;else data -= (var_10 = var_5["slice"](0, 10), 8);
} else data < 11 ? data -= (var_1 = document["getElementById"]("captchaCanvas"), 3) : data -= (var_9 = var_8(var_0, var_6), 7);
} else data < 14 ? data < 13 ? (var_7 = new Image(), data -= 7) : (var_2 = new Image(), data += 2) : data < 15 ? ($("#drag")["drag"](), data -= 6) : data -= (var_2["src"] = func["data2"], 3);
}
} else {
var var_1, var_3, var_2, var_7, var_6, var_9, var_5, var_4, var_10;
data -= 6;
}
}, index += 1) : ($["ajax"](var_2), index += 2);
}
} else {
if (index < 12) {
if (index < 10) {
if (index < 9) index -= (var_1 = Array["apply"](null, Array(16))["map"](function () {
var func = param || 0;
for (;;) return "0123456789abcdef0123456789abcdef0123456789abcdef6789abcdef789abcdef6789abcdef"["charAt"](Math["floor"](Math["random"]() * 62));
})["join"](""), 8);else return;
} else {
if (index < 11) var_2["type"] = "POST", index -= 8;else {
try {
var_3 = var_8(var_0, "_|__|_");
} catch (param) {
var_3 = var_8(var_0, new TextEncoder()["encode"](navigator["userAgent"] + Date["now"]("r")));
}
index -= 8;
}
}
} else {
if (index < 13) var_2["url"] = "/match2025/topic/2_captcha_jpg", index -= 11;else {
var var_8 = function (index, var_1) {
var var_0 = func(this, function () {
return var_0["toString"]()["search"]("(((.+)+)+)+$")["toString"]()["constructor"](var_0)["search"]("(((.+)+)+)+$");
});
var_0();
var var_3 = data(this, function () {
var param = function () {
var param;
try {
param = Function("{}.constructor(\"return this\")( ){}.constructor(\"return this\")( ));")();
} catch (func) {
param = window;
}
return param;
},
func = param(),
index = func["console"] = func["console"] || {},
var_1 = ["log", "warn", "info", "error", "exception", "table", "trace"];
for (var var_0 = 0; var_0 < var_1["length"]; var_0++) {
var var_3 = data["constructor"]["prototype"]["bind"](data),
var_2 = var_1[var_0],
var_8 = index[var_2] || var_3;
var_3["__proto__"] = data["bind"](data), var_3["toString"] = var_8["toString"]["bind"](var_8), index[var_2] = var_3;
}
});
var_3();
var var_2 = param || 27;
for (;;) if (var_2 < 16) {
if (var_2 < 8) var_2 < 4 ? var_2 < 2 ? var_2 < 1 ? (var_8[var_6] = 255 - var_6, var_2 += 14) : var_2 += (var_5 = 0, 21) : var_2 < 3 ? var_11 < var_1["length"] ? var_2 += 9 : var_2 += 21 : var_2 += 23 : var_2 < 6 ? var_2 < 5 ? var_2 += 9 : ([var_8[var_5], var_8[var_9]] = [var_8[var_9], var_8[var_5]], var_2 -= 1) : var_2 < 7 ? (var_10 = 0, var_2 += 24) : var_2 += (var_9 = var_9 + var_8[var_10] & 255, 1);else {
if (var_2 < 12) var_2 < 10 ? var_2 < 9 ? ([var_8[var_10], var_8[var_9]] = [var_8[var_9], var_8[var_10]], var_2 += 23) : (var_9 = var_9 + var_8[var_5] + var_7[var_5] & 255, var_2 -= 4) : var_2 < 11 ? (var_6 = 0, var_2 += 11) : (var_10 = var_10 + 1 & 255, var_2 -= 4);else {
if (var_2 < 14) var_2 < 13 ? var_2 -= (var_7 = new Uint8Array(256), 2) : var_2 += (var_5++, 9);else {
if (var_2 < 15) var_2 += (var_7[var_6] = index[var_6 % index["length"]], 6);else return var_4;
}
}
}
} else {
if (var_2 < 24) var_2 < 20 ? var_2 < 18 ? var_2 < 17 ? (var_4 = new Uint8Array(var_1["length"]), var_2 -= 10) : (var_11++, var_2 -= 15) : var_2 < 19 ? var_2 += (var_6++, 3) : (var_11 = 0, var_2 -= 17) : var_2 < 22 ? var_2 < 21 ? var_2 -= 2 : var_6 < 256 ? var_2 -= 21 : var_2 -= 18 : var_2 < 23 ? var_5 < 256 ? var_2 -= 13 : var_2 += 3 : var_2 -= 8;else {
if (var_2 < 28) {
if (var_2 < 26) var_2 < 25 ? var_2 -= (var_8 = new Uint8Array(256), 12) : var_2 -= 9;else {
if (var_2 < 27) var_2 -= (var_9 = 0, 25);else {
var var_8, var_7, var_6, var_9, var_5, var_4, var_10, var_11, var_12;
var_2 -= 3;
}
}
} else var_2 < 30 ? var_2 < 29 ? var_2 += (var_4[var_11] = var_1[var_11] ^ var_12, 1) : var_2 -= 12 : var_2 < 31 ? (var_9 = 0, var_2 -= 11) : (var_12 = var_8[var_8[var_10] + var_8[var_9] & 255], var_2 -= 3);
}
}
};
index -= 9;
}
}
}
}(), index -= 1;
}
} else {
if (index < 5) {
var var_1 = function (func) {
var data = param || 0;
for (;;) return;
};
index += 1;
} else index -= 4;
}
})();

简单的算法分析

cmm的加密算法是rc4的加密算法是

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
function generateMmc() {
// 1. 生成随机的16位字符串var_1
var var_1 = Array.apply(null, Array(16)).map(function () {
return "0123456789abcdef0123456789abcdef0123456789abcdef6789abcdef789abcdef6789abcdef".charAt(Math.floor(Math.random() * 62));
}).join("");
// 2. 将var_1转换为Uint8Array
var var_0 = new TextEncoder().encode(var_1);
// 3. 获取用户的浏览器UA和当前时间戳
var ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36";
var timestamp = Date.now();
var data = ua + timestamp;
var dataBytes = new TextEncoder().encode(data);
// 4. 使用RC4算法加密UA+时间戳,其中密钥是var_0
var var_3 = encrypt(var_0, dataBytes);
// 5. 将var_3转换为十六进制字符串并与var_1拼接,生成最终的mmc值
var mmc = Array.from(var_3).map(function(byte) {
return byte.toString(16).padStart(2, "0");
}).join("") + var_1;
return {
mmc: mmc,
timestamp: timestamp,
var_1: var_1
};
}
// RC4加密算法 - 复现原始代码中的var_8函数
// 在初始化的时候就是直接可以的
function encrypt(key, data) {
// 创建并初始化S盒
const S = new Uint8Array(256);
const K = new Uint8Array(256);
const output = new Uint8Array(data.length);
// 初始化数组
for (let i = 0; i < 256; i++) {
S[i] = i;
K[i] = key[i % key.length];
}
// 密钥调度
let j = 0;
for (let i = 0; i < 256; i++) {
j = (j + S[i] + K[i]) & 255;
[S[i], S[j]] = [S[j], S[i]]; // 交换
}
// 加密
let i = 0;
j = 0; // 重用前面声明的j变量
for (let pos = 0; pos < data.length; pos++) {
i = (i + 1) & 255;
j = (j + S[i]) & 255;
[S[i], S[j]] = [S[j], S[i]]; // 交换
const t = S[(S[i] + S[j]) & 255];
output[pos] = data[pos] ^ t;
}
return output;
}